@@ -98,13 +98,15 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
9898{
9999 // Blocks
100100 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_distanceto" , &SensingBlocks::compileDistanceTo));
101+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_keypressed" , &SensingBlocks::compileKeyPressed));
101102 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_timer" , &SensingBlocks::compileTimer));
102103 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_resettimer" , &SensingBlocks::compileResetTimer));
103104 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_current" , &SensingBlocks::compileCurrent));
104105 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_dayssince2000" , &SensingBlocks::compileDaysSince2000));
105106
106107 // Inputs
107108 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " DISTANCETOMENU" , SensingBlocks::DISTANCETOMENU));
109+ EXPECT_CALL (m_engineMock, addInput (m_section.get (), " KEY_OPTION" , SensingBlocks::KEY_OPTION));
108110
109111 // Fields
110112 EXPECT_CALL (m_engineMock, addField (m_section.get (), " CURRENTMENU" , SensingBlocks::CURRENTMENU));
@@ -256,6 +258,87 @@ TEST_F(SensingBlocksTest, DistanceToImpl)
256258 ASSERT_EQ (std::round (vm.getInput (0 , 1 )->toDouble () * 10000 ) / 10000 , 261.0096 );
257259}
258260
261+ TEST_F (SensingBlocksTest, KeyPressed)
262+ {
263+ Compiler compiler (&m_engineMock);
264+
265+ // key (space) pressed?
266+ auto block1 = std::make_shared<Block>(" a" , " sensing_keypressed" );
267+ addDropdownInput (block1, " KEY_OPTION" , SensingBlocks::KEY_OPTION, " space" );
268+
269+ // key (any) pressed?
270+ auto block2 = std::make_shared<Block>(" b" , " sensing_keypressed" );
271+ addDropdownInput (block2, " KEY_OPTION" , SensingBlocks::KEY_OPTION, " any" );
272+
273+ // key (join "" "") pressed?
274+ auto joinBlock = std::make_shared<Block>(" d" , " operator_join" );
275+ joinBlock->setCompileFunction (&OperatorBlocks::compileJoin);
276+ auto block3 = std::make_shared<Block>(" c" , " sensing_keypressed" );
277+ addDropdownInput (block3, " KEY_OPTION" , SensingBlocks::KEY_OPTION, " " , joinBlock);
278+
279+ compiler.init ();
280+
281+ EXPECT_CALL (m_engineMock, functionIndex (&SensingBlocks::keyPressed)).WillOnce (Return (0 ));
282+ compiler.setBlock (block1);
283+ SensingBlocks::compileKeyPressed (&compiler);
284+
285+ EXPECT_CALL (m_engineMock, functionIndex (&SensingBlocks::keyPressed)).WillOnce (Return (0 ));
286+ compiler.setBlock (block2);
287+ SensingBlocks::compileKeyPressed (&compiler);
288+
289+ EXPECT_CALL (m_engineMock, functionIndex (&SensingBlocks::keyPressed)).WillOnce (Return (0 ));
290+ compiler.setBlock (block3);
291+ SensingBlocks::compileKeyPressed (&compiler);
292+
293+ compiler.end ();
294+
295+ ASSERT_EQ (
296+ compiler.bytecode (),
297+ std::vector<unsigned int >({ vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_NULL, vm::OP_NULL, vm::OP_STR_CONCAT, vm::OP_EXEC, 0 , vm::OP_HALT }));
298+ ASSERT_EQ (compiler.constValues (), std::vector<Value>({ " space" , " any" }));
299+ }
300+
301+ TEST_F (SensingBlocksTest, KeyPressedImpl)
302+ {
303+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_HALT };
304+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT };
305+ static BlockFunc functions[] = { &SensingBlocks::keyPressed };
306+ static Value constValues[] = { " space" , " any" };
307+
308+ VirtualMachine vm (nullptr , &m_engineMock, nullptr );
309+ vm.setFunctions (functions);
310+ vm.setConstValues (constValues);
311+
312+ EXPECT_CALL (m_engineMock, keyPressed (" space" )).WillOnce (Return (true ));
313+ vm.setBytecode (bytecode1);
314+ vm.run ();
315+
316+ ASSERT_EQ (vm.registerCount (), 1 );
317+ ASSERT_EQ (vm.getInput (0 , 1 )->toBool (), true );
318+
319+ EXPECT_CALL (m_engineMock, keyPressed (" space" )).WillOnce (Return (false ));
320+ vm.reset ();
321+ vm.run ();
322+
323+ ASSERT_EQ (vm.registerCount (), 1 );
324+ ASSERT_EQ (vm.getInput (0 , 1 )->toBool (), false );
325+
326+ EXPECT_CALL (m_engineMock, keyPressed (" any" )).WillOnce (Return (true ));
327+ vm.reset ();
328+ vm.setBytecode (bytecode2);
329+ vm.run ();
330+
331+ ASSERT_EQ (vm.registerCount (), 1 );
332+ ASSERT_EQ (vm.getInput (0 , 1 )->toBool (), true );
333+
334+ EXPECT_CALL (m_engineMock, keyPressed (" any" )).WillOnce (Return (false ));
335+ vm.reset ();
336+ vm.run ();
337+
338+ ASSERT_EQ (vm.registerCount (), 1 );
339+ ASSERT_EQ (vm.getInput (0 , 1 )->toBool (), false );
340+ }
341+
259342TEST_F (SensingBlocksTest, Timer)
260343{
261344 Compiler compiler (&m_engineMock);
0 commit comments