Skip to content

Commit 4d57b32

Browse files
committed
Implement sensing_coloristouchingcolor block
1 parent 1a41232 commit 4d57b32

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
3232
// Blocks
3333
engine->addCompileFunction(this, "sensing_touchingobject", &compileTouchingObject);
3434
engine->addCompileFunction(this, "sensing_touchingcolor", &compileTouchingColor);
35+
engine->addCompileFunction(this, "sensing_coloristouchingcolor", &compileColorIsTouchingColor);
3536
engine->addCompileFunction(this, "sensing_distanceto", &compileDistanceTo);
3637
engine->addCompileFunction(this, "sensing_askandwait", &compileAskAndWait);
3738
engine->addCompileFunction(this, "sensing_answer", &compileAnswer);
@@ -60,6 +61,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
6061
// Inputs
6162
engine->addInput(this, "TOUCHINGOBJECTMENU", TOUCHINGOBJECTMENU);
6263
engine->addInput(this, "COLOR", COLOR);
64+
engine->addInput(this, "COLOR2", COLOR2);
6365
engine->addInput(this, "DISTANCETOMENU", DISTANCETOMENU);
6466
engine->addInput(this, "QUESTION", QUESTION);
6567
engine->addInput(this, "KEY_OPTION", KEY_OPTION);
@@ -139,6 +141,13 @@ void SensingBlocks::compileTouchingColor(Compiler *compiler)
139141
compiler->addFunctionCall(&touchingColor);
140142
}
141143

144+
void SensingBlocks::compileColorIsTouchingColor(Compiler *compiler)
145+
{
146+
compiler->addInput(COLOR2); // target color
147+
compiler->addInput(COLOR); // mask color
148+
compiler->addFunctionCall(&colorIsTouchingColor);
149+
}
150+
142151
void SensingBlocks::compileDistanceTo(Compiler *compiler)
143152
{
144153
Input *input = compiler->input(DISTANCETOMENU);
@@ -525,6 +534,12 @@ unsigned int SensingBlocks::touchingColor(VirtualMachine *vm)
525534
return 0;
526535
}
527536

537+
unsigned int SensingBlocks::colorIsTouchingColor(VirtualMachine *vm)
538+
{
539+
vm->replaceReturnValue(vm->target()->touchingColor(*vm->getInput(0, 2), *vm->getInput(1, 2)), 2);
540+
return 1;
541+
}
542+
528543
unsigned int SensingBlocks::keyPressed(VirtualMachine *vm)
529544
{
530545
vm->replaceReturnValue(vm->engine()->keyPressed(vm->getInput(0, 1)->toString()), 1);

src/blocks/sensingblocks.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class SensingBlocks : public IBlockSection
2222
{
2323
TOUCHINGOBJECTMENU,
2424
COLOR,
25+
COLOR2,
2526
DISTANCETOMENU,
2627
QUESTION,
2728
KEY_OPTION,
@@ -64,6 +65,7 @@ class SensingBlocks : public IBlockSection
6465

6566
static void compileTouchingObject(Compiler *compiler);
6667
static void compileTouchingColor(Compiler *compiler);
68+
static void compileColorIsTouchingColor(Compiler *compiler);
6769
static void compileDistanceTo(Compiler *compiler);
6870
static void compileAskAndWait(Compiler *compiler);
6971
static void compileAnswer(Compiler *compiler);
@@ -95,6 +97,8 @@ class SensingBlocks : public IBlockSection
9597

9698
static unsigned int touchingColor(VirtualMachine *vm);
9799

100+
static unsigned int colorIsTouchingColor(VirtualMachine *vm);
101+
98102
static unsigned int keyPressed(VirtualMachine *vm);
99103
static unsigned int mouseDown(VirtualMachine *vm);
100104
static unsigned int mouseX(VirtualMachine *vm);

test/blocks/sensing_blocks_test.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
457532
TEST_F(SensingBlocksTest, DistanceTo)
458533
{
459534
Compiler compiler(&m_engineMock);

0 commit comments

Comments
 (0)