Skip to content

Commit 54e5c0c

Browse files
committed
Implement looks_backdropnumbername block
1 parent c833386 commit 54e5c0c

File tree

3 files changed

+139
-10
lines changed

3 files changed

+139
-10
lines changed

src/blocks/looksblocks.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
3232
engine->addCompileFunction(this, "looks_nextcostume", &compileNextCostume);
3333
engine->addCompileFunction(this, "looks_switchbackdropto", &compileSwitchBackdropTo);
3434
engine->addCompileFunction(this, "looks_costumenumbername", &compileCostumeNumberName);
35+
engine->addCompileFunction(this, "looks_backdropnumbername", &compileBackdropNumberName);
3536

3637
// Inputs
3738
engine->addInput(this, "CHANGE", CHANGE);
@@ -43,8 +44,8 @@ void LooksBlocks::registerBlocks(IEngine *engine)
4344
engine->addField(this, "NUMBER_NAME", NUMBER_NAME);
4445

4546
// Field values
46-
engine->addFieldValue(this, "number", CostumeNumber);
47-
engine->addFieldValue(this, "name", CostumeName);
47+
engine->addFieldValue(this, "number", Number);
48+
engine->addFieldValue(this, "name", Name);
4849
}
4950

5051
void LooksBlocks::compileShow(Compiler *compiler)
@@ -160,16 +161,31 @@ void LooksBlocks::compileCostumeNumberName(Compiler *compiler)
160161
int option = compiler->field(NUMBER_NAME)->specialValueId();
161162

162163
switch (option) {
163-
case CostumeNumber:
164+
case Number:
164165
compiler->addFunctionCall(&costumeNumber);
165166
break;
166167

167-
case CostumeName:
168+
case Name:
168169
compiler->addFunctionCall(&costumeName);
169170
break;
170171
}
171172
}
172173

174+
void LooksBlocks::compileBackdropNumberName(Compiler *compiler)
175+
{
176+
int option = compiler->field(NUMBER_NAME)->specialValueId();
177+
178+
switch (option) {
179+
case Number:
180+
compiler->addFunctionCall(&backdropNumber);
181+
break;
182+
183+
case Name:
184+
compiler->addFunctionCall(&backdropName);
185+
break;
186+
}
187+
}
188+
173189
unsigned int LooksBlocks::show(VirtualMachine *vm)
174190
{
175191
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
@@ -377,3 +393,28 @@ unsigned int LooksBlocks::costumeName(VirtualMachine *vm)
377393

378394
return 0;
379395
}
396+
397+
unsigned int LooksBlocks::backdropNumber(VirtualMachine *vm)
398+
{
399+
if (Stage *stage = vm->engine()->stage())
400+
vm->addReturnValue(stage->currentCostume());
401+
else
402+
vm->addReturnValue(0);
403+
404+
return 0;
405+
}
406+
407+
unsigned int LooksBlocks::backdropName(VirtualMachine *vm)
408+
{
409+
if (Stage *stage = vm->engine()->stage()) {
410+
auto costume = stage->costumeAt(stage->currentCostume() - 1);
411+
412+
if (costume)
413+
vm->addReturnValue(costume->name());
414+
else
415+
vm->addReturnValue("");
416+
} else
417+
vm->addReturnValue("");
418+
419+
return 0;
420+
}

src/blocks/looksblocks.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class LooksBlocks : public IBlockSection
2929

3030
enum FieldValues
3131
{
32-
CostumeNumber,
33-
CostumeName
32+
Number,
33+
Name
3434
};
3535

3636
std::string name() const override;
@@ -46,6 +46,7 @@ class LooksBlocks : public IBlockSection
4646
static void compileNextCostume(Compiler *compiler);
4747
static void compileSwitchBackdropTo(Compiler *compiler);
4848
static void compileCostumeNumberName(Compiler *compiler);
49+
static void compileBackdropNumberName(Compiler *compiler);
4950

5051
static unsigned int show(VirtualMachine *vm);
5152
static unsigned int hide(VirtualMachine *vm);
@@ -67,6 +68,8 @@ class LooksBlocks : public IBlockSection
6768

6869
static unsigned int costumeNumber(VirtualMachine *vm);
6970
static unsigned int costumeName(VirtualMachine *vm);
71+
static unsigned int backdropNumber(VirtualMachine *vm);
72+
static unsigned int backdropName(VirtualMachine *vm);
7073

7174
static IRandomGenerator *rng;
7275
};

test/blocks/looks_blocks_test.cpp

Lines changed: 89 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
106106
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_nextcostume", &LooksBlocks::compileNextCostume));
107107
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_switchbackdropto", &LooksBlocks::compileSwitchBackdropTo));
108108
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_costumenumbername", &LooksBlocks::compileCostumeNumberName));
109+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_backdropnumbername", &LooksBlocks::compileBackdropNumberName));
109110

110111
// Inputs
111112
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "CHANGE", LooksBlocks::CHANGE));
@@ -117,8 +118,8 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
117118
EXPECT_CALL(m_engineMock, addField(m_section.get(), "NUMBER_NAME", LooksBlocks::NUMBER_NAME));
118119

119120
// Field values
120-
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "number", LooksBlocks::CostumeNumber));
121-
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "name", LooksBlocks::CostumeName));
121+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "number", LooksBlocks::Number));
122+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "name", LooksBlocks::Name));
122123

123124
m_section->registerBlocks(&m_engineMock);
124125
}
@@ -1249,11 +1250,11 @@ TEST_F(LooksBlocksTest, CostumeNumberName)
12491250

12501251
// costume [number]
12511252
auto block1 = std::make_shared<Block>("a", "looks_costumenumbername");
1252-
addDropdownField(block1, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "number", LooksBlocks::CostumeNumber);
1253+
addDropdownField(block1, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "number", LooksBlocks::Number);
12531254

12541255
// costume [name]
12551256
auto block2 = std::make_shared<Block>("b", "looks_costumenumbername");
1256-
addDropdownField(block2, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "name", LooksBlocks::CostumeName);
1257+
addDropdownField(block2, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "name", LooksBlocks::Name);
12571258

12581259
compiler.init();
12591260

@@ -1320,3 +1321,87 @@ TEST_F(LooksBlocksTest, CostumeNumberNameImpl)
13201321
ASSERT_EQ(vm.registerCount(), 1);
13211322
ASSERT_EQ(vm.getInput(0, 1)->toString(), "costume3");
13221323
}
1324+
1325+
TEST_F(LooksBlocksTest, BackdropNumberName)
1326+
{
1327+
Compiler compiler(&m_engineMock);
1328+
1329+
// backdrop [number]
1330+
auto block1 = std::make_shared<Block>("a", "looks_backdropnumbername");
1331+
addDropdownField(block1, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "number", LooksBlocks::Number);
1332+
1333+
// backdrop [name]
1334+
auto block2 = std::make_shared<Block>("b", "looks_backdropnumbername");
1335+
addDropdownField(block2, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "name", LooksBlocks::Name);
1336+
1337+
compiler.init();
1338+
1339+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::backdropNumber)).WillOnce(Return(0));
1340+
compiler.setBlock(block1);
1341+
LooksBlocks::compileBackdropNumberName(&compiler);
1342+
1343+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::backdropName)).WillOnce(Return(1));
1344+
compiler.setBlock(block2);
1345+
LooksBlocks::compileBackdropNumberName(&compiler);
1346+
1347+
compiler.end();
1348+
1349+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_EXEC, 1, vm::OP_HALT }));
1350+
ASSERT_TRUE(compiler.constValues().empty());
1351+
}
1352+
1353+
TEST_F(LooksBlocksTest, BackdropNumberNameImpl)
1354+
{
1355+
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
1356+
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_EXEC, 1, vm::OP_HALT };
1357+
static BlockFunc functions[] = { &LooksBlocks::backdropNumber, &LooksBlocks::backdropName };
1358+
1359+
auto b1 = std::make_shared<Costume>("backdrop1", "b1", "svg");
1360+
auto b2 = std::make_shared<Costume>("backdrop2", "b2", "svg");
1361+
auto b3 = std::make_shared<Costume>("backdrop3", "b3", "svg");
1362+
1363+
Target target;
1364+
1365+
Stage stage;
1366+
stage.addCostume(b1);
1367+
stage.addCostume(b2);
1368+
stage.addCostume(b3);
1369+
1370+
VirtualMachine vm(&target, &m_engineMock, nullptr);
1371+
vm.setFunctions(functions);
1372+
1373+
stage.setCurrentCostume(2);
1374+
1375+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
1376+
vm.setBytecode(bytecode1);
1377+
vm.run();
1378+
1379+
ASSERT_EQ(vm.registerCount(), 1);
1380+
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 2);
1381+
1382+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
1383+
vm.reset();
1384+
vm.setBytecode(bytecode2);
1385+
vm.run();
1386+
1387+
ASSERT_EQ(vm.registerCount(), 1);
1388+
ASSERT_EQ(vm.getInput(0, 1)->toString(), "backdrop2");
1389+
1390+
stage.setCurrentCostume(3);
1391+
1392+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
1393+
vm.reset();
1394+
vm.setBytecode(bytecode1);
1395+
vm.run();
1396+
1397+
ASSERT_EQ(vm.registerCount(), 1);
1398+
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 3);
1399+
1400+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
1401+
vm.reset();
1402+
vm.setBytecode(bytecode2);
1403+
vm.run();
1404+
1405+
ASSERT_EQ(vm.registerCount(), 1);
1406+
ASSERT_EQ(vm.getInput(0, 1)->toString(), "backdrop3");
1407+
}

0 commit comments

Comments
 (0)