@@ -33,26 +33,85 @@ func TestArrowTypes(t *testing.T) {
3333 if got .isDotted () != tt .wantDotted {
3434 t .Errorf ("isDotted() = %v, want %v" , got .isDotted (), tt .wantDotted )
3535 }
36- if got .hasHead () != tt .wantHead {
37- t .Errorf ("hasHead () = %v, want %v" , got . hasHead () , tt .wantHead )
36+ if _ , hasHead := got .head ( Unicode , true ); hasHead != tt .wantHead {
37+ t .Errorf ("head () present = %v, want %v" , hasHead , tt .wantHead )
3838 }
3939 })
4040 }
4141}
4242
43- // TestUnsupportedArrowsRejected documents that arrow types we don't yet support
44- // (async -x/-), cross, and bidirectional <<->>) are rejected rather than
45- // silently mis-parsed. mermaid supports these; adding them is future work.
46- func TestUnsupportedArrowsRejected (t * testing.T ) {
43+ // TestArrowSpecParityForms pins the exact input forms mermaid's own test
44+ // suites use for these arrows (sequenceDiagram.spec.js and the cypress
45+ // rendering spec): no spaces around the arrow or after the colon, punctuation
46+ // in labels, asymmetric spacing, and both message directions.
47+ func TestArrowSpecParityForms (t * testing.T ) {
48+ tests := []struct {
49+ in string
50+ want ArrowType
51+ }{
52+ {"sequenceDiagram\n Alice-xBob:Hello Bob, how are you?" , SolidCross },
53+ {"sequenceDiagram\n Alice--xBob:Hello Bob, how are you?" , DottedCross },
54+ {"sequenceDiagram\n Alice-)Bob:Hello Bob, how are you?" , SolidPoint },
55+ {"sequenceDiagram\n Alice--)Bob:Hello Bob, how are you?" , DottedPoint },
56+ {"sequenceDiagram\n Alice<<->>Bob:Hello Bob, how are you?" , BidirectionalSolid },
57+ {"sequenceDiagram\n Alice<<-->>Bob:Hello Bob, how are you?" , BidirectionalDotted },
58+ {"sequenceDiagram\n Bob--x Alice: I am good thanks!" , DottedCross },
59+ {"sequenceDiagram\n Alice --x Ola1: Bye!" , DottedCross },
60+ {"sequenceDiagram\n John<<->>Alice: This also works the other way" , BidirectionalSolid },
61+ }
62+ for _ , tt := range tests {
63+ sd , err := Parse (tt .in )
64+ if err != nil {
65+ t .Errorf ("Parse(%q): %v" , tt .in , err )
66+ continue
67+ }
68+ if len (sd .Messages ) != 1 || sd .Messages [0 ].ArrowType != tt .want {
69+ t .Errorf ("Parse(%q): expected 1 message with ArrowType %v, got %+v" , tt .in , tt .want , sd .Messages )
70+ }
71+ }
72+ }
73+
74+ // TestCentralConnectionsRejected documents that mermaid's central-connection
75+ // syntax (circle markers at the lifeline: "A ()->>() B", released in mermaid
76+ // 11.16) is rejected loudly rather than silently mis-parsed. It composes with
77+ // every arrow type, so supporting it is its own follow-up.
78+ func TestCentralConnectionsRejected (t * testing.T ) {
4779 for _ , in := range []string {
48- "sequenceDiagram\n A-xB: cross " ,
49- "sequenceDiagram\n A-)B: async " ,
50- "sequenceDiagram\n A--xB: dotted cross " ,
51- "sequenceDiagram\n A--)B: dotted async " ,
52- "sequenceDiagram\n A<< ->>B: bidirectional " ,
80+ "sequenceDiagram\n Alice ()->>() Bob: dual " ,
81+ "sequenceDiagram\n Alice ()-x() Bob: cross dual " ,
82+ "sequenceDiagram\n Alice ()<<->>() Bob: bidirectional dual " ,
83+ "sequenceDiagram\n Alice ->>() Bob: forward " ,
84+ "sequenceDiagram\n Alice () ->> Bob: reverse " ,
5385 } {
5486 if _ , err := Parse (in ); err == nil {
55- t .Errorf ("expected error for unsupported arrow in %q, got none" , in )
87+ t .Errorf ("expected error for central-connection syntax %q, got none" , in )
88+ }
89+ }
90+ }
91+
92+ // TestCrossPointBidirectionalArrows checks that mermaid's remaining message
93+ // arrows — cross (-x/--x), async point (-)/--)) and bidirectional
94+ // (<<->>/<<-->>) — parse to the right ArrowType.
95+ func TestCrossPointBidirectionalArrows (t * testing.T ) {
96+ tests := []struct {
97+ in string
98+ want ArrowType
99+ }{
100+ {"sequenceDiagram\n A-xB: cross" , SolidCross },
101+ {"sequenceDiagram\n A--xB: dotted cross" , DottedCross },
102+ {"sequenceDiagram\n A-)B: async" , SolidPoint },
103+ {"sequenceDiagram\n A--)B: dotted async" , DottedPoint },
104+ {"sequenceDiagram\n A<<->>B: bidirectional" , BidirectionalSolid },
105+ {"sequenceDiagram\n A<<-->>B: dotted bidirectional" , BidirectionalDotted },
106+ }
107+ for _ , tt := range tests {
108+ sd , err := Parse (tt .in )
109+ if err != nil {
110+ t .Errorf ("Parse(%q): %v" , tt .in , err )
111+ continue
112+ }
113+ if len (sd .Messages ) != 1 || sd .Messages [0 ].ArrowType != tt .want {
114+ t .Errorf ("Parse(%q): expected 1 message with ArrowType %v, got %+v" , tt .in , tt .want , sd .Messages )
56115 }
57116 }
58117}
0 commit comments