| describe("Parsing", function () { | |
| var abc1 = "X:3\n{Azzz}e2\n" | |
| var expected1 = [[{ | |
| gracenotes: [{pitch: 5, name: 'A', duration: 0.125, verticalPos: 5}], | |
| pitches: [{pitch: 9, name: 'e', verticalPos: 9, highestVert: 9}], | |
| duration: 0.25, | |
| el_type: "note", | |
| }]] | |
| var abc2 = "X: 789\nSx\n" | |
| var expected2 = [[{ | |
| rest: { type: 'invisible' }, | |
| duration: 0.125, | |
| el_type: "note", | |
| }]] | |
| var abc3 = "X: 360\n[V:1]f|\\\n[V:1]f|\n" | |
| var expected3 = [[ | |
| { pitches:[{ pitch: 10, name: 'f', verticalPos: 10, highestVert: 10}], duration: 0.125, el_type: 'note'}, | |
| { type: 'bar_thin', el_type: 'bar'}, | |
| { pitches:[{ pitch: 10, name: 'f', verticalPos: 10, highestVert: 10}], duration: 0.125, el_type: 'note'}, | |
| { type: 'bar_thin', el_type: 'bar'}, | |
| ]] | |
| var abc4 = "X: 360\n[V:T]c|\\\n[V:B]A|\\\n[V:T]d|\n" | |
| var expected4 = [ | |
| [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 7, name: 'c', verticalPos: 7, highestVert: 7}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 5, name: 'A', verticalPos: 5, highestVert: 11}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 8, name: 'd', verticalPos: 8, highestVert: 8}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ] | |
| ] | |
| var abc5 = "X: 360\n[V:T]c|[V:B]A|[V:T]d|\n" | |
| var expected5 = [ | |
| [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 7, name: 'c', verticalPos: 7, highestVert: 7}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 5, name: 'A', verticalPos: 5, highestVert: 11}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 8, name: 'd', verticalPos: 8, highestVert: 8}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ] | |
| ] | |
| var abc6 = "X: 360\n%%score (T B)\n[V:T]c|\\\n[V:B]A|\\\n[V:T]d|\n" | |
| var expected6 = [ | |
| [ | |
| { direction: 'up', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":7,"name":"c","verticalPos":7,"highestVert":13}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'down', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":5,"name":"A","verticalPos":5,"highestVert":5}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":8,"name":"d","verticalPos":8,"highestVert":8}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 8, name: 'd', verticalPos: 8, highestVert: 8}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ] | |
| ] | |
| var abc7 = "X: 360\n%%score (T B)\n[V:T]c|[V:B]A|[V:T]d|\n" | |
| var expected7 = [ | |
| [ | |
| { direction: 'up', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":7,"name":"c","verticalPos":7,"highestVert":13}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'down', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":5,"name":"A","verticalPos":5,"highestVert":5}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":8,"name":"d","verticalPos":8,"highestVert":8}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { duration: 0.125, el_type: 'note', pitches: [{pitch: 8, name: 'd', verticalPos: 8, highestVert: 8}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ] | |
| ] | |
| var abc8 = "X: 360\n%%score (T B)\n[V:T]a|\n[V:T]b|\n[V:T]c|\n[V:B]A|\n[V:B]B|\n[V:B]C|\n" | |
| var expected8 = [ | |
| [ | |
| { direction: 'up', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":12,"name":"a","verticalPos":12,"highestVert":18}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'down', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":5,"name":"A","verticalPos":5,"highestVert":5}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'up', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":13,"name":"b","verticalPos":13,"highestVert":19}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'down', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":6,"name":"B","verticalPos":6,"highestVert":6}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'up', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":7,"name":"c","verticalPos":7,"highestVert":13}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { direction: 'down', el_type: 'stem'}, | |
| { duration: 0.125, el_type: 'note', pitches: [{"pitch":0,"name":"C","verticalPos":0,"highestVert":0}]}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ] | |
| ] | |
| var abc9 = "X: 360\n%%score (T B)\n[V:T]a|\\\n[V:T]b|\\\n[V:T]c|\\\n[V:B]A|\\\n[V:B]B|\\\n[V:B]C|\n" | |
| var expected9 = [ | |
| [ | |
| { el_type: 'stem', direction: 'up'}, | |
| { el_type: 'note', pitches: [{ pitch: 12, name: 'a', verticalPos: 12, highestVert: 18}], duration: 0.125}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| { el_type: 'note', pitches: [{ pitch: 13, name: 'b', verticalPos: 13, highestVert: 19}], duration: 0.125}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| { el_type: 'note', pitches: [{ pitch: 7, name: 'c', verticalPos: 7, highestVert: 13}], duration: 0.125}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ], [ | |
| { el_type: 'stem', direction: 'down'}, | |
| { el_type: 'note', pitches: [{ pitch: 5, name: 'A', verticalPos: 5, highestVert: 5}], duration: 0.125}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| { el_type: 'note', pitches: [{ pitch: 6, name: 'B', verticalPos: 6, highestVert: 6}], duration: 0.125}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| { el_type: 'note', pitches: [{ pitch: 0, name: 'C', verticalPos: 0, highestVert: 0}], duration: 0.125}, | |
| { el_type: 'bar', type: 'bar_thin'}, | |
| ] | |
| ] | |
| it("crashes", function () { | |
| testParser(abc1, expected1, "abc1"); | |
| }) | |
| it("crash2", function () { | |
| testParser(abc2, expected2, "abc2"); | |
| }) | |
| it("crash3", function () { | |
| testParser(abc3, expected3, "abc3"); | |
| }) | |
| it("crash4", function () { | |
| testParser(abc4, expected4, "abc4"); | |
| }) | |
| it("crash5", function () { | |
| testParser(abc5, expected5, "abc5"); | |
| }) | |
| it("crash6", function () { | |
| testParser(abc6, expected6, "abc6"); | |
| }) | |
| it("crash7", function () { | |
| testParser(abc7, expected7, "abc7"); | |
| }) | |
| it("crash8", function () { | |
| testParser(abc8, expected8, "abc8"); | |
| }) | |
| it("crash9", function () { | |
| testParser(abc9, expected9, "abc9"); | |
| }) | |
| function testParser(abc, expectedLines, comment) { | |
| var visualObj = abcjs.renderAbc("paper", abc); | |
| var testIndex = 0 | |
| for (var lineNum = 0; lineNum < visualObj[0].lines.length; lineNum++) { | |
| var line = visualObj[0].lines[lineNum] | |
| for (var staffNum = 0; staffNum < line.staff.length; staffNum++) { | |
| for (var voiceNum = 0; voiceNum < line.staff[staffNum].voices.length; voiceNum++) { | |
| var line1 = line.staff[staffNum].voices[voiceNum] | |
| var expected = expectedLines[testIndex++] | |
| console.log(lineNum, staffNum, line1) | |
| chai.assert.equal(line1.length, expected.length, "number of elements doesn't match") | |
| for (var i = 0; i < expected.length; i++) { | |
| var expectedEl = expected[i] | |
| var keys = Object.keys(expectedEl).sort() | |
| var foundEl = line1[i] | |
| var foundKeys = Object.keys(foundEl).sort() | |
| foundKeys = foundKeys.filter(k => { | |
| return k !== 'averagepitch' && k !== 'endChar' && k !== 'maxpitch' && k !== 'minpitch' && k !== 'startChar' && k !== 'abselem' | |
| }) | |
| console.log(foundKeys) | |
| chai.assert.deepStrictEqual(foundKeys, keys, 'keys mismatch ' +comment); | |
| for (var j = 0; j < keys.length; j++) { | |
| var expectedAttr = expectedEl[keys[j]] | |
| var foundAttr = line1[i][keys[j]] | |
| console.log(JSON.stringify(foundAttr)) | |
| chai.assert.deepStrictEqual(foundAttr, expectedAttr, keys[j]+' '+i+' '+' '+' '+comment); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }) | |