@@ -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