Skip to content

Commit 6311acf

Browse files
committed
Do not create more clones than the maximum count
1 parent f200c25 commit 6311acf

File tree

5 files changed

+22
-1
lines changed

5 files changed

+22
-1
lines changed

src/scratch/sprite.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ std::shared_ptr<Sprite> Sprite::clone()
5252
{
5353
IEngine *eng = engine();
5454

55-
if (eng) {
55+
if (eng && (eng->cloneLimit() == -1 || eng->cloneCount() < eng->cloneLimit())) {
5656
std::shared_ptr<Sprite> clone = std::make_shared<Sprite>();
5757

5858
if (impl->cloneRoot == nullptr)

test/blocks/control_blocks_test.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,8 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
904904

905905
Sprite *clone1;
906906
EXPECT_CALL(m_engineMock, targetAt(4)).WillOnce(Return(&sprite));
907+
EXPECT_CALL(m_engineMock, cloneLimit()).Times(8).WillRepeatedly(Return(300));
908+
EXPECT_CALL(m_engineMock, cloneCount()).Times(4).WillRepeatedly(Return(0));
907909
EXPECT_CALL(m_engineMock, initClone).WillOnce(SaveArg<0>(&clone1));
908910
EXPECT_CALL(m_engineMock, requestRedraw());
909911

@@ -989,6 +991,8 @@ TEST_F(ControlBlocksTest, DeleteThisCloneImpl)
989991
sprite.setEngine(&m_engineMock);
990992

991993
Sprite *clone;
994+
EXPECT_CALL(m_engineMock, cloneLimit()).Times(2).WillRepeatedly(Return(300));
995+
EXPECT_CALL(m_engineMock, cloneCount()).WillOnce(Return(0));
992996
EXPECT_CALL(m_engineMock, initClone(_)).WillOnce(SaveArg<0>(&clone));
993997
EXPECT_CALL(m_engineMock, requestRedraw());
994998
sprite.clone();

test/scratch_classes/sprite_test.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,10 @@ TEST(SpriteTest, Clone)
124124
EngineMock engine;
125125
sprite->setEngine(&engine);
126126
EXPECT_CALL(engine, requestRedraw()).Times(2);
127+
EXPECT_CALL(engine, cloneLimit()).Times(6).WillRepeatedly(Return(300)); // clone count limit is tested later
127128

128129
Sprite *clone1;
130+
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(0));
129131
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone1));
130132
ASSERT_EQ(sprite->clone().get(), clone1);
131133
ASSERT_FALSE(sprite->isClone());
@@ -142,6 +144,7 @@ TEST(SpriteTest, Clone)
142144
sprite->setLayerOrder(3);
143145

144146
Sprite *clone2;
147+
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(1));
145148
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone2));
146149
ASSERT_EQ(clone1->clone().get(), clone2);
147150
ASSERT_TRUE(clone1->isClone());
@@ -156,13 +159,23 @@ TEST(SpriteTest, Clone)
156159
sprite->setVisible(true);
157160

158161
Sprite *clone3;
162+
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(2));
159163
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone3));
160164
ASSERT_EQ(clone1->clone().get(), clone3);
161165

162166
Sprite *clone4;
167+
EXPECT_CALL(engine, cloneLimit()).WillOnce(Return(-1));
163168
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone4));
164169
ASSERT_EQ(sprite->clone().get(), clone4);
165170

171+
EXPECT_CALL(engine, cloneLimit()).Times(2).WillRepeatedly(Return(0));
172+
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(0));
173+
ASSERT_EQ(sprite->clone(), nullptr);
174+
175+
EXPECT_CALL(engine, cloneLimit()).Times(2).WillRepeatedly(Return(150));
176+
EXPECT_CALL(engine, cloneCount()).WillOnce(Return(150));
177+
ASSERT_EQ(sprite->clone(), nullptr);
178+
166179
// children
167180
const auto &children1 = sprite->children();
168181
ASSERT_EQ(children1.size(), 2);

test/script/script_test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ TEST_F(ScriptTest, Start)
112112
root.addVariable(var2);
113113
root.addList(list2);
114114

115+
EXPECT_CALL(m_engine, cloneLimit()).Times(2).WillRepeatedly(Return(300));
116+
EXPECT_CALL(m_engine, cloneCount()).WillOnce(Return(0));
115117
EXPECT_CALL(m_engine, initClone).Times(1);
116118
EXPECT_CALL(m_engine, requestRedraw());
117119
auto clone = root.clone();

test/target_interfaces/ispritehandler_test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ TEST_F(ISpriteHandlerTest, Clone)
2828
{
2929
Sprite *clone;
3030
Sprite *cloneArg;
31+
EXPECT_CALL(m_engine, cloneLimit()).Times(2).WillRepeatedly(Return(300));
32+
EXPECT_CALL(m_engine, cloneCount()).WillOnce(Return(0));
3133
EXPECT_CALL(m_engine, initClone(_)).WillOnce(SaveArg<0>(&clone));
3234
EXPECT_CALL(m_handler, onCloned(_)).WillOnce(SaveArg<0>(&cloneArg));
3335
EXPECT_CALL(m_engine, requestRedraw());

0 commit comments

Comments
 (0)