Skip to content

Commit 9ea6799

Browse files
committed
Place clones behind the original sprite
1 parent a3c5afb commit 9ea6799

File tree

5 files changed

+27
-7
lines changed

5 files changed

+27
-7
lines changed

src/scratch/sprite.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ std::shared_ptr<Sprite> Sprite::clone()
9999
if (impl->iface)
100100
impl->iface->onCloned(clone.get());
101101

102+
// Place the clone behind the original sprite
103+
eng->moveSpriteBehindOther(clone.get(), this);
104+
102105
return clone;
103106
}
104107

test/blocks/control_blocks_test.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
907907
EXPECT_CALL(m_engineMock, cloneLimit()).Times(8).WillRepeatedly(Return(300));
908908
EXPECT_CALL(m_engineMock, cloneCount()).Times(4).WillRepeatedly(Return(0));
909909
EXPECT_CALL(m_engineMock, initClone).WillOnce(SaveArg<0>(&clone1));
910+
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
910911
EXPECT_CALL(m_engineMock, requestRedraw());
911912

912913
vm.setBytecode(bytecode1);
@@ -916,6 +917,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
916917
ASSERT_EQ(sprite.allChildren().size(), 1);
917918

918919
EXPECT_CALL(m_engineMock, initClone).Times(1);
920+
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
919921
EXPECT_CALL(m_engineMock, requestRedraw());
920922

921923
vm.setBytecode(bytecode2);
@@ -929,6 +931,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
929931
EXPECT_CALL(m_engineMock, findTarget).WillOnce(Return(4));
930932
EXPECT_CALL(m_engineMock, targetAt(4)).WillOnce(Return(&sprite));
931933
EXPECT_CALL(m_engineMock, initClone).WillOnce(SaveArg<0>(&clone3));
934+
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
932935
EXPECT_CALL(m_engineMock, requestRedraw());
933936

934937
vm.setBytecode(bytecode3);
@@ -939,6 +942,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
939942
ASSERT_EQ(sprite.children(), sprite.allChildren());
940943

941944
EXPECT_CALL(m_engineMock, initClone).Times(1);
945+
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
942946
EXPECT_CALL(m_engineMock, requestRedraw());
943947

944948
vm.setBytecode(bytecode4);
@@ -994,6 +998,7 @@ TEST_F(ControlBlocksTest, DeleteThisCloneImpl)
994998
EXPECT_CALL(m_engineMock, cloneLimit()).Times(2).WillRepeatedly(Return(300));
995999
EXPECT_CALL(m_engineMock, cloneCount()).WillOnce(Return(0));
9961000
EXPECT_CALL(m_engineMock, initClone(_)).WillOnce(SaveArg<0>(&clone));
1001+
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
9971002
EXPECT_CALL(m_engineMock, requestRedraw());
9981003
sprite.clone();
9991004
ASSERT_TRUE(clone);

test/scratch_classes/sprite_test.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,12 @@ TEST(SpriteTest, Clone)
126126
EXPECT_CALL(engine, requestRedraw()).Times(2);
127127
EXPECT_CALL(engine, cloneLimit()).Times(6).WillRepeatedly(Return(300)); // clone count limit is tested later
128128

129-
Sprite *clone1;
129+
Sprite *clone1, *clone1_2;
130130
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(0));
131131
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone1));
132+
EXPECT_CALL(engine, moveSpriteBehindOther(_, sprite.get())).WillOnce(SaveArg<0>(&clone1_2));
132133
ASSERT_EQ(sprite->clone().get(), clone1);
134+
ASSERT_EQ(clone1, clone1_2);
133135
ASSERT_FALSE(sprite->isClone());
134136
ASSERT_EQ(sprite->cloneRoot(), nullptr);
135137
ASSERT_EQ(sprite->cloneParent(), nullptr);
@@ -143,10 +145,12 @@ TEST(SpriteTest, Clone)
143145
// Modify root sprite data to make sure parent is used
144146
sprite->setLayerOrder(3);
145147

146-
Sprite *clone2;
148+
Sprite *clone2, *clone2_2;
147149
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(1));
148150
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone2));
151+
EXPECT_CALL(engine, moveSpriteBehindOther(_, clone1)).WillOnce(SaveArg<0>(&clone2_2));
149152
ASSERT_EQ(clone1->clone().get(), clone2);
153+
ASSERT_EQ(clone2, clone2_2);
150154
ASSERT_TRUE(clone1->isClone());
151155
ASSERT_EQ(clone1->cloneRoot(), sprite.get());
152156
ASSERT_EQ(clone1->cloneParent(), sprite.get());
@@ -158,15 +162,19 @@ TEST(SpriteTest, Clone)
158162

159163
sprite->setVisible(true);
160164

161-
Sprite *clone3;
165+
Sprite *clone3, *clone3_2;
162166
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(2));
163167
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone3));
168+
EXPECT_CALL(engine, moveSpriteBehindOther(_, clone1)).WillOnce(SaveArg<0>(&clone3_2));
164169
ASSERT_EQ(clone1->clone().get(), clone3);
170+
ASSERT_EQ(clone3, clone3_2);
165171

166-
Sprite *clone4;
172+
Sprite *clone4, *clone4_2;
167173
EXPECT_CALL(engine, cloneLimit()).WillOnce(Return(-1));
168174
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone4));
175+
EXPECT_CALL(engine, moveSpriteBehindOther(_, sprite.get())).WillOnce(SaveArg<0>(&clone4_2));
169176
ASSERT_EQ(sprite->clone().get(), clone4);
177+
ASSERT_EQ(clone4, clone4_2);
170178

171179
EXPECT_CALL(engine, cloneLimit()).Times(2).WillRepeatedly(Return(0));
172180
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(0));

test/script/script_test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using namespace libscratchcpp;
1212

1313
using ::testing::Return;
14+
using ::testing::_;
1415

1516
class ScriptTest : public testing::Test
1617
{
@@ -115,6 +116,7 @@ TEST_F(ScriptTest, Start)
115116
EXPECT_CALL(m_engine, cloneLimit()).Times(2).WillRepeatedly(Return(300));
116117
EXPECT_CALL(m_engine, cloneCount()).WillOnce(Return(0));
117118
EXPECT_CALL(m_engine, initClone).Times(1);
119+
EXPECT_CALL(m_engine, moveSpriteBehindOther(_, &root));
118120
EXPECT_CALL(m_engine, requestRedraw());
119121
auto clone = root.clone();
120122

test/target_interfaces/ispritehandler_test.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,18 @@ class ISpriteHandlerTest : public testing::Test
2727
TEST_F(ISpriteHandlerTest, Clone)
2828
{
2929
Sprite *clone;
30-
Sprite *cloneArg;
30+
Sprite *cloneParam1, *cloneParam2;
3131
EXPECT_CALL(m_engine, cloneLimit()).Times(2).WillRepeatedly(Return(300));
3232
EXPECT_CALL(m_engine, cloneCount()).WillOnce(Return(0));
3333
EXPECT_CALL(m_engine, initClone(_)).WillOnce(SaveArg<0>(&clone));
34-
EXPECT_CALL(m_handler, onCloned(_)).WillOnce(SaveArg<0>(&cloneArg));
34+
EXPECT_CALL(m_engine, moveSpriteBehindOther(_, &m_sprite)).WillOnce(SaveArg<0>(&cloneParam1));
35+
EXPECT_CALL(m_handler, onCloned(_)).WillOnce(SaveArg<0>(&cloneParam2));
3536
EXPECT_CALL(m_engine, requestRedraw());
3637

3738
m_sprite.clone();
3839
ASSERT_TRUE(clone);
39-
ASSERT_EQ(cloneArg, clone);
40+
ASSERT_EQ(cloneParam1, clone);
41+
ASSERT_EQ(cloneParam2, clone);
4042

4143
// Engine is used during deletion, so let's just set it to nullptr (this is tested elsewhere)
4244
m_sprite.setEngine(nullptr);

0 commit comments

Comments
 (0)