Skip to content

Commit c0f7013

Browse files
committed
Implement pen_penUp block
1 parent fcb8cf6 commit c0f7013

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

src/blocks/penblocks.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <scratchcpp/target.h>
55
#include <scratchcpp/ispritehandler.h>
66
#include <scratchcpp/istagehandler.h>
7+
#include <scratchcpp/value.h>
8+
#include <scratchcpp/compilerconstant.h>
79

810
#include "penblocks.h"
911
#include "penlayer.h"
@@ -33,6 +35,7 @@ void PenBlocks::registerBlocks(IEngine *engine)
3335
engine->addCompileFunction(this, "pen_clear", &compileClear);
3436
engine->addCompileFunction(this, "pen_stamp", &compileStamp);
3537
engine->addCompileFunction(this, "pen_penDown", &compilePenDown);
38+
engine->addCompileFunction(this, "pen_penUp", &compilePenUp);
3639
}
3740

3841
CompilerValue *PenBlocks::compileClear(Compiler *compiler)
@@ -49,7 +52,15 @@ CompilerValue *PenBlocks::compileStamp(Compiler *compiler)
4952

5053
CompilerValue *PenBlocks::compilePenDown(Compiler *compiler)
5154
{
52-
compiler->addTargetFunctionCall("pen_penDown");
55+
CompilerValue *arg = compiler->addConstValue(true);
56+
compiler->addTargetFunctionCall("pen_set_pen_down", Compiler::StaticType::Void, { Compiler::StaticType::Bool }, { arg });
57+
return nullptr;
58+
}
59+
60+
CompilerValue *PenBlocks::compilePenUp(Compiler *compiler)
61+
{
62+
CompilerValue *arg = compiler->addConstValue(false);
63+
compiler->addTargetFunctionCall("pen_set_pen_down", Compiler::StaticType::Void, { Compiler::StaticType::Bool }, { arg });
5364
return nullptr;
5465
}
5566

@@ -96,7 +107,7 @@ BLOCK_EXPORT void pen_stamp(Target *target)
96107
}
97108
}
98109

99-
BLOCK_EXPORT void pen_penDown(Target *target)
110+
BLOCK_EXPORT void pen_set_pen_down(Target *target, bool down)
100111
{
101-
getTargetModel(target)->setPenDown(true);
112+
getTargetModel(target)->setPenDown(down);
102113
}

src/blocks/penblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class PenBlocks : public libscratchcpp::IExtension
1616
static libscratchcpp::CompilerValue *compileClear(libscratchcpp::Compiler *compiler);
1717
static libscratchcpp::CompilerValue *compileStamp(libscratchcpp::Compiler *compiler);
1818
static libscratchcpp::CompilerValue *compilePenDown(libscratchcpp::Compiler *compiler);
19+
static libscratchcpp::CompilerValue *compilePenUp(libscratchcpp::Compiler *compiler);
1920
};
2021

2122
} // namespace scratchcpprender

test/blocks/pen_blocks_test.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,55 @@ TEST_F(PenBlocksTest, PenDown_Stage)
168168
thread->run();
169169
ASSERT_TRUE(model.penDown());
170170
}
171+
172+
TEST_F(PenBlocksTest, PenUp_Sprite)
173+
{
174+
auto sprite = std::make_shared<Sprite>();
175+
sprite->setEngine(&m_engineMock);
176+
177+
RenderedTarget renderedTarget;
178+
SpriteModel model;
179+
model.init(sprite.get());
180+
model.setRenderedTarget(&renderedTarget);
181+
sprite->setInterface(&model);
182+
183+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
184+
builder.addBlock("pen_penUp");
185+
186+
auto thread = buildScript(builder, sprite.get());
187+
188+
model.setPenDown(true);
189+
190+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
191+
thread->run();
192+
ASSERT_FALSE(model.penDown());
193+
194+
thread->run();
195+
ASSERT_FALSE(model.penDown());
196+
}
197+
198+
TEST_F(PenBlocksTest, PenUp_Stage)
199+
{
200+
auto stage = std::make_shared<Stage>();
201+
stage->setEngine(&m_engineMock);
202+
203+
RenderedTarget renderedTarget;
204+
StageModel model;
205+
model.init(stage.get());
206+
model.setRenderedTarget(&renderedTarget);
207+
stage->setInterface(&model);
208+
209+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
210+
builder.addBlock("pen_penUp");
211+
212+
auto thread = buildScript(builder, stage.get());
213+
214+
model.setPenDown(true);
215+
216+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
217+
thread->run();
218+
ASSERT_FALSE(model.penDown());
219+
220+
thread->run();
221+
ASSERT_FALSE(model.penDown());
222+
}

0 commit comments

Comments
 (0)