@@ -797,3 +797,216 @@ TEST_F(ListBlocksTest, ShowList_Local_FromClone)
797797 ASSERT_FALSE (clone->listAt (0 )->monitor ());
798798 ASSERT_FALSE (clone->listAt (1 )->monitor ());
799799}
800+
801+ TEST_F (ListBlocksTest, HideList_Global_Existent)
802+ {
803+ auto stage = std::make_shared<Stage>();
804+ auto list1 = std::make_shared<List>(" a" , " list1" );
805+ list1->append (" item1" );
806+ list1->append (" item2" );
807+ stage->addList (list1);
808+ auto list2 = std::make_shared<List>(" b" , " list2" );
809+ list2->append (" Hello" );
810+ list2->append (" world" );
811+ stage->addList (list2);
812+
813+ auto monitor1 = std::make_shared<Monitor>(" monitor" , " data_listcontents" );
814+ monitor1->block ()->addField (std::make_shared<Field>(" LIST" , list1->name (), list1));
815+ monitor1->setVisible (true );
816+
817+ auto monitor2 = std::make_shared<Monitor>(" monitor" , " data_listcontents" );
818+ monitor2->block ()->addField (std::make_shared<Field>(" LIST" , list2->name (), list2));
819+ monitor2->setVisible (false );
820+
821+ m_engine->setMonitors ({ monitor1, monitor2 });
822+ list1->setMonitor (monitor1.get ());
823+ list2->setMonitor (monitor2.get ());
824+
825+ m_engine->setTargets ({ stage });
826+
827+ ScriptBuilder builder1 (m_extension.get (), m_engine, stage);
828+ builder1.addBlock (" data_hidelist" );
829+ builder1.addEntityField (" LIST" , list1);
830+
831+ ScriptBuilder builder2 (m_extension.get (), m_engine, stage);
832+ builder2.addBlock (" data_hidelist" );
833+ builder2.addEntityField (" LIST" , list2);
834+
835+ ScriptBuilder::buildMultiple ({ &builder1, &builder2 });
836+
837+ builder1.run ();
838+ ASSERT_FALSE (monitor1->visible ());
839+ ASSERT_FALSE (monitor2->visible ());
840+
841+ builder2.run ();
842+ ASSERT_FALSE (monitor1->visible ());
843+ ASSERT_FALSE (monitor2->visible ());
844+ }
845+
846+ TEST_F (ListBlocksTest, HideList_Global_Nonexistent)
847+ {
848+ auto stage = std::make_shared<Stage>();
849+ auto list1 = std::make_shared<List>(" a" , " list1" );
850+ list1->append (" item1" );
851+ list1->append (" item2" );
852+ stage->addList (list1);
853+ auto list2 = std::make_shared<List>(" b" , " list2" );
854+ list2->append (" Hello" );
855+ list2->append (" world" );
856+ stage->addList (list2);
857+
858+ m_engine->setTargets ({ stage });
859+
860+ ScriptBuilder builder1 (m_extension.get (), m_engine, stage);
861+ builder1.addBlock (" data_hidelist" );
862+ builder1.addEntityField (" LIST" , list1);
863+
864+ ScriptBuilder builder2 (m_extension.get (), m_engine, stage);
865+ builder2.addBlock (" data_hidelist" );
866+ builder2.addEntityField (" LIST" , list2);
867+
868+ ScriptBuilder::buildMultiple ({ &builder1, &builder2 });
869+
870+ // Missing monitors should NOT be created
871+ builder1.run ();
872+ ASSERT_FALSE (list1->monitor ());
873+
874+ builder2.run ();
875+ ASSERT_FALSE (list2->monitor ());
876+ }
877+
878+ TEST_F (ListBlocksTest, HideList_Local_Existent)
879+ {
880+ auto stage = std::make_shared<Stage>();
881+ auto sprite = std::make_shared<Sprite>();
882+
883+ auto list1 = std::make_shared<List>(" a" , " list1" );
884+ list1->append (" item1" );
885+ list1->append (" item2" );
886+ sprite->addList (list1);
887+ auto list2 = std::make_shared<List>(" b" , " list2" );
888+ list2->append (" Hello" );
889+ list2->append (" world" );
890+ sprite->addList (list2);
891+
892+ auto monitor1 = std::make_shared<Monitor>(" monitor" , " data_listcontents" );
893+ monitor1->block ()->addField (std::make_shared<Field>(" LIST" , list1->name (), list1));
894+ monitor1->setVisible (true );
895+
896+ auto monitor2 = std::make_shared<Monitor>(" monitor" , " data_listcontents" );
897+ monitor2->block ()->addField (std::make_shared<Field>(" LIST" , list2->name (), list2));
898+ monitor2->setVisible (false );
899+
900+ m_engine->setMonitors ({ monitor1, monitor2 });
901+ list1->setMonitor (monitor1.get ());
902+ list2->setMonitor (monitor2.get ());
903+
904+ m_engine->setTargets ({ stage, sprite });
905+
906+ ScriptBuilder builder1 (m_extension.get (), m_engine, sprite);
907+ builder1.addBlock (" data_hidelist" );
908+ builder1.addEntityField (" LIST" , list1);
909+
910+ ScriptBuilder builder2 (m_extension.get (), m_engine, sprite);
911+ builder2.addBlock (" data_hidelist" );
912+ builder2.addEntityField (" LIST" , list2);
913+
914+ ScriptBuilder::buildMultiple ({ &builder1, &builder2 });
915+
916+ builder1.run ();
917+ ASSERT_FALSE (monitor1->visible ());
918+ ASSERT_FALSE (monitor2->visible ());
919+
920+ builder2.run ();
921+ ASSERT_FALSE (monitor1->visible ());
922+ ASSERT_FALSE (monitor2->visible ());
923+ }
924+
925+ TEST_F (ListBlocksTest, HideList_Local_Nonexistent)
926+ {
927+ auto stage = std::make_shared<Stage>();
928+ auto sprite = std::make_shared<Sprite>();
929+
930+ auto list1 = std::make_shared<List>(" a" , " list1" );
931+ list1->append (" item1" );
932+ list1->append (" item2" );
933+ sprite->addList (list1);
934+ auto list2 = std::make_shared<List>(" b" , " list2" );
935+ list2->append (" Hello" );
936+ list2->append (" world" );
937+ sprite->addList (list2);
938+
939+ m_engine->setTargets ({ stage, sprite });
940+
941+ ScriptBuilder builder1 (m_extension.get (), m_engine, sprite);
942+ builder1.addBlock (" data_hidelist" );
943+ builder1.addEntityField (" LIST" , list1);
944+
945+ ScriptBuilder builder2 (m_extension.get (), m_engine, sprite);
946+ builder2.addBlock (" data_hidelist" );
947+ builder2.addEntityField (" LIST" , list2);
948+
949+ ScriptBuilder::buildMultiple ({ &builder1, &builder2 });
950+ m_engine->run ();
951+
952+ // Missing monitors should NOT be created
953+ builder1.run ();
954+ ASSERT_FALSE (list1->monitor ());
955+
956+ builder2.run ();
957+ ASSERT_FALSE (list2->monitor ());
958+ }
959+
960+ TEST_F (ListBlocksTest, HideList_Local_FromClone)
961+ {
962+ auto stage = std::make_shared<Stage>();
963+ auto sprite = std::make_shared<Sprite>();
964+
965+ auto list1 = std::make_shared<List>(" a" , " list1" );
966+ list1->append (" item1" );
967+ list1->append (" item2" );
968+ sprite->addList (list1);
969+ auto list2 = std::make_shared<List>(" b" , " list2" );
970+ list2->append (" Hello" );
971+ list2->append (" world" );
972+ sprite->addList (list2);
973+
974+ auto monitor1 = std::make_shared<Monitor>(" monitor" , " data_listcontents" );
975+ monitor1->block ()->addField (std::make_shared<Field>(" LIST" , list1->name (), list1));
976+ monitor1->setVisible (true );
977+
978+ auto monitor2 = std::make_shared<Monitor>(" monitor" , " data_listcontents" );
979+ monitor2->block ()->addField (std::make_shared<Field>(" LIST" , list2->name (), list2));
980+ monitor2->setVisible (false );
981+
982+ m_engine->setMonitors ({ monitor1, monitor2 });
983+ list1->setMonitor (monitor1.get ());
984+ list2->setMonitor (monitor2.get ());
985+
986+ sprite->setEngine (m_engine);
987+ auto clone = sprite->clone ();
988+
989+ m_engine->setTargets ({ stage, sprite, clone });
990+
991+ ScriptBuilder builder1 (m_extension.get (), m_engine, clone);
992+ builder1.addBlock (" data_hidelist" );
993+ builder1.addEntityField (" LIST" , list1);
994+
995+ ScriptBuilder builder2 (m_extension.get (), m_engine, clone);
996+ builder2.addBlock (" data_hidelist" );
997+ builder2.addEntityField (" LIST" , list2);
998+
999+ ScriptBuilder::buildMultiple ({ &builder1, &builder2 });
1000+
1001+ // The clone root lists should be used
1002+ builder1.run ();
1003+ ASSERT_FALSE (monitor1->visible ());
1004+ ASSERT_FALSE (monitor2->visible ());
1005+
1006+ builder2.run ();
1007+ ASSERT_FALSE (monitor1->visible ());
1008+ ASSERT_FALSE (monitor2->visible ());
1009+
1010+ ASSERT_FALSE (clone->listAt (0 )->monitor ());
1011+ ASSERT_FALSE (clone->listAt (1 )->monitor ());
1012+ }
0 commit comments