diff --git a/cypress/integration/rendering/erDiagram.spec.js b/cypress/integration/rendering/erDiagram.spec.js index 8f6193f96..b9c8bbbf4 100644 --- a/cypress/integration/rendering/erDiagram.spec.js +++ b/cypress/integration/rendering/erDiagram.spec.js @@ -369,4 +369,92 @@ ORDER ||--|{ LINE-ITEM : contains ); }); }); + + describe('Special characters and numbers syntax', () => { + it('should render ER diagram with numeric entity names', () => { + imgSnapshotTest( + ` + erDiagram + 1 ||--|| ORDER : places + ORDER ||--|{ 2 : contains + 2 ||--o{ 3.5 : references + `, + { logLevel: 1 } + ); + }); + + it('should render ER diagram with "u" character in entity names and cardinality', () => { + imgSnapshotTest( + ` + erDiagram + CUSTOMER ||--|| u : has + u ||--|| ORDER : places + PROJECT u--o{ TEAM_MEMBER : "parent" + `, + { logLevel: 1 } + ); + }); + + it('should render ER diagram with decimal numbers in relationships', () => { + imgSnapshotTest( + ` + erDiagram + 2.5 ||--|| 1.5 : has + CUSTOMER ||--o{ 3.14 : references + 1.0 ||--|{ ORDER : contains + `, + { logLevel: 1 } + ); + }); + + it('should render ER diagram with numeric entity names and attributes', () => { + imgSnapshotTest( + ` + erDiagram + 1 { + string name + int value + } + 1 ||--|| ORDER : places + ORDER { + float price + string description + } + `, + { logLevel: 1 } + ); + }); + + it('should render complex ER diagram with mixed special entity names', () => { + imgSnapshotTest( + ` + erDiagram + CUSTOMER ||--o{ 1 : places + 1 ||--|{ u : contains + 1.5 + u ||--|| 2.5 : processes + 2.5 { + string id + float value + } + u { + varchar(50) name + int count + } + `, + { logLevel: 1 } + ); + }); + it('should render ER diagram with numeric entity names and attributes', () => { + imgSnapshotTest( + `erDiagram + PRODUCT ||--o{ ORDER-ITEM : has + 1.5 + u + 1 + `, + { logLevel: 1 } + ); + }); + }); }); diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js index fd1d2a9e5..05948988d 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js @@ -1001,4 +1001,90 @@ describe('when parsing ER diagram it...', function () { } ); }); + + describe('syntax fixes for special characters and numbers', function () { + describe('standalone entity names', function () { + it('should allow number "1" as standalone entity', function () { + erDiagram.parser.parse(`erDiagram\nCUSTOMER }|..|{ DELIVERY-ADDRESS : has\n1`); + }); + + it('should allow character "u" as standalone entity', function () { + erDiagram.parser.parse(`erDiagram\nCUSTOMER }|..|{ DELIVERY-ADDRESS : has\nu`); + }); + + it('should allow decimal numbers as standalone entities', function () { + erDiagram.parser.parse(`erDiagram\nCUSTOMER }|..|{ DELIVERY-ADDRESS : has\n2.5`); + erDiagram.parser.parse(`erDiagram\nCUSTOMER }|..|{ DELIVERY-ADDRESS : has\n1.5`); + erDiagram.parser.parse(`erDiagram\nCUSTOMER }|..|{ DELIVERY-ADDRESS : has\n0.1`); + erDiagram.parser.parse(`erDiagram\nCUSTOMER }|..|{ DELIVERY-ADDRESS : has\n99.99`); + }); + }); + + describe('entity names with attributes', function () { + it('should allow "u" as entity name with attributes', function () { + erDiagram.parser.parse(`erDiagram\nu {\nstring name\nint id\n}`); + }); + + it('should allow number "1" as entity name with attributes', function () { + erDiagram.parser.parse(`erDiagram\n1 {\nstring name\nint id\n}`); + }); + + it('should allow decimal numbers as entity names with attributes', function () { + erDiagram.parser.parse(`erDiagram\n2.5 {\nstring name\nint id\n}`); + erDiagram.parser.parse(`erDiagram\n1.5 {\nstring value\n}`); + }); + }); + + describe('entity names in relationships', function () { + it('should allow "u" in relationships', function () { + erDiagram.parser.parse(`erDiagram\nCUSTOMER ||--|| u : has`); + erDiagram.parser.parse(`erDiagram\nu ||--|| ORDER : places`); + erDiagram.parser.parse(`erDiagram\nu ||--|| v : connects`); + }); + + it('should allow numbers in relationships', function () { + erDiagram.parser.parse(`erDiagram\nCUSTOMER ||--|| 1 : has`); + erDiagram.parser.parse(`erDiagram\n1 ||--|| ORDER : places`); + erDiagram.parser.parse(`erDiagram\n1 ||--|| 2 : connects`); + }); + + it('should allow decimal numbers in relationships', function () { + erDiagram.parser.parse(`erDiagram\nCUSTOMER ||--|| 2.5 : has`); + erDiagram.parser.parse(`erDiagram\n1.5 ||--|| ORDER : places`); + erDiagram.parser.parse(`erDiagram\n2.5 ||--|| 5.5 : connects`); + }); + }); + + describe('mixed scenarios', function () { + it('should handle complex diagram with special entity names', function () { + erDiagram.parser.parse( + `erDiagram + CUSTOMER ||--o{ 1 : places + 1 ||--|{ u : contains + u { + string name + int quantity + } + "2.5" ||--|| ORDER : processes + ORDER { + int id + date created + } + ` + ); + }); + + it('should handle attributes with numbers in names (but not starting)', function () { + erDiagram.parser.parse( + `erDiagram + ENTITY { + string name1 + int value2 + float point3_5 + } + ` + ); + }); + }); + }); });