Skip to content

Commit d179ff8

Browse files
committed
Implement pen_penDown block
1 parent 52855ea commit d179ff8

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

src/blocks/penblocks.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void PenBlocks::registerBlocks(IEngine *engine)
3232
{
3333
engine->addCompileFunction(this, "pen_clear", &compileClear);
3434
engine->addCompileFunction(this, "pen_stamp", &compileStamp);
35+
engine->addCompileFunction(this, "pen_penDown", &compilePenDown);
3536
}
3637

3738
CompilerValue *PenBlocks::compileClear(Compiler *compiler)
@@ -46,6 +47,23 @@ CompilerValue *PenBlocks::compileStamp(Compiler *compiler)
4647
return nullptr;
4748
}
4849

50+
CompilerValue *PenBlocks::compilePenDown(Compiler *compiler)
51+
{
52+
compiler->addTargetFunctionCall("pen_penDown");
53+
return nullptr;
54+
}
55+
56+
static TargetModel *getTargetModel(Target *target)
57+
{
58+
if (target->isStage()) {
59+
Stage *stage = static_cast<Stage *>(target);
60+
return static_cast<StageModel *>(stage->getInterface());
61+
} else {
62+
Sprite *sprite = static_cast<Sprite *>(target);
63+
return static_cast<SpriteModel *>(sprite->getInterface());
64+
}
65+
}
66+
4967
BLOCK_EXPORT void pen_clear(ExecutionContext *ctx)
5068
{
5169
IEngine *engine = ctx->engine();
@@ -77,3 +95,8 @@ BLOCK_EXPORT void pen_stamp(Target *target)
7795
engine->requestRedraw();
7896
}
7997
}
98+
99+
BLOCK_EXPORT void pen_penDown(Target *target)
100+
{
101+
getTargetModel(target)->setPenDown(true);
102+
}

src/blocks/penblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class PenBlocks : public libscratchcpp::IExtension
1515
private:
1616
static libscratchcpp::CompilerValue *compileClear(libscratchcpp::Compiler *compiler);
1717
static libscratchcpp::CompilerValue *compileStamp(libscratchcpp::Compiler *compiler);
18+
static libscratchcpp::CompilerValue *compilePenDown(libscratchcpp::Compiler *compiler);
1819
};
1920

2021
} // namespace scratchcpprender

test/blocks/pen_blocks_test.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,55 @@ TEST_F(PenBlocksTest, Stamp_Stage)
116116
EXPECT_CALL(m_engineMock, requestRedraw());
117117
thread->run();
118118
}
119+
120+
TEST_F(PenBlocksTest, PenDown_Sprite)
121+
{
122+
auto sprite = std::make_shared<Sprite>();
123+
sprite->setEngine(&m_engineMock);
124+
125+
RenderedTarget renderedTarget;
126+
SpriteModel model;
127+
model.init(sprite.get());
128+
model.setRenderedTarget(&renderedTarget);
129+
sprite->setInterface(&model);
130+
131+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
132+
builder.addBlock("pen_penDown");
133+
134+
auto thread = buildScript(builder, sprite.get());
135+
136+
model.setPenDown(false);
137+
138+
// EXPECT_CALL(m_engineMock, requestRedraw());
139+
thread->run();
140+
ASSERT_TRUE(model.penDown());
141+
142+
thread->run();
143+
ASSERT_TRUE(model.penDown());
144+
}
145+
146+
TEST_F(PenBlocksTest, PenDown_Stage)
147+
{
148+
auto stage = std::make_shared<Stage>();
149+
stage->setEngine(&m_engineMock);
150+
151+
RenderedTarget renderedTarget;
152+
StageModel model;
153+
model.init(stage.get());
154+
model.setRenderedTarget(&renderedTarget);
155+
stage->setInterface(&model);
156+
157+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
158+
builder.addBlock("pen_penDown");
159+
160+
auto thread = buildScript(builder, stage.get());
161+
162+
model.setPenDown(false);
163+
164+
// EXPECT_CALL(m_engineMock, requestRedraw());
165+
thread->run();
166+
ASSERT_TRUE(model.penDown());
167+
168+
thread->run();
169+
ASSERT_TRUE(model.penDown());
170+
}

0 commit comments

Comments
 (0)