Skip to content

Commit 9bcec4c

Browse files
committed
Add variable monitor change function
1 parent 1d2103f commit 9bcec4c

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

src/blocks/variableblocks.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ void VariableBlocks::registerBlocks(IEngine *engine)
2525
// Monitor names
2626
engine->addMonitorNameFunction(this, "data_variable", &variableMonitorName);
2727

28+
// Monitor change functions
29+
engine->addMonitorChangeFunction(this, "data_variable", &changeVariableMonitorValue);
30+
2831
// Inputs
2932
engine->addInput(this, "VALUE", VALUE);
3033

@@ -61,3 +64,11 @@ const std::string &VariableBlocks::variableMonitorName(Block *block)
6164
return empty;
6265
}
6366
}
67+
68+
void VariableBlocks::changeVariableMonitorValue(Block *block, const Value &newValue)
69+
{
70+
Variable *var = dynamic_cast<Variable *>(block->findFieldById(VARIABLE)->valuePtr().get());
71+
72+
if (var)
73+
var->setValue(newValue);
74+
}

src/blocks/variableblocks.h

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class VariableBlocks : public IBlockSection
3232
static void compileChangeVariableBy(Compiler *compiler);
3333

3434
static const std::string &variableMonitorName(Block *block);
35+
static void changeVariableMonitorValue(Block *block, const Value &newValue);
3536
};
3637

3738
} // namespace libscratchcpp

test/blocks/variable_blocks_test.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ TEST_F(VariableBlocksTest, RegisterBlocks)
7474
// Monitor names
7575
EXPECT_CALL(m_engineMock, addMonitorNameFunction(m_section.get(), "data_variable", &VariableBlocks::variableMonitorName));
7676

77+
// Monitor change functions
78+
EXPECT_CALL(m_engineMock, addMonitorChangeFunction(m_section.get(), "data_variable", &VariableBlocks::changeVariableMonitorValue));
79+
7780
// Inputs
7881
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "VALUE", VariableBlocks::VALUE));
7982

@@ -127,6 +130,25 @@ TEST_F(VariableBlocksTest, VariableMonitorName)
127130
ASSERT_EQ(VariableBlocks::variableMonitorName(block2.get()), "var2");
128131
}
129132

133+
TEST_F(VariableBlocksTest, ChangeVariableMonitorValue)
134+
{
135+
// [var1]
136+
auto var1 = std::make_shared<Variable>("b", "var1", 2.5);
137+
auto block1 = createVariableBlock("a", "data_variable", var1);
138+
139+
// [var2]
140+
auto var2 = std::make_shared<Variable>("d", "var2", "hello");
141+
auto block2 = createVariableBlock("c", "data_variable", var2);
142+
143+
VariableBlocks::changeVariableMonitorValue(block1.get(), "test");
144+
ASSERT_EQ(var1->value().toString(), "test");
145+
ASSERT_EQ(var2->value().toString(), "hello");
146+
147+
VariableBlocks::changeVariableMonitorValue(block2.get(), -0.25);
148+
ASSERT_EQ(var1->value().toString(), "test");
149+
ASSERT_EQ(var2->value().toDouble(), -0.25);
150+
}
151+
130152
TEST_F(VariableBlocksTest, SetVariableTo)
131153
{
132154
Compiler compiler(&m_engine);

0 commit comments

Comments
 (0)