UNPKG

satie

Version:

A sheet music renderer for the web

129 lines (117 loc) 5.08 kB
/** * This file is part of Satie music engraver <https://github.com/jnetterf/satie>. * Copyright (C) Joshua Netterfield <joshua.ca> 2015 - present. * * Satie is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * Satie is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Satie. If not, see <http://www.gnu.org/licenses/>. */ /** * @file part of Satie test suite */ import {forEach} from "lodash"; import * as child_process from "child_process"; import * as fs from "fs"; import SongImpl from "../engine_songImpl"; function readFile(file: string, onEnd: (s: string) => void) { fs.readFile(file, "utf8", function (err, data) { if (err) { throw err; } onEnd(data); }); } function mkdirp(path: string) { try { fs.mkdirSync(path); } catch (e) { if (e.code !== "EEXIST") { throw e; } } } describe("Import/export tests", function() { const lilyRoot = "vendor/lilypond-regression"; const lilyFiles = fs.readdirSync(lilyRoot); // needs to be setup before leaving 'describe' forEach(lilyFiles, file => { if (file.match(/[0-9]..\.xml$/)) { testFile(lilyRoot, file); } }); const satieRoot = "vendor/satie-regression"; const satieFiles = fs.readdirSync(satieRoot); // needs to be setup before leaving 'describe' forEach(satieFiles, file => { if (file.match(/\.xml$/)) { testFile(satieRoot, file); } }); mkdirp("rendertest"); mkdirp("rendertest/out"); function testFile(root: string, file: string) { const outname = `${root.replace("/", "_").replace("-", "_")}_${file.replace("-", "_")}` .replace(".xml", ".svg"); it(file, function(done) { readFile(root + "/" + file, function(musicXML) { let song = new SongImpl({ baseSrc: musicXML, onError: done, onLoaded: () => { try { // HACK: Overwrite encoding date to always be the same, so test results don't change overnight. // Note: this is not the correct way of modifying a document -- use patches! song.header.identification.encoding.encodingDate = { day: 1, month: 1, year: 2016, }; // HACK: overwrite UUIDs, so test results don't change every time. // Note: this is not the correct way of modifying a document -- use patches! song.getDocument(null).measures.forEach((measure, idx) => { measure.uuid = 42 + idx; }); const page1Svg = song.toSVG(); fs.writeFile("rendertest/out/" + outname, page1Svg); if (!process.env.SKIP_DTD_VALIDATION) { let mxmlOut = song.toMusicXML(); let stdout: string; let stderr: string; let error: string; let env = Object.create(process.env); env.XML_CATALOG_FILES = "./vendor/musicxml-dtd/catalog.xml"; fs.writeFile("rendertest/out/" + outname + ".xml", mxmlOut); let proc = child_process.spawnSync("xmllint", ["--valid", "--noout", "--nonet", "-"], { input: mxmlOut, env: env }); stdout = String(proc.stdout); stderr = String(proc.stderr); error = "" + proc.error; if (stdout || stderr) { done(new Error(stderr || stdout || error)); } else { done(); } } else { done(); } } catch(err) { done(err); return; } }, }); song.run(); }); }); } });