Skip to content

Commit f40cb9d

Browse files
committed
Fix sprite deletion in clone tests
1 parent 55f6e95 commit f40cb9d

File tree

2 files changed

+62
-44
lines changed

2 files changed

+62
-44
lines changed

test/scratch_classes/sprite_test.cpp

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,36 +27,36 @@ TEST(SpriteTest, Visible)
2727

2828
TEST(SpriteTest, Clone)
2929
{
30-
Sprite sprite;
31-
sprite.setName("Sprite1");
30+
std::unique_ptr<Sprite> sprite = std::make_unique<Sprite>();
31+
sprite->setName("Sprite1");
3232
auto var1 = std::make_shared<Variable>("a", "var1", "hello");
3333
auto var2 = std::make_shared<Variable>("b", "var2", "world");
34-
sprite.addVariable(var1);
35-
sprite.addVariable(var2);
34+
sprite->addVariable(var1);
35+
sprite->addVariable(var2);
3636
auto c1 = std::make_shared<Costume>("costume1", "", "svg");
37-
sprite.addCostume(c1);
37+
sprite->addCostume(c1);
3838

3939
auto list1 = std::make_shared<List>("c", "list1");
4040
list1->push_back("item1");
4141
list1->push_back("item2");
4242
auto list2 = std::make_shared<List>("d", "list2");
4343
list2->push_back("test");
44-
sprite.addList(list1);
45-
sprite.addList(list2);
46-
47-
sprite.addCostume(std::make_shared<Costume>("", "", ""));
48-
sprite.addCostume(std::make_shared<Costume>("", "", ""));
49-
sprite.setCurrentCostume(2);
50-
sprite.setLayerOrder(5);
51-
sprite.setVolume(50);
52-
53-
sprite.setVisible(false);
54-
sprite.setX(100.25);
55-
sprite.setY(-45.43);
56-
sprite.setSize(54.121);
57-
sprite.setDirection(179.4);
58-
sprite.setDraggable(true);
59-
sprite.setRotationStyle(Sprite::RotationStyle::DoNotRotate);
44+
sprite->addList(list1);
45+
sprite->addList(list2);
46+
47+
sprite->addCostume(std::make_shared<Costume>("", "", ""));
48+
sprite->addCostume(std::make_shared<Costume>("", "", ""));
49+
sprite->setCurrentCostume(2);
50+
sprite->setLayerOrder(5);
51+
sprite->setVolume(50);
52+
53+
sprite->setVisible(false);
54+
sprite->setX(100.25);
55+
sprite->setY(-45.43);
56+
sprite->setSize(54.121);
57+
sprite->setDirection(179.4);
58+
sprite->setDraggable(true);
59+
sprite->setRotationStyle(Sprite::RotationStyle::DoNotRotate);
6060

6161
auto checkCloneData = [](Sprite *clone) {
6262
ASSERT_TRUE(clone);
@@ -97,42 +97,42 @@ TEST(SpriteTest, Clone)
9797
ASSERT_EQ(clone->rotationStyle(), Sprite::RotationStyle::DoNotRotate);
9898
};
9999

100-
ASSERT_FALSE(sprite.isClone());
101-
ASSERT_EQ(sprite.cloneRoot(), nullptr);
102-
ASSERT_EQ(sprite.cloneParent(), nullptr);
100+
ASSERT_FALSE(sprite->isClone());
101+
ASSERT_EQ(sprite->cloneRoot(), nullptr);
102+
ASSERT_EQ(sprite->cloneParent(), nullptr);
103103

104-
ASSERT_EQ(sprite.clone(), nullptr);
105-
ASSERT_FALSE(sprite.isClone());
106-
ASSERT_EQ(sprite.cloneRoot(), nullptr);
107-
ASSERT_EQ(sprite.cloneParent(), nullptr);
104+
ASSERT_EQ(sprite->clone(), nullptr);
105+
ASSERT_FALSE(sprite->isClone());
106+
ASSERT_EQ(sprite->cloneRoot(), nullptr);
107+
ASSERT_EQ(sprite->cloneParent(), nullptr);
108108

109109
EngineMock engine;
110-
sprite.setEngine(&engine);
110+
sprite->setEngine(&engine);
111111

112112
Sprite *clone1;
113113
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone1));
114-
ASSERT_EQ(sprite.clone().get(), clone1);
115-
ASSERT_FALSE(sprite.isClone());
116-
ASSERT_EQ(sprite.cloneRoot(), nullptr);
117-
ASSERT_EQ(sprite.cloneParent(), nullptr);
114+
ASSERT_EQ(sprite->clone().get(), clone1);
115+
ASSERT_FALSE(sprite->isClone());
116+
ASSERT_EQ(sprite->cloneRoot(), nullptr);
117+
ASSERT_EQ(sprite->cloneParent(), nullptr);
118118

119119
ASSERT_TRUE(clone1->isClone());
120-
ASSERT_EQ(clone1->cloneRoot(), &sprite);
121-
ASSERT_EQ(clone1->cloneParent(), &sprite);
120+
ASSERT_EQ(clone1->cloneRoot(), sprite.get());
121+
ASSERT_EQ(clone1->cloneParent(), sprite.get());
122122

123123
checkCloneData(clone1);
124124

125125
// Modify root sprite data to make sure parent is used
126-
sprite.setLayerOrder(3);
126+
sprite->setLayerOrder(3);
127127

128128
Sprite *clone2;
129129
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone2));
130130
ASSERT_EQ(clone1->clone().get(), clone2);
131131
ASSERT_TRUE(clone1->isClone());
132-
ASSERT_EQ(clone1->cloneRoot(), &sprite);
133-
ASSERT_EQ(clone1->cloneParent(), &sprite);
132+
ASSERT_EQ(clone1->cloneRoot(), sprite.get());
133+
ASSERT_EQ(clone1->cloneParent(), sprite.get());
134134
ASSERT_TRUE(clone2->isClone());
135-
ASSERT_EQ(clone2->cloneRoot(), &sprite);
135+
ASSERT_EQ(clone2->cloneRoot(), sprite.get());
136136
ASSERT_EQ(clone2->cloneParent(), clone1);
137137

138138
checkCloneData(clone2);
@@ -143,10 +143,10 @@ TEST(SpriteTest, Clone)
143143

144144
Sprite *clone4;
145145
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone4));
146-
ASSERT_EQ(sprite.clone().get(), clone4);
146+
ASSERT_EQ(sprite->clone().get(), clone4);
147147

148148
// children
149-
const auto &children1 = sprite.children();
149+
const auto &children1 = sprite->children();
150150
ASSERT_EQ(children1.size(), 2);
151151
ASSERT_EQ(children1[0].get(), clone1);
152152
ASSERT_EQ(children1[1].get(), clone4);
@@ -163,7 +163,7 @@ TEST(SpriteTest, Clone)
163163
ASSERT_TRUE(clone4->children().empty());
164164

165165
// allChildren
166-
auto allChildren = sprite.allChildren();
166+
auto allChildren = sprite->allChildren();
167167
ASSERT_EQ(allChildren.size(), 4);
168168
ASSERT_EQ(allChildren[0].get(), clone1);
169169
ASSERT_EQ(allChildren[1].get(), clone2);
@@ -181,10 +181,24 @@ TEST(SpriteTest, Clone)
181181

182182
ASSERT_TRUE(clone4->allChildren().empty());
183183

184-
ASSERT_EQ(clone2->costumes(), sprite.costumes());
184+
ASSERT_EQ(clone2->costumes(), sprite->costumes());
185185
auto c2 = std::make_shared<Costume>("costume2", "", "png");
186186
clone2->addCostume(c2);
187-
ASSERT_EQ(clone2->costumes(), sprite.costumes());
187+
ASSERT_EQ(clone2->costumes(), sprite->costumes());
188+
189+
EXPECT_CALL(engine, deinitClone(clone2));
190+
clone2->~Sprite();
191+
192+
EXPECT_CALL(engine, deinitClone(clone3));
193+
clone3->~Sprite();
194+
195+
EXPECT_CALL(engine, deinitClone(clone1)).Times(2);
196+
clone1->~Sprite();
197+
198+
EXPECT_CALL(engine, deinitClone(clone4)).Times(2);
199+
clone4->~Sprite();
200+
201+
sprite.reset();
188202
}
189203

190204
TEST(SpriteTest, X)

test/target_interfaces/ispritehandler_test.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ TEST_F(ISpriteHandlerTest, Clone)
3434
m_sprite.clone();
3535
ASSERT_TRUE(clone);
3636
ASSERT_EQ(cloneArg, clone);
37+
38+
// Engine is used during deletion, so let's just set it to nullptr (this is tested elsewhere)
39+
m_sprite.setEngine(nullptr);
40+
clone->setEngine(nullptr);
3741
}
3842

3943
TEST_F(ISpriteHandlerTest, Visible)

0 commit comments

Comments
 (0)