void TestMeasure::minWidth() { MasterScore* score = readScore(DIR + "measure-2.mscx"); int n = score->systems().size(); int measuresSystem[n]; for (int i = 0; i < n; ++i) measuresSystem[i] = score->systems().at(i)->measures().size(); score->doLayout(); Measure* m1 = score->systems().at(1)->lastMeasure(); Measure* m2 = score->systems().at(2)->firstMeasure(); qreal mw1 = m1->minWidth1(); qreal mw2 = m2->minWidth1(); score->doLayout(); QCOMPARE(mw1, m1->minWidth1()); QCOMPARE(mw2, m2->minWidth1()); // after second layout nothing should be changed: for (int i = 0; i < n; ++i) { QCOMPARE(measuresSystem[i], int(score->systems().at(i)->measures().size())); } }
void TestSpanners::spanners13() { DropData dropData; LayoutBreak* brk; MasterScore* score = readScore(DIR + "lyricsline06.mscx"); QVERIFY(score); score->doLayout(); // DROP A BREAK AT FIRST MEASURE AND VERIFY Measure* msr = score->firstMeasure(); QVERIFY(msr); brk = new LayoutBreak(score); brk->setLayoutBreakType(LayoutBreak::Type::LINE); dropData.pos = msr->pagePos(); dropData.element = brk; score->startCmd(); msr->drop(dropData); score->endCmd(); // VERIFY SEGMENTS IN SYSTEMS AND THEN SCORE for (System* sys : score->systems()) QVERIFY(sys->spannerSegments().size() == 1); QVERIFY(saveCompareScore(score, "lyricsline06.mscx", DIR + "lyricsline06-ref.mscx")); // UNDO AND VERIFY score->undoStack()->undo(); score->doLayout(); // systems need to be re-computed QVERIFY(saveCompareScore(score, "lyricsline06.mscx", DIR + "lyricsline06.mscx")); delete score; }
void TestSpanners::spanners14() { MasterScore* score = readScore(DIR + "glissando-cloning05.mscx"); QVERIFY(score); score->doLayout(); // create parts // (copied and adapted from void TestParts::createParts() in mtest/libmscore/parts/tst_parts.cpp) QList<Part*> parts; parts.append(score->parts().at(0)); Score* nscore = new Score(score); Excerpt* ex = new Excerpt(score); ex->setPartScore(nscore); ex->setTitle(parts.front()->longName()); ex->setParts(parts); Excerpt::createExcerpt(ex); QVERIFY(nscore); // nscore->setName(parts.front()->partName()); // QMultiMap<int, int> tracks; score->Score::undo(new AddExcerpt(ex)); QVERIFY(saveCompareScore(score, "glissando-cloning05.mscx", DIR + "glissando-cloning05-ref.mscx")); delete score; }
void TestSpanners::spanners05() { MasterScore* score = readScore(DIR + "glissando-cloning02.mscx"); QVERIFY(score); score->doLayout(); // create parts // (copied and adapted from void TestParts::createParts() in mtest/libmscore/parts/tst_parts.cpp) QList<Part*> parts; parts.append(score->parts().at(0)); Score* nscore = new Score(score); Excerpt ex(score); ex.setPartScore(nscore); ex.setTitle(parts.front()->longName()); ex.setParts(parts); ::createExcerpt(&ex); QVERIFY(nscore); nscore->setName(parts.front()->partName()); score->undo(new AddExcerpt(nscore)); QVERIFY(saveCompareScore(score, "glissando-cloning02.mscx", DIR + "glissando-cloning02-ref.mscx")); delete score; }
void TestSpanners::spanners07() { DropData dropData; Glissando* gliss; MasterScore* score = readScore(DIR + "glissando-cloning04.mscx"); QVERIFY(score); score->doLayout(); // DROP A GLISSANDO ON FIRST NOTE Measure* msr = score->firstMeasure(); QVERIFY(msr); Segment* seg = msr->findSegment(Segment::Type::ChordRest, 0); QVERIFY(seg); Ms::Chord* chord = static_cast<Ms::Chord*>(seg->element(0)); QVERIFY(chord && chord->type() == Element::Type::CHORD); Note* note = chord->upNote(); QVERIFY(note); // drop a glissando on note gliss = new Glissando(score); dropData.pos = note->pagePos(); dropData.element = gliss; note->drop(dropData); QVERIFY(saveCompareScore(score, "glissando-cloning04.mscx", DIR + "glissando-cloning04-ref.mscx")); delete score; }
MasterScore* TestChordSymbol::test_pre(const char* p) { QString p1 = DIR + p + ".mscx"; MasterScore* score = readScore(p1); score->doLayout(); return 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"); MasterScore* 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->undoStack()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestImplodeExplode::implode1() { QString readFile(DIR + "implode1.mscx"); QString writeFile1("implode1-test1.mscx"); QString writeFile2("implode1-test2.mscx"); QString reference(DIR + "implode1-ref.mscx"); MasterScore* score = readScore(readFile); score->doLayout(); // select all score->startCmd(); score->cmdSelectAll(); score->endCmd(); // do score->startCmd(); score->cmdImplode(); score->endCmd(); QVERIFY(saveCompareScore(score, writeFile1, reference)); // undo score->undoStack()->undo(); QVERIFY(saveCompareScore(score, writeFile2, readFile)); delete score; }
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"); MasterScore* 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->undoStack()->undo(&ed); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestChordSymbol::testClear() { MasterScore* score = test_pre("clear"); Measure* m = score->firstMeasure(); score->select(m, SelectType::SINGLE, 0); score->cmdDeleteSelection(); score->doLayout(); test_post(score, "clear"); }
void TestSpanners::spanners02() { MasterScore* score = readScore(DIR + "glissando-crossstaff01.mscx"); QVERIFY(score); score->doLayout(); QVERIFY(saveCompareScore(score, "glissando-crsossstaff01.mscx", DIR + "glissando-crossstaff01-ref.mscx")); delete score; }
void TestChordSymbol::testExtend() { MasterScore* score = test_pre("extend"); Measure* m = score->firstMeasure(); Segment* s = m->first(Segment::Type::ChordRest); ChordRest* cr = s->cr(0); score->changeCRlen(cr, TDuration::DurationType::V_WHOLE); score->doLayout(); test_post(score, "extend"); }
void TestSpanners::spanners08() { MasterScore* score = readScore(DIR + "lyricsline01.mscx"); QVERIFY(score); score->doLayout(); // verify initial LyricsLine setup System* sys = score->systems().at(0); QVERIFY(sys->spannerSegments().size() == 1); QVERIFY(score->unmanagedSpanners().size() == 1); // DELETE LYRICS Measure* msr = score->firstMeasure(); QVERIFY(msr); Segment* seg = msr->findSegment(Segment::Type::ChordRest, 0); QVERIFY(seg); Ms::Chord* chord = static_cast<Ms::Chord*>(seg->element(0)); QVERIFY(chord && chord->type() == Element::Type::CHORD); QVERIFY(chord->lyrics().size() > 0); Lyrics* lyr = chord->lyrics(0, Element::Placement::BELOW); score->startCmd(); score->undoRemoveElement(lyr); score->endCmd(); // verify setup after deletion QVERIFY(sys->spannerSegments().size() == 0); QVERIFY(score->unmanagedSpanners().size() == 0); // save and verify score after deletion QVERIFY(saveCompareScore(score, "lyricsline01.mscx", DIR + "lyricsline01-ref.mscx")); // UNDO score->undoStack()->undo(); score->doLayout(); // verify setup after undo QVERIFY(sys->spannerSegments().size() == 1); QVERIFY(score->unmanagedSpanners().size() == 1); // save and verify score after undo QVERIFY(saveCompareScore(score, "lyricsline01.mscx", DIR + "lyricsline01.mscx")); delete score; }
void TestInstrumentChange::testDelete() { MasterScore* score = test_pre("delete"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = toInstrumentChange(s->annotations()[0]); score->deleteItem(ic); score->doLayout(); test_post(score, "delete"); }
void TestMeasure::spanner_A() { MasterScore* score = readScore(DIR + "measure-6.mscx"); score->select(score->firstMeasure()); score->startCmd(); score->localTimeDelete(); score->endCmd(); score->doLayout(); QVERIFY(saveCompareScore(score, "measure-6.mscx", DIR + "measure-6-ref.mscx")); delete score; }
void TestInstrumentChange::testAdd() { MasterScore* 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->setXmlText("Instrument"); score->undoAddElement(ic); score->doLayout(); test_post(score, "add"); }
void TestCompat114::compat() { QFETCH(QString, file); QString readFile(DIR + file + ".mscx"); QString writeFile(file + "-test.mscx"); QString reference(DIR + file + "-ref.mscx"); MasterScore* score = readScore(readFile); score->doLayout(); QVERIFY(score); QVERIFY(saveCompareScore(score, writeFile, reference)); }
void TestChordSymbol::testAddPart() { MasterScore* score = test_pre("add-part"); Segment* seg = score->firstSegment(Segment::Type::ChordRest); ChordRest* cr = seg->cr(0); Harmony* harmony = new Harmony(score); harmony->setHarmony("C7"); harmony->setTrack(cr->track()); harmony->setParent(cr->segment()); score->undoAddElement(harmony); score->doLayout(); test_post(score, "add-part"); }
void TestSpanners::spanners12() { MasterScore* score = readScore(DIR + "lyricsline05.mscx"); QVERIFY(score); score->doLayout(); // DELETE SECOND MEASURE AND VERIFY Measure* msr = score->firstMeasure(); QVERIFY(msr); msr = msr->nextMeasure(); QVERIFY(msr); score->startCmd(); score->select(msr); score->cmdTimeDelete(); score->endCmd(); QVERIFY(saveCompareScore(score, "lyricsline05.mscx", DIR + "lyricsline05-ref.mscx")); // UNDO AND VERIFY score->undoStack()->undo(); score->doLayout(); // measure needs to be renumbered QVERIFY(saveCompareScore(score, "lyricsline05.mscx", DIR + "lyricsline05.mscx")); delete score; }
void TestInstrumentChange::testChange() { MasterScore* score = test_pre("change"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = toInstrumentChange(s->annotations()[0]); Instrument* ni = score->staff(1)->part()->instrument(); ic->setInstrument(new Instrument(*ni)); score->startCmd(); ic->setXmlText("Instrument Oboe"); score->undo(new ChangeInstrument(ic, ic->instrument())); score->endCmd(); score->doLayout(); test_post(score, "change"); }
void TestInstrumentChange::testCopy() { MasterScore* 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 TestChordSymbol::testNoSystem() { MasterScore* score = test_pre("no-system"); // // create first part // QList<Part*> parts; parts.append(score->parts().at(0)); Score* nscore = new Score(score); score->Score::undo(new AddExcerpt(nscore)); { Excerpt ex(score); ex.setPartScore(nscore); ex.setTitle(parts.front()->longName()); ex.setParts(parts); ::createExcerpt(&ex); QVERIFY(nscore); } nscore->setName(parts.front()->partName()); nscore->style()->set(StyleIdx::createMultiMeasureRests, true); // // create second part // parts.clear(); parts.append(score->parts().at(1)); nscore = new Score(score); score->Score::undo(new AddExcerpt(nscore)); { Excerpt ex(score); ex.setTitle(parts.front()->longName()); ex.setParts(parts); ex.setPartScore(nscore); ::createExcerpt(&ex); QVERIFY(nscore); } nscore->setName(parts.front()->partName()); nscore->style()->set(StyleIdx::createMultiMeasureRests, true); score->doLayout(); test_post(score, "no-system"); }
void TestNote::grace() { MasterScore* score = readScore(DIR + "grace.mscx"); score->doLayout(); Ms::Chord* chord = score->firstMeasure()->findChord(0, 0); Note* note = chord->upNote(); // create score->setGraceNote(chord, note->pitch(), NoteType::APPOGGIATURA, MScore::division/2); Ms::Chord* gc = chord->graceNotes().first(); Note* gn = gc->notes().front(); // Note* n = static_cast<Note*>(writeReadElement(gn)); // QCOMPARE(n->noteType(), NoteType::APPOGGIATURA); // delete n; // tie score->select(gn); score->cmdAddTie(); // 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(); // Ms::Chord* c = static_cast<Ms::Chord*>(writeReadElement(gc)); // QVERIFY(c->tremolo() != 0); // delete c; // articulation score->startCmd(); Articulation* ar = new Articulation(SymId::articAccentAbove, score); ar->setParent(gc); ar->setTrack(gc->track()); score->undoAddElement(ar); score->endCmd(); // c = static_cast<Ms::Chord*>(writeReadElement(gc)); // QVERIFY(c->articulations().size() == 1); // delete c; QVERIFY(saveCompareScore(score, "grace-test.mscx", DIR + "grace-ref.mscx")); }
void TestBarline::deleteSkipBarlines() { MasterScore* score = readScore(DIR + "barlinedelete.mscx"); Measure* m1 = score->firstMeasure(); QVERIFY(m1); score->startCmd(); score->cmdSelectAll(); score->cmdDeleteSelection(); score->endCmd(); score->doLayout(); QVERIFY(saveCompareScore(score, QString("barlinedelete.mscx"), DIR + QString("barlinedelete-ref.mscx"))); delete score; }
Score* QmlPlugin::newScore(const QString& /*name*/, const QString& /*part*/, int /*measures*/) { #if 0 // TODO if (msc->currentScore()) msc->currentScore()->endCmd(); MasterScore* score = new MasterScore(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; #endif return 0; }
void TestInstrumentChange::testMixer() { MasterScore* score = test_pre("mixer"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); int idx = score->staff(0)->channel(s->tick(), 0); Channel* c = score->staff(0)->part()->instrument(s->tick())->channel(idx); MidiPatch* mp = new MidiPatch; mp->bank = 0; mp->drum = false; mp->name = "Viola"; mp->prog = 41; mp->synti = "Fluid"; score->startCmd(); ic->setXmlText("Mixer Viola"); score->undo(new ChangePatch(score, c, mp)); score->endCmd(); score->doLayout(); test_post(score, "mixer"); }
void TestTools::undoResequencePart() { QString readFile(DIR + "undoResequencePart.mscx"); QString writeFile1("undoResequencePart01-test.mscx"); QString reference1(DIR + "undoResequencePart01-ref.mscx"); QString writeFile2("undoResequencePart02-test.mscx"); QString reference2(DIR + "undoResequencePart02-ref.mscx"); MasterScore* score = readScore(readFile); score->doLayout(); // do score->startCmd(); score->cmdResequenceRehearsalMarks(); score->endCmd(); QVERIFY(saveCompareScore(score, writeFile1, reference1)); // undo score->undoStack()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestSpanners::spanners04() { MasterScore* score = readScore(DIR + "glissando-cloning01.mscx"); QVERIFY(score); score->doLayout(); // add a linked staff to the existing staff // (copied and adapted from void MuseScore::editInstrList() in mscore/instrdialog.cpp) Staff* oldStaff = score->staff(0); Staff* newStaff = new Staff(score); newStaff->setPart(oldStaff->part()); newStaff->initFromStaffType(oldStaff->staffType()); newStaff->setDefaultClefType(ClefTypeList(ClefType::G)); KeySigEvent ke; ke.setKey(Key::C); newStaff->setKey(0, ke); score->undoInsertStaff(newStaff, 1, false); cloneStaff(oldStaff, newStaff); QVERIFY(saveCompareScore(score, "glissando-cloning01.mscx", DIR + "glissando-cloning01-ref.mscx")); delete score; }
void TestLinks::test5LinkedParts_94911() { MCursor c; c.setTimeSig(Fraction(4,4)); c.createScore("test"); c.addPart("electric-guitar"); c.move(0, 0); // move to track 0 tick 0 c.addKeySig(Key(1)); c.addTimeSig(Fraction(4,4)); c.addChord(60, TDuration(TDuration::DurationType::V_WHOLE)); MasterScore* score = c.score(); score->addText("title", "Title"); score->doLayout(); // delete chord Measure* m = score->firstMeasure(); Segment* s = m->first(Segment::Type::ChordRest); Element* e = s->element(0); QVERIFY(e->type() == ElementType::CHORD); score->select(e); score->cmdDeleteSelection(); e = s->element(0); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links() == nullptr); // create parts// score->startCmd(); QList<Part*> parts; parts.append(score->parts().at(0)); Score* nscore = new Score(score); Excerpt ex(score); ex.setPartScore(nscore); ex.setTitle("Guitar"); ex.setParts(parts); Excerpt::createExcerpt(&ex); QVERIFY(nscore); score->undo(new AddExcerpt(&ex)); score->endCmd(); // we should have now 1 staff and 2 linked rests QVERIFY(score->staves().size() == 1); e = s->element(0); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links()->size() == 2); // add a linked staff score->startCmd(); Staff* oStaff = score->staff(0); Staff* staff = new Staff(score); staff->setPart(oStaff->part()); score->undoInsertStaff(staff, 1); Excerpt::cloneStaff(oStaff, staff); score->endCmd(); // we should have now 2 staves and 3 linked rests QCOMPARE(score->staves().size(), 2); QCOMPARE(nscore->staves().size(), 1); QVERIFY(score->staves()[0]->linkedStaves()->staves().size() == 3); e = s->element(0); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links()->size() == 3); e = s->element(4); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links()->size() == 3); QVERIFY(score->excerpts().size() == 1); // undo score->undoStack()->undo(); // we should have now 1 staves and 2 linked rests QVERIFY(score->staves().size() == 1); QVERIFY(score->staves()[0]->linkedStaves()->staves().size() == 2); e = s->element(0); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links()->size() == 2); QVERIFY(score->excerpts().size() == 1); // redo score->undoStack()->redo(); // we should have now 2 staves and 3 linked rests QVERIFY(score->staves().size() == 2); QVERIFY(score->staves()[0]->linkedStaves()->staves().size() == 3); e = s->element(0); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links()->size() == 3); e = s->element(4); QVERIFY(e->type() == ElementType::REST); QVERIFY(e->links()->size() == 3); QVERIFY(score->excerpts().size() == 1); }
void TestSpanners::spanners03() { DropData dropData; Glissando* gliss; MasterScore* score = readScore(DIR + "glissando-graces01.mscx"); QVERIFY(score); score->doLayout(); // GLISSANDO FROM MAIN NOTE TO AFTER-GRACE // go to top note of first chord Measure* msr = score->firstMeasure(); QVERIFY(msr); Segment* seg = msr->findSegment(Segment::Type::ChordRest, 0); QVERIFY(seg); Ms::Chord* chord = static_cast<Ms::Chord*>(seg->element(0)); QVERIFY(chord && chord->type() == Element::Type::CHORD); Note* note = chord->upNote(); QVERIFY(note); // drop a glissando on note gliss = new Glissando(score); // create a new element each time, as drop() will eventually delete it dropData.pos = note->pagePos(); dropData.element = gliss; note->drop(dropData); // GLISSANDO FROM AFTER-GRACE TO BEFORE-GRACE OF NEXT CHORD // go to last after-grace of chord and drop a glissando on it Ms::Chord* grace = chord->graceNotesAfter().last(); QVERIFY(grace && grace->type() == Element::Type::CHORD); note = grace->upNote(); QVERIFY(note); gliss = new Glissando(score); dropData.pos = note->pagePos(); dropData.element = gliss; note->drop(dropData); // GLISSANDO FROM MAIN NOTE TO BEFORE-GRACE OF NEXT CHORD // go to next chord seg = seg->nextCR(0); QVERIFY(seg); chord = static_cast<Ms::Chord*>(seg->element(0)); QVERIFY(chord && chord->type() == Element::Type::CHORD); note = chord->upNote(); QVERIFY(note); gliss = new Glissando(score); dropData.pos = note->pagePos(); dropData.element = gliss; note->drop(dropData); // GLISSANDO FROM BEFORE-GRACE TO MAIN NOTE // go to next chord seg = seg->nextCR(0); QVERIFY(seg); chord = static_cast<Ms::Chord*>(seg->element(0)); QVERIFY(chord && chord->type() == Element::Type::CHORD); // go to its last before-grace note grace = chord->graceNotesBefore().last(); QVERIFY(grace && grace->type() == Element::Type::CHORD); note = grace->upNote(); QVERIFY(note); gliss = new Glissando(score); dropData.pos = note->pagePos(); dropData.element = gliss; note->drop(dropData); QVERIFY(saveCompareScore(score, "glissando-graces01.mscx", DIR + "glissando-graces01-ref.mscx")); delete score; }