@@ -117,6 +117,8 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
117117 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_switchbackdropto" , &LooksBlocks::compileSwitchBackdropTo));
118118 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_switchbackdroptoandwait" , &LooksBlocks::compileSwitchBackdropToAndWait));
119119 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_nextbackdrop" , &LooksBlocks::compileNextBackdrop));
120+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_gotofrontback" , &LooksBlocks::compileGoToFrontBack));
121+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_goforwardbackwardlayers" , &LooksBlocks::compileGoForwardBackwardLayers));
120122 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_costumenumbername" , &LooksBlocks::compileCostumeNumberName));
121123 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " looks_backdropnumbername" , &LooksBlocks::compileBackdropNumberName));
122124
@@ -130,6 +132,8 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
130132 // Fields
131133 EXPECT_CALL (m_engineMock, addField (m_section.get (), " NUMBER_NAME" , LooksBlocks::NUMBER_NAME));
132134 EXPECT_CALL (m_engineMock, addField (m_section.get (), " EFFECT" , LooksBlocks::EFFECT));
135+ EXPECT_CALL (m_engineMock, addField (m_section.get (), " FRONT_BACK" , LooksBlocks::FRONT_BACK));
136+ EXPECT_CALL (m_engineMock, addField (m_section.get (), " FORWARD_BACKWARD" , LooksBlocks::FORWARD_BACKWARD));
133137
134138 // Field values
135139 EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " number" , LooksBlocks::Number));
@@ -141,6 +145,10 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
141145 EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " MOSAIC" , LooksBlocks::MosaicEffect));
142146 EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " BRIGHTNESS" , LooksBlocks::BrightnessEffect));
143147 EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " GHOST" , LooksBlocks::GhostEffect));
148+ EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " front" , LooksBlocks::Front));
149+ EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " back" , LooksBlocks::Back));
150+ EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " forward" , LooksBlocks::Forward));
151+ EXPECT_CALL (m_engineMock, addFieldValue (m_section.get (), " backward" , LooksBlocks::Backward));
144152
145153 m_section->registerBlocks (&m_engineMock);
146154}
@@ -2577,6 +2585,116 @@ TEST_F(LooksBlocksTest, RandomBackdropAndWait)
25772585 LooksBlocks::rng = RandomGenerator::instance ().get ();
25782586}
25792587
2588+ TEST_F (LooksBlocksTest, GoToFrontBack)
2589+ {
2590+ Compiler compiler (&m_engineMock);
2591+
2592+ // go to [front] layer
2593+ auto block1 = std::make_shared<Block>(" a" , " looks_gotofrontback" );
2594+ addDropdownField (block1, " FRONT_BACK" , LooksBlocks::FRONT_BACK, " front" , LooksBlocks::Front);
2595+
2596+ // go to [back] layer
2597+ auto block2 = std::make_shared<Block>(" b" , " looks_gotofrontback" );
2598+ addDropdownField (block2, " FRONT_BACK" , LooksBlocks::FRONT_BACK, " back" , LooksBlocks::Back);
2599+
2600+ compiler.init ();
2601+
2602+ EXPECT_CALL (m_engineMock, functionIndex (&LooksBlocks::goToFront)).WillOnce (Return (0 ));
2603+ compiler.setBlock (block1);
2604+ LooksBlocks::compileGoToFrontBack (&compiler);
2605+
2606+ EXPECT_CALL (m_engineMock, functionIndex (&LooksBlocks::goToBack)).WillOnce (Return (1 ));
2607+ compiler.setBlock (block2);
2608+ LooksBlocks::compileGoToFrontBack (&compiler);
2609+
2610+ compiler.end ();
2611+
2612+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_EXEC, 0 , vm::OP_EXEC, 1 , vm::OP_HALT }));
2613+ ASSERT_TRUE (compiler.constValues ().empty ());
2614+ }
2615+
2616+ TEST_F (LooksBlocksTest, GoToFrontBackImpl)
2617+ {
2618+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_EXEC, 0 , vm::OP_HALT };
2619+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_EXEC, 1 , vm::OP_HALT };
2620+ static BlockFunc functions[] = { &LooksBlocks::goToFront, &LooksBlocks::goToBack };
2621+
2622+ Sprite sprite;
2623+
2624+ VirtualMachine vm (&sprite, &m_engineMock, nullptr );
2625+ vm.setFunctions (functions);
2626+
2627+ EXPECT_CALL (m_engineMock, moveSpriteToFront (&sprite));
2628+ vm.setBytecode (bytecode1);
2629+ vm.run ();
2630+
2631+ ASSERT_EQ (vm.registerCount (), 0 );
2632+
2633+ EXPECT_CALL (m_engineMock, moveSpriteToBack (&sprite));
2634+ vm.reset ();
2635+ vm.setBytecode (bytecode2);
2636+ vm.run ();
2637+
2638+ ASSERT_EQ (vm.registerCount (), 0 );
2639+ }
2640+
2641+ TEST_F (LooksBlocksTest, GoForwardBackwardLayers)
2642+ {
2643+ Compiler compiler (&m_engineMock);
2644+
2645+ // go [forward] (5) layers
2646+ auto block1 = std::make_shared<Block>(" a" , " looks_goforwardbackwardlayers" );
2647+ addDropdownField (block1, " FORWARD_BACKWARD" , LooksBlocks::FORWARD_BACKWARD, " forward" , LooksBlocks::Forward);
2648+ addValueInput (block1, " NUM" , LooksBlocks::NUM, 5 );
2649+
2650+ // go [backward] (3) layers
2651+ auto block2 = std::make_shared<Block>(" b" , " looks_goforwardbackwardlayers" );
2652+ addDropdownField (block2, " FORWARD_BACKWARD" , LooksBlocks::FORWARD_BACKWARD, " backward" , LooksBlocks::Backward);
2653+ addValueInput (block2, " NUM" , LooksBlocks::NUM, 3 );
2654+
2655+ compiler.init ();
2656+
2657+ EXPECT_CALL (m_engineMock, functionIndex (&LooksBlocks::goForwardLayers)).WillOnce (Return (0 ));
2658+ compiler.setBlock (block1);
2659+ LooksBlocks::compileGoForwardBackwardLayers (&compiler);
2660+
2661+ EXPECT_CALL (m_engineMock, functionIndex (&LooksBlocks::goBackwardLayers)).WillOnce (Return (1 ));
2662+ compiler.setBlock (block2);
2663+ LooksBlocks::compileGoForwardBackwardLayers (&compiler);
2664+
2665+ compiler.end ();
2666+
2667+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_CONST, 1 , vm::OP_EXEC, 1 , vm::OP_HALT }));
2668+ ASSERT_EQ (compiler.constValues (), std::vector<Value>({ 5 , 3 }));
2669+ }
2670+
2671+ TEST_F (LooksBlocksTest, GoForwardBackwardLayersImpl)
2672+ {
2673+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_HALT };
2674+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1 , vm::OP_EXEC, 1 , vm::OP_HALT };
2675+ static BlockFunc functions[] = { &LooksBlocks::goForwardLayers, &LooksBlocks::goBackwardLayers };
2676+ static Value constValues[] = { 5 , 3 };
2677+
2678+ Sprite sprite;
2679+
2680+ VirtualMachine vm (&sprite, &m_engineMock, nullptr );
2681+ vm.setFunctions (functions);
2682+ vm.setConstValues (constValues);
2683+
2684+ EXPECT_CALL (m_engineMock, moveSpriteForwardLayers (&sprite, 5 ));
2685+ vm.setBytecode (bytecode1);
2686+ vm.run ();
2687+
2688+ ASSERT_EQ (vm.registerCount (), 0 );
2689+
2690+ EXPECT_CALL (m_engineMock, moveSpriteBackwardLayers (&sprite, 3 ));
2691+ vm.reset ();
2692+ vm.setBytecode (bytecode2);
2693+ vm.run ();
2694+
2695+ ASSERT_EQ (vm.registerCount (), 0 );
2696+ }
2697+
25802698TEST_F (LooksBlocksTest, CostumeNumberName)
25812699{
25822700 Compiler compiler (&m_engineMock);
0 commit comments