Skip to content

Commit 1d2103f

Browse files
committed
Add list monitor name functions
1 parent ebf17cf commit 1d2103f

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/blocks/listblocks.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <scratchcpp/iengine.h>
44
#include <scratchcpp/compiler.h>
55
#include <scratchcpp/field.h>
6+
#include <scratchcpp/block.h>
7+
#include <scratchcpp/list.h>
68

79
#include "listblocks.h"
810

@@ -32,6 +34,9 @@ void ListBlocks::registerBlocks(IEngine *engine)
3234
engine->addCompileFunction(this, "data_lengthoflist", &compileLengthOfList);
3335
engine->addCompileFunction(this, "data_listcontainsitem", &compileListContainsItem);
3436

37+
// Monitor names
38+
engine->addMonitorNameFunction(this, "data_listcontents", &listContentsMonitorName);
39+
3540
// Inputs
3641
engine->addInput(this, "ITEM", ITEM);
3742
engine->addInput(this, "INDEX", INDEX);
@@ -101,3 +106,15 @@ void ListBlocks::compileListContainsItem(Compiler *compiler)
101106
compiler->addInput(ITEM);
102107
compiler->addInstruction(vm::OP_LIST_CONTAINS, { compiler->listIndex(compiler->field(LIST)->valuePtr()) });
103108
}
109+
110+
const std::string &ListBlocks::listContentsMonitorName(Block *block)
111+
{
112+
List *list = dynamic_cast<List *>(block->findFieldById(LIST)->valuePtr().get());
113+
114+
if (list)
115+
return list->name();
116+
else {
117+
static const std::string empty = "";
118+
return empty;
119+
}
120+
}

src/blocks/listblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class ListBlocks : public IBlockSection
4040
static void compileLengthOfList(Compiler *compiler);
4141
static void compileListContainsItem(Compiler *compiler);
4242

43+
static const std::string &listContentsMonitorName(Block *block);
44+
4345
private:
4446
static int validateIndex(size_t index, size_t listLength);
4547
};

test/blocks/list_blocks_test.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ TEST_F(ListBlocksTest, RegisterBlocks)
105105
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "data_lengthoflist", &ListBlocks::compileLengthOfList)).Times(1);
106106
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "data_listcontainsitem", &ListBlocks::compileListContainsItem)).Times(1);
107107

108+
// Monitor names
109+
EXPECT_CALL(m_engineMock, addMonitorNameFunction(m_section.get(), "data_listcontents", &ListBlocks::listContentsMonitorName));
110+
108111
// Inputs
109112
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "ITEM", ListBlocks::ITEM));
110113
EXPECT_CALL(m_engineMock, addInput(m_section.get(), "INDEX", ListBlocks::INDEX));
@@ -145,6 +148,20 @@ TEST_F(ListBlocksTest, ListContents)
145148
}));
146149
}
147150

151+
TEST_F(ListBlocksTest, ListContentsMonitorName)
152+
{
153+
// [list1]
154+
auto list1 = std::make_shared<List>("b", "list1");
155+
auto block1 = createListBlock("a", "data_listcontents", list1);
156+
157+
// [list2]
158+
auto list2 = std::make_shared<List>("d", "list2");
159+
auto block2 = createListBlock("c", "data_listcontents", list2);
160+
161+
ASSERT_EQ(ListBlocks::listContentsMonitorName(block1.get()), "list1");
162+
ASSERT_EQ(ListBlocks::listContentsMonitorName(block2.get()), "list2");
163+
}
164+
148165
TEST_F(ListBlocksTest, AddToList)
149166
{
150167
Compiler compiler(&m_engine);

0 commit comments

Comments
 (0)