Merge pull request #1089 from jgreywolf/1073-CommentsInClassDiagrams

Bug/1073 Comments in class diagrams
This commit is contained in:
Knut Sveidqvist 2019-12-01 00:39:33 +01:00 committed by GitHub
commit 71c531240f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 187 additions and 53 deletions

View File

@ -1,8 +0,0 @@
{
"typescript.format.enable": false,
"typescript.reportStyleChecksAsWarnings": false,
"typescript.validate.enable": false,
"javascript.validate.enable": false,
"editor.formatOnSave": false,
"editor.snippetSuggestions": "top"
}

View File

@ -2,7 +2,7 @@
import { imgSnapshotTest } from '../../helpers/util'; import { imgSnapshotTest } from '../../helpers/util';
describe('Class diagram', () => { describe('Class diagram', () => {
it('should render a simple class diagram', () => { it('1: should render a simple class diagram', () => {
imgSnapshotTest( imgSnapshotTest(
` `
classDiagram classDiagram
@ -33,7 +33,8 @@ describe('Class diagram', () => {
); );
cy.get('svg'); cy.get('svg');
}); });
it('should render a simple class diagrams with cardinality', () => {
it('2: should render a simple class diagrams with cardinality', () => {
imgSnapshotTest( imgSnapshotTest(
` `
classDiagram classDiagram
@ -132,4 +133,34 @@ describe('Class diagram', () => {
); );
cy.get('svg'); cy.get('svg');
}); });
it('4: should render a simple class diagram with comments', () => {
imgSnapshotTest(
`
classDiagram
%% this is a comment
Class01 <|-- AveryLongClass : Cool
&lt;&lt;interface&gt;&gt; Class01
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 --> C2 : Where am i?
Class09 --* C3
Class09 --|> Class07
Class07 : equals()
Class07 : Object[] elementData
Class01 : size()
Class01 : int chimp
Class01 : int gorilla
Class08 <--> C2: Cool label
class Class10 {
&lt;&lt;service&gt;&gt;
int id
test()
}
`,
{}
);
cy.get('svg');
});
}); });

View File

@ -14,6 +14,7 @@ describe('Flowcart', () => {
{ flowchart: { htmlLabels: false } } { flowchart: { htmlLabels: false } }
); );
}); });
it('2: should render a simple flowchart with htmlLabels', () => { it('2: should render a simple flowchart with htmlLabels', () => {
imgSnapshotTest( imgSnapshotTest(
`graph TD `graph TD
@ -26,6 +27,7 @@ describe('Flowcart', () => {
{ flowchart: { htmlLabels: true } } { flowchart: { htmlLabels: true } }
); );
}); });
it('3: should render a simple flowchart with line breaks', () => { it('3: should render a simple flowchart with line breaks', () => {
imgSnapshotTest( imgSnapshotTest(
` `
@ -99,6 +101,7 @@ describe('Flowcart', () => {
{} {}
); );
}); });
it('6: should render a flowchart full of icons', () => { it('6: should render a flowchart full of icons', () => {
imgSnapshotTest( imgSnapshotTest(
` `
@ -178,6 +181,7 @@ describe('Flowcart', () => {
{} {}
); );
}); });
it('8: should render subgraphs', () => { it('8: should render subgraphs', () => {
imgSnapshotTest( imgSnapshotTest(
` `
@ -190,7 +194,7 @@ describe('Flowcart', () => {
); );
}); });
it('9: should render subgraphs with a title startign with a digit', () => { it('9: should render subgraphs with a title starting with a digit', () => {
imgSnapshotTest( imgSnapshotTest(
` `
graph TB graph TB
@ -237,7 +241,7 @@ describe('Flowcart', () => {
); );
}); });
it('11: should render a flowchart with ling sames and class definitoins', () => { it('11: should render a flowchart with long names and class definitions', () => {
imgSnapshotTest( imgSnapshotTest(
`graph LR `graph LR
sid-B3655226-6C29-4D00-B685-3D5C734DC7E1[" sid-B3655226-6C29-4D00-B685-3D5C734DC7E1["
@ -356,6 +360,7 @@ describe('Flowcart', () => {
} }
); );
}); });
it('13: should render hexagons', () => { it('13: should render hexagons', () => {
imgSnapshotTest( imgSnapshotTest(
` `
@ -377,4 +382,18 @@ describe('Flowcart', () => {
} }
); );
}); });
it('14: should render a simple flowchart with comments', () => {
imgSnapshotTest(
`graph TD
A[Christmas] -->|Get money| B(Go shopping)
B --> C{Let me think}
%% this is a comment
C -->|One| D[Laptop]
C -->|Two| E[iPhone]
C -->|Three| F[fa:fa-car Car]
`,
{ flowchart: { htmlLabels: false } }
);
});
}); });

View File

@ -19,6 +19,7 @@ describe('class diagram, ', function() {
parser.parse(str); parser.parse(str);
}); });
it('should handle relation definition of different types and directions', function () { it('should handle relation definition of different types and directions', function () {
const str = const str =
'classDiagram\n' + 'classDiagram\n' +
@ -76,6 +77,7 @@ describe('class diagram, ', function() {
parser.parse(str); parser.parse(str);
}); });
it('should handle parsing of method statements grouped by brackets', function () { it('should handle parsing of method statements grouped by brackets', function () {
const str = const str =
'classDiagram\n' + 'classDiagram\n' +
@ -124,9 +126,106 @@ describe('class diagram, ', function() {
parser.parse(str); parser.parse(str);
}); });
it('should handle a comment', function () {
const str =
'classDiagram\n' +
'class Class1 {\n' +
'%% Comment\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'}';
parser.parse(str);
}); });
describe('when fetching data from an classDiagram graph it', function() { it('should handle comments at the start', function () {
const str =
'%% Comment\n' +
'classDiagram\n' +
'class Class1 {\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'}';
parser.parse(str);
});
it('should handle comments at the end', function () {
const str =
'classDiagram\n' +
'class Class1 {\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'\n}' +
'%% Comment\n';
parser.parse(str);
});
it('should handle comments at the end no trailing newline', function () {
const str =
'classDiagram\n' +
'class Class1 {\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'}\n' +
'%% Comment';
parser.parse(str);
});
it('should handle a comment with multiple line feeds', function () {
const str =
'classDiagram\n\n\n' +
'%% Comment\n\n' +
'class Class1 {\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'}';
parser.parse(str);
});
it('should handle a comment with mermaid class diagram code in them', function () {
const str =
'classDiagram\n' +
'%% Comment Class01 <|-- Class02\n' +
'class Class1 {\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'}';
parser.parse(str);
});
it('should handle a comment inside brackets', function () {
const str =
'classDiagram\n' +
'class Class1 {\n' +
'%% Comment Class01 <|-- Class02\n' +
'int : test\n' +
'string : foo\n' +
'test()\n' +
'foo()\n' +
'}';
parser.parse(str);
});
});
describe('when fetching data from a classDiagram graph it', function () {
beforeEach(function () { beforeEach(function () {
parser.yy = classDb; parser.yy = classDb;
parser.yy.clear(); parser.yy.clear();
@ -144,6 +243,7 @@ describe('class diagram, ', function() {
expect(relations[0].relation.type2).toBe('none'); expect(relations[0].relation.type2).toBe('none');
expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE); expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE);
}); });
it('should handle relation definitions AGGREGATION and dotted line', function () { it('should handle relation definitions AGGREGATION and dotted line', function () {
const str = 'classDiagram\n' + 'Class01 o.. Class02'; const str = 'classDiagram\n' + 'Class01 o.. Class02';
@ -157,6 +257,7 @@ describe('class diagram, ', function() {
expect(relations[0].relation.type2).toBe('none'); expect(relations[0].relation.type2).toBe('none');
expect(relations[0].relation.lineType).toBe(classDb.lineType.DOTTED_LINE); expect(relations[0].relation.lineType).toBe(classDb.lineType.DOTTED_LINE);
}); });
it('should handle relation definitions COMPOSITION on both sides', function () { it('should handle relation definitions COMPOSITION on both sides', function () {
const str = 'classDiagram\n' + 'Class01 *--* Class02'; const str = 'classDiagram\n' + 'Class01 *--* Class02';
@ -170,6 +271,7 @@ describe('class diagram, ', function() {
expect(relations[0].relation.type2).toBe(classDb.relationType.COMPOSITION); expect(relations[0].relation.type2).toBe(classDb.relationType.COMPOSITION);
expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE); expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE);
}); });
it('should handle relation definitions no types', function () { it('should handle relation definitions no types', function () {
const str = 'classDiagram\n' + 'Class01 -- Class02'; const str = 'classDiagram\n' + 'Class01 -- Class02';
@ -183,6 +285,7 @@ describe('class diagram, ', function() {
expect(relations[0].relation.type2).toBe('none'); expect(relations[0].relation.type2).toBe('none');
expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE); expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE);
}); });
it('should handle relation definitions with type only on right side', function () { it('should handle relation definitions with type only on right side', function () {
const str = 'classDiagram\n' + 'Class01 --|> Class02'; const str = 'classDiagram\n' + 'Class01 --|> Class02';

View File

@ -9,7 +9,7 @@
%x string struct %x string struct
%% %%
\%\%[^\n]* /* do nothing */ \%\%[^\n]*\n* /* do nothing */
\n+ return 'NEWLINE'; \n+ return 'NEWLINE';
\s+ /* skip whitespace */ \s+ /* skip whitespace */
"classDiagram" return 'CLASS_DIAGRAM'; "classDiagram" return 'CLASS_DIAGRAM';

View File

@ -12,8 +12,8 @@ describe('[Comments] when parsing', () => {
flow.parser.yy.clear(); flow.parser.yy.clear();
}); });
it('should handle a comments', function() { it('should handle comments', function() {
const res = flow.parser.parse('graph TD;\n%% CComment\n A-->B;'); const res = flow.parser.parse('graph TD;\n%% Comment\n A-->B;');
const vert = flow.parser.yy.getVertices(); const vert = flow.parser.yy.getVertices();
const edges = flow.parser.yy.getEdges(); const edges = flow.parser.yy.getEdges();
@ -27,7 +27,7 @@ describe('[Comments] when parsing', () => {
expect(edges[0].text).toBe(''); expect(edges[0].text).toBe('');
}); });
it('should handle comments a at the start', function() { it('should handle comments at the start', function() {
const res = flow.parser.parse('%% Comment\ngraph TD;\n A-->B;'); const res = flow.parser.parse('%% Comment\ngraph TD;\n A-->B;');
const vert = flow.parser.yy.getVertices(); const vert = flow.parser.yy.getVertices();
@ -43,7 +43,7 @@ describe('[Comments] when parsing', () => {
}); });
it('should handle comments at the end', function() { it('should handle comments at the end', function() {
const res = flow.parser.parse('graph TD;\n A-->B\n %% Comment at the find\n'); const res = flow.parser.parse('graph TD;\n A-->B\n %% Comment at the end\n');
const vert = flow.parser.yy.getVertices(); const vert = flow.parser.yy.getVertices();
const edges = flow.parser.yy.getEdges(); const edges = flow.parser.yy.getEdges();
@ -117,7 +117,7 @@ describe('[Comments] when parsing', () => {
expect(edges[0].text).toBe(''); expect(edges[0].text).toBe('');
}); });
it('should handle a comments with blank rows in-between', function() { it('should handle a comment with blank rows in-between', function() {
const res = flow.parser.parse('graph TD;\n\n\n %% Comment\n A-->B;'); const res = flow.parser.parse('graph TD;\n\n\n %% Comment\n A-->B;');
const vert = flow.parser.yy.getVertices(); const vert = flow.parser.yy.getVertices();
@ -132,7 +132,7 @@ describe('[Comments] when parsing', () => {
expect(edges[0].text).toBe(''); expect(edges[0].text).toBe('');
}); });
it('should handle a comments mermaid flowchart code in them', function() { it('should handle a comment with mermaid flowchart code in them', function() {
const res = flow.parser.parse( const res = flow.parser.parse(
'graph TD;\n\n\n %% Test od>Odd shape]-->|Two line<br>edge comment|ro;\n A-->B;' 'graph TD;\n\n\n %% Test od>Odd shape]-->|Two line<br>edge comment|ro;\n A-->B;'
); );

View File

@ -9,7 +9,7 @@
%x string %x string
%x dir %x dir
%% %%
\%\%[^\n]* /* do nothing */ \%\%[^\n]*\n* /* do nothing */
["] this.begin("string"); ["] this.begin("string");
<string>["] this.popState(); <string>["] this.popState();
<string>[^"]* return "STR"; <string>[^"]* return "STR";
@ -460,13 +460,6 @@ text: textToken
commentText: commentToken
{$$=$1;}
| commentText commentToken
{$$=$1+''+$2;}
;
keywords keywords
: STYLE | LINKSTYLE | CLASSDEF | CLASS | CLICK | GRAPH | DIR | subgraph | end | DOWN | UP; : STYLE | LINKSTYLE | CLASSDEF | CLASS | CLICK | GRAPH | DIR | subgraph | end | DOWN | UP;
@ -516,8 +509,6 @@ linkStyleStatement
{$$ = $1;yy.updateLinkInterpolate($3,$7);} {$$ = $1;yy.updateLinkInterpolate($3,$7);}
; ;
commentStatement: PCT PCT commentText;
numList: NUM numList: NUM
{$$ = [$1]} {$$ = [$1]}
| numList COMMA NUM | numList COMMA NUM
@ -539,8 +530,6 @@ styleComponent: ALPHA | COLON | MINUS | NUM | UNIT | SPACE | HEX | BRKT | DOT |
/* Token lists */ /* Token lists */
commentToken : textToken | graphCodeTokens ;
textToken : textNoTagsToken | TAGSTART | TAGEND | '==' | '--' | PCT | DEFAULT; textToken : textNoTagsToken | TAGSTART | TAGEND | '==' | '--' | PCT | DEFAULT;
textNoTagsToken: alphaNumToken | SPACE | MINUS | keywords ; textNoTagsToken: alphaNumToken | SPACE | MINUS | keywords ;