Skip to content

Commit 8c22d09

Browse files
committed
Implement data_hidevariable block
1 parent e37c9fd commit 8c22d09

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed

src/blocks/variableblocks.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ void VariableBlocks::registerBlocks(IEngine *engine)
2424
engine->addCompileFunction(this, "data_setvariableto", &compileSetVariable);
2525
engine->addCompileFunction(this, "data_changevariableby", &compileChangeVariableBy);
2626
engine->addCompileFunction(this, "data_showvariable", &compileShowVariable);
27+
engine->addCompileFunction(this, "data_hidevariable", &compileHideVariable);
2728

2829
// Monitor names
2930
engine->addMonitorNameFunction(this, "data_variable", &variableMonitorName);
@@ -71,6 +72,21 @@ void VariableBlocks::compileShowVariable(Compiler *compiler)
7172
compiler->addFunctionCall(&showVariable);
7273
}
7374

75+
void VariableBlocks::compileHideVariable(Compiler *compiler)
76+
{
77+
Field *field = compiler->field(VARIABLE);
78+
assert(field);
79+
Variable *var = static_cast<Variable *>(field->valuePtr().get());
80+
assert(var);
81+
82+
compiler->addConstValue(var->id());
83+
84+
if (var->target() == static_cast<Target *>(compiler->engine()->stage()))
85+
compiler->addFunctionCall(&hideGlobalVariable);
86+
else
87+
compiler->addFunctionCall(&hideVariable);
88+
}
89+
7490
void VariableBlocks::setVarVisible(std::shared_ptr<Variable> var, bool visible)
7591
{
7692
if (var) {
@@ -99,6 +115,26 @@ unsigned int VariableBlocks::showVariable(VirtualMachine *vm)
99115
return 1;
100116
}
101117

118+
unsigned int VariableBlocks::hideGlobalVariable(VirtualMachine *vm)
119+
{
120+
if (Stage *target = vm->engine()->stage()) {
121+
int index = target->findVariableById(vm->getInput(0, 1)->toString());
122+
setVarVisible(target->variableAt(index), false);
123+
}
124+
125+
return 1;
126+
}
127+
128+
unsigned int VariableBlocks::hideVariable(VirtualMachine *vm)
129+
{
130+
if (Target *target = vm->target()) {
131+
int index = target->findVariableById(vm->getInput(0, 1)->toString());
132+
setVarVisible(target->variableAt(index), false);
133+
}
134+
135+
return 1;
136+
}
137+
102138
const std::string &VariableBlocks::variableMonitorName(Block *block)
103139
{
104140
Variable *var = dynamic_cast<Variable *>(block->findFieldById(VARIABLE)->valuePtr().get());

src/blocks/variableblocks.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,14 @@ class VariableBlocks : public IBlockSection
3232
static void compileSetVariable(Compiler *compiler);
3333
static void compileChangeVariableBy(Compiler *compiler);
3434
static void compileShowVariable(Compiler *compiler);
35+
static void compileHideVariable(Compiler *compiler);
3536

3637
static void setVarVisible(std::shared_ptr<Variable> var, bool visible);
3738

3839
static unsigned int showGlobalVariable(VirtualMachine *vm);
3940
static unsigned int showVariable(VirtualMachine *vm);
41+
static unsigned int hideGlobalVariable(VirtualMachine *vm);
42+
static unsigned int hideVariable(VirtualMachine *vm);
4043

4144
static const std::string &variableMonitorName(Block *block);
4245
static void changeVariableMonitorValue(Block *block, const Value &newValue);

test/blocks/variable_blocks_test.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ TEST_F(VariableBlocksTest, RegisterBlocks)
7575
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "data_setvariableto", &VariableBlocks::compileSetVariable)).Times(1);
7676
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "data_changevariableby", &VariableBlocks::compileChangeVariableBy)).Times(1);
7777
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "data_showvariable", &VariableBlocks::compileShowVariable)).Times(1);
78+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "data_hidevariable", &VariableBlocks::compileHideVariable)).Times(1);
7879

7980
// Monitor names
8081
EXPECT_CALL(m_engineMock, addMonitorNameFunction(m_section.get(), "data_variable", &VariableBlocks::variableMonitorName));
@@ -316,3 +317,106 @@ TEST_F(VariableBlocksTest, ShowVariableImpl)
316317
ASSERT_FALSE(monitor1.visible());
317318
ASSERT_TRUE(monitor2.visible());
318319
}
320+
321+
TEST_F(VariableBlocksTest, HideVariable)
322+
{
323+
Compiler compiler(&m_engineMock);
324+
Stage stage;
325+
Target target;
326+
327+
// hide variable [var1]
328+
auto var1 = std::make_shared<Variable>("b", "var1");
329+
var1->setTarget(&stage);
330+
auto block1 = createVariableBlock("a", "data_hidevariable", var1);
331+
332+
// hide variable [var2]
333+
auto var2 = std::make_shared<Variable>("d", "var2");
334+
var2->setTarget(&target);
335+
auto block2 = createVariableBlock("c", "data_hidevariable", var2);
336+
337+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
338+
EXPECT_CALL(m_engineMock, functionIndex(&VariableBlocks::hideGlobalVariable)).WillOnce(Return(0));
339+
compiler.init();
340+
compiler.setBlock(block1);
341+
VariableBlocks::compileHideVariable(&compiler);
342+
343+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
344+
EXPECT_CALL(m_engineMock, functionIndex(&VariableBlocks::hideVariable)).WillOnce(Return(1));
345+
compiler.setBlock(block2);
346+
VariableBlocks::compileHideVariable(&compiler);
347+
compiler.end();
348+
349+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_CONST, 1, vm::OP_EXEC, 1, vm::OP_HALT }));
350+
ASSERT_EQ(compiler.constValues(), std::vector<Value>({ "b", "d" }));
351+
ASSERT_TRUE(compiler.variables().empty());
352+
ASSERT_TRUE(compiler.lists().empty());
353+
}
354+
355+
TEST_F(VariableBlocksTest, HideVariableImpl)
356+
{
357+
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT };
358+
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1, vm::OP_EXEC, 0, vm::OP_HALT };
359+
static unsigned int bytecode3[] = { vm::OP_START, vm::OP_CONST, 2, vm::OP_EXEC, 1, vm::OP_HALT };
360+
static unsigned int bytecode4[] = { vm::OP_START, vm::OP_CONST, 3, vm::OP_EXEC, 1, vm::OP_HALT };
361+
static BlockFunc functions[] = { &VariableBlocks::hideGlobalVariable, &VariableBlocks::hideVariable };
362+
static Value constValues[] = { "a", "b", "c", "d" };
363+
364+
auto var1 = std::make_shared<Variable>("b", "");
365+
Monitor monitor1("b", "");
366+
monitor1.setVisible(true);
367+
var1->setMonitor(&monitor1);
368+
369+
auto var2 = std::make_shared<Variable>("d", "");
370+
Monitor monitor2("d", "");
371+
monitor2.setVisible(true);
372+
var2->setMonitor(&monitor2);
373+
374+
Stage stage;
375+
stage.addVariable(var1);
376+
377+
Target target;
378+
target.addVariable(var2);
379+
380+
// Global
381+
VirtualMachine vm1(&stage, &m_engineMock, nullptr);
382+
vm1.setBytecode(bytecode1);
383+
vm1.setFunctions(functions);
384+
vm1.setConstValues(constValues);
385+
386+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
387+
vm1.run();
388+
389+
ASSERT_EQ(vm1.registerCount(), 0);
390+
ASSERT_TRUE(monitor1.visible());
391+
ASSERT_TRUE(monitor2.visible());
392+
393+
EXPECT_CALL(m_engineMock, stage()).WillOnce(Return(&stage));
394+
vm1.reset();
395+
vm1.setBytecode(bytecode2);
396+
vm1.run();
397+
398+
ASSERT_EQ(vm1.registerCount(), 0);
399+
ASSERT_FALSE(monitor1.visible());
400+
ASSERT_TRUE(monitor2.visible());
401+
402+
monitor1.setVisible(true);
403+
404+
// Local
405+
VirtualMachine vm2(&target, &m_engineMock, nullptr);
406+
vm2.setBytecode(bytecode3);
407+
vm2.setFunctions(functions);
408+
vm2.setConstValues(constValues);
409+
vm2.run();
410+
411+
ASSERT_EQ(vm2.registerCount(), 0);
412+
ASSERT_TRUE(monitor1.visible());
413+
ASSERT_TRUE(monitor2.visible());
414+
415+
vm2.reset();
416+
vm2.setBytecode(bytecode4);
417+
vm2.run();
418+
419+
ASSERT_EQ(vm2.registerCount(), 0);
420+
ASSERT_TRUE(monitor1.visible());
421+
ASSERT_FALSE(monitor2.visible());
422+
}

0 commit comments

Comments
 (0)