diff --git a/cypress/integration/rendering/classDiagram.spec.js b/cypress/integration/rendering/classDiagram.spec.js
index 0125a4373..29c4aba86 100644
--- a/cypress/integration/rendering/classDiagram.spec.js
+++ b/cypress/integration/rendering/classDiagram.spec.js
@@ -2,7 +2,7 @@
import { imgSnapshotTest } from '../../helpers/util';
describe('Class diagram', () => {
- it('should render a simple class diagram', () => {
+ it('1: should render a simple class diagram', () => {
imgSnapshotTest(
`
classDiagram
@@ -33,7 +33,8 @@ describe('Class diagram', () => {
);
cy.get('svg');
});
- it('should render a simple class diagrams with cardinality', () => {
+
+ it('2: should render a simple class diagrams with cardinality', () => {
imgSnapshotTest(
`
classDiagram
@@ -132,4 +133,34 @@ describe('Class diagram', () => {
);
cy.get('svg');
});
+
+ it('4: should render a simple class diagram with comments', () => {
+ imgSnapshotTest(
+ `
+ classDiagram
+ %% this is a comment
+ Class01 <|-- AveryLongClass : Cool
+ <<interface>> 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 {
+ <<service>>
+ int id
+ test()
+ }
+ `,
+ {}
+ );
+ cy.get('svg');
+ });
});
diff --git a/cypress/integration/rendering/flowchart.spec.js b/cypress/integration/rendering/flowchart.spec.js
index 565083520..a27f3b50c 100644
--- a/cypress/integration/rendering/flowchart.spec.js
+++ b/cypress/integration/rendering/flowchart.spec.js
@@ -14,6 +14,7 @@ describe('Flowcart', () => {
{ flowchart: { htmlLabels: false } }
);
});
+
it('2: should render a simple flowchart with htmlLabels', () => {
imgSnapshotTest(
`graph TD
@@ -26,6 +27,7 @@ describe('Flowcart', () => {
{ flowchart: { htmlLabels: true } }
);
});
+
it('3: should render a simple flowchart with line breaks', () => {
imgSnapshotTest(
`
@@ -99,6 +101,7 @@ describe('Flowcart', () => {
{}
);
});
+
it('6: should render a flowchart full of icons', () => {
imgSnapshotTest(
`
@@ -178,6 +181,7 @@ describe('Flowcart', () => {
{}
);
});
+
it('8: should render subgraphs', () => {
imgSnapshotTest(
`
@@ -356,6 +360,7 @@ describe('Flowcart', () => {
}
);
});
+
it('13: should render hexagons', () => {
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 } }
+ );
+ });
});
diff --git a/src/diagrams/class/classDiagram.spec.js b/src/diagrams/class/classDiagram.spec.js
index 2c83e6675..a1089d3d7 100644
--- a/src/diagrams/class/classDiagram.spec.js
+++ b/src/diagrams/class/classDiagram.spec.js
@@ -19,6 +19,7 @@ describe('class diagram, ', function () {
parser.parse(str);
});
+
it('should handle relation definition of different types and directions', function () {
const str =
'classDiagram\n' +
@@ -76,6 +77,7 @@ describe('class diagram, ', function () {
parser.parse(str);
});
+
it('should handle parsing of method statements grouped by brackets', function () {
const str =
'classDiagram\n' +
@@ -124,9 +126,106 @@ describe('class diagram, ', function () {
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);
+ });
+
+ 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 an classDiagram graph it', function () {
+ describe('when fetching data from a classDiagram graph it', function () {
beforeEach(function () {
parser.yy = classDb;
parser.yy.clear();
@@ -144,6 +243,7 @@ describe('class diagram, ', function () {
expect(relations[0].relation.type2).toBe('none');
expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE);
});
+
it('should handle relation definitions AGGREGATION and dotted line', function () {
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.lineType).toBe(classDb.lineType.DOTTED_LINE);
});
+
it('should handle relation definitions COMPOSITION on both sides', function () {
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.lineType).toBe(classDb.lineType.LINE);
});
+
it('should handle relation definitions no types', function () {
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.lineType).toBe(classDb.lineType.LINE);
});
+
it('should handle relation definitions with type only on right side', function () {
const str = 'classDiagram\n' + 'Class01 --|> Class02';
@@ -297,100 +400,5 @@ describe('class diagram, ', function () {
expect(testClass.methods[0]).toBe('test()');
expect(testClass.methods[1]).toBe('foo()');
});
-
- it('should handle a comment', function () {
- const str =
- 'classDiagram\n' +
- '%% Comment \n' +
- 'class Class1 {\n' +
- 'int : test\n' +
- 'string : foo\n' +
- 'test()\n' +
- 'foo()\n' +
- '}';
-
- parser.parse(str);
- });
-
- // it('should handle comments at the start', function () {
- // const str =
- // '%% Comment\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 =
- // 'class Class1 {\n' +
- // 'int : test\n' +
- // 'string : foo\n' +
- // 'test()\n' +
- // 'foo()\n' +
- // '}\n' +
- // '%% Comment';
-
- // parser.parse(str);
- // });
-
- // it('should handle comments at the end many trailing newlines', function () {
- // const str =
- // 'classDiagram\n' +
- // '%% Comment\n\n\n\n\n' +
- // 'class Class1 {\n' +
- // 'int : test\n' +
- // 'string : foo\n' +
- // 'test()\n' +
- // 'foo()\n' +
- // '}';
-
- // parser.parse(str);
- // });
-
- // it('should handle a comment with blank rows in-between', 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);
- //});
});
});
diff --git a/src/diagrams/class/parser/classDiagram.jison b/src/diagrams/class/parser/classDiagram.jison
index f9e1d22af..f34da91a5 100644
--- a/src/diagrams/class/parser/classDiagram.jison
+++ b/src/diagrams/class/parser/classDiagram.jison
@@ -9,7 +9,7 @@
%x string struct
%%
-\%\%[^\n]* /* do nothing */
+\%\%[^\n]*\n* /* do nothing */
\n+ return 'NEWLINE';
\s+ /* skip whitespace */
"classDiagram" return 'CLASS_DIAGRAM';
diff --git a/src/diagrams/flowchart/parser/flow-comments.spec.js b/src/diagrams/flowchart/parser/flow-comments.spec.js
index 5ef91c874..e05caadd0 100644
--- a/src/diagrams/flowchart/parser/flow-comments.spec.js
+++ b/src/diagrams/flowchart/parser/flow-comments.spec.js
@@ -12,8 +12,8 @@ describe('[Comments] when parsing', () => {
flow.parser.yy.clear();
});
- it('should handle a comments', function() {
- const res = flow.parser.parse('graph TD;\n%% CComment\n A-->B;');
+ it('should handle comments', function() {
+ const res = flow.parser.parse('graph TD;\n%% Comment\n A-->B;');
const vert = flow.parser.yy.getVertices();
const edges = flow.parser.yy.getEdges();
@@ -43,7 +43,7 @@ describe('[Comments] when parsing', () => {
});
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 edges = flow.parser.yy.getEdges();
@@ -117,7 +117,7 @@ describe('[Comments] when parsing', () => {
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 vert = flow.parser.yy.getVertices();
@@ -132,7 +132,7 @@ describe('[Comments] when parsing', () => {
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(
'graph TD;\n\n\n %% Test od>Odd shape]-->|Two line
edge comment|ro;\n A-->B;'
);
diff --git a/src/diagrams/flowchart/parser/flow.jison b/src/diagrams/flowchart/parser/flow.jison
index 309d83c94..80a53b01a 100644
--- a/src/diagrams/flowchart/parser/flow.jison
+++ b/src/diagrams/flowchart/parser/flow.jison
@@ -9,7 +9,7 @@
%x string
%x dir
%%
-\%\%[^\n]* /* do nothing */
+\%\%[^\n]*\n* /* do nothing */
["] this.begin("string");
["] this.popState();
[^"]* return "STR";