1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
//=============================================================================
// MuseScore
// Music Composition & Notation
// $Id:$
//
// Copyright (C) 2012 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#include <QtTest/QtTest>
#include "mtest/testutils.h"
#include "libmscore/score.h"
#include "libmscore/measure.h"
#include "libmscore/timesig.h"
#define DIR QString("libmscore/timesig/")
using namespace Ms;
//---------------------------------------------------------
// TestTimesig
//---------------------------------------------------------
class TestTimesig : public QObject, public MTest
{
Q_OBJECT
private slots:
void initTestCase() { initMTest(); }
void timesig01();
void timesig02();
void timesig03();
void timesig04();
void timesig_78216();
};
//---------------------------------------------------------
/// timesig01
/// add a 3/4 time signature in the second measure
//---------------------------------------------------------
void TestTimesig::timesig01()
{
Score* score = readScore(DIR + "timesig01.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, "timesig01.mscx", DIR + "timesig01-ref.mscx"));
delete score;
}
//---------------------------------------------------------
/// timesig02
/// Attempt to change a 4/4 measure containing a triplet of minims to a 3/4 time signature
/// The attempt should fail, the score left unchanged
//---------------------------------------------------------
void TestTimesig::timesig02()
{
Score* score = readScore(DIR + "timesig-02.mscx");
QVERIFY(score);
Measure* m = score->firstMeasure();
TimeSig* ts = new TimeSig(score);
ts->setSig(Fraction(3, 4), TimeSigType::NORMAL);
score->startCmd();
score->cmdAddTimeSig(m, 0, ts, false);
score->doLayout();
score->endCmd();
QVERIFY(saveCompareScore(score, "timesig-02a.mscx", DIR + "timesig-02-ref.mscx"));
delete score;
}
//---------------------------------------------------------
/// timesig03
/// add a 3/4 time signature in the second measure
/// rewrite notes
/// be sure that annotations and spanners are preserved
/// even annotations in otherwise empty segments
/// also measure repeats and non-default barlines
//---------------------------------------------------------
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;
}
//---------------------------------------------------------
/// timesig04
/// add a 6/4 time signature in the second measure
/// which already contains a quarter note
//---------------------------------------------------------
void TestTimesig::timesig04()
{
Score* score = readScore(DIR + "timesig-04.mscx");
QVERIFY(score);
Measure* m = score->firstMeasure()->nextMeasure();
TimeSig* ts = new TimeSig(score);
ts->setSig(Fraction(6, 4), TimeSigType::NORMAL);
score->cmdAddTimeSig(m, 0, ts, false);
score->doLayout();
QVERIFY(saveCompareScore(score, "timesig-04.mscx", DIR + "timesig-04-ref.mscx"));
delete score;
}
//---------------------------------------------------------
// timesig_78216
// input score has section breaks on non-measure MeasureBase objects.
// should not display courtesy timesig at the end of final measure of each section (meas 1, 2, & 3), even if section break occurs on subsequent non-measure frame.
//---------------------------------------------------------
void TestTimesig::timesig_78216()
{
Score* score = readScore(DIR + "timesig_78216.mscx");
score->doLayout();
Measure* m1 = score->firstMeasure();
Measure* m2 = m1->nextMeasure();
Measure* m3 = m2->nextMeasure();
// verify no timesig exists in segment of final tick of m1, m2, m3
QVERIFY2(m1->findSegment(Segment::Type::TimeSig, m1->endTick()) == nullptr, "Should be no timesig at end of measure 1.");
QVERIFY2(m2->findSegment(Segment::Type::TimeSig, m2->endTick()) == nullptr, "Should be no timesig at end of measure 2.");
QVERIFY2(m3->findSegment(Segment::Type::TimeSig, m3->endTick()) == nullptr, "Should be no timesig at end of measure 3.");
}
QTEST_MAIN(TestTimesig)
#include "tst_timesig.moc"
|