UNPKG

satie

Version:

A sheet music renderer for the web

152 lines (135 loc) 4.75 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 {Attributes} from "musicxml-interfaces"; import AttributesModel from "../implAttributes_attributesModel"; import {expect} from "chai"; import {ISegment, IModel, Type} from "../document"; import {ValidationCursor, LayoutCursor} from "../private_cursor"; import Factory from "../engine_factory"; export function makeCursor(factory: Factory, models: ISegment): ValidationCursor { models.part = "P1"; let v: ValidationCursor = { const: () => v, document: { __fakeDocument: true } as any, fixup: null, dangerouslyPatchWithoutValidation: null, patch: null, advance: null, segmentInstance: <any> models, segmentPosition: 0, staffAttributes: <any> { divisions: 60, clef: { sign: "G", clefOctaveChange: "0", line: 2 }, time: { beats: ["4"], beatTypes: [4], senzaMisura: null } }, staffAccidentals: {}, staffIdx: 0, measureInstance: { uuid: 100, nonControlling: false, idx: 0, number: "1", implicit: false, parts: { "P1": { staves: [ null, { } ], voices: null, } } } as any, measureIsLast: true, print: null, header: <any> { partList: [ { _class: "ScorePart", id: "P1" } ] }, segmentDivision: 0, factory: factory, preview: false, singleLineMode: false, }; return v; } function FakeChord(constructors: { [key: number]: any }) { constructors[Type.Chord] = function() { // pass }; } describe("[attributes.ts]", function() { describe("AttributesModel", function() { let factory = new Factory([AttributesModel, FakeChord]); let attributes: Attributes & IModel; let segment: ISegment; it("can be created", function() { attributes = factory.create(Type.Attributes); expect(!!attributes).to.be.true; // Divisions is usually set by the engine attributes.divisions = 100; segment = [attributes] as any; let cursor = makeCursor(factory, segment); cursor.staffAttributes = <any> {}; attributes.refresh(cursor); }); it("lays out properly when at start of song", function() { let cursor = makeCursor(factory, segment); cursor.staffAttributes = {} as any; const lCursor: LayoutCursor = {...cursor, measureX: 0, lineShortest: Number.MAX_VALUE, lineBarOnLine: 0, lineTotalBarsOnLine: 1, lineIndex: 0, lineCount: 1, segmentX: 100, lineMaxPaddingTopByStaff: [], lineMaxPaddingBottomByStaff: [], }; let layout = attributes.getLayout(lCursor) as AttributesModel.IAttributesLayout; expect(!!layout.keySignature).to.be.true; expect(!!layout.time).to.be.true; expect(!!layout.clef).to.be.true; expect(layout.tsSpacing).to.be.gt(0); expect(layout.clefSpacing).to.be.gt(0); expect(layout.ksSpacing).to.be.gt(0); expect(layout.x).to.be.lt(lCursor.segmentX); let expectedChange = layout.clefSpacing + layout.tsSpacing + layout.ksSpacing; expect(lCursor.segmentX - layout.x).to.equal(expectedChange); }); }); });