@@ -109,6 +109,7 @@ TEST_F(ListBlocksTest, RegisterBlocks)
109109 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " data_lengthoflist" , &ListBlocks::compileLengthOfList)).Times (1 );
110110 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " data_listcontainsitem" , &ListBlocks::compileListContainsItem)).Times (1 );
111111 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " data_showlist" , &ListBlocks::compileShowList)).Times (1 );
112+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " data_hidelist" , &ListBlocks::compileHideList)).Times (1 );
112113
113114 // Monitor names
114115 EXPECT_CALL (m_engineMock, addMonitorNameFunction (m_section.get (), " data_listcontents" , &ListBlocks::listContentsMonitorName));
@@ -543,3 +544,106 @@ TEST_F(ListBlocksTest, ShowListImpl)
543544 ASSERT_FALSE (monitor1.visible ());
544545 ASSERT_TRUE (monitor2.visible ());
545546}
547+
548+ TEST_F (ListBlocksTest, HideList)
549+ {
550+ Compiler compiler (&m_engineMock);
551+ Stage stage;
552+ Target target;
553+
554+ // hide list [list1]
555+ auto list1 = std::make_shared<List>(" b" , " list1" );
556+ list1->setTarget (&stage);
557+ auto block1 = createListBlock (" a" , " data_hidelist" , list1);
558+
559+ // hide list [list2]
560+ auto list2 = std::make_shared<List>(" d" , " list2" );
561+ list2->setTarget (&target);
562+ auto block2 = createListBlock (" c" , " data_hidelist" , list2);
563+
564+ EXPECT_CALL (m_engineMock, stage ()).WillOnce (Return (&stage));
565+ EXPECT_CALL (m_engineMock, functionIndex (&ListBlocks::hideGlobalList)).WillOnce (Return (0 ));
566+ compiler.init ();
567+ compiler.setBlock (block1);
568+ ListBlocks::compileHideList (&compiler);
569+
570+ EXPECT_CALL (m_engineMock, stage ()).WillOnce (Return (&stage));
571+ EXPECT_CALL (m_engineMock, functionIndex (&ListBlocks::hideList)).WillOnce (Return (1 ));
572+ compiler.setBlock (block2);
573+ ListBlocks::compileHideList (&compiler);
574+ compiler.end ();
575+
576+ 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 }));
577+ ASSERT_EQ (compiler.constValues (), std::vector<Value>({ " b" , " d" }));
578+ ASSERT_TRUE (compiler.variables ().empty ());
579+ ASSERT_TRUE (compiler.lists ().empty ());
580+ }
581+
582+ TEST_F (ListBlocksTest, HideListImpl)
583+ {
584+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_HALT };
585+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT };
586+ static unsigned int bytecode3[] = { vm::OP_START, vm::OP_CONST, 2 , vm::OP_EXEC, 1 , vm::OP_HALT };
587+ static unsigned int bytecode4[] = { vm::OP_START, vm::OP_CONST, 3 , vm::OP_EXEC, 1 , vm::OP_HALT };
588+ static BlockFunc functions[] = { &ListBlocks::hideGlobalList, &ListBlocks::hideList };
589+ static Value constValues[] = { " a" , " b" , " c" , " d" };
590+
591+ auto list1 = std::make_shared<List>(" b" , " " );
592+ Monitor monitor1 (" b" , " " );
593+ monitor1.setVisible (true );
594+ list1->setMonitor (&monitor1);
595+
596+ auto list2 = std::make_shared<List>(" d" , " " );
597+ Monitor monitor2 (" d" , " " );
598+ monitor2.setVisible (true );
599+ list2->setMonitor (&monitor2);
600+
601+ Stage stage;
602+ stage.addList (list1);
603+
604+ Target target;
605+ target.addList (list2);
606+
607+ // Global
608+ VirtualMachine vm1 (&stage, &m_engineMock, nullptr );
609+ vm1.setBytecode (bytecode1);
610+ vm1.setFunctions (functions);
611+ vm1.setConstValues (constValues);
612+
613+ EXPECT_CALL (m_engineMock, stage ()).WillOnce (Return (&stage));
614+ vm1.run ();
615+
616+ ASSERT_EQ (vm1.registerCount (), 0 );
617+ ASSERT_TRUE (monitor1.visible ());
618+ ASSERT_TRUE (monitor2.visible ());
619+
620+ EXPECT_CALL (m_engineMock, stage ()).WillOnce (Return (&stage));
621+ vm1.reset ();
622+ vm1.setBytecode (bytecode2);
623+ vm1.run ();
624+
625+ ASSERT_EQ (vm1.registerCount (), 0 );
626+ ASSERT_FALSE (monitor1.visible ());
627+ ASSERT_TRUE (monitor2.visible ());
628+
629+ monitor1.setVisible (true );
630+
631+ // Local
632+ VirtualMachine vm2 (&target, &m_engineMock, nullptr );
633+ vm2.setBytecode (bytecode3);
634+ vm2.setFunctions (functions);
635+ vm2.setConstValues (constValues);
636+ vm2.run ();
637+
638+ ASSERT_EQ (vm2.registerCount (), 0 );
639+ ASSERT_TRUE (monitor1.visible ());
640+ ASSERT_TRUE (monitor2.visible ());
641+
642+ vm2.reset ();
643+ vm2.setBytecode (bytecode4);
644+ vm2.run ();
645+
646+ ASSERT_EQ (vm2.registerCount (), 0 );
647+ ASSERT_TRUE (monitor1.visible ());
648+ ASSERT_FALSE (monitor2.visible ());
649+ }
0 commit comments