Skip to content

Commit d230416

Browse files
committed
Implement motion_yposition block
1 parent afdc329 commit d230416

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

src/blocks/motionblocks.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void MotionBlocks::registerBlocks(IEngine *engine)
4040
engine->addCompileFunction(this, "motion_sety", &compileSetY);
4141
engine->addCompileFunction(this, "motion_setrotationstyle", &compileSetRotationStyle);
4242
engine->addCompileFunction(this, "motion_xposition", &compileXPosition);
43+
engine->addCompileFunction(this, "motion_yposition", &compileYPosition);
4344

4445
// Inputs
4546
engine->addInput(this, "STEPS", STEPS);
@@ -221,6 +222,11 @@ void MotionBlocks::compileXPosition(Compiler *compiler)
221222
compiler->addFunctionCall(&xPosition);
222223
}
223224

225+
void MotionBlocks::compileYPosition(Compiler *compiler)
226+
{
227+
compiler->addFunctionCall(&yPosition);
228+
}
229+
224230
unsigned int MotionBlocks::moveSteps(VirtualMachine *vm)
225231
{
226232
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
@@ -664,3 +670,15 @@ unsigned int MotionBlocks::xPosition(VirtualMachine *vm)
664670

665671
return 0;
666672
}
673+
674+
unsigned int MotionBlocks::yPosition(VirtualMachine *vm)
675+
{
676+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
677+
678+
if (sprite)
679+
vm->addReturnValue(sprite->y());
680+
else
681+
vm->addReturnValue(0);
682+
683+
return 0;
684+
}

src/blocks/motionblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class MotionBlocks : public IBlockSection
6363
static void compileSetY(Compiler *compiler);
6464
static void compileSetRotationStyle(Compiler *compiler);
6565
static void compileXPosition(Compiler *compiler);
66+
static void compileYPosition(Compiler *compiler);
6667

6768
static unsigned int moveSteps(VirtualMachine *vm);
6869
static unsigned int turnRight(VirtualMachine *vm);
@@ -100,6 +101,7 @@ class MotionBlocks : public IBlockSection
100101
static unsigned int setDoNotRotateRotationStyle(VirtualMachine *vm);
101102
static unsigned int setAllAroundRotationStyle(VirtualMachine *vm);
102103
static unsigned int xPosition(VirtualMachine *vm);
104+
static unsigned int yPosition(VirtualMachine *vm);
103105

104106
static IRandomGenerator *rng;
105107
static IClock *clock;

test/blocks/motion_blocks_test.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ TEST_F(MotionBlocksTest, RegisterBlocks)
112112
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_sety", &MotionBlocks::compileSetY));
113113
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_setrotationstyle", &MotionBlocks::compileSetRotationStyle));
114114
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_xposition", &MotionBlocks::compileXPosition));
115+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "motion_yposition", &MotionBlocks::compileYPosition));
115116

116117
// Inputs
117118
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "STEPS", MotionBlocks::STEPS));
@@ -1188,3 +1189,37 @@ TEST_F(MotionBlocksTest, XPositionImpl)
11881189
ASSERT_EQ(vm.registerCount(), 1);
11891190
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 198.0874);
11901191
}
1192+
1193+
TEST_F(MotionBlocksTest, YPosition)
1194+
{
1195+
Compiler compiler(&m_engineMock);
1196+
1197+
auto block = std::make_shared<Block>("a", "motion_yposition");
1198+
1199+
EXPECT_CALL(m_engineMock, functionIndex(&MotionBlocks::yPosition)).WillOnce(Return(0));
1200+
1201+
compiler.init();
1202+
compiler.setBlock(block);
1203+
MotionBlocks::compileYPosition(&compiler);
1204+
compiler.end();
1205+
1206+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
1207+
ASSERT_TRUE(compiler.constValues().empty());
1208+
}
1209+
1210+
TEST_F(MotionBlocksTest, YPositionImpl)
1211+
{
1212+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
1213+
static BlockFunc functions[] = { &MotionBlocks::yPosition };
1214+
1215+
Sprite sprite;
1216+
sprite.setY(-68.5408);
1217+
1218+
VirtualMachine vm(&sprite, nullptr, nullptr);
1219+
vm.setBytecode(bytecode);
1220+
vm.setFunctions(functions);
1221+
vm.run();
1222+
1223+
ASSERT_EQ(vm.registerCount(), 1);
1224+
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), -68.5408);
1225+
}

0 commit comments

Comments
 (0)