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