Skip to content

Commit f4368ab

Browse files
committed
Implement looks_changesizeby block
1 parent 3c62f57 commit f4368ab

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

src/blocks/looksblocks.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,13 @@ std::string LooksBlocks::name() const
1515

1616
void LooksBlocks::registerBlocks(IEngine *engine)
1717
{
18+
// Blocks
1819
engine->addCompileFunction(this, "looks_show", &compileShow);
1920
engine->addCompileFunction(this, "looks_hide", &compileHide);
21+
engine->addCompileFunction(this, "looks_changesizeby", &compileChangeSizeBy);
22+
23+
// Inputs
24+
engine->addInput(this, "CHANGE", CHANGE);
2025
}
2126

2227
void LooksBlocks::compileShow(Compiler *compiler)
@@ -29,6 +34,12 @@ void LooksBlocks::compileHide(Compiler *compiler)
2934
compiler->addFunctionCall(&hide);
3035
}
3136

37+
void LooksBlocks::compileChangeSizeBy(Compiler *compiler)
38+
{
39+
compiler->addInput(CHANGE);
40+
compiler->addFunctionCall(&changeSizeBy);
41+
}
42+
3243
unsigned int LooksBlocks::show(VirtualMachine *vm)
3344
{
3445
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
@@ -48,3 +59,13 @@ unsigned int LooksBlocks::hide(VirtualMachine *vm)
4859

4960
return 0;
5061
}
62+
63+
unsigned int LooksBlocks::changeSizeBy(VirtualMachine *vm)
64+
{
65+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
66+
67+
if (sprite)
68+
sprite->setSize(sprite->size() + vm->getInput(0, 1)->toDouble());
69+
70+
return 1;
71+
}

src/blocks/looksblocks.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class LooksBlocks : public IBlockSection
1313
public:
1414
enum Inputs
1515
{
16+
CHANGE
1617
};
1718

1819
enum Fields
@@ -29,9 +30,11 @@ class LooksBlocks : public IBlockSection
2930

3031
static void compileShow(Compiler *compiler);
3132
static void compileHide(Compiler *compiler);
33+
static void compileChangeSizeBy(Compiler *compiler);
3234

3335
static unsigned int show(VirtualMachine *vm);
3436
static unsigned int hide(VirtualMachine *vm);
37+
static unsigned int changeSizeBy(VirtualMachine *vm);
3538
};
3639

3740
} // namespace libscratchcpp

test/blocks/looks_blocks_test.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
9494
// Blocks
9595
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_show", &LooksBlocks::compileShow));
9696
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_hide", &LooksBlocks::compileHide));
97+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_changesizeby", &LooksBlocks::compileChangeSizeBy));
98+
99+
// Inputs
100+
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "CHANGE", LooksBlocks::CHANGE));
97101

98102
m_section->registerBlocks(&m_engineMock);
99103
}
@@ -177,3 +181,42 @@ TEST_F(LooksBlocksTest, HideImpl)
177181
ASSERT_EQ(vm.registerCount(), 0);
178182
ASSERT_FALSE(sprite.visible());
179183
}
184+
185+
TEST_F(LooksBlocksTest, ChangeSizeBy)
186+
{
187+
Compiler compiler(&m_engineMock);
188+
189+
// change size by (10.05)
190+
auto block = std::make_shared<Block>("a", "looks_changesizeby");
191+
addValueInput(block, "CHANGE", LooksBlocks::CHANGE, 10.05);
192+
193+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::changeSizeBy)).WillOnce(Return(0));
194+
195+
compiler.init();
196+
compiler.setBlock(block);
197+
LooksBlocks::compileChangeSizeBy(&compiler);
198+
compiler.end();
199+
200+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT }));
201+
ASSERT_EQ(compiler.constValues().size(), 1);
202+
ASSERT_EQ(compiler.constValues()[0].toDouble(), 10.05);
203+
}
204+
205+
TEST_F(LooksBlocksTest, ChangeSizeByImpl)
206+
{
207+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT };
208+
static BlockFunc functions[] = { &LooksBlocks::changeSizeBy };
209+
static Value constValues[] = { 10.05 };
210+
211+
Sprite sprite;
212+
sprite.setSize(1.308);
213+
214+
VirtualMachine vm(&sprite, nullptr, nullptr);
215+
vm.setBytecode(bytecode);
216+
vm.setFunctions(functions);
217+
vm.setConstValues(constValues);
218+
vm.run();
219+
220+
ASSERT_EQ(vm.registerCount(), 0);
221+
ASSERT_EQ(sprite.size(), 11.358);
222+
}

0 commit comments

Comments
 (0)