Skip to content

Commit 2388d9f

Browse files
committed
Implement control_delete_this_clone
1 parent 1cd4016 commit 2388d9f

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

src/dev/blocks/controlblocks.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void ControlBlocks::registerBlocks(IEngine *engine)
4040
engine->addCompileFunction(this, "control_for_each", &compileForEach);
4141
engine->addCompileFunction(this, "control_start_as_clone", &compileStartAsClone);
4242
engine->addCompileFunction(this, "control_create_clone_of", &compileCreateCloneOf);
43+
engine->addCompileFunction(this, "control_delete_this_clone", &compileDeleteThisClone);
4344
}
4445

4546
CompilerValue *ControlBlocks::compileForever(Compiler *compiler)
@@ -167,6 +168,12 @@ CompilerValue *ControlBlocks::compileCreateCloneOf(Compiler *compiler)
167168
return nullptr;
168169
}
169170

171+
CompilerValue *ControlBlocks::compileDeleteThisClone(Compiler *compiler)
172+
{
173+
compiler->addTargetFunctionCall("control_delete_this_clone");
174+
return nullptr;
175+
}
176+
170177
extern "C" void control_stop_all(ExecutionContext *ctx)
171178
{
172179
ctx->engine()->stop();
@@ -216,3 +223,11 @@ extern "C" void control_create_clone(ExecutionContext *ctx, const char *spriteNa
216223
static_cast<Sprite *>(target)->clone();
217224
}
218225
}
226+
227+
extern "C" void control_delete_this_clone(Target *target)
228+
{
229+
if (!target->isStage()) {
230+
target->engine()->stopTarget(target, nullptr);
231+
static_cast<Sprite *>(target)->deleteClone();
232+
}
233+
}

src/dev/blocks/controlblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class ControlBlocks : public IExtension
2828
static CompilerValue *compileForEach(Compiler *compiler);
2929
static CompilerValue *compileStartAsClone(Compiler *compiler);
3030
static CompilerValue *compileCreateCloneOf(Compiler *compiler);
31+
static CompilerValue *compileDeleteThisClone(Compiler *compiler);
3132
};
3233

3334
} // namespace libscratchcpp

test/dev/blocks/control_blocks_test.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,3 +1063,53 @@ TEST_F(ControlBlocksTest, CreateCloneOfStage)
10631063
thread.run();
10641064
}
10651065
}
1066+
1067+
TEST_F(ControlBlocksTest, DeleteThisClone)
1068+
{
1069+
Sprite sprite;
1070+
sprite.setEngine(&m_engineMock);
1071+
1072+
std::shared_ptr<Sprite> clone;
1073+
EXPECT_CALL(m_engineMock, cloneLimit()).WillRepeatedly(Return(-1));
1074+
EXPECT_CALL(m_engineMock, initClone(_)).WillOnce(SaveArg<0>(&clone));
1075+
EXPECT_CALL(m_engineMock, moveDrawableBehindOther(_, &sprite));
1076+
EXPECT_CALL(m_engineMock, requestRedraw());
1077+
sprite.clone();
1078+
ASSERT_TRUE(clone);
1079+
1080+
ScriptBuilder builder(m_extension.get(), m_engine, clone);
1081+
1082+
builder.addBlock("control_delete_this_clone");
1083+
auto block = builder.currentBlock();
1084+
1085+
Compiler compiler(&m_engineMock, clone.get());
1086+
auto code = compiler.compile(block);
1087+
Script script(clone.get(), block, &m_engineMock);
1088+
script.setCode(code);
1089+
Thread thread(clone.get(), &m_engineMock, &script);
1090+
1091+
EXPECT_CALL(m_engineMock, stopTarget(clone.get(), nullptr));
1092+
EXPECT_CALL(m_engineMock, deinitClone(clone));
1093+
thread.run();
1094+
}
1095+
1096+
TEST_F(ControlBlocksTest, DeleteThisCloneStage)
1097+
{
1098+
auto target = std::make_shared<Stage>();
1099+
target->setEngine(&m_engineMock);
1100+
1101+
ScriptBuilder builder(m_extension.get(), m_engine, target);
1102+
1103+
builder.addBlock("control_delete_this_clone");
1104+
auto block = builder.currentBlock();
1105+
1106+
Compiler compiler(&m_engineMock, target.get());
1107+
auto code = compiler.compile(block);
1108+
Script script(target.get(), block, &m_engineMock);
1109+
script.setCode(code);
1110+
Thread thread(target.get(), &m_engineMock, &script);
1111+
1112+
EXPECT_CALL(m_engineMock, stopTarget).Times(0);
1113+
EXPECT_CALL(m_engineMock, deinitClone).Times(0);
1114+
thread.run();
1115+
}

0 commit comments

Comments
 (0)