|
3 | 3 | #include <scratchcpp/input.h> |
4 | 4 | #include <scratchcpp/field.h> |
5 | 5 | #include <scratchcpp/sprite.h> |
| 6 | +#include <scratchcpp/costume.h> |
6 | 7 | #include <enginemock.h> |
7 | 8 |
|
8 | 9 | #include "../common.h" |
@@ -97,11 +98,19 @@ TEST_F(LooksBlocksTest, RegisterBlocks) |
97 | 98 | EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_changesizeby", &LooksBlocks::compileChangeSizeBy)); |
98 | 99 | EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_setsizeto", &LooksBlocks::compileSetSizeTo)); |
99 | 100 | EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_size", &LooksBlocks::compileSize)); |
| 101 | + EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_costumenumbername", &LooksBlocks::compileCostumeNumberName)); |
100 | 102 |
|
101 | 103 | // Inputs |
102 | 104 | EXPECT_CALL(m_engineMock, addInput(m_section.get(), "CHANGE", LooksBlocks::CHANGE)); |
103 | 105 | EXPECT_CALL(m_engineMock, addInput(m_section.get(), "SIZE", LooksBlocks::SIZE)); |
104 | 106 |
|
| 107 | + // Fields |
| 108 | + EXPECT_CALL(m_engineMock, addField(m_section.get(), "NUMBER_NAME", LooksBlocks::NUMBER_NAME)); |
| 109 | + |
| 110 | + // Field values |
| 111 | + EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "number", LooksBlocks::CostumeNumber)); |
| 112 | + EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "name", LooksBlocks::CostumeName)); |
| 113 | + |
105 | 114 | m_section->registerBlocks(&m_engineMock); |
106 | 115 | } |
107 | 116 |
|
@@ -296,3 +305,81 @@ TEST_F(LooksBlocksTest, SizeImpl) |
296 | 305 | ASSERT_EQ(vm.registerCount(), 1); |
297 | 306 | ASSERT_EQ(vm.getInput(0, 1)->toDouble(), -51.0684); |
298 | 307 | } |
| 308 | + |
| 309 | +TEST_F(LooksBlocksTest, CostumeNumberName) |
| 310 | +{ |
| 311 | + Compiler compiler(&m_engineMock); |
| 312 | + |
| 313 | + // costume [number] |
| 314 | + auto block1 = std::make_shared<Block>("a", "looks_costumenumbername"); |
| 315 | + addDropdownField(block1, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "number", LooksBlocks::CostumeNumber); |
| 316 | + |
| 317 | + // costume [name] |
| 318 | + auto block2 = std::make_shared<Block>("b", "looks_costumenumbername"); |
| 319 | + addDropdownField(block2, "NUMBER_NAME", LooksBlocks::NUMBER_NAME, "name", LooksBlocks::CostumeName); |
| 320 | + |
| 321 | + compiler.init(); |
| 322 | + |
| 323 | + EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::costumeNumber)).WillOnce(Return(0)); |
| 324 | + compiler.setBlock(block1); |
| 325 | + LooksBlocks::compileCostumeNumberName(&compiler); |
| 326 | + |
| 327 | + EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::costumeName)).WillOnce(Return(1)); |
| 328 | + compiler.setBlock(block2); |
| 329 | + LooksBlocks::compileCostumeNumberName(&compiler); |
| 330 | + |
| 331 | + compiler.end(); |
| 332 | + |
| 333 | + ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_EXEC, 1, vm::OP_HALT })); |
| 334 | + ASSERT_TRUE(compiler.constValues().empty()); |
| 335 | +} |
| 336 | + |
| 337 | +TEST_F(LooksBlocksTest, CostumeNumberNameImpl) |
| 338 | +{ |
| 339 | + static unsigned int bytecode1[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }; |
| 340 | + static unsigned int bytecode2[] = { vm::OP_START, vm::OP_EXEC, 1, vm::OP_HALT }; |
| 341 | + static BlockFunc functions[] = { &LooksBlocks::costumeNumber, &LooksBlocks::costumeName }; |
| 342 | + |
| 343 | + auto c1 = std::make_shared<Costume>("costume1", "c1", "svg"); |
| 344 | + auto c2 = std::make_shared<Costume>("costume2", "c2", "svg"); |
| 345 | + auto c3 = std::make_shared<Costume>("costume3", "c3", "svg"); |
| 346 | + |
| 347 | + Target target; |
| 348 | + target.addCostume(c1); |
| 349 | + target.addCostume(c2); |
| 350 | + target.addCostume(c3); |
| 351 | + |
| 352 | + VirtualMachine vm(&target, nullptr, nullptr); |
| 353 | + vm.setFunctions(functions); |
| 354 | + |
| 355 | + target.setCurrentCostume(2); |
| 356 | + |
| 357 | + vm.setBytecode(bytecode1); |
| 358 | + vm.run(); |
| 359 | + |
| 360 | + ASSERT_EQ(vm.registerCount(), 1); |
| 361 | + ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 2); |
| 362 | + |
| 363 | + vm.reset(); |
| 364 | + vm.setBytecode(bytecode2); |
| 365 | + vm.run(); |
| 366 | + |
| 367 | + ASSERT_EQ(vm.registerCount(), 1); |
| 368 | + ASSERT_EQ(vm.getInput(0, 1)->toString(), "costume2"); |
| 369 | + |
| 370 | + target.setCurrentCostume(3); |
| 371 | + |
| 372 | + vm.reset(); |
| 373 | + vm.setBytecode(bytecode1); |
| 374 | + vm.run(); |
| 375 | + |
| 376 | + ASSERT_EQ(vm.registerCount(), 1); |
| 377 | + ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 3); |
| 378 | + |
| 379 | + vm.reset(); |
| 380 | + vm.setBytecode(bytecode2); |
| 381 | + vm.run(); |
| 382 | + |
| 383 | + ASSERT_EQ(vm.registerCount(), 1); |
| 384 | + ASSERT_EQ(vm.getInput(0, 1)->toString(), "costume3"); |
| 385 | +} |
0 commit comments