22#include < scratchcpp/block.h>
33#include < enginemock.h>
44#include < timermock.h>
5+ #include < clockmock.h>
56
67#include " ../common.h"
78#include " blocks/sensingblocks.h"
@@ -24,6 +25,7 @@ class SensingBlocksTest : public testing::Test
2425 EngineMock m_engineMock;
2526 Engine m_engine;
2627 TimerMock m_timerMock;
28+ ClockMock m_clockMock;
2729};
2830
2931TEST_F (SensingBlocksTest, Name)
@@ -41,6 +43,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
4143 // Blocks
4244 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_timer" , &SensingBlocks::compileTimer)).Times (1 );
4345 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_resettimer" , &SensingBlocks::compileResetTimer)).Times (1 );
46+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_dayssince2000" , &SensingBlocks::compileDaysSince2000)).Times (1 );
4447
4548 m_section->registerBlocks (&m_engineMock);
4649}
@@ -111,3 +114,39 @@ TEST_F(SensingBlocksTest, ResetTimerImpl)
111114
112115 ASSERT_EQ (vm.registerCount (), 0 );
113116}
117+
118+ TEST_F (SensingBlocksTest, DaysSince2000)
119+ {
120+ Compiler compiler (&m_engineMock);
121+
122+ auto block = std::make_shared<Block>(" a" , " sensing_dayssince2000" );
123+
124+ EXPECT_CALL (m_engineMock, functionIndex (&SensingBlocks::daysSince2000)).WillOnce (Return (0 ));
125+
126+ compiler.init ();
127+ compiler.setBlock (block);
128+ SensingBlocks::compileDaysSince2000 (&compiler);
129+ compiler.end ();
130+
131+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_EXEC, 0 , vm::OP_HALT }));
132+ }
133+
134+ TEST_F (SensingBlocksTest, DaysSince2000Impl)
135+ {
136+ static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0 , vm::OP_HALT };
137+ static BlockFunc functions[] = { &SensingBlocks::daysSince2000 };
138+
139+ VirtualMachine vm (nullptr , &m_engineMock, nullptr );
140+ vm.setFunctions (functions);
141+
142+ std::chrono::system_clock::time_point time (std::chrono::milliseconds (1011243120562 )); // Jan 17 2002 04:52:00
143+ EXPECT_CALL (m_clockMock, currentSystemTime ()).WillOnce (Return (time));
144+
145+ SensingBlocks::clock = &m_clockMock;
146+ vm.setBytecode (bytecode);
147+ vm.run ();
148+ SensingBlocks::clock = Clock::instance ().get ();
149+
150+ ASSERT_EQ (vm.registerCount (), 1 );
151+ ASSERT_EQ (vm.getInput (0 , 1 )->toDouble (), 747.20278428240817 );
152+ }
0 commit comments