void TestBarline::barline04() { Score* score = readScore(DIR + "barline04.mscx"); QVERIFY(score); score->doLayout(); // 'go' to 5th measure Measure* msr = score->firstMeasure(); for (int i=0; i < 4; i++) msr = msr->nextMeasure(); // check span data of measure-initial start-repeat bar line Segment* seg = msr->findSegment(SegmentType::StartRepeatBarLine, msr->tick()); QVERIFY2(seg != nullptr, "No SegStartRepeatBarLine segment in measure 5."); BarLine* bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No start-repeat bar line in measure 5."); score->undoChangeSingleBarLineSpan(bar, 2, 2, 6); score->doLayout(); QVERIFY2(bar->span() == 2 && bar->spanFrom() == 2 && bar->spanTo() == 6, "Wrong span data in start-repeat bar line of measure 5."); // check start-repeat bar ine in second staff is gone QVERIFY2(seg->element(1) == nullptr, "Extra start-repeat bar line in 2nd staff of measure 5."); // QVERIFY(saveCompareScore(score, "barline04.mscx", DIR + "barline04-ref.mscx")); delete score; }
void TestMeasure::minWidth() { Score* score = readScore(DIR + "measure-2.mscx"); score->doLayout(); int n = score->systems()->size(); int measuresSystem[n]; for (int i = 0; i < n; ++i) measuresSystem[i] = score->systems()->at(i)->measures().size(); Measure* m1 = score->systems()->at(1)->lastMeasure(); Measure* m2 = score->systems()->at(2)->firstMeasure(); qreal mw1 = m1->minWidth1(); qreal mw2 = m2->minWidth1(); score->doLayout(); printf("m1: %f / %f\n", mw1, m1->minWidth1()); printf("m2: %f / %f\n", mw2, m2->minWidth1()); QCOMPARE(mw1, m1->minWidth1()); QCOMPARE(mw2, m2->minWidth1()); // after second layout nothing should be changed: for (int i = 0; i < n; ++i) { printf("==%d %d == %d\n", i, measuresSystem[i], score->systems()->at(i)->measures().size()); QCOMPARE(measuresSystem[i], score->systems()->at(i)->measures().size()); } }
void TestClefCourtesy::clef_courtesy02() { Score* score = readScore(DIR + "clef_courtesy02.mscx"); score->doLayout(); // 'go' to 4th measure Measure* m1 = score->firstMeasure(); for (int i=0; i < 3; i++) m1 = m1->nextMeasure(); // make a clef-drop object and drop it to the measure Clef* clef = new Clef(score); // create a new element, as Measure::drop() will eventually delete it clef->setClefType(ClefType::G1); DropData dropData; dropData.pos = m1->pagePos(); dropData.element = clef; m1->drop(dropData); // 'go' to 7th measure Measure* m2 = m1; for (int i=0; i < 3; i++) m2 = m2->nextMeasure(); // make a clef-drop object and drop it to the measure clef = new Clef(score); // create a new element, as Measure::drop() will eventually delete it clef->setClefType(ClefType::G); dropData.pos = m2->pagePos(); dropData.element = clef; m2->drop(dropData); score->doLayout(); // check both clef elements are there, but none is shown Clef* clefCourt = nullptr; Measure* m = m1->prevMeasure(); Segment* seg = m->findSegment(SegmentType::Clef, m1->tick()); QVERIFY2(seg != nullptr, "No SegClef in measure 3."); clefCourt = static_cast<Clef*>(seg->element(0)); QVERIFY2(clefCourt != nullptr, "No courtesy clef element in measure 3."); QVERIFY2(clefCourt->bbox().width() == 0, "Courtesy clef in measure 3 is NOT hidden."); clefCourt = nullptr; m = m2->prevMeasure(); seg = m->findSegment(SegmentType::Clef, m2->tick()); QVERIFY2(seg != nullptr, "No SegClef in measure 6."); clefCourt = static_cast<Clef*>(seg->element(0)); QVERIFY2(clefCourt != nullptr, "No courtesy clef element in measure 6."); QVERIFY2(clefCourt->bbox().width() == 0, "Courtesy clef in measure 3 is NOT hidden."); QVERIFY(saveCompareScore(score, "clef_courtesy02.mscx", DIR + "clef_courtesy02-ref.mscx")); delete score; }
void TestTools::undoLockLineBreaks() { QString readFile(DIR + "undoLockLineBreaks.mscx"); QString writeFile1("undoLockLineBreaks01-test.mscx"); QString reference1(DIR + "undoLockLineBreaks01-ref.mscx"); QString writeFile2("undoLockLineBreaks02-test.mscx"); QString reference2(DIR + "undoLockLineBreaks02-ref.mscx"); Score* score = readScore(readFile); score->doLayout(); // select all score->startCmd(); score->cmdSelectAll(); score->endCmd(); // do score->startCmd(); score->addRemoveBreaks(0, true); score->endCmd(); QVERIFY(saveCompareScore(score, writeFile1, reference1)); // undo score->undo()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestMidi::midi02() { MCursor c; c.setTimeSig(Fraction(3,4)); c.createScore("test2a"); c.addPart("voice"); c.move(0, 0); // move to track 0 tick 0 c.addKeySig(Key(2)); c.addTimeSig(Fraction(3,4)); c.addChord(60, TDuration(TDuration::DurationType::V_QUARTER)); c.addChord(61, TDuration(TDuration::DurationType::V_QUARTER)); c.addChord(62, TDuration(TDuration::DurationType::V_QUARTER)); Score* score = c.score(); score->doLayout(); score->rebuildMidiMapping(); c.saveScore(); saveMidi(score, "test2.mid"); Score* score2 = new Score(mscore->baseStyle()); score2->setName("test2b"); QCOMPARE(importMidi(score2, "test2.mid"), Score::FileError::FILE_NO_ERROR); score2->doLayout(); score2->rebuildMidiMapping(); MCursor c2(score2); c2.saveScore(); QVERIFY(compareScores(score, score2)); delete score; delete score2; }
void TestBarline::barline02() { char msg[256]; Score* score = readScore(DIR + "barline02.mscx"); QVERIFY(score); Measure* msr = score->firstMeasure()->nextMeasure(); TimeSig* ts = new TimeSig(score); ts->setSig(Fraction(3, 4), TimeSigType::NORMAL); score->cmdAddTimeSig(msr, 0, ts, false); score->doLayout(); msr = score->firstMeasure(); int msrNo = 1; while ((msr = msr->nextMeasure())) { ++msrNo; Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); sprintf(msg, "No SegEndBarLine in measure %d.", msrNo); QVERIFY2(seg != nullptr, msg); BarLine* bar = static_cast<BarLine*>(seg->element(0)); sprintf(msg, "No barline in measure %d.", msrNo); QVERIFY2(bar != nullptr, msg); // bar line should be generated if NORMAL, except the END one at the end sprintf(msg, "Barline in measure %d changed into 'non-generated'.", msrNo); // ws: end barline is also generated // bool test = (bar->barLineType() == BarLineType::NORMAL) ? bar->generated() : !bar->generated(); bool test = bar->generated(); QVERIFY2(test, msg); } // QVERIFY(saveCompareScore(score, "barline02.mscx", DIR + "barline02-ref.mscx")); delete score; }
void TestMidi::midi3() { MCursor c; c.createScore("test3a"); c.addPart("voice"); c.move(0, 0); // move to track 0 tick 0 c.addKeySig(1); c.addTimeSig(Fraction(4,4)); c.addChord(60, TDuration(TDuration::V_QUARTER)); c.addChord(61, TDuration(TDuration::V_QUARTER)); c.addChord(62, TDuration(TDuration::V_QUARTER)); c.addChord(63, TDuration(TDuration::V_QUARTER)); Score* score = c.score(); score->doLayout(); score->rebuildMidiMapping(); c.saveScore(); saveMidi(score, "test3.mid"); Score* score2 = new Score(mscore->baseStyle()); score2->setName("test3b"); QVERIFY(importMidi(score2, "test3.mid")); score2->doLayout(); score2->rebuildMidiMapping(); MCursor c2(score2); c2.saveScore(); QVERIFY(compareScores(score, score2)); delete score; delete score2; }
void TestTools::undoSlashRhythm() { QString readFile(DIR + "undoSlashRhythm.mscx"); QString writeFile1("undoSlashRhythm01-test.mscx"); QString reference1(DIR + "undoSlashRhythm01-ref.mscx"); QString writeFile2("undoSlashRhythm02-test.mscx"); QString reference2(DIR + "undoSlashRhythm02-ref.mscx"); Score* score = readScore(readFile); score->doLayout(); // select all score->startCmd(); score->cmdSelectAll(); score->endCmd(); // do score->startCmd(); score->cmdSlashRhythm(); score->endCmd(); QVERIFY(saveCompareScore(score, writeFile1, reference1)); // undo score->undo()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
Score* TestInstrumentChange::test_pre(const char* p) { QString p1 = DIR + p + ".mscx"; Score* score = readScore(p1); score->doLayout(); return score; }
void TestMeasure::insertBfKeyChange() { Score* score = readScore(DIR + "measure-insert_bf_key.mscx"); score->doLayout(); // 4th measure Measure* m = score->firstMeasure()->nextMeasure(); m = m->nextMeasure()->nextMeasure(); score->startCmd(); score->insertMeasure(Element::MEASURE, m); score->endCmd(); QVERIFY(saveCompareScore(score, "measure-insert_bf_key.mscx", DIR + "measure-insert_bf_key-ref.mscx")); score->undo()->undo(); score->doLayout(); QVERIFY(saveCompareScore(score, "measure-insert_bf_key_undo.mscx", DIR + "measure-insert_bf_key.mscx")); delete score; }
void TestTools::undoSlashFill() { QString readFile(DIR + "undoSlashFill.mscx"); QString writeFile1("undoSlashFill01-test.mscx"); QString reference1(DIR + "undoSlashFill01-ref.mscx"); QString writeFile2("undoSlashFill02-test.mscx"); QString reference2(DIR + "undoSlashFill02-ref.mscx"); Score* score = readScore(readFile); score->doLayout(); // select Segment* s = score->firstMeasure()->findSegment(Segment::Type::ChordRest, MScore::division * 2); score->selection().setRange(s, score->lastSegment(), 0, 2); // do score->startCmd(); score->cmdSlashFill(); score->endCmd(); QVERIFY(saveCompareScore(score, writeFile1, reference1)); // undo score->undo()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestTools::undoChangeVoice() { QString readFile(DIR + "undoChangeVoice.mscx"); QString writeFile1("undoChangeVoice01-test.mscx"); QString reference1(DIR + "undoChangeVoice01-ref.mscx"); QString writeFile2("undoChangeVoice02-test.mscx"); QString reference2(DIR + "undoChangeVoice02-ref.mscx"); Score* score = readScore(readFile); score->doLayout(); // do score->deselectAll(); // select bottom note of all voice 1 chords for (Segment* s = score->firstSegment(Segment::Type::ChordRest); s; s = s->next1()) { ChordRest* cr = static_cast<ChordRest*>(s->element(0)); if (cr && cr->type() == Element::Type::CHORD) { Ms::Chord* c = static_cast<Ms::Chord*>(cr); score->select(c->downNote(), SelectType::ADD); } } // change voice score->changeVoice(1); QVERIFY(saveCompareScore(score, writeFile1, reference1)); // undo score->undo()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestInstrumentChange::testDelete() { Score* score = test_pre("delete"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); score->deleteItem(ic); score->doLayout(); test_post(score, "delete"); }
void TestMeasure::insertMeasureEnd() { Score* score = readScore(DIR + "measure01.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); score->startCmd(); score->insertMeasure(Element::MEASURE, 0); score->endCmd(); QVERIFY(saveCompareScore(score, "measure01-3.mscx", DIR + "measure01-3-ref.mscx")); delete score; }
void TestInstrumentChange::testAdd() { Score* score = test_pre("add"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = new InstrumentChange(score); ic->setParent(s); ic->setTrack(0); ic->setText("Instrument"); score->undoAddElement(ic); score->doLayout(); test_post(score, "add"); }
void TestCompat::compat() { QFETCH(QString, file); QString readFile(DIR + file + ".mscx"); QString writeFile(file + "-test.mscx"); QString reference(DIR + file + "-ref.mscx"); Score* score = readScore(readFile); score->doLayout(); QVERIFY(score); QVERIFY(saveCompareScore(score, writeFile, reference)); }
void TestNote::grace() { Score* score = readScore(DIR + "grace.mscx"); score->doLayout(); Chord* chord = score->firstMeasure()->findChord(0, 0); Note* note = chord->upNote(); // create score->setGraceNote(chord, note->pitch(), NoteType::APPOGGIATURA, MScore::division/2); Chord* gc = chord->graceNotes().first(); Note* gn = gc->notes().first(); // Note* n = static_cast<Note*>(writeReadElement(gn)); // QCOMPARE(n->noteType(), NoteType::APPOGGIATURA); // delete n; // tie score->startCmd(); score->select(gn); score->cmdAddTie(); score->endCmd(); // n = static_cast<Note*>(writeReadElement(gn)); // QVERIFY(n->tieFor() != 0); // delete n; // tremolo score->startCmd(); Tremolo* tr = new Tremolo(score); tr->setTremoloType(TremoloType::R16); tr->setParent(gc); tr->setTrack(gc->track()); score->undoAddElement(tr); score->endCmd(); // Chord* c = static_cast<Chord*>(writeReadElement(gc)); // QVERIFY(c->tremolo() != 0); // delete c; // articulation score->startCmd(); Articulation* ar = new Articulation(score); ar->setArticulationType(ArticulationType::Sforzatoaccent); ar->setParent(gc); ar->setTrack(gc->track()); score->undoAddElement(ar); score->endCmd(); // c = static_cast<Chord*>(writeReadElement(gc)); // QVERIFY(c->articulations().size() == 1); // delete c; QVERIFY(saveCompareScore(score, "grace-test.mscx", DIR + "grace-ref.mscx")); }
void TestBarline::barline05() { Score* score = readScore(DIR + "barline05.mscx"); QVERIFY(score); score->doLayout(); // 'go' to 4th measure Measure* msr = score->firstMeasure(); for (int i=0; i < 3; i++) msr = msr->nextMeasure(); // create and add a LineBreak element LayoutBreak* lb = new LayoutBreak(score); lb->setLayoutBreakType(LayoutBreak::Type::LINE); lb->setTrack(-1); // system-level element lb->setParent(msr); score->undoAddElement(lb); score->doLayout(); // check an end-repeat bar line has been created at the end of this measure and it is generated Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); QVERIFY2(seg != nullptr, "No SegEndBarLine segment in measure 4."); BarLine* bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No end-repeat barline in measure 4."); QVERIFY2(bar->barLineType() == BarLineType::END_REPEAT, "Barline at measure 4 is not END-REPEAT"); QVERIFY2(bar->generated(), "End-repeat barline in measure 4 is non-generated."); // // check an end-repeat bar line has been created at the beginning of the next measure and it is not generated // check an end-repeat bar line has been created at the beginning of the next measure and it is generated msr = msr->nextMeasure(); seg = msr->findSegment(SegmentType::StartRepeatBarLine, msr->tick()); QVERIFY2(seg != nullptr, "No SegStartRepeatBarLine segment in measure 5."); bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No start-repeat barline in measure 5."); QVERIFY2(bar->generated(), "Start-reapeat barline in measure 5 is not generated."); // QVERIFY(saveCompareScore(score, "barline05.mscx", DIR + "barline05-ref.mscx")); delete score; }
void TestMeasure::spanner_a() { Score* score = readScore(DIR + "measure-3.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); Measure* m = score->firstMeasure()->nextMeasure(); score->startCmd(); score->insertMeasure(Element::MEASURE, m); score->endCmd(); QVERIFY(saveCompareScore(score, "measure-4.mscx", DIR + "measure-4-ref.mscx")); delete score; }
void TestTimesig::timesig03() { Score* score = readScore(DIR + "timesig-03.mscx"); QVERIFY(score); Measure* m = score->firstMeasure()->nextMeasure(); TimeSig* ts = new TimeSig(score); ts->setSig(Fraction(3, 4), TimeSigType::NORMAL); score->cmdAddTimeSig(m, 0, ts, false); score->doLayout(); QVERIFY(saveCompareScore(score, "timesig-03.mscx", DIR + "timesig-03-ref.mscx")); delete score; }
void TestMeasure::insertMeasureBegin() { Score* score = readScore(DIR + "measure1.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); Measure* m = score->firstMeasure(); score->startCmd(); score->insertMeasure(Element::MEASURE, m); score->endCmd(); QVERIFY(saveCompareScore(score, "measure1-2.mscx", DIR + "measure1-2o.mscx")); delete score; }
void TestClef::clef2() { Score* score = readScore(DIR + "clef-2.mscx"); Measure* m = score->firstMeasure(); m = m->nextMeasure(); m = m->nextMeasure(); TimeSig* ts = new TimeSig(score); ts->setSig(2, 4); qDebug("tick %d", m->tick()); score->cmdAddTimeSig(m, 0, ts, false); score->doLayout(); QVERIFY(saveCompareScore(score, "clef-2.mscx", DIR + "clef-2-ref.mscx")); delete score; }
void TestInstrumentChange::testChange() { Score* score = test_pre("change"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); Instrument* ni = score->staff(1)->part()->instr(); ic->setInstrument(*ni); score->startCmd(); ic->setText("Instrument Oboe"); score->undo(new ChangeInstrument(ic, ic->instrument())); score->endCmd(); score->doLayout(); test_post(score, "change"); }
void TestInstrumentChange::testCopy() { Score* score = test_pre("copy"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); m = m->nextMeasure(); s = m->first(Segment::Type::ChordRest); InstrumentChange* nic = new InstrumentChange(*ic); nic->setParent(s); nic->setTrack(4); score->undoAddElement(nic); score->doLayout(); test_post(score, "copy"); }
void TestMeasure::spanner_D() { Score* score = readScore(DIR + "measure-9.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); Measure* m = score->firstMeasure()->nextMeasure(); score->startCmd(); score->select(m); score->cmdDeleteSelectedMeasures(); score->endCmd(); QVERIFY(saveCompareScore(score, "measure-9.mscx", DIR + "measure-9-ref.mscx")); delete score; }
void TestNote::tpcTranspose2() { Score* score = readScore(DIR + "tpc-transpose2.mscx"); score->doLayout(); score->inputState().setTrack(0); score->inputState().setSegment(score->tick2segment(0, false, Segment::Type::ChordRest)); score->inputState().setDuration(TDuration::DurationType::V_QUARTER); score->inputState().setNoteEntryMode(true); int octave = 5 * 7; score->cmdAddPitch(octave + 3, false); score->cmdConcertPitchChanged(true, true); QVERIFY(saveCompareScore(score, "tpc-transpose2-test.mscx", DIR + "tpc-transpose2-ref.mscx")); }
Score* QmlPlugin::newScore(const QString& name, const QString& part, int measures) { if (msc->currentScore()) { msc->currentScore()->endCmd(); msc->endCmd(); } Score* score = new Score(MScore::defaultStyle()); score->setName(name); score->appendPart(part); score->appendMeasures(measures); score->doLayout(); int view = msc->appendScore(score); msc->setCurrentView(0, view); qApp->processEvents(); score->startCmd(); return score; }
Score* QmlPlugin::newScore(const QString& name, const QString& part, int measures) { if (msc->currentScore()) msc->currentScore()->endCmd(); Score* score = new Score(MScore::defaultStyle()); score->setName(name); score->appendPart(part); score->appendMeasures(measures); score->doLayout(); int view = msc->appendScore(score); msc->setCurrentView(0, view); qApp->processEvents(); // tell QML not to garbage collect this score QQmlEngine::setObjectOwnership(score, QQmlEngine::CppOwnership); score->startCmd(); return score; }
void TestBarline::barline06() { char msg[256]; Score* score = readScore(DIR + "barline06.mscx"); QVERIFY(score); score->doLayout(); // scan each measure Measure* msr = score->firstMeasure(); int msrNo = 1; for (int i=0; i < 3; i++) { // check measure endbarline type sprintf(msg, "EndBarLineType not NORMAL in measure %d.", msrNo); //TODO QVERIFY2(msr->endBarLineType() == BarLineType::NORMAL, msg); // locate end-measure bar line segment Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); sprintf(msg, "No SegEndBarLine in measure %d.", msr->no()); QVERIFY2(seg != nullptr, msg); // check only i-th staff has custom bar line type for (int j=0; j < 3; j++) { BarLine* bar = static_cast<BarLine*>(seg->element(j*VOICES)); // if not the i-th staff, bar should be normal and not custom if (j != i) { sprintf(msg, "barline type NOT NORMAL or CUSTOM TYPE in staff %d of measure %d.", j+1, msrNo); QVERIFY2(bar->barLineType() == BarLineType::NORMAL, msg); // QVERIFY2(bar->customSubtype() == false, msg); } // in the i-th staff, the bar line should be of type DOUBLE and custom type should be true else { sprintf(msg, "No barline for staff %d in measure %d", j+1, msrNo); QVERIFY2(bar != nullptr, msg); sprintf(msg, "barline type NOT DOUBLE or NOT CUSTOM TYPE in staff %d of measure %d.", j+1, msrNo); QVERIFY2(bar->barLineType() == BarLineType::DOUBLE, msg); // QVERIFY2(bar->customSubtype() == true, msg); } } msr = msr->nextMeasure(); msrNo++; } // QVERIFY(saveCompareScore(score, "barline06.mscx", DIR + "barline06-ref.mscx")); delete score; }
void TestExchangevoices::glissandi() { QString p1 = DIR + "exchangevoices-gliss.mscx"; QVERIFY(score); Score* score = readScore(p1); score->doLayout(); // select all score->startCmd(); score->cmdSelectAll(); score->endCmd(); // do score->startCmd(); score->cmdExchangeVoice(0,1); score->endCmd(); // compare QVERIFY(saveCompareScore(score, "exchangevoices-gliss.mscx", DIR + "exchangevoices-gliss-ref.mscx")); }