Skip to content

Commit 369ad2b

Browse files
committed
Implement sensing_touchingcolor block
1 parent 9ea8a1f commit 369ad2b

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Rgb SensingBlocks::color() const
3232
void SensingBlocks::registerBlocks(IEngine *engine)
3333
{
3434
engine->addCompileFunction(this, "sensing_touchingobject", &compileTouchingObject);
35+
engine->addCompileFunction(this, "sensing_touchingcolor", &compileTouchingColor);
3536
}
3637

3738
CompilerValue *SensingBlocks::compileTouchingObject(Compiler *compiler)
@@ -62,6 +63,12 @@ CompilerValue *SensingBlocks::compileTouchingObject(Compiler *compiler)
6263
return compiler->addConstValue(false);
6364
}
6465

66+
CompilerValue *SensingBlocks::compileTouchingColor(Compiler *compiler)
67+
{
68+
CompilerValue *color = compiler->addInput("COLOR");
69+
return compiler->addTargetFunctionCall("sensing_touchingcolor", Compiler::StaticType::Bool, { Compiler::StaticType::Unknown }, { color });
70+
}
71+
6572
extern "C" bool sensing_touching_mouse(Target *target)
6673
{
6774
IEngine *engine = target->engine();
@@ -100,3 +107,8 @@ extern "C" bool sensing_touchingobject(Target *target, const StringPtr *object)
100107

101108
return false;
102109
}
110+
111+
extern "C" bool sensing_touchingcolor(Target *target, const ValueData *color)
112+
{
113+
return target->touchingColor(value_toRgba(color));
114+
}

src/blocks/sensingblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class SensingBlocks : public IExtension
1818

1919
private:
2020
static CompilerValue *compileTouchingObject(Compiler *compiler);
21+
static CompilerValue *compileTouchingColor(Compiler *compiler);
2122
};
2223

2324
} // namespace libscratchcpp

test/blocks/sensing_blocks_test.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,3 +367,57 @@ TEST_F(SensingBlocksTest, TouchingObject_Invalid_Runtime)
367367
ASSERT_FALSE(value_toBool(&value));
368368
value_free(&value);
369369
}
370+
371+
TEST_F(SensingBlocksTest, TouchingColor_String)
372+
{
373+
auto targetMock = std::make_shared<TargetMock>();
374+
targetMock->setEngine(&m_engineMock);
375+
376+
ScriptBuilder builder(m_extension.get(), m_engine, targetMock);
377+
builder.addBlock("sensing_touchingcolor");
378+
builder.addValueInput("COLOR", "#00ffff");
379+
Block *block = builder.currentBlock();
380+
381+
Compiler compiler(&m_engineMock, targetMock.get());
382+
auto code = compiler.compile(block, Compiler::CodeType::Reporter);
383+
Script script(targetMock.get(), block, &m_engineMock);
384+
script.setCode(code);
385+
Thread thread(targetMock.get(), &m_engineMock, &script);
386+
387+
EXPECT_CALL(*targetMock, touchingColor(rgb(0, 255, 255))).WillOnce(Return(true));
388+
ValueData value = thread.runReporter();
389+
ASSERT_TRUE(value_toBool(&value));
390+
value_free(&value);
391+
392+
EXPECT_CALL(*targetMock, touchingColor(rgb(0, 255, 255))).WillOnce(Return(false));
393+
value = thread.runReporter();
394+
ASSERT_FALSE(value_toBool(&value));
395+
value_free(&value);
396+
}
397+
398+
TEST_F(SensingBlocksTest, TouchingColor_Number)
399+
{
400+
auto targetMock = std::make_shared<TargetMock>();
401+
targetMock->setEngine(&m_engineMock);
402+
403+
ScriptBuilder builder(m_extension.get(), m_engine, targetMock);
404+
builder.addBlock("sensing_touchingcolor");
405+
builder.addValueInput("COLOR", rgb(255, 54, 23));
406+
Block *block = builder.currentBlock();
407+
408+
Compiler compiler(&m_engineMock, targetMock.get());
409+
auto code = compiler.compile(block, Compiler::CodeType::Reporter);
410+
Script script(targetMock.get(), block, &m_engineMock);
411+
script.setCode(code);
412+
Thread thread(targetMock.get(), &m_engineMock, &script);
413+
414+
EXPECT_CALL(*targetMock, touchingColor(rgb(255, 54, 23))).WillOnce(Return(true));
415+
ValueData value = thread.runReporter();
416+
ASSERT_TRUE(value_toBool(&value));
417+
value_free(&value);
418+
419+
EXPECT_CALL(*targetMock, touchingColor(rgb(255, 54, 23))).WillOnce(Return(false));
420+
value = thread.runReporter();
421+
ASSERT_FALSE(value_toBool(&value));
422+
value_free(&value);
423+
}

0 commit comments

Comments
 (0)