Salome HOME
Add tests for drag and drop algo.
[modules/hydro.git] / src / HYDROGUI / test_HYDROGUI_ZLevelsModel.cxx
1
2 #undef HYDROGUI_EXPORTS
3
4 #include <test_HYDROGUI_ZLevelsModel.h>
5 #include <HYDROData_Document.h>
6 #include <HYDROGUI_ZLevelsModel.h>
7
8 Handle_HYDROData_Document GetDocument()
9 {
10   return HYDROData_Document::Document( 0 );
11 }
12
13 HYDROGUI_ZLevelsModel::Object2VisibleList CreateTestObjects( int theObjCount )
14 {
15   HYDROGUI_ZLevelsModel::Object2VisibleList anObjects;
16
17   for( int i=0; i<theObjCount; i++ )
18   {
19     Handle_HYDROData_Entity anObj = GetDocument()->CreateObject( KIND_IMMERSIBLE_ZONE );
20
21     std::string aName = " ";
22     aName[0] = 'A' + i;
23     anObj->SetName( QString::fromStdString( aName ) );
24
25     bool isVisible = i%2==0;
26
27     anObjects.append( HYDROGUI_ZLevelsModel::Object2Visible( anObj, isVisible ) );
28   }
29   return anObjects;
30 }
31
32 std::string test_HYDROGUI_ZLevelsModel::GetObjects( HYDROGUI_ZLevelsModel* theModel ) const
33 {
34   std::string anObjects;
35   for( int i=0, n=theModel->myObjects.size(); i<n; i++ )
36   {
37     std::string anObjName = theModel->myObjects[i].first->GetName().toStdString();
38     if( theModel->isObjectVisible( i ) )
39       anObjName = "*" + anObjName;
40     if( i>0 )
41       anObjects += ", ";
42     anObjects += anObjName;
43   }
44   return anObjects;
45 }
46
47 /**
48   Test move up algorithm.
49 */
50 void test_HYDROGUI_ZLevelsModel::testMoveUp()
51 {
52   HYDROGUI_ZLevelsModel* aModel = new HYDROGUI_ZLevelsModel();
53   aModel->setObjects( CreateTestObjects( 6 ) );
54   const HYDROGUI_ZLevelsModel::OpType anUp = HYDROGUI_ZLevelsModel::Up;
55
56   // 0. Check the initial state
57   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
58
59   // 1. [ *A ] / ALL OBJECTS
60   aModel->move( QList<int>() << 0, anUp, false );
61   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
62
63   // 2. [ *A, B ] / ALL OBJECTS
64   aModel->move( QList<int>() << 0 << 1, anUp, false );
65   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
66
67   // 3. [ *A, *C ] / ALL OBJECTS
68   aModel->move( QList<int>() << 0 << 2, anUp, false );
69   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
70
71   // 4. [ *A, F ] / ALL OBJECTS
72   aModel->move( QList<int>() << 0 << 5, anUp, false );
73   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
74
75   // 5. [ F ] X 6 times / ALL OBJECTS
76   aModel->move( QList<int>() << 5, anUp, false );
77   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, F, *E" ), GetObjects( aModel ) );
78   aModel->move( QList<int>() << 4, anUp, false );
79   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, F, D, *E" ), GetObjects( aModel ) );
80   aModel->move( QList<int>() << 3, anUp, false );
81   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, F, *C, D, *E" ), GetObjects( aModel ) );
82   aModel->move( QList<int>() << 2, anUp, false );
83   CPPUNIT_ASSERT_EQUAL( std::string( "*A, F, B, *C, D, *E" ), GetObjects( aModel ) );
84   aModel->move( QList<int>() << 1, anUp, false );
85   CPPUNIT_ASSERT_EQUAL( std::string( "F, *A, B, *C, D, *E" ), GetObjects( aModel ) );
86   aModel->move( QList<int>() << 0, anUp, false );
87   CPPUNIT_ASSERT_EQUAL( std::string( "F, *A, B, *C, D, *E" ), GetObjects( aModel ) );
88
89   // 6. [ *A, B ] / ALL OBJECTS
90   aModel->move( QList<int>() << 1 << 2, anUp, false );
91   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, F, *C, D, *E" ), GetObjects( aModel ) );
92
93   // 7. [ B, *C, *E ] / ALL OBJECTS
94   aModel->move( QList<int>() << 1 << 3 << 5, anUp, false );
95   CPPUNIT_ASSERT_EQUAL( std::string( "B, *A, *C, F, *E, D" ), GetObjects( aModel ) );
96
97   // 8. [ *A, *C, F, *E, D ] / ALL OBJECTS
98   aModel->move( QList<int>() << 1 << 2 << 3 << 4 << 5, anUp, false );
99   CPPUNIT_ASSERT_EQUAL( std::string( "*A, *C, F, *E, D, B" ), GetObjects( aModel ) );
100
101   // 9. [ *E ] / VISIBLE OBJECTS
102   aModel->move( QList<int>() << 3, anUp, true );
103   CPPUNIT_ASSERT_EQUAL( std::string( "*A, *E, *C, F, D, B" ), GetObjects( aModel ) );
104
105   // 10. [ *E, *C ] / VISIBLE OBJECTS
106   aModel->move( QList<int>() << 1 << 2, anUp, true );
107   CPPUNIT_ASSERT_EQUAL( std::string( "*E, *C, *A, F, D, B" ), GetObjects( aModel ) );
108
109   // 11. [ *A, F ] / ALL OBJECTS
110   aModel->move( QList<int>() << 2 << 3, anUp, false );
111   CPPUNIT_ASSERT_EQUAL( std::string( "*E, *A, F, *C, D, B" ), GetObjects( aModel ) );
112
113   // 12. [ *A, *C ] / VISIBLE OBJECTS
114   aModel->move( QList<int>() << 1 << 3, anUp, true );
115   CPPUNIT_ASSERT_EQUAL( std::string( "*A, *C, *E, F, D, B" ), GetObjects( aModel ) );
116
117   // 13. [] / ALL OBJECTS
118   aModel->move( QList<int>(), anUp, false );
119   CPPUNIT_ASSERT_EQUAL( std::string( "*A, *C, *E, F, D, B"), GetObjects( aModel ) );
120
121   // 14. [ *A, *C, *E, F, D, B ] / ALL OBJECTS
122   aModel->move( QList<int>() << 0 << 1 << 2 << 3 << 4 << 5, anUp, false );
123   CPPUNIT_ASSERT_EQUAL( std::string( "*A, *C, *E, F, D, B"), GetObjects( aModel ) );
124
125   delete aModel;
126 }
127
128 /**
129   Test move on top algorithm.
130 */
131 void test_HYDROGUI_ZLevelsModel::testMoveOnTop()
132 {
133   HYDROGUI_ZLevelsModel* aModel = new HYDROGUI_ZLevelsModel();
134   aModel->setObjects( CreateTestObjects( 6 ) );
135   const HYDROGUI_ZLevelsModel::OpType aTop = HYDROGUI_ZLevelsModel::Top;
136
137   // 0. Check the initial state
138   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
139
140   // 1. [ *A ] / ALL OBJECTS
141   aModel->move( QList<int>() << 0, aTop, false );
142   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
143
144   // 2. [ *A ] / VISIBLE OBJECTS
145   aModel->move( QList<int>() << 0, aTop, true );
146   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
147
148   // 3. [ F ] / ALL OBJECTS
149   aModel->move( QList<int>() << 5, aTop, false );
150   CPPUNIT_ASSERT_EQUAL( std::string( "F, *A, B, *C, D, *E" ), GetObjects( aModel ) );
151
152   // 4. [ *E ] / VISIBLE OBJECTS
153   aModel->move( QList<int>() << 5, aTop, true );
154   CPPUNIT_ASSERT_EQUAL( std::string( "*E, F, *A, B, *C, D" ), GetObjects( aModel ) );
155
156   // 5. [ *E, F ] / ALL OBJECTS
157   aModel->move( QList<int>() << 0 << 1, aTop, false );
158   CPPUNIT_ASSERT_EQUAL( std::string( "*E, F, *A, B, *C, D" ), GetObjects( aModel ) );
159
160   // 6. [ *E, *A ] / ALL OBJECTS
161   aModel->move( QList<int>() << 0 << 2, aTop, false );
162   CPPUNIT_ASSERT_EQUAL( std::string( "*E, *A, F, B, *C, D" ), GetObjects( aModel ) );
163
164   // 7. [ *A, F, *C ] / ALL OBJECTS
165   aModel->move( QList<int>() << 1 << 2 << 4, aTop, false );
166   CPPUNIT_ASSERT_EQUAL( std::string( "*A, F, *C, *E, B, D" ), GetObjects( aModel ) );
167
168   // 8.  [ F, *C, *E, B, D ] / ALL OBJECTS
169   aModel->move( QList<int>() << 1 << 2 << 3 << 4 << 5, aTop, false );
170   CPPUNIT_ASSERT_EQUAL( std::string( "F, *C, *E, B, D, *A" ), GetObjects( aModel ) );
171
172   // 9. [] / ALL OBJECTS
173   aModel->move( QList<int>(), aTop, false );
174   CPPUNIT_ASSERT_EQUAL( std::string( "F, *C, *E, B, D, *A" ), GetObjects( aModel ) );
175
176   // 10. [*F, *C, *E, B, D, *A] / ALL OBJECTS
177   aModel->move( QList<int>() << 0 << 1 << 2 << 3 << 4 << 5, aTop, false );
178   CPPUNIT_ASSERT_EQUAL( std::string( "F, *C, *E, B, D, *A" ), GetObjects( aModel ) );
179
180   delete aModel;
181 }
182
183 /**
184   Test move down algorithm.
185 */
186 void test_HYDROGUI_ZLevelsModel::testMoveDown()
187 {
188   HYDROGUI_ZLevelsModel* aModel = new HYDROGUI_ZLevelsModel();
189   aModel->setObjects( CreateTestObjects( 6 ) );
190   const HYDROGUI_ZLevelsModel::OpType aDown = HYDROGUI_ZLevelsModel::Down;
191
192   // 0. Check the initial state
193   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
194
195   // 1. [ F ] / ALL OBJECTS
196   aModel->move( QList<int>() << 5, aDown, false );
197   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
198
199   // 2. [ *E, F ] / ALL OBJECTS
200   aModel->move( QList<int>() << 4 << 5, aDown, false );
201   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
202
203   // 3. [ D, F ] / ALL OBJECTS
204   aModel->move( QList<int>() << 3 << 5, aDown, false );
205   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
206
207   // 4. [ *A, F ] / ALL OBJECTS
208   aModel->move( QList<int>() << 0 << 5, aDown, false );
209   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
210
211   // 5. [ *A ] X 6 times / ALL OBJECTS
212   aModel->move( QList<int>() << 0, aDown, false );
213   CPPUNIT_ASSERT_EQUAL( std::string( "B, *A, *C, D, *E, F" ), GetObjects( aModel ) );
214   aModel->move( QList<int>() << 1, aDown, false );
215   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, *A, D, *E, F" ), GetObjects( aModel ) );
216   aModel->move( QList<int>() << 2, aDown, false );
217   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, D, *A, *E, F" ), GetObjects( aModel ) );
218   aModel->move( QList<int>() << 3, aDown, false );
219   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, D, *E, *A, F" ), GetObjects( aModel ) );
220   aModel->move( QList<int>() << 4, aDown, false );
221   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, D, *E, F, *A" ), GetObjects( aModel ) );
222   aModel->move( QList<int>() << 5, aDown, false );
223   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, D, *E, F, *A" ), GetObjects( aModel ) );
224
225   // 6. [ *E, *F ] / ALL OBJECTS
226   aModel->move( QList<int>() << 3 << 4, aDown, false );
227   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, D, *A, *E, F" ), GetObjects( aModel ) );
228
229   // 7. [ B, D, *E ] / ALL OBJECTS
230   aModel->move( QList<int>() << 0 << 2 << 4, aDown, false );
231   CPPUNIT_ASSERT_EQUAL( std::string( "*C, B, *A, D, F, *E" ), GetObjects( aModel ) );
232
233   // 8. [ *C, B, *A, D, F ] / ALL OBJECTS
234   aModel->move( QList<int>() << 0 << 1 << 2 << 3 << 4, aDown, false );
235   CPPUNIT_ASSERT_EQUAL( std::string( "*E, *C, B, *A, D, F" ), GetObjects( aModel ) );
236
237   // 9. [ *C ] / VISIBLE OBJECTS
238   aModel->move( QList<int>() << 1, aDown, true );
239   CPPUNIT_ASSERT_EQUAL( std::string( "*E, B, *A, *C, D, F" ), GetObjects( aModel ) );
240
241   // 10. [ *E, *A ] / VISIBLE OBJECTS
242   aModel->move( QList<int>() << 0 << 2, aDown, true );
243   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, *E, *A, D, F" ), GetObjects( aModel ) );
244
245   // 11. [ *E, *A ] / VISIBLE OBJECTS
246   aModel->move( QList<int>() << 2 << 3, aDown, true );
247   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, *E, *A, D, F" ), GetObjects( aModel ) );
248
249   // 12. [ *C, *E, *A ] / VISIBLE OBJECTS
250   aModel->move( QList<int>() << 1 << 2 << 3, aDown, true );
251   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, *E, *A, D, F" ), GetObjects( aModel ) );
252
253   // 13. [] / ALL OBJECTS
254   aModel->move( QList<int>(), aDown, false );
255   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, *E, *A, D, F"), GetObjects( aModel ) );
256
257   // 14. [ B, *C, *E, *A, D, F ] / ALL OBJECTS
258   aModel->move( QList<int>() << 0 << 1 << 2 << 3 << 4 << 5, aDown, false );
259   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, *E, *A, D, F"), GetObjects( aModel ) );
260
261   delete aModel;
262 }
263
264 /**
265   Test move on bottom algorithm.
266 */
267 void test_HYDROGUI_ZLevelsModel::testMoveOnBottom()
268 {
269   HYDROGUI_ZLevelsModel* aModel = new HYDROGUI_ZLevelsModel();
270   aModel->setObjects( CreateTestObjects( 6 ) );
271   const HYDROGUI_ZLevelsModel::OpType aBottom = HYDROGUI_ZLevelsModel::Bottom;
272
273   // 0. Check the initial state
274   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
275
276   // 1. [ F ] / ALL OBJECTS
277   aModel->move( QList<int>() << 5, aBottom, false );
278   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
279
280   // 2. [ F ] / VISIBLE OBJECTS
281   aModel->move( QList<int>() << 5, aBottom, true );
282   CPPUNIT_ASSERT_EQUAL( std::string( "*A, B, *C, D, *E, F" ), GetObjects( aModel ) );
283
284   // 3. [ *A ] / ALL OBJECTS
285   aModel->move( QList<int>() << 0, aBottom, false );
286   CPPUNIT_ASSERT_EQUAL( std::string( "B, *C, D, *E, F, *A" ), GetObjects( aModel ) );
287
288   // 4. [ *C ] / VISIBLE OBJECTS
289   aModel->move( QList<int>() << 1, aBottom, true );
290   CPPUNIT_ASSERT_EQUAL( std::string( "B, D, *E, F, *A, *C" ), GetObjects( aModel ) );
291
292   // 5. [ B, D ] / ALL OBJECTS
293   aModel->move( QList<int>() << 0 << 1, aBottom, false );
294   CPPUNIT_ASSERT_EQUAL( std::string( "*E, F, *A, *C, B, D" ), GetObjects( aModel ) );
295
296   // 6. [ *C, *D ] / ALL OBJECTS
297   aModel->move( QList<int>() << 3 << 5, aBottom, false );
298   CPPUNIT_ASSERT_EQUAL( std::string( "*E, F, *A, B, *C, D" ), GetObjects( aModel ) );
299
300   // 7. [ *E, *A, *C ] / ALL OBJECTS
301   aModel->move( QList<int>() << 0 << 2 << 4, aBottom, false );
302   CPPUNIT_ASSERT_EQUAL( std::string( "F, B, D, *E, *A, *C" ), GetObjects( aModel ) );
303
304   // 8.  [ B, D, *E, *A ] / ALL OBJECTS
305   aModel->move( QList<int>() << 1 << 2 << 3 << 4 , aBottom, false );
306   CPPUNIT_ASSERT_EQUAL( std::string( "F, *C, B, D, *E, *A" ), GetObjects( aModel ) );
307
308   // 9. [] / ALL OBJECTS
309   aModel->move( QList<int>(), aBottom, false );
310   CPPUNIT_ASSERT_EQUAL( std::string( "F, *C, B, D, *E, *A" ), GetObjects( aModel ) );
311
312   // 10. [F, *C, B, D, *E, *A] / ALL OBJECTS
313   aModel->move( QList<int>() << 0 << 1 << 2 << 3 << 4 << 5, aBottom, false );
314   CPPUNIT_ASSERT_EQUAL( std::string( "F, *C, B, D, *E, *A" ), GetObjects( aModel ) );
315
316   delete aModel;
317 }
318
319 /**
320   Test drag and drop algorithm.
321 */
322 void test_HYDROGUI_ZLevelsModel::testDragAndDrop()
323 {
324   HYDROGUI_ZLevelsModel* aModel = new HYDROGUI_ZLevelsModel();
325   aModel->setObjects( CreateTestObjects( 8 ) );
326   const HYDROGUI_ZLevelsModel::OpType aDnD = HYDROGUI_ZLevelsModel::DragAndDrop;
327
328   // 0. Check the initial state
329   std::string anInitialState = std::string( "*A, B, *C, D, *E, F, *G, H" );
330   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
331
332   // 1. [] -> B ( i=1 )
333   bool aRes = aModel->move( QList<int>(), aDnD, false, 1 );
334   CPPUNIT_ASSERT_EQUAL( false, aRes );
335   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
336
337   // 2. ALL -> B ( i=1 )
338   QList<int> anAll;
339   anAll << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7;
340   aRes = aModel->move( anAll, aDnD, false, 1 );
341   CPPUNIT_ASSERT_EQUAL( false, aRes );
342   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
343
344   // 3. [D, *E, *G] -> D : drop item is among dragged items ( at the beginning )
345   aRes = aModel->move( QList<int>() << 3 << 4 << 6, aDnD, false, 3 );
346   CPPUNIT_ASSERT_EQUAL( false, aRes );
347   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
348
349   // 4. [D, *E, *G] -> *E : drop item is among dragged items ( in the middle )
350   aRes = aModel->move( QList<int>() << 3 << 4 << 6, aDnD, false, 4 );
351   CPPUNIT_ASSERT_EQUAL( false, aRes );
352   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
353
354   // 5. [D, *E, *G] -> *G : drop item is among dragged items ( at the end )
355   aRes = aModel->move( QList<int>() << 3 << 4 << 6, aDnD, false, 6 );
356   CPPUNIT_ASSERT_EQUAL( false, aRes );
357   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
358
359   // 6. [D, *E, *G] -> -1 : drop item index is out of range ( less than zero )
360   aRes = aModel->move( QList<int>() << 3 << 4 << 6, aDnD, false, -1 );
361   CPPUNIT_ASSERT_EQUAL( false, aRes );
362   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
363
364   // 7. [D, *E, *G] -> -1 : drop item index is out of range ( more than than (list length - 1) )
365   aRes = aModel->move( QList<int>() << 3 << 4 << 6, aDnD, false, 8 );
366   CPPUNIT_ASSERT_EQUAL( false, aRes );
367   CPPUNIT_ASSERT_EQUAL( anInitialState, GetObjects( aModel ) );
368
369   // 8. [D, *E, *G] -> B ( i = 1 )
370   aRes = aModel->move( QList<int>() << 3 << 4 << 6, aDnD, false, 1 );
371   CPPUNIT_ASSERT_EQUAL( true, aRes );
372   CPPUNIT_ASSERT_EQUAL( std::string( "*A, D, *E, *G, B, *C, F, H" ), GetObjects( aModel ) );
373
374   // 9. [*E, F] -> *G
375   aRes = aModel->move( QList<int>() << 2 << 6, aDnD, false, 3 );
376   CPPUNIT_ASSERT_EQUAL( true, aRes );
377   CPPUNIT_ASSERT_EQUAL( std::string( "*A, D, *E, F, *G, B, *C, H" ), GetObjects( aModel ) );
378
379   // 10. [*E, F, *G] -> *A
380   aRes = aModel->move( QList<int>() << 2 << 3 << 4, aDnD, false, 0 );
381   CPPUNIT_ASSERT_EQUAL( true, aRes );
382   CPPUNIT_ASSERT_EQUAL( std::string( "*E, F, *G, *A, D, B, *C, H" ), GetObjects( aModel ) );
383
384   // 11. [*G, D, *C, H] -> B
385   aRes = aModel->move( QList<int>() << 2 << 4 << 6 << 7, aDnD, false, 5 );
386   CPPUNIT_ASSERT_EQUAL( true, aRes );
387   CPPUNIT_ASSERT_EQUAL( std::string( "*E, F, *A, *G, D, *C, H, B" ), GetObjects( aModel ) );
388
389   // 12. [F, *A, *G, D, *C, H, B] -> *E
390   QList<int> anAllWithoutFirst;
391   anAllWithoutFirst << 1 << 2 << 3 << 4 << 5 << 6 << 7;
392   aRes = aModel->move( anAllWithoutFirst, aDnD, false, 0 );
393   CPPUNIT_ASSERT_EQUAL( true, aRes );
394   CPPUNIT_ASSERT_EQUAL( std::string( "F, *A, *G, D, *C, H, B, *E" ), GetObjects( aModel ) );
395
396   // 13. [*A, *G] -> D : no changes
397   aRes = aModel->move(  QList<int>() << 1 << 2, aDnD, false, 3 );
398   CPPUNIT_ASSERT_EQUAL( true, aRes );
399   CPPUNIT_ASSERT_EQUAL( std::string( "F, *A, *G, D, *C, H, B, *E" ), GetObjects( aModel ) );
400
401   // 14. [F, *G] -> D
402   aRes = aModel->move(  QList<int>() << 0 << 2, aDnD, false, 3 );
403   CPPUNIT_ASSERT_EQUAL( true, aRes );
404   CPPUNIT_ASSERT_EQUAL( std::string( "*A, F, *G, D, *C, H, B, *E" ), GetObjects( aModel ) );
405
406   // 15. [*A, *G, *C, H, *E] -> D
407   aRes = aModel->move(  QList<int>() << 0 << 2 << 4 << 5 << 7, aDnD, false, 3 );
408   CPPUNIT_ASSERT_EQUAL( true, aRes );
409   CPPUNIT_ASSERT_EQUAL( std::string( "F, *A, *G, *C, H, *E, D, B" ), GetObjects( aModel ) );
410 }