| 
									
										
										
										
											2015-02-12 23:16:25 +08:00
										 |  |  | // Aseprite
 | 
					
						
							| 
									
										
										
										
											2018-08-09 04:27:26 +08:00
										 |  |  | // Copyright (C) 2001-2018  David Capello
 | 
					
						
							| 
									
										
										
										
											2015-02-12 23:16:25 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2016-08-27 04:02:58 +08:00
										 |  |  | // This program is distributed under the terms of
 | 
					
						
							|  |  |  | // the End-User License Agreement for Aseprite.
 | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "tests/test.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-21 03:27:09 +08:00
										 |  |  | #include "app/context.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-07 22:54:44 +08:00
										 |  |  | #include "app/doc.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-07 14:07:16 +08:00
										 |  |  | #include "app/doc_api.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-07 13:47:42 +08:00
										 |  |  | #include "app/test_context.h"
 | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  | #include "app/transaction.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-02 23:26:53 +08:00
										 |  |  | #include "doc/cel.h"
 | 
					
						
							|  |  |  | #include "doc/image.h"
 | 
					
						
							|  |  |  | #include "doc/primitives.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace app; | 
					
						
							| 
									
										
										
										
											2014-11-02 23:26:53 +08:00
										 |  |  | using namespace doc; | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 04:27:26 +08:00
										 |  |  | typedef std::unique_ptr<Doc> DocPtr; | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  | class BasicDocApiTest : public ::testing::Test { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   BasicDocApiTest() : | 
					
						
							| 
									
										
										
										
											2018-07-07 22:54:44 +08:00
										 |  |  |     doc((ctx.documents().add(32, 16))), | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     sprite(doc->sprite()), | 
					
						
							|  |  |  |     root(sprite->root()), | 
					
						
							|  |  |  |     layer1(dynamic_cast<LayerImage*>(sprite->root()->firstLayer())), | 
					
						
							|  |  |  |     layer2(new LayerImage(sprite)), | 
					
						
							|  |  |  |     layer3(new LayerImage(sprite)) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     root->addLayer(layer2); | 
					
						
							|  |  |  |     root->addLayer(layer3); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ~BasicDocApiTest() { | 
					
						
							|  |  |  |     doc->close(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-07 22:54:44 +08:00
										 |  |  |   TestContextT<Context> ctx; | 
					
						
							|  |  |  |   DocPtr doc; | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |   Sprite* sprite; | 
					
						
							|  |  |  |   LayerGroup* root; | 
					
						
							|  |  |  |   LayerImage* layer1; | 
					
						
							|  |  |  |   LayerImage* layer2; | 
					
						
							|  |  |  |   LayerImage* layer3; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(BasicDocApiTest, RestackLayerBefore) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Transaction transaction(&ctx, ""); | 
					
						
							|  |  |  |     // Do nothing
 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:50:51 +08:00
										 |  |  |     doc->getApi(transaction).restackLayerBefore(layer1, layer1->parent(), layer1); | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer2, root->firstLayer()->getNext()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer3, root->firstLayer()->getNext()->getNext()); | 
					
						
							|  |  |  |     // Rollback
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Transaction transaction(&ctx, ""); | 
					
						
							| 
									
										
										
										
											2016-08-29 21:50:51 +08:00
										 |  |  |     doc->getApi(transaction).restackLayerBefore(layer1, layer3->parent(), layer3); | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     EXPECT_EQ(layer2, root->firstLayer()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer1, root->firstLayer()->getNext()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer3, root->firstLayer()->getNext()->getNext()); | 
					
						
							|  |  |  |     // Rollback
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Transaction transaction(&ctx, ""); | 
					
						
							| 
									
										
										
										
											2016-08-29 21:50:51 +08:00
										 |  |  |     doc->getApi(transaction).restackLayerBefore(layer1, layer1->parent(), nullptr); | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     EXPECT_EQ(layer2, root->firstLayer()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer3, root->firstLayer()->getNext()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer1, root->firstLayer()->getNext()->getNext()); | 
					
						
							|  |  |  |     // Rollback
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  | TEST_F(BasicDocApiTest, RestackLayerAfter) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Transaction transaction(&ctx, ""); | 
					
						
							|  |  |  |     // Do nothing
 | 
					
						
							| 
									
										
										
										
											2016-08-29 21:50:51 +08:00
										 |  |  |     doc->getApi(transaction).restackLayerAfter(layer1, layer1->parent(), layer1); | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer2, root->firstLayer()->getNext()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer3, root->firstLayer()->getNext()->getNext()); | 
					
						
							|  |  |  |     // Rollback
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Transaction transaction(&ctx, ""); | 
					
						
							| 
									
										
										
										
											2016-08-29 21:50:51 +08:00
										 |  |  |     doc->getApi(transaction).restackLayerAfter(layer1, layer3->parent(), layer3); | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     EXPECT_EQ(layer2, root->firstLayer()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer3, root->firstLayer()->getNext()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer1, root->firstLayer()->getNext()->getNext()); | 
					
						
							|  |  |  |     // Rollback
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   EXPECT_EQ(layer1, root->firstLayer()); | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Transaction transaction(&ctx, ""); | 
					
						
							| 
									
										
										
										
											2016-08-29 21:50:51 +08:00
										 |  |  |     doc->getApi(transaction).restackLayerAfter(layer3, layer3->parent(), nullptr); | 
					
						
							| 
									
										
										
										
											2016-08-13 00:11:37 +08:00
										 |  |  |     EXPECT_EQ(layer3, root->firstLayer()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer1, root->firstLayer()->getNext()); | 
					
						
							|  |  |  |     EXPECT_EQ(layer2, root->firstLayer()->getNext()->getNext()); | 
					
						
							|  |  |  |     // Rollback
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(BasicDocApiTest, MoveCel) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-12-29 08:04:08 +08:00
										 |  |  |   Cel* cel1 = layer1->cel(frame_t(0)); | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  |   cel1->setPosition(2, -2); | 
					
						
							|  |  |  |   cel1->setOpacity(128); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Image* image1 = cel1->image(); | 
					
						
							|  |  |  |   EXPECT_EQ(32, image1->width()); | 
					
						
							|  |  |  |   EXPECT_EQ(16, image1->height()); | 
					
						
							|  |  |  |   for (int v=0; v<image1->height(); ++v) | 
					
						
							|  |  |  |     for (int u=0; u<image1->width(); ++u) | 
					
						
							|  |  |  |       image1->putPixel(u, v, u+v*image1->width()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Create a copy for later comparison.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 04:27:26 +08:00
										 |  |  |   std::unique_ptr<Image> expectedImage(Image::createCopy(image1)); | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  |   Transaction transaction(&ctx, ""); | 
					
						
							|  |  |  |   doc->getApi(transaction).moveCel( | 
					
						
							| 
									
										
										
										
											2014-12-29 07:39:11 +08:00
										 |  |  |     layer1, frame_t(0), | 
					
						
							|  |  |  |     layer2, frame_t(1)); | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  |   transaction.commit(); | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-29 08:04:08 +08:00
										 |  |  |   EXPECT_EQ(NULL, layer1->cel(frame_t(0))); | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-29 08:04:08 +08:00
										 |  |  |   Cel* cel2 = layer2->cel(frame_t(1)); | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  |   ASSERT_TRUE(cel2 != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Image* image2 = cel2->image(); | 
					
						
							|  |  |  |   EXPECT_EQ(32, image2->width()); | 
					
						
							|  |  |  |   EXPECT_EQ(16, image2->height()); | 
					
						
							| 
									
										
										
										
											2018-08-09 04:27:26 +08:00
										 |  |  |   EXPECT_EQ(0, count_diff_between_images(expectedImage.get(), image2)); | 
					
						
							| 
									
										
										
										
											2014-11-02 02:38:26 +08:00
										 |  |  |   EXPECT_EQ(2, cel2->x()); | 
					
						
							|  |  |  |   EXPECT_EQ(-2, cel2->y()); | 
					
						
							|  |  |  |   EXPECT_EQ(128, cel2->opacity()); | 
					
						
							|  |  |  | } |