1 // Aseprite
2 // Copyright (C) 2001-2018 David Capello
3 //
4 // This program is distributed under the terms of
5 // the End-User License Agreement for Aseprite.
6
7 #include "tests/test.h"
8
9 #include "app/context.h"
10 #include "app/doc.h"
11 #include "app/doc_api.h"
12 #include "app/doc_range.h"
13 #include "app/doc_range_ops.h"
14 #include "app/doc_undo.h"
15 #include "app/test_context.h"
16 #include "app/transaction.h"
17 #include "base/unique_ptr.h"
18 #include "doc/doc.h"
19
20 using namespace app;
21 using namespace doc;
22
23 namespace std {
24
operator <<(std::ostream & os,const doc::Layer * layer)25 std::ostream& operator<<(std::ostream& os, const doc::Layer* layer) {
26 if (layer)
27 os << '"' << layer->name() << '"';
28 else
29 os << "(null layer)";
30 return os;
31 }
32
operator <<(std::ostream & os,const app::DocRange & range)33 std::ostream& operator<<(std::ostream& os, const app::DocRange& range) {
34 os << "{ layers: [";
35
36 bool first = true;
37 for (auto layer : range.selectedLayers()) {
38 if (first)
39 first = false;
40 else
41 os << ", ";
42 os << layer;
43 }
44
45 os << "]";
46 os << ", frames: [";
47
48 first = true;
49 for (auto frame : range.selectedFrames()) {
50 if (first)
51 first = false;
52 else
53 os << ", ";
54 os << frame;
55 }
56
57 os << "] }";
58 return os;
59 }
60
operator <<(std::ostream & os,const doc::LayerList & layers)61 std::ostream& operator<<(std::ostream& os, const doc::LayerList& layers) {
62 os << "[";
63 bool first = true;
64 for (auto layer : layers) {
65 if (first)
66 first = false;
67 else
68 os << ", ";
69 os << layer;
70 }
71 return os << "]";
72 }
73
74 } // namespace std
75
76 typedef base::UniquePtr<Doc> DocPtr;
77
78 #define EXPECT_LAYER_ORDER(a, b, c, d) \
79 EXPECT_TRUE(expect_layer(a, 0)); \
80 EXPECT_TRUE(expect_layer(b, 1)); \
81 EXPECT_TRUE(expect_layer(c, 2)); \
82 EXPECT_TRUE(expect_layer(d, 3));
83
84 #define EXPECT_FRAME_ORDER(a, b, c, d) \
85 EXPECT_TRUE(expect_frame(a, 0) && \
86 expect_frame(b, 1) && \
87 expect_frame(c, 2) && \
88 expect_frame(d, 3));
89
90 #define EXPECT_FRAME_ORDER6(a, b, c, d, e, f) \
91 EXPECT_TRUE(expect_frame(a, 0) && \
92 expect_frame(b, 1) && \
93 expect_frame(c, 2) && \
94 expect_frame(d, 3) && \
95 expect_frame(e, 4) && \
96 expect_frame(f, 5));
97
98 #define EXPECT_FRAME_COPY1(a, b, c, d, e) \
99 EXPECT_TRUE(expect_frame(a, 0)); \
100 EXPECT_TRUE(expect_frame(b, 1)); \
101 EXPECT_TRUE(expect_frame(c, 2)); \
102 EXPECT_TRUE(expect_frame(d, 3)); \
103 EXPECT_TRUE(expect_frame(e, 4));
104
105 #define EXPECT_FRAME_COPY2(a, b, c, d, e, f) \
106 EXPECT_TRUE(expect_frame(a, 0)); \
107 EXPECT_TRUE(expect_frame(b, 1)); \
108 EXPECT_TRUE(expect_frame(c, 2)); \
109 EXPECT_TRUE(expect_frame(d, 3)); \
110 EXPECT_TRUE(expect_frame(e, 4)); \
111 EXPECT_TRUE(expect_frame(f, 5));
112
113 #define EXPECT_FRAME_COPY3(a, b, c, d, e, f, g) \
114 EXPECT_TRUE(expect_frame(a, 0)); \
115 EXPECT_TRUE(expect_frame(b, 1)); \
116 EXPECT_TRUE(expect_frame(c, 2)); \
117 EXPECT_TRUE(expect_frame(d, 3)); \
118 EXPECT_TRUE(expect_frame(e, 4)); \
119 EXPECT_TRUE(expect_frame(f, 5)); \
120 EXPECT_TRUE(expect_frame(g, 6));
121
122 #define EXPECT_CEL(y, x, v, u) \
123 EXPECT_TRUE(expect_cel(y, x, v, u));
124
125 #define EXPECT_EMPTY_CEL(y, x) \
126 EXPECT_TRUE(expect_empty_cel(y, x));
127
128 class DocRangeOps : public ::testing::Test {
129 public:
DocRangeOps()130 DocRangeOps() {
131 expected_color = rgba(255, 255, 255, 255);
132
133 doc.reset(ctx.documents().add(6, 4));
134 sprite = doc->sprite();
135 layer1 = dynamic_cast<LayerImage*>(sprite->root()->firstLayer());
136 layer2 = new LayerImage(sprite);
137 layer3 = new LayerImage(sprite);
138 layer4 = new LayerImage(sprite);
139 sprite->root()->addLayer(layer2);
140 sprite->root()->addLayer(layer3);
141 sprite->root()->addLayer(layer4);
142 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
143
144 layer1->setName("layer1");
145 layer2->setName("layer2");
146 layer3->setName("layer3");
147 layer4->setName("layer4");
148
149 sprite->setTotalFrames(frame_t(6));
150 sprite->setFrameDuration(frame_t(0), 1); // These durations can be used to identify
151 sprite->setFrameDuration(frame_t(1), 2); // frames after a move operation
152 sprite->setFrameDuration(frame_t(2), 3);
153 sprite->setFrameDuration(frame_t(3), 4);
154 sprite->setFrameDuration(frame_t(4), 5);
155 sprite->setFrameDuration(frame_t(5), 6);
156
157 LayerList layers = sprite->allLayers();
158
159 for (layer_t i=0; i<layers.size(); i++) {
160 LayerImage* layer = static_cast<LayerImage*>(layers[i]);
161
162 for (frame_t j=0; j<sprite->totalFrames(); j++) {
163 Cel* cel = layer->cel(frame_t(j));
164 ImageRef image;
165 if (cel)
166 image = cel->imageRef();
167 else {
168 image.reset(Image::create(IMAGE_RGB, 6, 4));
169 cel = new Cel(frame_t(j), image);
170 layer->addCel(cel);
171 }
172
173 clear_image(image.get(), i + j*100);
174 put_pixel(image.get(), i, j, expected_color);
175 }
176 }
177 }
178
~DocRangeOps()179 ~DocRangeOps() {
180 doc->close();
181 }
182
183 protected:
expect_layer(Layer * expected_layer,layer_t layer)184 bool expect_layer(Layer* expected_layer, layer_t layer) {
185 LayerList layers = sprite->allLayers();
186 return expect_layer_frame(
187 find_layer_index(layers, expected_layer), -1, layer, -1);
188 }
189
expect_frame(layer_t expected_frame,frame_t frame)190 bool expect_frame(layer_t expected_frame, frame_t frame) {
191 LayerList layers = sprite->allLayers();
192 for (int i=0; i<(int)layers.size(); ++i) {
193 if (!expect_layer_frame(i, expected_frame, i, frame))
194 return false;
195 }
196 return true;
197 }
198
expect_layer_frame(layer_t expected_layer,frame_t expected_frame,layer_t layer,frame_t frame)199 bool expect_layer_frame(layer_t expected_layer, frame_t expected_frame,
200 layer_t layer, frame_t frame) {
201 if (frame >= 0) {
202 if (!expect_cel(expected_layer, expected_frame, layer, frame))
203 return false;
204
205 EXPECT_EQ((expected_frame+1), sprite->frameDuration(frame));
206 return ((expected_frame+1) == sprite->frameDuration(frame));
207 }
208
209 if (layer >= 0) {
210 LayerList layers = sprite->allLayers();
211 Layer* a = layers[expected_layer];
212 Layer* b = layers[layer];
213 EXPECT_EQ(a->name(), b->name()) << layers;
214 if (a != b)
215 return false;
216 }
217
218 return true;
219 }
220
expect_cel(layer_t expected_layer,frame_t expected_frame,layer_t layer,frame_t frame)221 bool expect_cel(layer_t expected_layer, frame_t expected_frame,
222 layer_t layer, frame_t frame) {
223 LayerList layers = sprite->allLayers();
224 Cel* cel = layers[layer]->cel(frame);
225 if (!cel)
226 return false;
227
228 color_t color = get_pixel(
229 cel->image(),
230 expected_layer, expected_frame);
231
232 EXPECT_EQ(expected_color, color)
233 << " - expecting layer " << expected_layer << " in " << layer << " and it is " << int(color%100) << "\n"
234 << " - expecting frame " << expected_frame << " in " << frame << " and it is " << int(color/100);
235
236 return (expected_color == color);
237 }
238
expect_empty_cel(layer_t layer,frame_t frame)239 bool expect_empty_cel(layer_t layer, frame_t frame) {
240 LayerList layers = sprite->allLayers();
241 Cel* cel = layers[layer]->cel(frame);
242
243 EXPECT_EQ(NULL, cel);
244 return (cel == NULL);
245 }
246
range(Layer * fromLayer,frame_t fromFrNum,Layer * toLayer,frame_t toFrNum,DocRange::Type type)247 DocRange range(Layer* fromLayer, frame_t fromFrNum, Layer* toLayer, frame_t toFrNum, DocRange::Type type) {
248 DocRange r;
249 r.startRange(fromLayer, fromFrNum, type);
250 r.endRange(toLayer, toFrNum);
251 return r;
252 }
253
range(layer_t fromLayer,frame_t fromFrNum,layer_t toLayer,frame_t toFrNum,DocRange::Type type)254 DocRange range(layer_t fromLayer, frame_t fromFrNum,
255 layer_t toLayer, frame_t toFrNum, DocRange::Type type) {
256 LayerList layers = sprite->allLayers();
257 return range(layers[fromLayer], fromFrNum, layers[toLayer], toFrNum, type);
258 }
259
layers_range(Layer * fromLayer,Layer * toLayer)260 DocRange layers_range(Layer* fromLayer, Layer* toLayer) {
261 return range(fromLayer, -1, toLayer, -1, DocRange::kLayers);
262 }
263
layers_range(layer_t fromLayer,layer_t toLayer)264 DocRange layers_range(layer_t fromLayer, layer_t toLayer) {
265 LayerList layers = sprite->allLayers();
266 return layers_range(layers[fromLayer], layers[toLayer]);
267 }
268
layers_range(Layer * layer)269 DocRange layers_range(Layer* layer) {
270 return range(layer, -1, layer, -1, DocRange::kLayers);
271 }
272
layers_range(layer_t layer)273 DocRange layers_range(layer_t layer) {
274 LayerList layers = sprite->allLayers();
275 return layers_range(layers[layer]);
276 }
277
frames_range(frame_t fromFrame,frame_t toFrame)278 DocRange frames_range(frame_t fromFrame, frame_t toFrame) {
279 return range(nullptr, fromFrame, nullptr, toFrame, DocRange::kFrames);
280 }
281
frames_range(frame_t frame)282 DocRange frames_range(frame_t frame) {
283 return range(nullptr, frame, nullptr, frame, DocRange::kFrames);
284 }
285
cels_range(layer_t fromLayer,frame_t fromFrNum,layer_t toLayer,frame_t toFrNum)286 DocRange cels_range(layer_t fromLayer, frame_t fromFrNum,
287 layer_t toLayer, frame_t toFrNum) {
288 return range(fromLayer, fromFrNum, toLayer, toFrNum, DocRange::kCels);
289 }
290
291 TestContextT<app::Context> ctx;
292 DocPtr doc;
293 Sprite* sprite;
294 LayerImage* layer1;
295 LayerImage* layer2;
296 LayerImage* layer3;
297 LayerImage* layer4;
298 color_t expected_color;
299 };
300
TEST_F(DocRangeOps,MoveLayersNoOp)301 TEST_F(DocRangeOps, MoveLayersNoOp) {
302 // Move one layer to the same place
303
304 EXPECT_EQ(layers_range(layer1),
305 move_range(doc,
306 layers_range(layer1),
307 layers_range(layer1), kDocRangeAfter));
308 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
309 EXPECT_FALSE(doc->undoHistory()->canUndo());
310
311 EXPECT_EQ(layers_range(layer1),
312 move_range(doc,
313 layers_range(layer1),
314 layers_range(layer2), kDocRangeBefore));
315 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
316 EXPECT_FALSE(doc->undoHistory()->canUndo());
317
318 EXPECT_EQ(layers_range(layer4),
319 move_range(doc,
320 layers_range(layer4),
321 layers_range(layer4), kDocRangeAfter));
322 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
323 EXPECT_FALSE(doc->undoHistory()->canUndo());
324
325 EXPECT_EQ(layers_range(layer4),
326 move_range(doc,
327 layers_range(layer4),
328 layers_range(layer4), kDocRangeBefore));
329 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
330 EXPECT_FALSE(doc->undoHistory()->canUndo());
331
332 EXPECT_EQ(layers_range(layer4),
333 move_range(doc,
334 layers_range(layer4),
335 layers_range(layer3), kDocRangeAfter));
336 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
337 EXPECT_FALSE(doc->undoHistory()->canUndo());
338
339 // Move two layer to the same place
340
341 EXPECT_EQ(layers_range(layer1, layer2),
342 move_range(doc,
343 layers_range(layer1, layer2),
344 layers_range(layer1), kDocRangeBefore));
345 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
346 EXPECT_FALSE(doc->undoHistory()->canUndo());
347
348 EXPECT_EQ(layers_range(layer1, layer2),
349 move_range(doc,
350 layers_range(layer1, layer2),
351 layers_range(layer1), kDocRangeAfter));
352 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
353 EXPECT_FALSE(doc->undoHistory()->canUndo());
354
355 EXPECT_EQ(layers_range(layer1, layer2),
356 move_range(doc,
357 layers_range(layer1, layer2),
358 layers_range(layer2), kDocRangeBefore));
359 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
360 EXPECT_FALSE(doc->undoHistory()->canUndo());
361
362 EXPECT_EQ(layers_range(layer1, layer2),
363 move_range(doc,
364 layers_range(layer1, layer2),
365 layers_range(layer2), kDocRangeAfter));
366 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
367 EXPECT_FALSE(doc->undoHistory()->canUndo());
368
369 EXPECT_EQ(layers_range(layer1, layer2),
370 move_range(doc,
371 layers_range(layer1, layer2),
372 layers_range(layer3), kDocRangeBefore));
373 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
374 EXPECT_FALSE(doc->undoHistory()->canUndo());
375
376 EXPECT_EQ(layers_range(layer3, layer4),
377 move_range(doc,
378 layers_range(layer3, layer4),
379 layers_range(layer2), kDocRangeAfter));
380 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
381 EXPECT_FALSE(doc->undoHistory()->canUndo());
382
383 EXPECT_EQ(layers_range(layer3, layer4),
384 move_range(doc,
385 layers_range(layer3, layer4),
386 layers_range(layer3), kDocRangeBefore));
387 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
388 EXPECT_FALSE(doc->undoHistory()->canUndo());
389
390 EXPECT_EQ(layers_range(layer3, layer4),
391 move_range(doc,
392 layers_range(layer3, layer4),
393 layers_range(layer3), kDocRangeAfter));
394 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
395 EXPECT_FALSE(doc->undoHistory()->canUndo());
396
397 EXPECT_EQ(layers_range(layer3, layer4),
398 move_range(doc,
399 layers_range(layer3, layer4),
400 layers_range(layer4), kDocRangeBefore));
401 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
402 EXPECT_FALSE(doc->undoHistory()->canUndo());
403
404 EXPECT_EQ(layers_range(layer3, layer4),
405 move_range(doc,
406 layers_range(layer3, layer4),
407 layers_range(layer4), kDocRangeAfter));
408 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
409 EXPECT_FALSE(doc->undoHistory()->canUndo());
410
411 // Move four layers
412
413 DocRangePlace places[] = { kDocRangeBefore, kDocRangeAfter };
414 for (int i=0; i<2; ++i) {
415 for (int layer=0; layer<4; ++layer) {
416 EXPECT_EQ(layers_range(layer1, layer4),
417 move_range(doc,
418 layers_range(layer1, layer4),
419 layers_range(layer), places[i]));
420 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
421 EXPECT_FALSE(doc->undoHistory()->canUndo());
422 }
423
424 for (int layer=0; layer<3; ++layer) {
425 EXPECT_EQ(layers_range(layer1, layer4),
426 move_range(doc,
427 layers_range(layer1, layer4),
428 layers_range(layer, layer+1), places[i]));
429 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
430 EXPECT_FALSE(doc->undoHistory()->canUndo());
431 }
432
433 for (int layer=0; layer<2; ++layer) {
434 EXPECT_EQ(layers_range(layer1, layer4),
435 move_range(doc,
436 layers_range(layer1, layer4),
437 layers_range(layer, layer+2), places[i]));
438 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
439 EXPECT_FALSE(doc->undoHistory()->canUndo());
440 }
441
442 EXPECT_EQ(layers_range(layer1, layer4),
443 move_range(doc,
444 layers_range(layer1, layer4),
445 layers_range(layer1, layer4), places[i]));
446 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
447 EXPECT_FALSE(doc->undoHistory()->canUndo());
448 }
449 }
450
TEST_F(DocRangeOps,MoveFramesNoOp)451 TEST_F(DocRangeOps, MoveFramesNoOp) {
452 // Move one frame to the same place
453
454 EXPECT_EQ(frames_range(0),
455 move_range(doc,
456 frames_range(0),
457 frames_range(0), kDocRangeAfter));
458 EXPECT_FRAME_ORDER(0, 1, 2, 3);
459 EXPECT_FALSE(doc->undoHistory()->canUndo());
460
461 EXPECT_EQ(frames_range(0),
462 move_range(doc,
463 frames_range(0),
464 frames_range(1), kDocRangeBefore));
465 EXPECT_FRAME_ORDER(0, 1, 2, 3);
466 EXPECT_FALSE(doc->undoHistory()->canUndo());
467
468 EXPECT_EQ(frames_range(3),
469 move_range(doc,
470 frames_range(3),
471 frames_range(3), kDocRangeAfter));
472 EXPECT_FRAME_ORDER(0, 1, 2, 3);
473 EXPECT_FALSE(doc->undoHistory()->canUndo());
474
475 EXPECT_EQ(frames_range(3),
476 move_range(doc,
477 frames_range(3),
478 frames_range(3), kDocRangeBefore));
479 EXPECT_FRAME_ORDER(0, 1, 2, 3);
480 EXPECT_FALSE(doc->undoHistory()->canUndo());
481
482 EXPECT_EQ(frames_range(3),
483 move_range(doc,
484 frames_range(3),
485 frames_range(2), kDocRangeAfter));
486 EXPECT_FRAME_ORDER(0, 1, 2, 3);
487 EXPECT_FALSE(doc->undoHistory()->canUndo());
488
489 // Move two frame to the same place
490
491 EXPECT_EQ(frames_range(0, 1),
492 move_range(doc,
493 frames_range(0, 1),
494 frames_range(0), kDocRangeBefore));
495 EXPECT_FRAME_ORDER(0, 1, 2, 3);
496 EXPECT_FALSE(doc->undoHistory()->canUndo());
497
498 EXPECT_EQ(frames_range(0, 1),
499 move_range(doc,
500 frames_range(0, 1),
501 frames_range(0), kDocRangeAfter));
502 EXPECT_FRAME_ORDER(0, 1, 2, 3);
503 EXPECT_FALSE(doc->undoHistory()->canUndo());
504
505 EXPECT_EQ(frames_range(0, 1),
506 move_range(doc,
507 frames_range(0, 1),
508 frames_range(1), kDocRangeBefore));
509 EXPECT_FRAME_ORDER(0, 1, 2, 3);
510 EXPECT_FALSE(doc->undoHistory()->canUndo());
511
512 EXPECT_EQ(frames_range(0, 1),
513 move_range(doc,
514 frames_range(0, 1),
515 frames_range(1), kDocRangeAfter));
516 EXPECT_FRAME_ORDER(0, 1, 2, 3);
517 EXPECT_FALSE(doc->undoHistory()->canUndo());
518
519 EXPECT_EQ(frames_range(0, 1),
520 move_range(doc,
521 frames_range(0, 1),
522 frames_range(2), kDocRangeBefore));
523 EXPECT_FRAME_ORDER(0, 1, 2, 3);
524 EXPECT_FALSE(doc->undoHistory()->canUndo());
525
526 EXPECT_EQ(frames_range(2, 3),
527 move_range(doc,
528 frames_range(2, 3),
529 frames_range(1), kDocRangeAfter));
530 EXPECT_FRAME_ORDER(0, 1, 2, 3);
531 EXPECT_FALSE(doc->undoHistory()->canUndo());
532
533 EXPECT_EQ(frames_range(2, 3),
534 move_range(doc,
535 frames_range(2, 3),
536 frames_range(2), kDocRangeBefore));
537 EXPECT_FRAME_ORDER(0, 1, 2, 3);
538 EXPECT_FALSE(doc->undoHistory()->canUndo());
539
540 EXPECT_EQ(frames_range(2, 3),
541 move_range(doc,
542 frames_range(2, 3),
543 frames_range(2), kDocRangeAfter));
544 EXPECT_FRAME_ORDER(0, 1, 2, 3);
545 EXPECT_FALSE(doc->undoHistory()->canUndo());
546
547 EXPECT_EQ(frames_range(2, 3),
548 move_range(doc,
549 frames_range(2, 3),
550 frames_range(3), kDocRangeBefore));
551 EXPECT_FRAME_ORDER(0, 1, 2, 3);
552 EXPECT_FALSE(doc->undoHistory()->canUndo());
553
554 EXPECT_EQ(frames_range(2, 3),
555 move_range(doc,
556 frames_range(2, 3),
557 frames_range(3), kDocRangeAfter));
558 EXPECT_FRAME_ORDER(0, 1, 2, 3);
559 EXPECT_FALSE(doc->undoHistory()->canUndo());
560
561 // Move four frames
562
563 DocRangePlace places[] = { kDocRangeBefore, kDocRangeAfter };
564 for (int i=0; i<2; ++i) {
565 for (int frame=0; frame<4; ++frame) {
566 EXPECT_EQ(frames_range(0, 3),
567 move_range(doc,
568 frames_range(0, 3),
569 frames_range(frame), places[i]));
570 EXPECT_FRAME_ORDER(0, 1, 2, 3);
571 EXPECT_FALSE(doc->undoHistory()->canUndo());
572 }
573
574 for (int frame=0; frame<3; ++frame) {
575 EXPECT_EQ(frames_range(0, 3),
576 move_range(doc,
577 frames_range(0, 3),
578 frames_range(frame, frame+1), places[i]));
579 EXPECT_FRAME_ORDER(0, 1, 2, 3);
580 EXPECT_FALSE(doc->undoHistory()->canUndo());
581 }
582
583 for (int frame=0; frame<2; ++frame) {
584 EXPECT_EQ(frames_range(0, 3),
585 move_range(doc,
586 frames_range(0, 3),
587 frames_range(frame, frame+2), places[i]));
588 EXPECT_FRAME_ORDER(0, 1, 2, 3);
589 EXPECT_FALSE(doc->undoHistory()->canUndo());
590 }
591
592 EXPECT_EQ(frames_range(0, 3),
593 move_range(doc,
594 frames_range(0, 3),
595 frames_range(0, 3), places[i]));
596 EXPECT_FRAME_ORDER(0, 1, 2, 3);
597 EXPECT_FALSE(doc->undoHistory()->canUndo());
598 }
599 }
600
TEST_F(DocRangeOps,MoveCelsNoOp)601 TEST_F(DocRangeOps, MoveCelsNoOp) {
602 EXPECT_EQ(cels_range(0, 0, 1, 1),
603 move_range(doc,
604 cels_range(0, 0, 1, 1),
605 cels_range(0, 0, 1, 1), kDocRangeAfter));
606 EXPECT_CEL(0, 0, 0, 0);
607 EXPECT_CEL(0, 1, 0, 1);
608 EXPECT_CEL(1, 0, 1, 0);
609 EXPECT_CEL(1, 1, 1, 1);
610 EXPECT_FALSE(doc->undoHistory()->canUndo());
611 }
612
TEST_F(DocRangeOps,CopyCelsNoOp)613 TEST_F(DocRangeOps, CopyCelsNoOp) {
614 // TODO
615 }
616
TEST_F(DocRangeOps,MoveLayers)617 TEST_F(DocRangeOps, MoveLayers) {
618 // One layer at the bottom of another
619 EXPECT_EQ(layers_range(layer1),
620 move_range(doc,
621 layers_range(layer1),
622 layers_range(layer2), kDocRangeAfter));
623 EXPECT_LAYER_ORDER(layer2, layer1, layer3, layer4);
624 doc->undoHistory()->undo();
625 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
626
627 // One layer at the bottom
628 EXPECT_EQ(layers_range(layer2),
629 move_range(doc,
630 layers_range(layer2),
631 layers_range(layer1), kDocRangeBefore));
632 EXPECT_LAYER_ORDER(layer2, layer1, layer3, layer4);
633 doc->undoHistory()->undo();
634 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
635
636 // Try with a background
637 layer1->setBackground(true);
638 EXPECT_THROW({
639 move_range(doc,
640 layers_range(layer1),
641 layers_range(layer2), kDocRangeAfter);
642 }, std::exception);
643 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
644 layer1->setBackground(false);
645
646 // Move one layer to the top
647 EXPECT_EQ(layers_range(layer2),
648 move_range(doc,
649 layers_range(layer2),
650 layers_range(layer4), kDocRangeAfter));
651 EXPECT_LAYER_ORDER(layer1, layer3, layer4, layer2);
652 doc->undoHistory()->undo();
653 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
654
655 // Move one layers before other
656 EXPECT_EQ(layers_range(layer2),
657 move_range(doc,
658 layers_range(layer2),
659 layers_range(layer4), kDocRangeBefore));
660 EXPECT_LAYER_ORDER(layer1, layer3, layer2, layer4);
661 doc->undoHistory()->undo();
662 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
663
664 EXPECT_EQ(layers_range(layer1),
665 move_range(doc,
666 layers_range(layer1),
667 layers_range(layer3, layer4), kDocRangeBefore));
668 EXPECT_LAYER_ORDER(layer2, layer1, layer3, layer4);
669 doc->undoHistory()->undo();
670 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
671
672 // Move two layers on top of other
673 EXPECT_EQ(layers_range(layer2, layer3),
674 move_range(doc,
675 layers_range(layer2, layer3),
676 layers_range(layer4), kDocRangeAfter));
677 EXPECT_LAYER_ORDER(layer1, layer4, layer2, layer3);
678
679 EXPECT_EQ(layers_range(layer2, layer3),
680 move_range(doc,
681 layers_range(layer2, layer3),
682 layers_range(layer1), kDocRangeAfter));
683 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
684
685 // Move three layers at the bottom (but we cannot because the bottom is a background layer)
686 layer1->setBackground(true);
687 EXPECT_THROW({
688 move_range(doc,
689 layers_range(layer2, layer4),
690 layers_range(layer1), kDocRangeBefore);
691 }, std::exception);
692 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
693 layer1->setBackground(false);
694
695 // Move three layers at the top
696 EXPECT_EQ(layers_range(layer1, layer3),
697 move_range(doc,
698 layers_range(layer1, layer3),
699 layers_range(layer4), kDocRangeAfter));
700 EXPECT_LAYER_ORDER(layer4, layer1, layer2, layer3);
701 doc->undoHistory()->undo();
702 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
703
704 // Move three layers at the bottom
705 EXPECT_EQ(layers_range(layer2, layer4),
706 move_range(doc,
707 layers_range(layer2, layer4),
708 layers_range(layer1), kDocRangeBefore));
709 EXPECT_LAYER_ORDER(layer2, layer3, layer4, layer1);
710 doc->undoHistory()->undo();
711 EXPECT_LAYER_ORDER(layer1, layer2, layer3, layer4);
712 }
713
TEST_F(DocRangeOps,MoveFrames)714 TEST_F(DocRangeOps, MoveFrames) {
715 // Move frame 0 after 1
716 EXPECT_EQ(frames_range(1),
717 move_range(doc,
718 frames_range(0),
719 frames_range(1), kDocRangeAfter));
720 EXPECT_FRAME_ORDER(1, 0, 2, 3);
721 doc->undoHistory()->undo();
722 EXPECT_FRAME_ORDER(0, 1, 2, 3);
723
724 // Move frame 1 after frame 5 (at the end)
725 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
726 EXPECT_EQ(frames_range(5),
727 move_range(doc,
728 frames_range(1),
729 frames_range(5), kDocRangeAfter));
730 EXPECT_FRAME_ORDER6(0, 2, 3, 4, 5, 1);
731 doc->undoHistory()->undo();
732 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
733
734 // Move frames 1,2 after 5
735 EXPECT_EQ(frames_range(4, 5),
736 move_range(
737 doc,
738 frames_range(1, 2),
739 frames_range(5), kDocRangeAfter));
740 EXPECT_FRAME_ORDER6(0, 3, 4, 5, 1, 2);
741 doc->undoHistory()->undo();
742 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
743
744 // Move frames 1,2 after 3
745 EXPECT_EQ(frames_range(1, 2),
746 move_range(doc,
747 frames_range(2, 3),
748 frames_range(0), kDocRangeAfter));
749 EXPECT_FRAME_ORDER(0, 2, 3, 1);
750 doc->undoHistory()->undo();
751 EXPECT_FRAME_ORDER(0, 1, 2, 3);
752
753 // Move three frames at the beginning
754 EXPECT_EQ(frames_range(0, 2),
755 move_range(doc,
756 frames_range(1, 3),
757 frames_range(0), kDocRangeBefore));
758 EXPECT_FRAME_ORDER(1, 2, 3, 0);
759 doc->undoHistory()->undo();
760 EXPECT_FRAME_ORDER(0, 1, 2, 3);
761
762 // Move three frames at the end
763 EXPECT_EQ(frames_range(1, 3),
764 move_range(doc,
765 frames_range(0, 2),
766 frames_range(3), kDocRangeAfter));
767 EXPECT_FRAME_ORDER(3, 0, 1, 2);
768 doc->undoHistory()->undo();
769 EXPECT_FRAME_ORDER(0, 1, 2, 3);
770 }
771
TEST_F(DocRangeOps,MoveFramesNonAdjacent)772 TEST_F(DocRangeOps, MoveFramesNonAdjacent) {
773 // Move frames 0,2...
774
775 DocRange from;
776 from.startRange(nullptr, 0, DocRange::kFrames); from.endRange(nullptr, 0);
777 from.startRange(nullptr, 2, DocRange::kFrames); from.endRange(nullptr, 2);
778
779 // Move frames 0,2 after 3...
780
781 EXPECT_EQ(frames_range(2, 3),
782 move_range(doc, from, frames_range(3), kDocRangeAfter));
783 EXPECT_FRAME_ORDER(1, 3, 0, 2);
784 doc->undoHistory()->undo();
785 EXPECT_FRAME_ORDER(0, 1, 2, 3);
786
787 // Move frames 0,2 before 3...
788
789 EXPECT_EQ(frames_range(1, 2),
790 move_range(doc, from, frames_range(3), kDocRangeBefore));
791 EXPECT_FRAME_ORDER(1, 0, 2, 3);
792 doc->undoHistory()->undo();
793 EXPECT_FRAME_ORDER(0, 1, 2, 3);
794
795 // Move frames 0,2 before 0...
796
797 EXPECT_EQ(frames_range(0, 1),
798 move_range(doc, from, frames_range(0), kDocRangeBefore));
799 EXPECT_FRAME_ORDER(0, 2, 1, 3);
800 doc->undoHistory()->undo();
801 EXPECT_FRAME_ORDER(0, 1, 2, 3);
802
803 // Move frames 0,2 after 0...
804
805 EXPECT_EQ(frames_range(0, 1),
806 move_range(doc, from, frames_range(0), kDocRangeAfter));
807 EXPECT_FRAME_ORDER(0, 2, 1, 3);
808 doc->undoHistory()->undo();
809 EXPECT_FRAME_ORDER(0, 1, 2, 3);
810
811 // Move frames 0,2 before 1...
812
813 EXPECT_EQ(frames_range(0, 1),
814 move_range(doc, from, frames_range(1), kDocRangeBefore));
815 EXPECT_FRAME_ORDER(0, 2, 1, 3);
816 doc->undoHistory()->undo();
817 EXPECT_FRAME_ORDER(0, 1, 2, 3);
818
819 // Move frames 0,2 after 1...
820
821 EXPECT_EQ(frames_range(1, 2),
822 move_range(doc, from, frames_range(1), kDocRangeAfter));
823 EXPECT_FRAME_ORDER(1, 0, 2, 3);
824 doc->undoHistory()->undo();
825 EXPECT_FRAME_ORDER(0, 1, 2, 3);
826
827 // Move 1,2,5...
828
829 from.clearRange();
830 from.startRange(nullptr, 1, DocRange::kFrames);
831 from.endRange(nullptr, 2);
832 from.startRange(nullptr, 5, DocRange::kFrames);
833 from.endRange(nullptr, 5);
834
835 // Move 1,2,5 before 4...
836
837 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
838 EXPECT_EQ(frames_range(2, 4),
839 move_range(doc, from, frames_range(4), kDocRangeBefore));
840 EXPECT_FRAME_ORDER6(0, 3, 1, 2, 5, 4);
841 doc->undoHistory()->undo();
842 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
843
844 // Move 1,2,5 after 4...
845
846 EXPECT_EQ(frames_range(3, 5),
847 move_range(doc, from, frames_range(4), kDocRangeAfter));
848 EXPECT_FRAME_ORDER6(0, 3, 4, 1, 2, 5);
849 doc->undoHistory()->undo();
850 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
851
852 // Move 1,2,5 before 2...
853
854 EXPECT_EQ(frames_range(1, 3),
855 move_range(doc, from, frames_range(2), kDocRangeBefore));
856 EXPECT_FRAME_ORDER6(0, 1, 2, 5, 3, 4);
857 doc->undoHistory()->undo();
858 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
859
860 // Move 1,2,5 after 2...
861
862 EXPECT_EQ(frames_range(1, 3),
863 move_range(doc, from, frames_range(2), kDocRangeAfter));
864 EXPECT_FRAME_ORDER6(0, 1, 2, 5, 3, 4);
865 doc->undoHistory()->undo();
866 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
867
868 // Move 1,2,5 before 1...
869
870 EXPECT_EQ(frames_range(1, 3),
871 move_range(doc, from, frames_range(1), kDocRangeBefore));
872 EXPECT_FRAME_ORDER6(0, 1, 2, 5, 3, 4);
873 doc->undoHistory()->undo();
874 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
875
876 // Move 1,3,5...
877
878 from.clearRange();
879 from.startRange(nullptr, 1, DocRange::kFrames);
880 from.endRange(nullptr, 1);
881 from.startRange(nullptr, 3, DocRange::kFrames);
882 from.endRange(nullptr, 3);
883 from.startRange(nullptr, 5, DocRange::kFrames);
884 from.endRange(nullptr, 5);
885
886 // Move 1,3,5 before 4...
887
888 EXPECT_EQ(frames_range(2, 4),
889 move_range(doc, from, frames_range(4), kDocRangeBefore));
890 EXPECT_FRAME_ORDER6(0, 2, 1, 3, 5, 4);
891 doc->undoHistory()->undo();
892 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
893
894 // Move 1,3,5 after 4...
895
896 EXPECT_EQ(frames_range(3, 5),
897 move_range(doc, from, frames_range(4), kDocRangeAfter));
898 EXPECT_FRAME_ORDER6(0, 2, 4, 1, 3, 5);
899 doc->undoHistory()->undo();
900 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
901
902 // Move 1,3,5 before 5...
903
904 EXPECT_EQ(frames_range(3, 5),
905 move_range(doc, from, frames_range(5), kDocRangeBefore));
906 EXPECT_FRAME_ORDER6(0, 2, 4, 1, 3, 5);
907 doc->undoHistory()->undo();
908 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
909
910 // Move 1,3,5 after 5...
911
912 EXPECT_EQ(frames_range(3, 5),
913 move_range(doc, from, frames_range(5), kDocRangeAfter));
914 EXPECT_FRAME_ORDER6(0, 2, 4, 1, 3, 5);
915 doc->undoHistory()->undo();
916 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
917 }
918
TEST_F(DocRangeOps,MoveCels)919 TEST_F(DocRangeOps, MoveCels) {
920 DocRangePlace ignore = kDocRangeBefore;
921
922 move_range(doc,
923 cels_range(0, 0, 0, 0),
924 cels_range(0, 1, 0, 1), ignore);
925 EXPECT_CEL(0, 0, 0, 1);
926 EXPECT_EMPTY_CEL(0, 0);
927 doc->undoHistory()->undo();
928 EXPECT_CEL(0, 0, 0, 0);
929
930 move_range(doc,
931 cels_range(0, 0, 0, 1),
932 cels_range(0, 2, 0, 3), ignore);
933 EXPECT_CEL(0, 0, 0, 2);
934 EXPECT_CEL(0, 1, 0, 3);
935 EXPECT_EMPTY_CEL(0, 0);
936 EXPECT_EMPTY_CEL(0, 1);
937 doc->undoHistory()->undo();
938
939 move_range(doc,
940 cels_range(0, 0, 1, 1),
941 cels_range(2, 2, 3, 3), ignore);
942 EXPECT_CEL(0, 0, 2, 2);
943 EXPECT_CEL(0, 1, 2, 3);
944 EXPECT_CEL(1, 0, 3, 2);
945 EXPECT_CEL(1, 1, 3, 3);
946 EXPECT_EMPTY_CEL(0, 0);
947 EXPECT_EMPTY_CEL(0, 1);
948 EXPECT_EMPTY_CEL(1, 0);
949 EXPECT_EMPTY_CEL(1, 1);
950 doc->undoHistory()->undo();
951
952 move_range(doc,
953 cels_range(0, 0, 0, 3),
954 cels_range(1, 0, 1, 3), ignore);
955 EXPECT_CEL(0, 0, 1, 0);
956 EXPECT_CEL(0, 1, 1, 1);
957 EXPECT_CEL(0, 2, 1, 2);
958 EXPECT_CEL(0, 3, 1, 3);
959 EXPECT_EMPTY_CEL(0, 0);
960 EXPECT_EMPTY_CEL(0, 1);
961 EXPECT_EMPTY_CEL(0, 2);
962 EXPECT_EMPTY_CEL(0, 3);
963 doc->undoHistory()->undo();
964
965 // Moving with overlapping areas
966 move_range(doc,
967 cels_range(0, 0, 0, 2),
968 cels_range(0, 1, 0, 3), ignore);
969 EXPECT_CEL(0, 0, 0, 1);
970 EXPECT_CEL(0, 1, 0, 2);
971 EXPECT_CEL(0, 2, 0, 3);
972 EXPECT_EMPTY_CEL(0, 0);
973 doc->undoHistory()->undo();
974 }
975
TEST_F(DocRangeOps,CopyLayers)976 TEST_F(DocRangeOps, CopyLayers) {
977 // TODO
978 }
979
TEST_F(DocRangeOps,CopyFrames)980 TEST_F(DocRangeOps, CopyFrames) {
981 // Copy one frame
982 EXPECT_EQ(frames_range(2),
983 copy_range(doc,
984 frames_range(0),
985 frames_range(2, 3), kDocRangeBefore));
986 EXPECT_FRAME_COPY1(0, 1, 0, 2, 3);
987 doc->undoHistory()->undo();
988 EXPECT_FRAME_ORDER(0, 1, 2, 3);
989
990 EXPECT_EQ(frames_range(4),
991 copy_range(doc,
992 frames_range(0),
993 frames_range(2, 3), kDocRangeAfter));
994 EXPECT_FRAME_COPY1(0, 1, 2, 3, 0);
995 doc->undoHistory()->undo();
996 EXPECT_FRAME_ORDER(0, 1, 2, 3);
997
998 EXPECT_EQ(frames_range(0),
999 copy_range(doc,
1000 frames_range(3),
1001 frames_range(0, 1), kDocRangeBefore));
1002 EXPECT_FRAME_COPY1(3, 0, 1, 2, 3);
1003 doc->undoHistory()->undo();
1004 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1005
1006 EXPECT_EQ(frames_range(2),
1007 copy_range(doc,
1008 frames_range(3),
1009 frames_range(0, 1), kDocRangeAfter));
1010 EXPECT_FRAME_COPY1(0, 1, 3, 2, 3);
1011 doc->undoHistory()->undo();
1012 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1013
1014 // Copy three frames
1015
1016 EXPECT_EQ(frames_range(3, 5),
1017 copy_range(doc,
1018 frames_range(0, 2),
1019 frames_range(3), kDocRangeBefore));
1020 EXPECT_FRAME_COPY3(0, 1, 2, 0, 1, 2, 3);
1021 doc->undoHistory()->undo();
1022 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1023
1024 EXPECT_EQ(frames_range(4, 6),
1025 copy_range(doc,
1026 frames_range(0, 2),
1027 frames_range(3), kDocRangeAfter));
1028 EXPECT_FRAME_COPY3(0, 1, 2, 3, 0, 1, 2);
1029 doc->undoHistory()->undo();
1030 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1031
1032 EXPECT_EQ(frames_range(0, 2),
1033 copy_range(doc,
1034 frames_range(1, 3),
1035 frames_range(0), kDocRangeBefore));
1036 EXPECT_FRAME_COPY3(1, 2, 3, 0, 1, 2, 3);
1037 doc->undoHistory()->undo();
1038 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1039
1040 EXPECT_EQ(frames_range(1, 3),
1041 copy_range(doc,
1042 frames_range(1, 3),
1043 frames_range(0), kDocRangeAfter));
1044 EXPECT_FRAME_COPY3(0, 1, 2, 3, 1, 2, 3);
1045 doc->undoHistory()->undo();
1046 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1047
1048 EXPECT_EQ(frames_range(0, 2),
1049 copy_range(doc,
1050 frames_range(0, 2),
1051 frames_range(0, 2), kDocRangeBefore));
1052 EXPECT_FRAME_COPY3(0, 1, 2, 0, 1, 2, 3);
1053 doc->undoHistory()->undo();
1054 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1055
1056 EXPECT_EQ(frames_range(3, 5),
1057 copy_range(doc,
1058 frames_range(0, 2),
1059 frames_range(0, 2), kDocRangeAfter));
1060 EXPECT_FRAME_COPY3(0, 1, 2, 0, 1, 2, 3);
1061 doc->undoHistory()->undo();
1062 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1063 }
1064
TEST_F(DocRangeOps,CopyFramesNonAdjacent)1065 TEST_F(DocRangeOps, CopyFramesNonAdjacent) {
1066 // Copy frames 0 and 2...
1067
1068 DocRange from;
1069 from.startRange(nullptr, 0, DocRange::kFrames); from.endRange(nullptr, 0);
1070 from.startRange(nullptr, 2, DocRange::kFrames); from.endRange(nullptr, 2);
1071
1072 EXPECT_EQ(frames_range(3, 4),
1073 copy_range(doc, from, frames_range(3), kDocRangeBefore));
1074 EXPECT_FRAME_COPY2(0, 1, 2, 0, 2, 3);
1075 doc->undoHistory()->undo();
1076 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1077
1078 EXPECT_EQ(frames_range(4, 5),
1079 copy_range(doc, from, frames_range(3), kDocRangeAfter));
1080 EXPECT_FRAME_COPY2(0, 1, 2, 3, 0, 2);
1081 doc->undoHistory()->undo();
1082 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1083
1084 EXPECT_EQ(frames_range(2, 3),
1085 copy_range(doc, from, frames_range(1), kDocRangeAfter));
1086 EXPECT_FRAME_COPY2(0, 1, 0, 2, 2, 3);
1087 doc->undoHistory()->undo();
1088 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1089
1090 EXPECT_EQ(frames_range(1, 2),
1091 copy_range(doc, from, frames_range(1), kDocRangeBefore));
1092 EXPECT_FRAME_COPY2(0, 0, 2, 1, 2, 3);
1093 doc->undoHistory()->undo();
1094 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1095
1096 // Copy frames 1 and 3...
1097
1098 from.clearRange();
1099 from.startRange(nullptr, 1, DocRange::kFrames); from.endRange(nullptr, 1);
1100 from.startRange(nullptr, 3, DocRange::kFrames); from.endRange(nullptr, 3);
1101
1102 EXPECT_EQ(frames_range(0, 1),
1103 copy_range(doc, from, frames_range(0), kDocRangeBefore));
1104 EXPECT_FRAME_COPY2(1, 3, 0, 1, 2, 3);
1105 doc->undoHistory()->undo();
1106 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1107
1108 EXPECT_EQ(frames_range(1, 2),
1109 copy_range(doc, from, frames_range(0), kDocRangeAfter));
1110 EXPECT_FRAME_COPY2(0, 1, 3, 1, 2, 3);
1111 doc->undoHistory()->undo();
1112 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1113 }
1114
TEST_F(DocRangeOps,CopyCels)1115 TEST_F(DocRangeOps, CopyCels) {
1116 // TODO
1117 }
1118
TEST_F(DocRangeOps,ReverseFrames)1119 TEST_F(DocRangeOps, ReverseFrames) {
1120 reverse_frames(doc, frames_range(0, 0));
1121 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1122
1123 reverse_frames(doc, frames_range(1, 1));
1124 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1125
1126 reverse_frames(doc, frames_range(1, 2));
1127 EXPECT_FRAME_ORDER(0, 2, 1, 3);
1128 doc->undoHistory()->undo();
1129 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1130
1131 reverse_frames(doc, frames_range(0, 2));
1132 EXPECT_FRAME_ORDER(2, 1, 0, 3);
1133 doc->undoHistory()->undo();
1134 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1135
1136 reverse_frames(doc, frames_range(1, 3));
1137 EXPECT_FRAME_ORDER(0, 3, 2, 1);
1138 doc->undoHistory()->undo();
1139 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1140
1141 reverse_frames(doc, frames_range(0, 3));
1142 EXPECT_FRAME_ORDER(3, 2, 1, 0);
1143 doc->undoHistory()->undo();
1144 EXPECT_FRAME_ORDER(0, 1, 2, 3);
1145 }
1146
TEST_F(DocRangeOps,ReverseCels)1147 TEST_F(DocRangeOps, ReverseCels) {
1148 // TODO
1149 }
1150
TEST(DocRangeOps2,DropInsideBugs)1151 TEST(DocRangeOps2, DropInsideBugs) {
1152 TestContextT<app::Context> ctx;
1153 DocPtr doc(ctx.documents().add(4, 4));
1154 auto sprite = doc->sprite();
1155 auto layer1 = dynamic_cast<LayerImage*>(sprite->root()->firstLayer());
1156 auto layer2 = new LayerGroup(sprite);
1157 auto layer3 = new LayerGroup(sprite);
1158 auto layer4 = new LayerGroup(sprite);
1159 sprite->root()->addLayer(layer2);
1160 sprite->root()->addLayer(layer3);
1161 sprite->root()->addLayer(layer4);
1162
1163 EXPECT_EQ(layer1, sprite->root()->layers()[0]);
1164 EXPECT_EQ(layer2, sprite->root()->layers()[1]);
1165 EXPECT_EQ(layer3, sprite->root()->layers()[2]);
1166 EXPECT_EQ(layer4, sprite->root()->layers()[3]);
1167
1168 // layer4 layer4
1169 // layer3 --> layer1
1170 // layer2 layer3
1171 // layer1 layer2
1172 DocRange from, to;
1173 from.selectLayer(layer1);
1174 to.selectLayer(layer4);
1175 move_range(doc, from, to, kDocRangeFirstChild);
1176 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1177 EXPECT_EQ(layer3, sprite->root()->layers()[1]);
1178 EXPECT_EQ(layer4, sprite->root()->layers()[2]);
1179 EXPECT_EQ(layer1, layer4->layers()[0]);
1180
1181 // layer4 layer4
1182 // layer1 --> layer1
1183 // layer3 layer3
1184 // layer2 layer2
1185 from.clearRange(); from.selectLayer(layer3);
1186 to.clearRange(); to.selectLayer(layer1);
1187 move_range(doc, from, to, kDocRangeBefore);
1188 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1189 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1190 EXPECT_EQ(layer3, layer4->layers()[0]);
1191 EXPECT_EQ(layer1, layer4->layers()[1]);
1192
1193 // layer4 layer4
1194 // layer1 --> layer3
1195 // layer3 layer1
1196 // layer2 layer2
1197 from.clearRange(); from.selectLayer(layer1);
1198 to.clearRange(); to.selectLayer(layer3);
1199 move_range(doc, from, to, kDocRangeFirstChild);
1200 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1201 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1202 EXPECT_EQ(layer3, layer4->layers()[0]);
1203 EXPECT_EQ(layer1, layer3->layers()[0]);
1204
1205 // move layer4 as first child of layer4 (invalid operation)
1206 from.clearRange(); from.selectLayer(layer4);
1207 to.clearRange(); to.selectLayer(layer4);
1208 move_range(doc, from, to, kDocRangeFirstChild);
1209 // Everything is exactly the same (no new undo operation)
1210 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1211 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1212 EXPECT_EQ(layer3, layer4->layers()[0]);
1213 EXPECT_EQ(layer1, layer3->layers()[0]);
1214
1215 // move layer4 as first child of layer3 (invalid operation)
1216 from.clearRange(); from.selectLayer(layer4);
1217 to.clearRange(); to.selectLayer(layer3);
1218 move_range(doc, from, to, kDocRangeFirstChild);
1219 // Everything is exactly the same (no new undo operation)
1220 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1221 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1222 EXPECT_EQ(layer3, layer4->layers()[0]);
1223 EXPECT_EQ(layer1, layer3->layers()[0]);
1224
1225 // move layer4 after layer1 (invalid operation)
1226 from.clearRange(); from.selectLayer(layer4);
1227 to.clearRange(); to.selectLayer(layer1);
1228 move_range(doc, from, to, kDocRangeAfter);
1229 // Everything is exactly the same (no new undo operation)
1230 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1231 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1232 EXPECT_EQ(layer3, layer4->layers()[0]);
1233 EXPECT_EQ(layer1, layer3->layers()[0]);
1234
1235 // move layer4 after layer1 (invalid operation)
1236 from.clearRange(); from.selectLayer(layer4);
1237 to.clearRange(); to.selectLayer(layer1);
1238 move_range(doc, from, to, kDocRangeBefore);
1239 // Everything is exactly the same (no new undo operation)
1240 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1241 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1242 EXPECT_EQ(layer3, layer4->layers()[0]);
1243 EXPECT_EQ(layer1, layer3->layers()[0]);
1244
1245 // move layer2 inside layer2 (invalid operation)
1246 from.clearRange(); from.selectLayer(layer2);
1247 to.clearRange(); to.selectLayer(layer2);
1248 move_range(doc, from, to, kDocRangeFirstChild);
1249 // Everything is exactly the same (no new undo operation)
1250 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1251 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1252 EXPECT_EQ(layer3, layer4->layers()[0]);
1253 EXPECT_EQ(layer1, layer3->layers()[0]);
1254
1255 // layer4 layer4
1256 // layer1 <-- layer3
1257 // layer3 layer1
1258 // layer2 layer2
1259 doc->undoHistory()->undo();
1260 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1261 EXPECT_EQ(layer4, sprite->root()->layers()[1]);
1262 EXPECT_EQ(layer3, layer4->layers()[0]);
1263 EXPECT_EQ(layer1, layer4->layers()[1]);
1264
1265 // layer4 layer4
1266 // layer1 <-- layer1
1267 // layer3 layer3
1268 // layer2 layer2
1269 doc->undoHistory()->undo();
1270 EXPECT_EQ(layer2, sprite->root()->layers()[0]);
1271 EXPECT_EQ(layer3, sprite->root()->layers()[1]);
1272 EXPECT_EQ(layer4, sprite->root()->layers()[2]);
1273 EXPECT_EQ(layer1, layer4->layers()[0]);
1274
1275 // layer4 layer4
1276 // layer3 <-- layer1
1277 // layer2 layer3
1278 // layer1 layer2
1279 doc->undoHistory()->undo();
1280 EXPECT_EQ(layer1, sprite->root()->layers()[0]);
1281 EXPECT_EQ(layer2, sprite->root()->layers()[1]);
1282 EXPECT_EQ(layer3, sprite->root()->layers()[2]);
1283 EXPECT_EQ(layer4, sprite->root()->layers()[3]);
1284
1285 doc->close();
1286 }
1287
TEST_F(DocRangeOps,MoveRangeWithTags)1288 TEST_F(DocRangeOps, MoveRangeWithTags) {
1289 FrameTag* a = new FrameTag(0, 2);
1290 FrameTag* b = new FrameTag(3, 5);
1291 sprite->frameTags().add(a);
1292 sprite->frameTags().add(b);
1293
1294 EXPECT_EQ(0, a->fromFrame());
1295 EXPECT_EQ(2, a->toFrame());
1296 EXPECT_EQ(3, b->fromFrame());
1297 EXPECT_EQ(5, b->toFrame());
1298
1299 // Move before tag "a" (outside the tag)
1300 EXPECT_EQ(frames_range(0, 1),
1301 move_range(doc,
1302 frames_range(1, 2),
1303 frames_range(0),
1304 kDocRangeBefore,
1305 kFitOutsideTags));
1306 EXPECT_FRAME_ORDER6(1, 2, 0, 3, 4, 5);
1307 EXPECT_EQ(2, a->fromFrame());
1308 EXPECT_EQ(2, a->toFrame());
1309 EXPECT_EQ(3, b->fromFrame());
1310 EXPECT_EQ(5, b->toFrame());
1311
1312 // Check that undo for frame tags does work.
1313 doc->undoHistory()->undo();
1314 EXPECT_EQ(0, a->fromFrame());
1315 EXPECT_EQ(2, a->toFrame());
1316 EXPECT_EQ(3, b->fromFrame());
1317 EXPECT_EQ(5, b->toFrame());
1318
1319 // Move before tag "a" (inside the tag)
1320 EXPECT_EQ(frames_range(0, 1),
1321 move_range(doc,
1322 frames_range(1, 2),
1323 frames_range(0),
1324 kDocRangeBefore,
1325 kFitInsideTags));
1326 EXPECT_FRAME_ORDER6(1, 2, 0, 3, 4, 5);
1327 EXPECT_EQ(0, a->fromFrame());
1328 EXPECT_EQ(2, a->toFrame());
1329 EXPECT_EQ(3, b->fromFrame());
1330 EXPECT_EQ(5, b->toFrame());
1331 EXPECT_TRUE(doc->undoHistory()->canUndo());
1332 doc->undoHistory()->undo();
1333
1334 // Move after (and inside) tag "a"
1335 EXPECT_EQ(frames_range(1, 2),
1336 move_range(doc,
1337 frames_range(0, 1),
1338 frames_range(2),
1339 kDocRangeAfter,
1340 kFitInsideTags));
1341 EXPECT_FRAME_ORDER6(2, 0, 1, 3, 4, 5);
1342 EXPECT_EQ(0, a->fromFrame());
1343 EXPECT_EQ(2, a->toFrame());
1344 EXPECT_EQ(3, b->fromFrame());
1345 EXPECT_EQ(5, b->toFrame());
1346 EXPECT_TRUE(doc->undoHistory()->canUndo());
1347 doc->undoHistory()->undo();
1348
1349 // Move between tag "a" and "b" (outside both tags)
1350 EXPECT_EQ(frames_range(1, 2),
1351 move_range(doc,
1352 frames_range(0, 1),
1353 frames_range(2),
1354 kDocRangeAfter,
1355 kFitOutsideTags));
1356 EXPECT_FRAME_ORDER6(2, 0, 1, 3, 4, 5);
1357 EXPECT_EQ(0, a->fromFrame());
1358 EXPECT_EQ(0, a->toFrame());
1359 EXPECT_EQ(3, b->fromFrame());
1360 EXPECT_EQ(5, b->toFrame());
1361 EXPECT_TRUE(doc->undoHistory()->canUndo());
1362 doc->undoHistory()->undo();
1363
1364 EXPECT_EQ(frames_range(1, 2),
1365 move_range(doc,
1366 frames_range(0, 1),
1367 frames_range(3),
1368 kDocRangeBefore,
1369 kFitOutsideTags));
1370 EXPECT_FRAME_ORDER6(2, 0, 1, 3, 4, 5);
1371 EXPECT_EQ(0, a->fromFrame());
1372 EXPECT_EQ(0, a->toFrame());
1373 EXPECT_EQ(3, b->fromFrame());
1374 EXPECT_EQ(5, b->toFrame());
1375 EXPECT_TRUE(doc->undoHistory()->canUndo());
1376 doc->undoHistory()->undo();
1377
1378 EXPECT_EQ(frames_range(2, 3),
1379 move_range(doc,
1380 frames_range(2, 3),
1381 frames_range(2),
1382 kDocRangeAfter,
1383 kFitOutsideTags));
1384 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
1385 EXPECT_EQ(0, a->fromFrame());
1386 EXPECT_EQ(1, a->toFrame());
1387 EXPECT_EQ(4, b->fromFrame());
1388 EXPECT_EQ(5, b->toFrame());
1389 EXPECT_TRUE(doc->undoHistory()->canUndo());
1390 doc->undoHistory()->undo();
1391
1392 EXPECT_EQ(frames_range(2, 3),
1393 move_range(doc,
1394 frames_range(2, 3),
1395 frames_range(3),
1396 kDocRangeBefore,
1397 kFitOutsideTags));
1398 EXPECT_FRAME_ORDER6(0, 1, 2, 3, 4, 5);
1399 EXPECT_EQ(0, a->fromFrame());
1400 EXPECT_EQ(1, a->toFrame());
1401 EXPECT_EQ(4, b->fromFrame());
1402 EXPECT_EQ(5, b->toFrame());
1403 EXPECT_TRUE(doc->undoHistory()->canUndo());
1404 doc->undoHistory()->undo();
1405
1406 // Move after tag "b" (inside tag)
1407 EXPECT_EQ(frames_range(4, 5),
1408 move_range(doc,
1409 frames_range(0, 1),
1410 frames_range(5),
1411 kDocRangeAfter,
1412 kFitInsideTags));
1413 EXPECT_FRAME_ORDER6(2, 3, 4, 5, 0, 1);
1414 EXPECT_EQ(0, a->fromFrame());
1415 EXPECT_EQ(0, a->toFrame());
1416 EXPECT_EQ(1, b->fromFrame());
1417 EXPECT_EQ(5, b->toFrame());
1418 EXPECT_TRUE(doc->undoHistory()->canUndo());
1419 doc->undoHistory()->undo();
1420
1421 // Move after tag "b" (outside tag)
1422 EXPECT_EQ(frames_range(4, 5),
1423 move_range(doc,
1424 frames_range(0, 1),
1425 frames_range(5),
1426 kDocRangeAfter,
1427 kFitOutsideTags));
1428 EXPECT_FRAME_ORDER6(2, 3, 4, 5, 0, 1);
1429 EXPECT_EQ(0, a->fromFrame());
1430 EXPECT_EQ(0, a->toFrame());
1431 EXPECT_EQ(1, b->fromFrame());
1432 EXPECT_EQ(3, b->toFrame());
1433 EXPECT_TRUE(doc->undoHistory()->canUndo());
1434 doc->undoHistory()->undo();
1435
1436 // Put frame 1 and 4 in the middle of both tags (outside)
1437 DocRange from;
1438 from.startRange(nullptr, 1, DocRange::kFrames); from.endRange(nullptr, 1);
1439 from.startRange(nullptr, 4, DocRange::kFrames); from.endRange(nullptr, 4);
1440 EXPECT_EQ(frames_range(2, 3),
1441 move_range(doc,
1442 from,
1443 frames_range(2),
1444 kDocRangeAfter,
1445 kFitOutsideTags));
1446 EXPECT_FRAME_ORDER6(0, 2, 1, 4, 3, 5);
1447 EXPECT_EQ(0, a->fromFrame());
1448 EXPECT_EQ(1, a->toFrame());
1449 EXPECT_EQ(4, b->fromFrame());
1450 EXPECT_EQ(5, b->toFrame());
1451 EXPECT_TRUE(doc->undoHistory()->canUndo());
1452 doc->undoHistory()->undo();
1453
1454 // Put frame 1 and 4 before tag "b" (inside)
1455 EXPECT_EQ(frames_range(2, 3),
1456 move_range(doc,
1457 from,
1458 frames_range(3),
1459 kDocRangeBefore,
1460 kFitInsideTags));
1461 EXPECT_FRAME_ORDER6(0, 2, 1, 4, 3, 5);
1462 EXPECT_EQ(0, a->fromFrame());
1463 EXPECT_EQ(1, a->toFrame());
1464 EXPECT_EQ(2, b->fromFrame());
1465 EXPECT_EQ(5, b->toFrame());
1466 EXPECT_TRUE(doc->undoHistory()->canUndo());
1467 doc->undoHistory()->undo();
1468 }
1469
TEST_F(DocRangeOps,CopyRangeWithTags)1470 TEST_F(DocRangeOps, CopyRangeWithTags) {
1471 FrameTag* a = new FrameTag(0, 2);
1472 FrameTag* b = new FrameTag(3, 5);
1473 sprite->frameTags().add(a);
1474 sprite->frameTags().add(b);
1475
1476 EXPECT_EQ(0, a->fromFrame());
1477 EXPECT_EQ(2, a->toFrame());
1478 EXPECT_EQ(3, b->fromFrame());
1479 EXPECT_EQ(5, b->toFrame());
1480
1481 // Copy before tag "a" (outside the tag)
1482 EXPECT_EQ(frames_range(0),
1483 copy_range(doc,
1484 frames_range(1),
1485 frames_range(0),
1486 kDocRangeBefore,
1487 kFitOutsideTags));
1488 EXPECT_FRAME_COPY3(1, 0, 1, 2, 3, 4, 5);
1489 EXPECT_EQ(1, a->fromFrame());
1490 EXPECT_EQ(3, a->toFrame());
1491 EXPECT_EQ(4, b->fromFrame());
1492 EXPECT_EQ(6, b->toFrame());
1493 EXPECT_TRUE(doc->undoHistory()->canUndo());
1494 doc->undoHistory()->undo();
1495
1496 // Copy before tag "a" (inside the tag)
1497 EXPECT_EQ(frames_range(0),
1498 copy_range(doc,
1499 frames_range(1),
1500 frames_range(0),
1501 kDocRangeBefore,
1502 kFitInsideTags));
1503 EXPECT_FRAME_COPY3(1, 0, 1, 2, 3, 4, 5);
1504 EXPECT_EQ(0, a->fromFrame());
1505 EXPECT_EQ(3, a->toFrame());
1506 EXPECT_EQ(4, b->fromFrame());
1507 EXPECT_EQ(6, b->toFrame());
1508 EXPECT_TRUE(doc->undoHistory()->canUndo());
1509 doc->undoHistory()->undo();
1510
1511 // Copy after tag "a" (outside the tag)
1512 EXPECT_EQ(frames_range(3),
1513 copy_range(doc,
1514 frames_range(1),
1515 frames_range(2),
1516 kDocRangeAfter,
1517 kFitOutsideTags));
1518 EXPECT_FRAME_COPY3(0, 1, 2, 1, 3, 4, 5);
1519 EXPECT_EQ(0, a->fromFrame());
1520 EXPECT_EQ(2, a->toFrame());
1521 EXPECT_EQ(4, b->fromFrame());
1522 EXPECT_EQ(6, b->toFrame());
1523 EXPECT_TRUE(doc->undoHistory()->canUndo());
1524 doc->undoHistory()->undo();
1525 }
1526