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