1 //=============================================================================
2 // MuseScore
3 // Music Composition & Notation
4 //
5 // Copyright (C) 2014 Werner Schweer
6 //
7 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License version 2
9 // as published by the Free Software Foundation and appearing in
10 // the file LICENCE.GPL
11 //=============================================================================
12
13 #include <QtTest/QtTest>
14
15 #include "libmscore/score.h"
16 #include "libmscore/measure.h"
17 #include "libmscore/undo.h"
18 #include "mtest/testutils.h"
19
20 #define DIR QString("libmscore/selectionrangedelete/")
21
22 using namespace Ms;
23
24 //---------------------------------------------------------
25 // TestSelectionRangeDelete
26 //---------------------------------------------------------
27
28 class TestSelectionRangeDelete : public QObject, public MTest
29 {
30 Q_OBJECT
31 void verifyDelete(MasterScore* score, size_t spanners);
32 void verifyNoDelete(MasterScore* score, size_t spanners);
33 void deleteVoice(int voice, QString idx);
34
35 private slots:
36 void initTestCase();
37 void deleteSegmentWithSlur();
38 void deleteSegmentWithSpanner();
deleteVoice1()39 void deleteVoice1() { deleteVoice(0,"03"); }
deleteVoice2()40 void deleteVoice2() { deleteVoice(1,"04"); }
41 void deleteSkipAnnotations();
42 };
43
44 //---------------------------------------------------------
45 // initTestCase
46 //---------------------------------------------------------
47
initTestCase()48 void TestSelectionRangeDelete::initTestCase()
49 {
50 initMTest();
51 }
52
53 //---------------------------------------------------------
54 // verifyDelete
55 //---------------------------------------------------------
56
verifyDelete(MasterScore * score,size_t spanners)57 void TestSelectionRangeDelete::verifyDelete(MasterScore* score, size_t spanners)
58 {
59 score->startCmd();
60 score->cmdDeleteSelection();
61 score->endCmd();
62
63 QVERIFY(score->spanner().size() == spanners -1);
64 score->undoRedo(true, 0);
65 QVERIFY(score->spanner().size() == spanners);
66 }
67
68 //---------------------------------------------------------
69 // verifyNoDelete
70 //---------------------------------------------------------
71
verifyNoDelete(MasterScore * score,size_t spanners)72 void TestSelectionRangeDelete::verifyNoDelete(MasterScore* score, size_t spanners)
73 {
74 score->startCmd();
75 score->cmdDeleteSelection();
76 score->endCmd();
77
78 QVERIFY(score->spanner().size() == spanners);
79 score->undoRedo(true, 0);
80 QVERIFY(score->spanner().size() == spanners);
81 }
82
83 //---------------------------------------------------------
84 // chordRestAtBeat
85 //---------------------------------------------------------
86
chordRestAtBeat(Score * score,int beat,int half=0)87 Element* chordRestAtBeat(Score* score, int beat, int half = 0)
88 {
89 qDebug("Chordrest at beat %i,%i",beat,half);
90 int division = MScore::division;
91 int tick = beat * division + half * division/2;
92 return score->tick2segment(Fraction::fromTicks(tick), false, SegmentType::ChordRest,false)->element(0);
93 }
94
95 //---------------------------------------------------------
96 // deleteSegmentWithSlur
97 //---------------------------------------------------------
98
deleteSegmentWithSlur()99 void TestSelectionRangeDelete::deleteSegmentWithSlur()
100 {
101 /*
102 * Score looks like this:
103 * ss - start slur, es - end slur, q - quarter note, e - eighth note
104 *
105 * ss es ss es
106 * q q q e e
107 */
108 MasterScore* score = readScore(DIR + "selectionrangedelete01.mscx");
109
110 score->doLayout();
111 QVERIFY(score);
112 size_t spanners = score->spanner().size();
113
114 score->select(chordRestAtBeat(score, 0),SelectType::RANGE);
115 verifyDelete(score,spanners);
116 score->deselectAll();
117
118 score->select(chordRestAtBeat(score, 1),SelectType::RANGE);
119 verifyDelete(score,spanners);
120 score->deselectAll();
121
122 score->select(chordRestAtBeat(score, 2),SelectType::RANGE);
123 verifyDelete(score,spanners);
124 score->deselectAll();
125
126 score->select(chordRestAtBeat(score, 3),SelectType::RANGE);
127 verifyNoDelete(score,spanners);
128 score->deselectAll();
129
130 score->select(chordRestAtBeat(score, 3,1),SelectType::RANGE);
131 verifyDelete(score,spanners);
132 score->deselectAll();
133
134 delete score;
135 }
136
137 //---------------------------------------------------------
138 // deleteSegmentWithSpanner
139 //---------------------------------------------------------
140
deleteSegmentWithSpanner()141 void TestSelectionRangeDelete::deleteSegmentWithSpanner()
142 {
143 /*
144 * Score looks like this:
145 * ss - start spanner, es - end spanner, q - quarter note
146 *
147 * ss es
148 * q q q
149 */
150 MasterScore* score = readScore(DIR + "selectionrangedelete02.mscx");
151
152 score->doLayout();
153 QVERIFY(score);
154 size_t spanners = score->spanner().size();
155
156 score->select(chordRestAtBeat(score, 0),SelectType::RANGE);
157 verifyNoDelete(score,spanners);
158 // verifyDelete(score,spanners);
159 score->deselectAll();
160
161 score->select(chordRestAtBeat(score, 1),SelectType::RANGE);
162 verifyNoDelete(score,spanners);
163 score->deselectAll();
164
165 score->select(chordRestAtBeat(score, 2),SelectType::RANGE);
166 verifyNoDelete(score,spanners);
167 score->deselectAll();
168
169 score->select(chordRestAtBeat(score, 0),SelectType::RANGE);
170 score->select(chordRestAtBeat(score, 2),SelectType::RANGE);
171 verifyDelete(score,spanners);
172 score->deselectAll();
173
174 delete score;
175 }
176
177 //---------------------------------------------------------
178 // deleteVoice
179 //---------------------------------------------------------
180
deleteVoice(int voice,QString idx)181 void TestSelectionRangeDelete::deleteVoice(int voice, QString idx)
182 {
183 MasterScore* score = readScore(DIR + QString("selectionrangedelete%1.mscx").arg(idx));
184
185 Measure* m1 = score->firstMeasure();
186 QVERIFY(m1);
187
188 SelectionFilterType voiceFilterType = SelectionFilterType((int)SelectionFilterType::FIRST_VOICE + voice);
189 score->selectionFilter().setFiltered(voiceFilterType,false);
190 score->select(m1,SelectType::RANGE);
191
192 score->startCmd();
193 score->cmdDeleteSelection();
194 score->endCmd();
195
196 score->doLayout();
197
198 QVERIFY(saveCompareScore(score, QString("selectionrangedelete%1.mscx").arg(idx),
199 DIR + QString("selectionrangedelete%1-ref.mscx").arg(idx)));
200 delete score;
201 }
202
203 //---------------------------------------------------------
204 // deleteSkipAnnotations
205 //---------------------------------------------------------
206
deleteSkipAnnotations()207 void TestSelectionRangeDelete::deleteSkipAnnotations()
208 {
209 MasterScore* score = readScore(DIR + QString("selectionrangedelete05.mscx"));
210
211 Measure* m1 = score->firstMeasure();
212 QVERIFY(m1);
213
214 SelectionFilterType annotationFilterType = SelectionFilterType((int)SelectionFilterType::CHORD_SYMBOL);
215 score->selectionFilter().setFiltered(annotationFilterType, false);
216
217 score->startCmd();
218 score->cmdSelectAll();
219 score->cmdDeleteSelection();
220 score->endCmd();
221
222 score->doLayout();
223
224 QVERIFY(saveCompareScore(score, QString("selectionrangedelete05.mscx"),
225 DIR + QString("selectionrangedelete05-ref.mscx")));
226 delete score;
227 }
228
229 QTEST_MAIN(TestSelectionRangeDelete)
230
231 #include "tst_selectionrangedelete.moc"
232