Skip to content

Commit 0d6fd71

Browse files
committed
Implement sensing_coloristouchingcolor block
1 parent 369ad2b commit 0d6fd71

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
3333
{
3434
engine->addCompileFunction(this, "sensing_touchingobject", &compileTouchingObject);
3535
engine->addCompileFunction(this, "sensing_touchingcolor", &compileTouchingColor);
36+
engine->addCompileFunction(this, "sensing_coloristouchingcolor", &compileColorIsTouchingColor);
3637
}
3738

3839
CompilerValue *SensingBlocks::compileTouchingObject(Compiler *compiler)
@@ -69,6 +70,13 @@ CompilerValue *SensingBlocks::compileTouchingColor(Compiler *compiler)
6970
return compiler->addTargetFunctionCall("sensing_touchingcolor", Compiler::StaticType::Bool, { Compiler::StaticType::Unknown }, { color });
7071
}
7172

73+
CompilerValue *SensingBlocks::compileColorIsTouchingColor(Compiler *compiler)
74+
{
75+
CompilerValue *color = compiler->addInput("COLOR");
76+
CompilerValue *color2 = compiler->addInput("COLOR2");
77+
return compiler->addTargetFunctionCall("sensing_coloristouchingcolor", Compiler::StaticType::Bool, { Compiler::StaticType::Unknown, Compiler::StaticType::Unknown }, { color, color2 });
78+
}
79+
7280
extern "C" bool sensing_touching_mouse(Target *target)
7381
{
7482
IEngine *engine = target->engine();
@@ -112,3 +120,8 @@ extern "C" bool sensing_touchingcolor(Target *target, const ValueData *color)
112120
{
113121
return target->touchingColor(value_toRgba(color));
114122
}
123+
124+
extern "C" bool sensing_coloristouchingcolor(Target *target, const ValueData *color, const ValueData *color2)
125+
{
126+
return target->touchingColor(value_toRgba(color), value_toRgba(color2));
127+
}

src/blocks/sensingblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class SensingBlocks : public IExtension
1919
private:
2020
static CompilerValue *compileTouchingObject(Compiler *compiler);
2121
static CompilerValue *compileTouchingColor(Compiler *compiler);
22+
static CompilerValue *compileColorIsTouchingColor(Compiler *compiler);
2223
};
2324

2425
} // namespace libscratchcpp

test/blocks/sensing_blocks_test.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,3 +421,59 @@ TEST_F(SensingBlocksTest, TouchingColor_Number)
421421
ASSERT_FALSE(value_toBool(&value));
422422
value_free(&value);
423423
}
424+
425+
TEST_F(SensingBlocksTest, ColorIsTouchingColor_StringNumber)
426+
{
427+
auto targetMock = std::make_shared<TargetMock>();
428+
targetMock->setEngine(&m_engineMock);
429+
430+
ScriptBuilder builder(m_extension.get(), m_engine, targetMock);
431+
builder.addBlock("sensing_coloristouchingcolor");
432+
builder.addValueInput("COLOR", "#00ffff");
433+
builder.addValueInput("COLOR2", rgb(255, 54, 23));
434+
Block *block = builder.currentBlock();
435+
436+
Compiler compiler(&m_engineMock, targetMock.get());
437+
auto code = compiler.compile(block, Compiler::CodeType::Reporter);
438+
Script script(targetMock.get(), block, &m_engineMock);
439+
script.setCode(code);
440+
Thread thread(targetMock.get(), &m_engineMock, &script);
441+
442+
EXPECT_CALL(*targetMock, touchingColor(rgb(0, 255, 255), rgb(255, 54, 23))).WillOnce(Return(true));
443+
ValueData value = thread.runReporter();
444+
ASSERT_TRUE(value_toBool(&value));
445+
value_free(&value);
446+
447+
EXPECT_CALL(*targetMock, touchingColor(rgb(0, 255, 255), rgb(255, 54, 23))).WillOnce(Return(false));
448+
value = thread.runReporter();
449+
ASSERT_FALSE(value_toBool(&value));
450+
value_free(&value);
451+
}
452+
453+
TEST_F(SensingBlocksTest, ColorIsTouchingColor_NumberString)
454+
{
455+
auto targetMock = std::make_shared<TargetMock>();
456+
targetMock->setEngine(&m_engineMock);
457+
458+
ScriptBuilder builder(m_extension.get(), m_engine, targetMock);
459+
builder.addBlock("sensing_coloristouchingcolor");
460+
builder.addValueInput("COLOR", rgb(255, 54, 23));
461+
builder.addValueInput("COLOR2", "#00ffff");
462+
Block *block = builder.currentBlock();
463+
464+
Compiler compiler(&m_engineMock, targetMock.get());
465+
auto code = compiler.compile(block, Compiler::CodeType::Reporter);
466+
Script script(targetMock.get(), block, &m_engineMock);
467+
script.setCode(code);
468+
Thread thread(targetMock.get(), &m_engineMock, &script);
469+
470+
EXPECT_CALL(*targetMock, touchingColor(rgb(255, 54, 23), rgb(0, 255, 255))).WillOnce(Return(true));
471+
ValueData value = thread.runReporter();
472+
ASSERT_TRUE(value_toBool(&value));
473+
value_free(&value);
474+
475+
EXPECT_CALL(*targetMock, touchingColor(rgb(255, 54, 23), rgb(0, 255, 255))).WillOnce(Return(false));
476+
value = thread.runReporter();
477+
ASSERT_FALSE(value_toBool(&value));
478+
value_free(&value);
479+
}

0 commit comments

Comments
 (0)