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