Skip to content

Commit cfab503

Browse files
committed
Implement sensing_resettimer block
1 parent bd24321 commit cfab503

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,27 @@ void SensingBlocks::registerBlocks(IEngine *engine)
1717
{
1818
// Blocks
1919
engine->addCompileFunction(this, "sensing_timer", &compileTimer);
20+
engine->addCompileFunction(this, "sensing_resettimer", &compileResetTimer);
2021
}
2122

2223
void SensingBlocks::compileTimer(Compiler *compiler)
2324
{
2425
compiler->addFunctionCall(&timer);
2526
}
2627

28+
void SensingBlocks::compileResetTimer(Compiler *compiler)
29+
{
30+
compiler->addFunctionCall(&resetTimer);
31+
}
32+
2733
unsigned int SensingBlocks::timer(VirtualMachine *vm)
2834
{
2935
vm->addReturnValue(vm->engine()->timer()->value());
3036
return 0;
3137
}
38+
39+
unsigned int SensingBlocks::resetTimer(VirtualMachine *vm)
40+
{
41+
vm->engine()->timer()->reset();
42+
return 0;
43+
}

src/blocks/sensingblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ class SensingBlocks : public IBlockSection
1616
void registerBlocks(IEngine *engine) override;
1717

1818
static void compileTimer(Compiler *compiler);
19+
static void compileResetTimer(Compiler *compiler);
1920

2021
static unsigned int timer(VirtualMachine *vm);
22+
static unsigned int resetTimer(VirtualMachine *vm);
2123
};
2224

2325
} // namespace libscratchcpp

test/blocks/sensing_blocks_test.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
4040
{
4141
// Blocks
4242
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_timer", &SensingBlocks::compileTimer)).Times(1);
43+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_resettimer", &SensingBlocks::compileResetTimer)).Times(1);
4344

4445
m_section->registerBlocks(&m_engineMock);
4546
}
@@ -77,3 +78,36 @@ TEST_F(SensingBlocksTest, TimerImpl)
7778
ASSERT_EQ(vm.registerCount(), 1);
7879
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 2.375);
7980
}
81+
82+
TEST_F(SensingBlocksTest, ResetTimer)
83+
{
84+
Compiler compiler(&m_engineMock);
85+
86+
auto block = std::make_shared<Block>("a", "sensing_resettimer");
87+
88+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::resetTimer)).WillOnce(Return(0));
89+
90+
compiler.init();
91+
compiler.setBlock(block);
92+
SensingBlocks::compileResetTimer(&compiler);
93+
compiler.end();
94+
95+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
96+
}
97+
98+
TEST_F(SensingBlocksTest, ResetTimerImpl)
99+
{
100+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
101+
static BlockFunc functions[] = { &SensingBlocks::resetTimer };
102+
103+
VirtualMachine vm(nullptr, &m_engineMock, nullptr);
104+
vm.setFunctions(functions);
105+
106+
EXPECT_CALL(m_engineMock, timer()).WillOnce(Return(&m_timerMock));
107+
EXPECT_CALL(m_timerMock, reset()).Times(1);
108+
109+
vm.setBytecode(bytecode);
110+
vm.run();
111+
112+
ASSERT_EQ(vm.registerCount(), 0);
113+
}

0 commit comments

Comments
 (0)