@@ -71,20 +71,50 @@ func TestArrowSpecParityForms(t *testing.T) {
7171 }
7272}
7373
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 ) {
74+ // TestCentralConnections checks mermaid's central-connection syntax (circle
75+ // markers at the lifeline, mermaid 11.16): "()" on either side of any arrow.
76+ // The "()" is its own token in mermaid's lexer, so spaces around it are legal.
77+ func TestCentralConnections (t * testing.T ) {
78+ tests := []struct {
79+ in string
80+ arrow ArrowType
81+ from , to bool
82+ }{
83+ {"sequenceDiagram\n Alice ()->>() Bob: dual" , SolidArrow , true , true },
84+ {"sequenceDiagram\n Alice ()-x() Bob: cross dual" , SolidCross , true , true },
85+ {"sequenceDiagram\n Alice ()<<->>() Bob: bidirectional dual" , BidirectionalSolid , true , true },
86+ {"sequenceDiagram\n Alice ->>() Bob: forward" , SolidArrow , false , true },
87+ {"sequenceDiagram\n Alice ()->> Bob: reverse" , SolidArrow , true , false },
88+ {"sequenceDiagram\n Alice () -->> () Bob: spaced dual" , DottedArrow , true , true },
89+ {"sequenceDiagram\n Alice ()--)() Bob: point dual" , DottedPoint , true , true },
90+ }
91+ for _ , tt := range tests {
92+ sd , err := Parse (tt .in )
93+ if err != nil {
94+ t .Errorf ("Parse(%q): %v" , tt .in , err )
95+ continue
96+ }
97+ if len (sd .Messages ) != 1 {
98+ t .Errorf ("Parse(%q): expected 1 message, got %d" , tt .in , len (sd .Messages ))
99+ continue
100+ }
101+ m := sd .Messages [0 ]
102+ if m .ArrowType != tt .arrow || m .CentralFrom != tt .from || m .CentralTo != tt .to {
103+ t .Errorf ("Parse(%q): got arrow=%v centralFrom=%v centralTo=%v, want %v/%v/%v" ,
104+ tt .in , m .ArrowType , m .CentralFrom , m .CentralTo , tt .arrow , tt .from , tt .to )
105+ }
106+ }
107+ }
108+
109+ // TestMalformedCentralConnectionsRejected keeps near-miss circle forms loud.
110+ func TestMalformedCentralConnectionsRejected (t * testing.T ) {
79111 for _ , in := range []string {
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" ,
112+ "sequenceDiagram\n Alice (->>) Bob: parens around arrow" ,
113+ "sequenceDiagram\n Alice ( )->> Bob: space inside circle" ,
114+ "sequenceDiagram\n Alice (()->> Bob: unbalanced" ,
85115 } {
86116 if _ , err := Parse (in ); err == nil {
87- t .Errorf ("expected error for central-connection syntax %q, got none" , in )
117+ t .Errorf ("expected error for malformed central connection %q, got none" , in )
88118 }
89119 }
90120}
0 commit comments