11#include < scratchcpp/sprite.h>
2+ #include < scratchcpp/variable.h>
3+ #include < scratchcpp/list.h>
4+ #include < enginemock.h>
25
36#include " ../common.h"
47
58using namespace libscratchcpp ;
69
10+ using ::testing::_;
11+ using ::testing::SaveArg;
12+
713TEST (SpriteTest, IsStage)
814{
915 Sprite sprite;
@@ -18,6 +24,113 @@ TEST(SpriteTest, Visible)
1824 ASSERT_FALSE (sprite.visible ());
1925}
2026
27+ TEST (SpriteTest, Clone)
28+ {
29+ Sprite sprite;
30+ sprite.setName (" Sprite1" );
31+ auto var1 = std::make_shared<Variable>(" a" , " var1" , " hello" );
32+ auto var2 = std::make_shared<Variable>(" b" , " var2" , " world" );
33+ sprite.addVariable (var1);
34+ sprite.addVariable (var2);
35+
36+ auto list1 = std::make_shared<List>(" c" , " list1" );
37+ list1->push_back (" item1" );
38+ list1->push_back (" item2" );
39+ auto list2 = std::make_shared<List>(" d" , " list2" );
40+ list2->push_back (" test" );
41+ sprite.addList (list1);
42+ sprite.addList (list2);
43+
44+ sprite.setCurrentCostume (2 );
45+ sprite.setLayerOrder (5 );
46+ sprite.setVolume (50 );
47+
48+ sprite.setVisible (false );
49+ sprite.setX (100.25 );
50+ sprite.setY (-45.43 );
51+ sprite.setSize (54.121 );
52+ sprite.setDirection (179.4 );
53+ sprite.setDraggable (true );
54+ sprite.setRotationStyle (Sprite::RotationStyle::DoNotRotate);
55+
56+ auto checkCloneData = [](Sprite *clone) {
57+ ASSERT_TRUE (clone);
58+ Sprite *root = clone->cloneRoot ();
59+
60+ ASSERT_EQ (clone->name (), " Sprite1" );
61+ ASSERT_EQ (clone->variables ().size (), 2 );
62+ ASSERT_NE (clone->variables (), root->variables ());
63+ ASSERT_EQ (clone->variableAt (0 )->id (), " a" );
64+ ASSERT_EQ (clone->variableAt (0 )->name (), " var1" );
65+ ASSERT_EQ (clone->variableAt (0 )->value ().toString (), " hello" );
66+ ASSERT_EQ (clone->variableAt (1 )->id (), " b" );
67+ ASSERT_EQ (clone->variableAt (1 )->name (), " var2" );
68+ ASSERT_EQ (clone->variableAt (1 )->value ().toString (), " world" );
69+
70+ ASSERT_EQ (clone->lists ().size (), 2 );
71+ ASSERT_NE (clone->lists (), root->lists ());
72+ ASSERT_EQ (clone->listAt (0 )->id (), " c" );
73+ ASSERT_EQ (clone->listAt (0 )->name (), " list1" );
74+ ASSERT_EQ (*clone->listAt (0 ), std::deque<Value>({ " item1" , " item2" }));
75+ ASSERT_EQ (clone->listAt (1 )->id (), " d" );
76+ ASSERT_EQ (clone->listAt (1 )->name (), " list2" );
77+ ASSERT_EQ (*clone->listAt (1 ), std::deque<Value>({ " test" }));
78+
79+ ASSERT_EQ (clone->currentCostume (), 2 );
80+ ASSERT_EQ (clone->layerOrder (), 5 );
81+ ASSERT_EQ (clone->volume (), 50 );
82+ ASSERT_EQ (clone->engine (), root->engine ());
83+
84+ ASSERT_EQ (clone->visible (), false );
85+ ASSERT_EQ (clone->x (), 100.25 );
86+ ASSERT_EQ (clone->y (), -45.43 );
87+ ASSERT_EQ (clone->size (), 54.121 );
88+ ASSERT_EQ (clone->direction (), 179.4 );
89+ ASSERT_EQ (clone->draggable (), true );
90+ ASSERT_EQ (clone->rotationStyle (), Sprite::RotationStyle::DoNotRotate);
91+ };
92+
93+ ASSERT_FALSE (sprite.isClone ());
94+ ASSERT_EQ (sprite.cloneRoot (), nullptr );
95+ ASSERT_EQ (sprite.cloneParent (), nullptr );
96+
97+ ASSERT_EQ (sprite.clone (), nullptr );
98+ ASSERT_FALSE (sprite.isClone ());
99+ ASSERT_EQ (sprite.cloneRoot (), nullptr );
100+ ASSERT_EQ (sprite.cloneParent (), nullptr );
101+
102+ EngineMock engine;
103+ sprite.setEngine (&engine);
104+
105+ Sprite *clone1;
106+ EXPECT_CALL (engine, initClone (_)).WillOnce (SaveArg<0 >(&clone1));
107+ ASSERT_EQ (sprite.clone ().get (), clone1);
108+ ASSERT_FALSE (sprite.isClone ());
109+ ASSERT_EQ (sprite.cloneRoot (), nullptr );
110+ ASSERT_EQ (sprite.cloneParent (), nullptr );
111+
112+ ASSERT_TRUE (clone1->isClone ());
113+ ASSERT_EQ (clone1->cloneRoot (), &sprite);
114+ ASSERT_EQ (clone1->cloneParent (), &sprite);
115+
116+ checkCloneData (clone1);
117+
118+ // Modify root sprite data to make sure parent is used
119+ sprite.setLayerOrder (3 );
120+
121+ Sprite *clone2;
122+ EXPECT_CALL (engine, initClone (_)).WillOnce (SaveArg<0 >(&clone2));
123+ ASSERT_EQ (clone1->clone ().get (), clone2);
124+ ASSERT_TRUE (clone1->isClone ());
125+ ASSERT_EQ (clone1->cloneRoot (), &sprite);
126+ ASSERT_EQ (clone1->cloneParent (), &sprite);
127+ ASSERT_TRUE (clone2->isClone ());
128+ ASSERT_EQ (clone2->cloneRoot (), &sprite);
129+ ASSERT_EQ (clone2->cloneParent (), clone1);
130+
131+ checkCloneData (clone2);
132+ }
133+
21134TEST (SpriteTest, X)
22135{
23136 Sprite sprite;
0 commit comments