1function assertSingleActor(d, alias, name) {
2
3  name = name || alias;
4
5  equal(d.actors.length, 1, 'Correct actors count');
6
7  var a = d.actors[0];
8  equal(a.name, name, 'Actors A\'s name');
9  equal(a.alias, alias, 'Actors A\'s alias');
10  equal(a.index, 0, 'Actors A\'s index');
11}
12
13function assertSingleArrow(d, arrowtype, linetype, actorA, actorB, message) {
14
15  actorA = actorA || 'A';
16  actorB = actorB || 'B';
17  message = message || 'Message';
18
19  equal(d.actors.length, 2, 'Correct actors count');
20
21  var a = d.actors[0];
22  var b = d.actors[1];
23  equal(a.name, actorA, 'Actors A name');
24  equal(b.name, actorB, 'Actors B name');
25
26  equal(d.signals.length, 1, 'Correct signals count');
27  equal(d.signals[0].type, 'Signal', 'Correct signal type');
28  equal(d.signals[0].actorA, a, 'Actors A');
29  equal(d.signals[0].actorB, b, 'Actors B');
30
31  equal(d.signals[0].message, message, 'Signal message');
32
33  equal(d.signals[0].arrowtype, arrowtype, 'Arrowhead type');
34  equal(d.signals[0].linetype, linetype, 'Line type');
35}
36
37function assertSingleNote(d, placement, actors, message) {
38
39  message = message || 'Message';
40
41  equal(d.signals.length, 1, 'Correct notes count');
42
43  var note = d.signals[0];
44  equal(note.type, 'Note', 'Correct signal type');
45  equal(note.placement, placement, 'Correct signal placement');
46  equal(note.message, message, 'Correct signal message');
47
48  if (_.isArray(actors)) {
49    equal(_.isArray(d.actors), true, 'Correct actors array');
50    equal(d.actors.length, actors.length, 'Correct actors count');
51
52    equal(note.actor.length, actors.length, 'Correct note actors');
53    for (var i = 0; i < actors.length; i++) {
54      equal(d.actors[i].name, actors[i], 'Correct actor');
55      equal(note.actor[i].name, actors[i], 'Correct note actor');
56    }
57
58  } else {
59    equal(d.actors.length, 1, 'Correct actors count');
60    equal(note.actor.name, actors, 'Correct note actor');
61  }
62}
63
64function assertEmptyDocument(d) {
65  equal(d.title, undefined, 'No title');
66  equal(d.actors.length,  0, 'Zero actors');
67  equal(d.signals.length, 0, 'Zero signals');
68}
69
70var LINETYPE = Diagram.LINETYPE;
71var ARROWTYPE = Diagram.ARROWTYPE;
72var PLACEMENT = Diagram.PLACEMENT;
73
74/*
75function regextest(regex, string) {
76	console.log(string, regex.exec(string));
77}
78
79test("Regex Tests", function() {
80	// These are here to debug regex problems with unicode
81	//var r = /[^\->:\n,]+\b/;
82	var r = /[^\->:\n,]+/;
83	regextest(r, "blah");
84	regextest(r, "bl:ah");
85	regextest(r, "中国");
86	regextest(r, " 中国 ");
87
88	regextest(/^(.+) as (\S+)\s*$/i, "blah");
89	regextest(/^(.+) as (\S+)\s*$/i, " as as as b");
90});
91*/
92
93test('Solid Arrow', function() {
94  var d = Diagram.parse('A->B: Message');
95  assertSingleArrow(d, ARROWTYPE.FILLED, LINETYPE.SOLID);
96});
97
98test('Dashed Arrow', function() {
99  var d = Diagram.parse('A-->B: Message');
100  assertSingleArrow(d, ARROWTYPE.FILLED, LINETYPE.DOTTED);
101});
102
103test('Solid Open Arrow', function() {
104  var d = Diagram.parse('A->>B: Message');
105  assertSingleArrow(d, ARROWTYPE.OPEN, LINETYPE.SOLID);
106});
107
108test('Dashed Open Arrow', function() {
109  var d = Diagram.parse('A-->>B: Message');
110  assertSingleArrow(d, ARROWTYPE.OPEN, LINETYPE.DOTTED);
111});
112
113test('Titles', function() {
114  equal(Diagram.parse('Title: title').title, 'title', 'Title');
115  equal(Diagram.parse('Title: line1\\nline2').title, 'line1\nline2', 'Multiline Title');
116});
117
118test('Unicode', function() {
119  equal(Diagram.parse('Title: 中国').title, '中国', 'Unicode Title');
120  assertEmptyDocument(Diagram.parse('# 中国'));
121  assertSingleActor(Diagram.parse('Participant 中国'), '中国');
122  assertSingleActor(Diagram.parse('Participant 中国 as alias'), 'alias', '中国');
123  assertSingleActor(Diagram.parse('中国->中国: Message'), '中国');
124});
125
126test('Empty documents', function() {
127  assertEmptyDocument(Diagram.parse(''));
128  assertEmptyDocument(Diagram.parse(' \t\n'));
129  assertEmptyDocument(Diagram.parse('\r\n\r\n'));
130});
131
132test('Whitespace', function() {
133  assertSingleArrow(Diagram.parse('  A  -  > B  : Message  '), ARROWTYPE.FILLED, LINETYPE.SOLID);
134  assertSingleArrow(Diagram.parse('\n\nA->B: Message\n\n'), ARROWTYPE.FILLED, LINETYPE.SOLID);
135
136  assertSingleActor(Diagram.parse('  A  -> A: blah'), 'A');
137});
138
139test('Comments', function() {
140  // Comments must be on lines on their own
141  assertEmptyDocument(Diagram.parse('#'));
142  assertEmptyDocument(Diagram.parse('# comment'));
143  assertEmptyDocument(Diagram.parse(' # comment'));
144  assertEmptyDocument(Diagram.parse('# A->B: Title'));
145
146  // If # is encountered elsewhere, it is part of the names
147  assertSingleArrow(Diagram.parse('A#->B: Message'), ARROWTYPE.FILLED, LINETYPE.SOLID, 'A#', 'B');
148  assertSingleArrow(Diagram.parse('A->B#: Message'), ARROWTYPE.FILLED, LINETYPE.SOLID, 'A', 'B#');
149  assertSingleArrow(Diagram.parse('A->B: Message # not a comment'), ARROWTYPE.FILLED,
150      LINETYPE.SOLID, 'A', 'B', 'Message # not a comment');
151
152  equal(Diagram.parse('Title: title # not a comment').title, 'title # not a comment');
153  assertSingleNote(Diagram.parse('note left of A: Message # not a comment'), PLACEMENT.LEFTOF, 'A',
154      'Message # not a comment');
155});
156
157test('Notes', function() {
158  assertSingleNote(Diagram.parse('Note left of A: Message'), PLACEMENT.LEFTOF, 'A');
159  assertSingleNote(Diagram.parse('Note right of A: Message'), PLACEMENT.RIGHTOF, 'A');
160  assertSingleNote(Diagram.parse('Note over A: Message'), PLACEMENT.OVER, 'A');
161  assertSingleNote(Diagram.parse('Note over A,B: Message'), PLACEMENT.OVER, ['A', 'B']);
162
163  // We don't allow "as X" when referencing an actor
164  assertSingleNote(Diagram.parse('Note over C as A,B: Message'), PLACEMENT.OVER, ['C as A', 'B']);
165});
166
167test('Participants', function() {
168  assertSingleActor(Diagram.parse('Participant Bob'), 'Bob');
169  assertSingleActor(Diagram.parse('Participant Name with spaces'), 'Name with spaces');
170  assertSingleActor(Diagram.parse('Participant Name with spaces as alias'),
171      'alias', 'Name with spaces');
172  assertSingleActor(Diagram.parse('Participant Name with \'as\' in it'), 'Name with \'as\' in it');
173  assertSingleActor(Diagram.parse('Participant Double as as alias'), 'alias', 'Double as');
174  assertSingleActor(Diagram.parse('Participant Bob \\n with newline'), 'Bob \n with newline');
175  assertSingleActor(Diagram.parse('Participant Bob \\n with newline as alias'),
176      'alias', 'Bob \n with newline');
177  assertSingleActor(Diagram.parse('Participant Object'), 'Object');
178});
179
180test('Newlines', function() {
181  assertSingleActor(Diagram.parse('Participant A\nNote left of A: Hello'), 'A');
182  assertSingleActor(Diagram.parse('Participant A\rNote left of A: Hello'), 'A');
183  assertSingleActor(Diagram.parse('Participant A\r\nNote left of A: Hello'), 'A');
184});
185
186test('Quoted names', function() {
187  assertSingleArrow(Diagram.parse('"->:"->B: M'), ARROWTYPE.FILLED, LINETYPE.SOLID,
188      '->:', 'B', 'M');
189  assertSingleArrow(Diagram.parse('A->"->:": M'), ARROWTYPE.FILLED, LINETYPE.SOLID,
190      'A', '->:', 'M');
191  assertSingleActor(Diagram.parse('Participant "->:"'), '->:');
192});
193
194test('API', function() {
195  // Public API
196  ok(typeof Diagram.parse == 'function');
197
198  var d = Diagram.parse('Participant A');
199  ok(d instanceof Diagram);
200  ok(typeof d.drawSVG == 'function');
201
202  // Private API
203  ok(typeof d.getActor == 'function');
204  ok(typeof d.getActorWithAlias == 'function');
205  ok(typeof d.setTitle == 'function');
206  ok(typeof d.addSignal == 'function');
207});
208