Skip to content

Commit f2a0be8

Browse files
committed
Implement looks_setsizeto block
1 parent f4368ab commit f2a0be8

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

src/blocks/looksblocks.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ void LooksBlocks::registerBlocks(IEngine *engine)
1919
engine->addCompileFunction(this, "looks_show", &compileShow);
2020
engine->addCompileFunction(this, "looks_hide", &compileHide);
2121
engine->addCompileFunction(this, "looks_changesizeby", &compileChangeSizeBy);
22+
engine->addCompileFunction(this, "looks_setsizeto", &compileSetSizeTo);
2223

2324
// Inputs
2425
engine->addInput(this, "CHANGE", CHANGE);
26+
engine->addInput(this, "SIZE", SIZE);
2527
}
2628

2729
void LooksBlocks::compileShow(Compiler *compiler)
@@ -40,6 +42,12 @@ void LooksBlocks::compileChangeSizeBy(Compiler *compiler)
4042
compiler->addFunctionCall(&changeSizeBy);
4143
}
4244

45+
void LooksBlocks::compileSetSizeTo(Compiler *compiler)
46+
{
47+
compiler->addInput(SIZE);
48+
compiler->addFunctionCall(&setSizeTo);
49+
}
50+
4351
unsigned int LooksBlocks::show(VirtualMachine *vm)
4452
{
4553
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
@@ -69,3 +77,13 @@ unsigned int LooksBlocks::changeSizeBy(VirtualMachine *vm)
6977

7078
return 1;
7179
}
80+
81+
unsigned int LooksBlocks::setSizeTo(VirtualMachine *vm)
82+
{
83+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
84+
85+
if (sprite)
86+
sprite->setSize(vm->getInput(0, 1)->toDouble());
87+
88+
return 1;
89+
}

src/blocks/looksblocks.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class LooksBlocks : public IBlockSection
1313
public:
1414
enum Inputs
1515
{
16-
CHANGE
16+
CHANGE,
17+
SIZE
1718
};
1819

1920
enum Fields
@@ -31,10 +32,12 @@ class LooksBlocks : public IBlockSection
3132
static void compileShow(Compiler *compiler);
3233
static void compileHide(Compiler *compiler);
3334
static void compileChangeSizeBy(Compiler *compiler);
35+
static void compileSetSizeTo(Compiler *compiler);
3436

3537
static unsigned int show(VirtualMachine *vm);
3638
static unsigned int hide(VirtualMachine *vm);
3739
static unsigned int changeSizeBy(VirtualMachine *vm);
40+
static unsigned int setSizeTo(VirtualMachine *vm);
3841
};
3942

4043
} // namespace libscratchcpp

test/blocks/looks_blocks_test.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,11 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
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));
9797
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_changesizeby", &LooksBlocks::compileChangeSizeBy));
98+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_setsizeto", &LooksBlocks::compileSetSizeTo));
9899

99100
// Inputs
100101
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "CHANGE", LooksBlocks::CHANGE));
102+
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "SIZE", LooksBlocks::SIZE));
101103

102104
m_section->registerBlocks(&m_engineMock);
103105
}
@@ -220,3 +222,42 @@ TEST_F(LooksBlocksTest, ChangeSizeByImpl)
220222
ASSERT_EQ(vm.registerCount(), 0);
221223
ASSERT_EQ(sprite.size(), 11.358);
222224
}
225+
226+
TEST_F(LooksBlocksTest, SetSizeTo)
227+
{
228+
Compiler compiler(&m_engineMock);
229+
230+
// set size to (87.654)
231+
auto block = std::make_shared<Block>("a", "looks_setsizeto");
232+
addValueInput(block, "SIZE", LooksBlocks::SIZE, 87.654);
233+
234+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::setSizeTo)).WillOnce(Return(0));
235+
236+
compiler.init();
237+
compiler.setBlock(block);
238+
LooksBlocks::compileSetSizeTo(&compiler);
239+
compiler.end();
240+
241+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT }));
242+
ASSERT_EQ(compiler.constValues().size(), 1);
243+
ASSERT_EQ(compiler.constValues()[0].toDouble(), 87.654);
244+
}
245+
246+
TEST_F(LooksBlocksTest, SetSizeToImpl)
247+
{
248+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT };
249+
static BlockFunc functions[] = { &LooksBlocks::setSizeTo };
250+
static Value constValues[] = { 87.654 };
251+
252+
Sprite sprite;
253+
sprite.setSize(5.684);
254+
255+
VirtualMachine vm(&sprite, nullptr, nullptr);
256+
vm.setBytecode(bytecode);
257+
vm.setFunctions(functions);
258+
vm.setConstValues(constValues);
259+
vm.run();
260+
261+
ASSERT_EQ(vm.registerCount(), 0);
262+
ASSERT_EQ(sprite.size(), 87.654);
263+
}

0 commit comments

Comments
 (0)