@@ -127,6 +127,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
127127 // Blocks
128128 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_touchingobject" , &SensingBlocks::compileTouchingObject));
129129 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_touchingcolor" , &SensingBlocks::compileTouchingColor));
130+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_coloristouchingcolor" , &SensingBlocks::compileColorIsTouchingColor));
130131 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_distanceto" , &SensingBlocks::compileDistanceTo));
131132 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_askandwait" , &SensingBlocks::compileAskAndWait));
132133 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " sensing_answer" , &SensingBlocks::compileAnswer));
@@ -155,6 +156,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
155156 // Inputs
156157 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " TOUCHINGOBJECTMENU" , SensingBlocks::TOUCHINGOBJECTMENU));
157158 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " COLOR" , SensingBlocks::COLOR));
159+ EXPECT_CALL (m_engineMock, addInput (m_section.get (), " COLOR2" , SensingBlocks::COLOR2));
158160 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " DISTANCETOMENU" , SensingBlocks::DISTANCETOMENU));
159161 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " QUESTION" , SensingBlocks::QUESTION));
160162 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " KEY_OPTION" , SensingBlocks::KEY_OPTION));
@@ -454,6 +456,79 @@ TEST_F(SensingBlocksTest, TouchingColorImpl)
454456 ASSERT_TRUE (vm.getInput (0 , 1 )->toBool ());
455457}
456458
459+ TEST_F (SensingBlocksTest, ColorIsTouchingColor)
460+ {
461+ Compiler compiler (&m_engineMock);
462+
463+ // color (#FF00FF) is touching color (#FFFF00)
464+ auto block1 = std::make_shared<Block>(" a" , " sensing_coloristouchingcolor" );
465+ addValueInput (block1, " COLOR" , SensingBlocks::COLOR, " #FF00FF" );
466+ addValueInput (block1, " COLOR2" , SensingBlocks::COLOR2, " #FFFF00" );
467+
468+ // color (null block) is touching color (null block)
469+ auto block2 = std::make_shared<Block>(" b" , " sensing_coloristouchingcolor" );
470+ addDropdownInput (block2, " COLOR" , SensingBlocks::COLOR, " " , createNullBlock (" c" ));
471+ addDropdownInput (block2, " COLOR2" , SensingBlocks::COLOR2, " " , createNullBlock (" d" ));
472+
473+ compiler.init ();
474+
475+ EXPECT_CALL (m_engineMock, functionIndex (&SensingBlocks::colorIsTouchingColor)).WillOnce (Return (1 ));
476+ compiler.setBlock (block1);
477+ SensingBlocks::compileColorIsTouchingColor (&compiler);
478+
479+ EXPECT_CALL (m_engineMock, functionIndex (&SensingBlocks::colorIsTouchingColor)).WillOnce (Return (1 ));
480+ compiler.setBlock (block2);
481+ SensingBlocks::compileColorIsTouchingColor (&compiler);
482+
483+ compiler.end ();
484+
485+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_CONST, 0 , vm::OP_CONST, 1 , vm::OP_EXEC, 1 , vm::OP_NULL, vm::OP_NULL, vm::OP_EXEC, 1 , vm::OP_HALT }));
486+ ASSERT_EQ (compiler.constValues (), std::vector<Value>({ " #FFFF00" , " #FF00FF" }));
487+ }
488+
489+ TEST_F (SensingBlocksTest, ColorIsTouchingColorImpl)
490+ {
491+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT };
492+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 2 , vm::OP_CONST, 3 , vm::OP_EXEC, 0 , vm::OP_HALT };
493+ static BlockFunc functions[] = { &SensingBlocks::colorIsTouchingColor };
494+ static Value constValues[] = { " #FF00FF" , " #FFFF00" , 1946195606 , 238 };
495+
496+ TargetMock target;
497+ Sprite sprite;
498+ VirtualMachine vm (&target, nullptr , nullptr );
499+ vm.setFunctions (functions);
500+ vm.setConstValues (constValues);
501+
502+ EXPECT_CALL (target, touchingColor (constValues[0 ], constValues[1 ])).WillOnce (Return (false ));
503+ vm.setBytecode (bytecode1);
504+ vm.run ();
505+
506+ ASSERT_EQ (vm.registerCount (), 1 );
507+ ASSERT_FALSE (vm.getInput (0 , 1 )->toBool ());
508+
509+ EXPECT_CALL (target, touchingColor (constValues[0 ], constValues[1 ])).WillOnce (Return (true ));
510+ vm.reset ();
511+ vm.run ();
512+
513+ ASSERT_EQ (vm.registerCount (), 1 );
514+ ASSERT_TRUE (vm.getInput (0 , 1 )->toBool ());
515+
516+ EXPECT_CALL (target, touchingColor (constValues[2 ], constValues[3 ])).WillOnce (Return (false ));
517+ vm.reset ();
518+ vm.setBytecode (bytecode2);
519+ vm.run ();
520+
521+ ASSERT_EQ (vm.registerCount (), 1 );
522+ ASSERT_FALSE (vm.getInput (0 , 1 )->toBool ());
523+
524+ EXPECT_CALL (target, touchingColor (constValues[2 ], constValues[3 ])).WillOnce (Return (true ));
525+ vm.reset ();
526+ vm.run ();
527+
528+ ASSERT_EQ (vm.registerCount (), 1 );
529+ ASSERT_TRUE (vm.getInput (0 , 1 )->toBool ());
530+ }
531+
457532TEST_F (SensingBlocksTest, DistanceTo)
458533{
459534 Compiler compiler (&m_engineMock);
0 commit comments