| describe("Slurs", function() { | |
| var abcSlurBeams = "X:1\n" + | |
| "L:1/8\n" + | |
| "M:4/4\n" + | |
| "%%score (S A)\n" + | |
| "K:C\n" + | |
| "[V:S]G2 cc3 ||\n" + | |
| "[V:A]E2E (EFG) ||"; | |
| var abcSlurBeams2 = "X:1\n" + | |
| "L:1/8\n" + | |
| "M:4/4\n" + | |
| "%%score (S A) (T B)\n" + | |
| "K:C\n" + | |
| "[V:S](EFGCF2) (EF) | (E2D2) C4 | (f2e)c ||\n" + | |
| "[V:A](C4CB,) C2 | (C2B,2) C4 | (c2G)E ||\n" + | |
| "[V:T](G,4 A,F,) (G,F,) | G,2>F,2 E,4 | f(e c2) ||\n" + | |
| "[V:B](C,D, E,2 D,2) (C,A,,) | G,,4 C,4 | c(G E2) ||\n" | |
| it("slur around beams", function() { | |
| abcjs.renderAbc("paper", abcSlurBeams, {add_classes: true}); | |
| var slur = document.querySelector('.abcjs-slur') | |
| var beam = document.querySelector('.abcjs-beam-elem') | |
| var slurPos = slur.getBBox() | |
| var beamPos = beam.getBBox() | |
| chai.assert.isAbove(slurPos.y, beamPos.y, "slur should be underneath beam"); | |
| }) | |
| it("slurs-around-beams2", function() { | |
| var visualObj = abcjs.renderAbc("paper", abcSlurBeams2, {add_classes: true}); | |
| var slurY = [] | |
| for (var i = 0; i < visualObj[0].lines[0].staffGroup.voices.length; i++) { | |
| var voice = visualObj[0].lines[0].staffGroup.voices[i] | |
| for (var s = 0; s < voice.otherchildren.length; s++) { | |
| var slur = voice.otherchildren[s] | |
| if (slur.type === 'TieElem') { | |
| slurY.push({s: Math.round(slur.startY), e: Math.round(slur.endY)}) | |
| } | |
| } | |
| } | |
| var expected = [ | |
| {s: 13, e: 3}, | |
| {s: 10, e: 11}, | |
| {s: 5, e: 4}, | |
| {s: 13, e: 12}, | |
| {s: 0, e: -8}, | |
| {s: 0, e: -1}, | |
| {s: 7, e: 4}, | |
| {s: 0, e: 5}, | |
| {s: 6, e: 6}, | |
| {s: 12, e: 10}, | |
| {s: -14, e: -6}, | |
| {s: -15, e: -16}, | |
| {s: 4, e: 2}, | |
| ] | |
| chai.assert.deepStrictEqual(slurY, expected, "Vertical placement of slurs"); | |
| }) | |
| }) | |