Skip to content

Commit e507813

Browse files
committed
Implement data_hidelist block
1 parent ea0c7eb commit e507813

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed

src/blocks/listblocks.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ void ListBlocks::registerBlocks(IEngine *engine)
3636
engine->addCompileFunction(this, "data_lengthoflist", &compileLengthOfList);
3737
engine->addCompileFunction(this, "data_listcontainsitem", &compileListContainsItem);
3838
engine->addCompileFunction(this, "data_showlist", &compileShowList);
39+
engine->addCompileFunction(this, "data_hidelist", &compileHideList);
3940

4041
// Monitor names
4142
engine->addMonitorNameFunction(this, "data_listcontents", &listContentsMonitorName);
@@ -125,6 +126,21 @@ void ListBlocks::compileShowList(Compiler *compiler)
125126
compiler->addFunctionCall(&showList);
126127
}
127128

129+
void ListBlocks::compileHideList(Compiler *compiler)
130+
{
131+
Field *field = compiler->field(LIST);
132+
assert(field);
133+
List *var = static_cast<List *>(field->valuePtr().get());
134+
assert(var);
135+
136+
compiler->addConstValue(var->id());
137+
138+
if (var->target() == static_cast<Target *>(compiler->engine()->stage()))
139+
compiler->addFunctionCall(&hideGlobalList);
140+
else
141+
compiler->addFunctionCall(&hideList);
142+
}
143+
128144
void ListBlocks::setListVisible(std::shared_ptr<List> list, bool visible)
129145
{
130146
if (list) {
@@ -153,6 +169,26 @@ unsigned int ListBlocks::showList(VirtualMachine *vm)
153169
return 1;
154170
}
155171

172+
unsigned int ListBlocks::hideGlobalList(VirtualMachine *vm)
173+
{
174+
if (Stage *target = vm->engine()->stage()) {
175+
int index = target->findListById(vm->getInput(0, 1)->toString());
176+
setListVisible(target->listAt(index), false);
177+
}
178+
179+
return 1;
180+
}
181+
182+
unsigned int ListBlocks::hideList(VirtualMachine *vm)
183+
{
184+
if (Target *target = vm->target()) {
185+
int index = target->findListById(vm->getInput(0, 1)->toString());
186+
setListVisible(target->listAt(index), false);
187+
}
188+
189+
return 1;
190+
}
191+
156192
const std::string &ListBlocks::listContentsMonitorName(Block *block)
157193
{
158194
List *list = dynamic_cast<List *>(block->findFieldById(LIST)->valuePtr().get());

src/blocks/listblocks.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ class ListBlocks : public IBlockSection
4141
static void compileLengthOfList(Compiler *compiler);
4242
static void compileListContainsItem(Compiler *compiler);
4343
static void compileShowList(Compiler *compiler);
44+
static void compileHideList(Compiler *compiler);
4445

4546
static void setListVisible(std::shared_ptr<List> list, bool visible);
4647

4748
static unsigned int showGlobalList(VirtualMachine *vm);
4849
static unsigned int showList(VirtualMachine *vm);
50+
static unsigned int hideGlobalList(VirtualMachine *vm);
51+
static unsigned int hideList(VirtualMachine *vm);
4952

5053
static const std::string &listContentsMonitorName(Block *block);
5154

test/blocks/list_blocks_test.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)