Skip to content

Commit bd24321

Browse files
committed
Implement sensing_timer block
1 parent 6442d11 commit bd24321

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
// SPDX-License-Identifier: Apache-2.0
22

3+
#include <scratchcpp/virtualmachine.h>
4+
#include <scratchcpp/compiler.h>
5+
#include <scratchcpp/iengine.h>
6+
#include <scratchcpp/itimer.h>
37
#include "sensingblocks.h"
48

59
using namespace libscratchcpp;
@@ -11,4 +15,17 @@ std::string SensingBlocks::name() const
1115

1216
void SensingBlocks::registerBlocks(IEngine *engine)
1317
{
18+
// Blocks
19+
engine->addCompileFunction(this, "sensing_timer", &compileTimer);
20+
}
21+
22+
void SensingBlocks::compileTimer(Compiler *compiler)
23+
{
24+
compiler->addFunctionCall(&timer);
25+
}
26+
27+
unsigned int SensingBlocks::timer(VirtualMachine *vm)
28+
{
29+
vm->addReturnValue(vm->engine()->timer()->value());
30+
return 0;
1431
}

src/blocks/sensingblocks.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class SensingBlocks : public IBlockSection
1414
std::string name() const override;
1515

1616
void registerBlocks(IEngine *engine) override;
17+
18+
static void compileTimer(Compiler *compiler);
19+
20+
static unsigned int timer(VirtualMachine *vm);
1721
};
1822

1923
} // namespace libscratchcpp

test/blocks/sensing_blocks_test.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
#include <scratchcpp/compiler.h>
22
#include <scratchcpp/block.h>
33
#include <enginemock.h>
4+
#include <timermock.h>
45

56
#include "../common.h"
67
#include "blocks/sensingblocks.h"
78
#include "engine/internal/engine.h"
89

910
using namespace libscratchcpp;
1011

12+
using ::testing::Return;
13+
1114
class SensingBlocksTest : public testing::Test
1215
{
1316
public:
@@ -20,6 +23,7 @@ class SensingBlocksTest : public testing::Test
2023
std::unique_ptr<IBlockSection> m_section;
2124
EngineMock m_engineMock;
2225
Engine m_engine;
26+
TimerMock m_timerMock;
2327
};
2428

2529
TEST_F(SensingBlocksTest, Name)
@@ -34,5 +38,42 @@ TEST_F(SensingBlocksTest, CategoryVisible)
3438

3539
TEST_F(SensingBlocksTest, RegisterBlocks)
3640
{
41+
// Blocks
42+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_timer", &SensingBlocks::compileTimer)).Times(1);
43+
3744
m_section->registerBlocks(&m_engineMock);
3845
}
46+
47+
TEST_F(SensingBlocksTest, Timer)
48+
{
49+
Compiler compiler(&m_engineMock);
50+
51+
auto block = std::make_shared<Block>("a", "sensing_timer");
52+
53+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::timer)).WillOnce(Return(0));
54+
55+
compiler.init();
56+
compiler.setBlock(block);
57+
SensingBlocks::compileTimer(&compiler);
58+
compiler.end();
59+
60+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
61+
}
62+
63+
TEST_F(SensingBlocksTest, TimerImpl)
64+
{
65+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
66+
static BlockFunc functions[] = { &SensingBlocks::timer };
67+
68+
VirtualMachine vm(nullptr, &m_engineMock, nullptr);
69+
vm.setFunctions(functions);
70+
71+
EXPECT_CALL(m_engineMock, timer()).WillOnce(Return(&m_timerMock));
72+
EXPECT_CALL(m_timerMock, value()).WillOnce(Return(2.375));
73+
74+
vm.setBytecode(bytecode);
75+
vm.run();
76+
77+
ASSERT_EQ(vm.registerCount(), 1);
78+
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), 2.375);
79+
}

0 commit comments

Comments
 (0)