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