@@ -99,12 +99,15 @@ TEST_F(MotionBlocksTest, RegisterBlocks)
9999 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_turnleft" , &MotionBlocks::compileTurnLeft));
100100 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_pointindirection" , &MotionBlocks::compilePointInDirection));
101101 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_pointtowards" , &MotionBlocks::compilePointTowards));
102+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_gotoxy" , &MotionBlocks::compileGoToXY));
102103
103104 // Inputs
104105 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " STEPS" , MotionBlocks::STEPS));
105106 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " DEGREES" , MotionBlocks::DEGREES));
106107 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " DIRECTION" , MotionBlocks::DIRECTION));
107108 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " TOWARDS" , MotionBlocks::TOWARDS));
109+ EXPECT_CALL (m_engineMock, addInput (m_section.get (), " X" , MotionBlocks::X));
110+ EXPECT_CALL (m_engineMock, addInput (m_section.get (), " Y" , MotionBlocks::Y));
108111
109112 m_section->registerBlocks (&m_engineMock);
110113}
@@ -436,3 +439,42 @@ TEST_F(MotionBlocksTest, PointTowardsImpl)
436439 ASSERT_EQ (std::round (sprite.direction () * 100 ) / 100 , intPosResults[i]);
437440 }
438441}
442+
443+ TEST_F (MotionBlocksTest, GoToXY)
444+ {
445+ Compiler compiler (&m_engineMock);
446+
447+ // turn right (12.05) degrees
448+ auto block = std::make_shared<Block>(" a" , " motion_gotoxy" );
449+ addValueInput (block, " X" , MotionBlocks::X, 95.2 );
450+ addValueInput (block, " Y" , MotionBlocks::Y, -175.9 );
451+
452+ EXPECT_CALL (m_engineMock, functionIndex (&MotionBlocks::goToXY)).WillOnce (Return (0 ));
453+
454+ compiler.init ();
455+ compiler.setBlock (block);
456+ MotionBlocks::compileGoToXY (&compiler);
457+ compiler.end ();
458+
459+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_CONST, 0 , vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT }));
460+ ASSERT_EQ (compiler.constValues (), std::vector<Value>({ 95.2 , -175.9 }));
461+ }
462+
463+ TEST_F (MotionBlocksTest, GoToXYImpl)
464+ {
465+ static unsigned int bytecode[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT };
466+ static BlockFunc functions[] = { &MotionBlocks::goToXY };
467+ static Value constValues[] = { 95.2 , -175.9 };
468+
469+ Sprite sprite;
470+
471+ VirtualMachine vm (&sprite, nullptr , nullptr );
472+ vm.setBytecode (bytecode);
473+ vm.setFunctions (functions);
474+ vm.setConstValues (constValues);
475+ vm.run ();
476+
477+ ASSERT_EQ (vm.registerCount (), 0 );
478+ ASSERT_EQ (sprite.x (), 95.2 );
479+ ASSERT_EQ (sprite.y (), -175.9 );
480+ }
0 commit comments