abcjs / tests /visual /misc.test.js
KEXEL's picture
Upload 337 files
af6912c verified
describe("Miscellaneous", function () {
var abcJazzChords = "X:1\n" +
"%%jazzchords\n" +
"K:C\n" +
"\"C7\"C \"C/B\"B \"x\"A \"x/C\"G \"/E\"E|";
var expectedJazzChords = [
{input: 'C7', output: 'C\x037\x03'},
{input: 'C/B', output: 'C\x03\x03/B'},
{input: 'x', output: '\x03x\x03'},
{input: 'x/C', output: '\x03x\x03/C'},
{input: '/E', output: '\x03\x03/E'},
]
var abcGlissando = "X:1\n" +
"L:1/4\n" +
"%%stretchlast\n" +
"!glissando(!C!glissando)!e\n" +
"!glissando(!C!glissando)!E !glissando(!C!glissando)!F !glissando(!C!glissando)!G !glissando(!C!glissando)!A !glissando(!C!glissando)!B !glissando(!C!glissando)!c \n" +
"!glissando(!C!glissando)!d !glissando(!C!glissando)!e !glissando(!C!glissando)!f\n" +
"!glissando(!g!glissando)!f !glissando(!g!glissando)!e !glissando(!g!glissando)!d !glissando(!g!glissando)!c !glissando(!g!glissando)!f !glissando(!g!glissando)!A !glissando(!g!glissando)!G !glissando(!g!glissando)!F !glissando(!g!glissando)!E !glissando(!g!glissando)!D \n" +
"\n" +
"\n" +
"\n" +
"\n" +
"\n";
var expectedGlissando = [
{x: 63, y: 36, w: 329, h: 40},
{x: 63, y: 156, w: 35, h: 12},
{x: 181, y: 153, w: 35, h: 14},
{x: 298, y: 150, w: 35, h: 16},
{x: 416, y: 147, w: 35, h: 18},
{x: 533, y: 144, w: 35, h: 20},
{x: 651, y: 139, w: 41, h: 25},
{x: 63, y: 227, w: 95, h: 32},
{x: 298, y: 223, w: 95, h: 35},
{x: 533, y: 218, w: 101, h: 40},
{x: 63, y: 307, w: 17, h: 7},
{x: 133, y: 308, w: 17, h: 8},
{x: 204, y: 309, w: 17, h: 9},
{x: 275, y: 311, w: 17, h: 10},
{x: 345, y: 307, w: 17, h: 7},
{x: 416, y: 313, w: 17, h: 11},
{x: 486, y: 315, w: 17, h: 12},
{x: 557, y: 316, w: 23, h: 18},
{x: 628, y: 318, w: 23, h: 20},
{x: 698, y: 319, w: 29, h: 28},
]
var abcDirectives = "X:1\n" +
"L:1/4\n" +
"CCCC!D.C.alcoda!|DDDD!D.C.alfine!|EEEE!D.S.alcoda!|FFFF!D.S.alfine!|!D.C.!G!5!GGG|\n"
var expectedDirectives = [
{ c: 'D.C. al coda', anchor: 'end'},
{ c: 'D.C. al fine', anchor: 'end'},
{ c: 'D.S. al coda', anchor: 'end'},
{ c: 'D.S. al fine', anchor: 'end'},
{ c: 'D.C.', anchor: 'middle'},
{ c: '5', anchor: 'middle'},
]
var abcSetFont = 'X:1\n' +
'%%setfont-1 cursive 16 bold\n' +
'%%setfont-7 Arial 19 bold\n' +
'T:Title $1bold$0 $$100 reg, the\n' +
'T:subtitle $1bold$0 reg\n' +
'C:Thomas $7Fats$0 Waller\n' +
'O:Copyright $11924$0 All Rights Reserved\n' +
'A:by $1Me\n' +
'P:AA$1BB$0CC\n' +
'H:one $1two $0 three\n' +
'H:aye $1bee $0 sea\n' +
'B:$1book\n' +
'D:records\n' +
'N:four $1five $0 six\n' +
'N:seven\n' +
'L:1/4\n' +
'M:4/4\n' +
'W: lo $1loo $0lou $$1dollar\n' +
'K:C\n' +
'"C$1m$7\\ntwo"G "Dm7"E2 F | "^above $1the$0 staff"D4 |]\n' +
'w: la $1le $0lu\n' +
'P:chorus $1with feeling\n' +
'A4|' +
'\n' +
'X:1\n' +
'T:Title bold $$100 reg, the\n' +
'T:subtitle bold reg\n' +
'C:Thomas Fats Waller\n' +
'O:Copyright 1924 All Rights Reserved\n' +
'A:by Me\n' +
'P:AABBCC\n' +
'H:one two three\n' +
'H:aye bee sea\n' +
'N:four five six\n' +
'N:seven\n' +
'L:1/4\n' +
'M:4/4\n' +
'W: lo loo lou $$1dollar\n' +
'K:C\n' +
'"Cm"G E2 F | "^above the staff"D4 |]\n' +
'w: la le lu\n' +
'P:chorus with feeling\n' +
'A4|'
var expectedSetFont = [
{"klass":"abcjs-title","phrases":[
{"content":"The Title ","attrs":{"font-family":"Times New Roman","font-size":27,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"bold","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" $100 reg","attrs":{"font-family":"Times New Roman","font-size":27,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}
]},
{"klass":"abcjs-text abcjs-subtitle","phrases":[
{"content":"subtitle ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"bold","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" reg","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}
]},
{"klass":"abcjs-composer","phrases":[
{"content":"Thomas ","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},
{"content":"Fats","attrs":{"font-family":"Arial","font-size":19,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" Waller","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},
{"content":" (","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},{"content":"Copyright ","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},
{"content":"1924","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" All Rights Reserved","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},
{"content":")","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}]},
{"klass":"abcjs-author","phrases":[
{"content":"by ","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},
{"content":"Me","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}]},
{"klass":"abcjs-part-order","phrases":[
{"content":"AA","attrs":{"font-family":"Times New Roman","font-size":20,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"BB","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":"CC","attrs":{"font-family":"Times New Roman","font-size":20,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}]},
{"key":"subtitle","text":[{"text":"subtitle "},{"font":{"face":"cursive","weight":"bold","style":"normal","decoration":"none","size":16},"text":"bold"},{"text":" reg"}]},
{"key":"chord","text":"C$1m$7"},
{"key":"lyric","text":"la"},
{"key":"chord","text":"Dm7"},
{"key":"lyric","text":"$1le"},
{"key":"lyric","text":"$0lu"},
{"key":"chord","text":"above $1the$0 staff"},
{"phrases":[
{"content":"lo ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"loo ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":"lou $1dollar","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}
]},
{"klass":"abcjs-extra-text abcjs-book","phrases":[
{"content":"Book: ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"book","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}
]},
{"klass":"abcjs-extra-text abcjs-discography","font":"historyfont","text":"Discography: records"},
{"font":"historyfont","text":"Notes:"},
{"phrases":[
{"content":"four ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"five ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" six","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}
]},
{"font":"historyfont","text":"seven"},
{"font":"historyfont","text":"History:"},
{"phrases":[
{"content":"one ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"two ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" three","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}
]},
{"phrases":[
{"content":"aye ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}},
{"content":"bee ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}},
{"content":" sea","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}
]}
]
var abcLineWidth = 'X:1\n' +
"L:1/8\n" +
"AB||ef g D|Df f/D/| A,4 c'4|]\n"
var abcAccentPosition = 'X:1\n' +
"K:C\n" +
"!>!A2!>!c2|T!>!A2T!>!c2|]\n"
it("line-width", function () {
abcjs.renderAbc("paper", abcLineWidth, { add_classes: true});
var height = extractHeight()
chai.assert.equal(height, "0.700", "No change to lineThickness")
abcjs.renderAbc("paper", abcLineWidth, { add_classes: true, lineThickness: 0.1});
height = extractHeight()
chai.assert.equal(height, "0.900", "lineThickness = 0.1")
abcjs.renderAbc("paper", abcLineWidth, { add_classes: true, lineThickness: 0.5});
height = extractHeight()
chai.assert.equal(height, "1.700", "lineThickness = 0.5")
})
function extractHeight() {
var topLine = document.querySelector("#paper .abcjs-top-line")
var path = topLine.getAttribute('d')
var coordinates = path.split(" L ")
var first = coordinates[1].split(' ')
var second = coordinates[2].split(' ')
return (parseFloat(second[1]) - parseFloat(first[1])).toFixed(3)
}
it("accent position", function () {
abcjs.renderAbc("paper", abcAccentPosition, { accentAbove: true });
abcjs.renderAbc("paper2", abcAccentPosition, { });
})
it("jazz chords", function () {
extractChords(abcJazzChords, expectedJazzChords);
})
it("glissando", function () {
draw(abcGlissando, expectedGlissando);
})
it("directives", function () {
var visualObj = abcjs.renderAbc("paper", abcDirectives);
var voice = visualObj[0].lines[0].staff[0].voices[0]
var results = []
for (var i = 0; i < voice.length; i++) {
var elem = voice[i].abselem.children;
for (var j = 0; j < elem.length; j++) {
var rel = elem[j]
if (rel.type === 'decoration')
results.push({ c: elem[j].c, anchor: elem[j].anchor })
}
}
chai.assert.deepEqual(results, expectedDirectives)
})
it("set-font", function() {
var visualObj = abcjs.renderAbc(["paper", 'paper2'], abcSetFont, {add_classes:true, jazzchords: true});
var results = extractText(visualObj)
for (var i = 0; i < results.length; i++) {
chai.assert.deepEqual(results[i], expectedSetFont[i], "index: " + i + "\n" + JSON.stringify(results[i])+"\n" + JSON.stringify(expectedSetFont[i]))
}
})
})
function extractText(visualObj) {
var textResults = []
// Object.keys(visualObj[0].metaText).forEach(key => {
// if (key !== 'unalignedWords' && key !== 'history')
// textResults.push({key: key, text: visualObj[0].metaText[key] })
// })
var topText = visualObj[0].topText.rows.filter(item => {
return item.text !== undefined || item.phrases !== undefined
}).map(item => {
var ret = {}
if (item.klass) ret.klass = item.klass;
if (item.font) ret.font = item.font
if (item.text) ret.text = item.text
if (item.phrases) ret.phrases = item.phrases
return ret
})
textResults = textResults.concat(topText)
for (var i = 0; i < visualObj[0].lines.length; i++) {
var line = visualObj[0].lines[i]
if (line.subtitle) {
textResults.push({key: 'subtitle', text:line.subtitle.text})
} else if (line.staff) {
var voice = line.staff[0].voices[0]
for (var i = 0; i < voice.length; i++) {
var elem = voice[i];
if (elem.chord) {
for (var j = 0; j < elem.chord.length; j++) {
var chord = elem.chord[j]
var item = { key: "chord", text: chord.name}
if (chord.font)
item.font = chord.font
textResults.push(item)
}
}
if (elem.lyric) {
for (var j = 0; j < elem.lyric.length; j++) {
var lyric = elem.lyric[j]
var item = {key: "lyric", text: lyric.syllable}
if (lyric.font)
item.font = lyric.font
textResults.push(item)
}
}
}
}
}
var bottomText = visualObj[0].bottomText.rows.filter(item => {
return item.text !== undefined || item.phrases !== undefined
}).map(item => {
var ret = {}
if (item.klass) ret.klass = item.klass;
if (item.font) ret.font = item.font
if (item.text) ret.text = item.text
if (item.phrases) ret.phrases = item.phrases
return ret
})
textResults = textResults.concat(bottomText)
console.log(JSON.stringify(textResults))
return textResults
}
function extractChords(abc, expected) {
var visualObj = abcjs.renderAbc("paper", abc);
var line = visualObj[0].lines[0];
var staff = line.staff[0];
var voice = staff.voices[0];
var chords = [];
for (var i = 0; i < voice.length; i++) {
var el = voice[i];
if (el.chord) {
var output = el.abselem.extra[0]
chords.push({input: el.chord[0].name, output: output.c})
}
}
//console.log(chords)
chai.assert.equal(chords.length, expected.length, "wrong number of chords");
for (i = 0; i < chords.length; i++) {
chai.assert.equal(chords[i].input, expected[i].input, i + ": Inputs different");
chai.assert.equal(chords[i].output, expected[i].output, i + ": Outputs different");
}
}
function draw(abc, expected) {
var visualObj = abcjs.renderAbc("paper", abc);
var gliss = document.querySelectorAll('[data-name="glissando"]')
for (var i = 0; i < gliss.length; i++) {
var bb = gliss[i].getBBox()
bb = {x: Math.round(bb.x), y: Math.round(bb.y), w: Math.round(bb.width), h: Math.round(bb.height)}
//console.log(bb)
chai.assert.deepEqual(bb, expected[i])
}
}