Skip to content

Commit 706665a

Browse files
committed
Add Block test
1 parent 77a6f27 commit 706665a

File tree

2 files changed

+259
-0
lines changed

2 files changed

+259
-0
lines changed

test/scratch_classes/CMakeLists.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,19 @@ target_link_libraries(
153153
)
154154

155155
gtest_discover_tests(field_test)
156+
157+
# block_test
158+
add_executable(
159+
block_test
160+
block_test.cpp
161+
)
162+
163+
target_link_libraries(
164+
block_test
165+
GTest::gtest_main
166+
GTest::gmock_main
167+
scratchcpp
168+
scratchcpp_mocks
169+
)
170+
171+
gtest_discover_tests(block_test)
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
#include <scratchcpp/block.h>
2+
#include <scratchcpp/input.h>
3+
#include <scratchcpp/field.h>
4+
#include <scratchcpp/target.h>
5+
#include <scratchcpp/compiler.h>
6+
#include <enginemock.h>
7+
8+
#include "../common.h"
9+
10+
using namespace libscratchcpp;
11+
12+
class BlockTestMock
13+
{
14+
public:
15+
MOCK_METHOD(void, compileTest, (Compiler *), ());
16+
};
17+
18+
class BlockTest : public testing::Test
19+
{
20+
public:
21+
void SetUp() override { m_mockPtr = &m_mock; }
22+
23+
static void compileTest(Compiler *compiler)
24+
{
25+
ASSERT_TRUE(m_mockPtr);
26+
m_mockPtr->compileTest(compiler);
27+
}
28+
29+
static inline BlockTestMock *m_mockPtr = nullptr;
30+
BlockTestMock m_mock;
31+
};
32+
33+
TEST_F(BlockTest, Constructors)
34+
{
35+
Block block("abc", "motion_movesteps");
36+
ASSERT_EQ(block.id(), "abc");
37+
ASSERT_EQ(block.opcode(), "motion_movesteps");
38+
}
39+
40+
TEST_F(BlockTest, Next)
41+
{
42+
Block block("", "");
43+
ASSERT_EQ(block.next(), nullptr);
44+
ASSERT_EQ(block.nextId(), "");
45+
46+
block.setNextId("hello");
47+
ASSERT_EQ(block.next(), nullptr);
48+
ASSERT_EQ(block.nextId(), "hello");
49+
50+
auto nextBlock = std::make_shared<Block>("abc", "");
51+
block.setNext(nextBlock);
52+
ASSERT_EQ(block.next(), nextBlock);
53+
ASSERT_EQ(block.nextId(), "abc");
54+
55+
block.setNextId("def");
56+
ASSERT_EQ(block.next(), nullptr);
57+
ASSERT_EQ(block.nextId(), "def");
58+
59+
block.setNext(nullptr);
60+
ASSERT_EQ(block.next(), nullptr);
61+
ASSERT_EQ(block.nextId(), "");
62+
}
63+
64+
TEST_F(BlockTest, Parent)
65+
{
66+
Block block("", "");
67+
ASSERT_EQ(block.parent(), nullptr);
68+
ASSERT_EQ(block.parentId(), "");
69+
70+
block.setParentId("hello");
71+
ASSERT_EQ(block.parent(), nullptr);
72+
ASSERT_EQ(block.parentId(), "hello");
73+
74+
auto parentBlock = std::make_shared<Block>("abc", "");
75+
block.setParent(parentBlock);
76+
ASSERT_EQ(block.parent(), parentBlock);
77+
ASSERT_EQ(block.parentId(), "abc");
78+
79+
block.setParentId("def");
80+
ASSERT_EQ(block.parent(), nullptr);
81+
ASSERT_EQ(block.parentId(), "def");
82+
83+
block.setParent(nullptr);
84+
ASSERT_EQ(block.parent(), nullptr);
85+
ASSERT_EQ(block.parentId(), "");
86+
}
87+
88+
TEST_F(BlockTest, Inputs)
89+
{
90+
auto i1 = std::make_shared<Input>("VALUE1", Input::Type::Shadow);
91+
i1->setInputId(11);
92+
93+
auto i2 = std::make_shared<Input>("VALUE2", Input::Type::Shadow);
94+
i2->setInputId(12);
95+
96+
auto i3 = std::make_shared<Input>("VALUE3", Input::Type::Shadow);
97+
i3->setInputId(15);
98+
99+
Block block("", "");
100+
ASSERT_EQ(block.addInput(i1), 0);
101+
ASSERT_EQ(block.addInput(i2), 1);
102+
ASSERT_EQ(block.addInput(i3), 2);
103+
ASSERT_EQ(block.addInput(i2), 1); // add existing input
104+
105+
ASSERT_EQ(block.inputs(), std::vector<std::shared_ptr<Input>>({ i1, i2, i3 }));
106+
ASSERT_EQ(block.inputAt(0), i1);
107+
ASSERT_EQ(block.inputAt(1), i2);
108+
ASSERT_EQ(block.inputAt(2), i3);
109+
ASSERT_EQ(block.inputAt(3), nullptr);
110+
ASSERT_EQ(block.inputAt(-1), nullptr);
111+
112+
ASSERT_EQ(block.findInput("invalid"), -1);
113+
ASSERT_EQ(block.findInput("VALUE1"), 0);
114+
ASSERT_EQ(block.findInput("VALUE2"), 1);
115+
ASSERT_EQ(block.findInput("VALUE3"), 2);
116+
117+
block.updateInputMap();
118+
ASSERT_EQ(block.findInputById(5), nullptr);
119+
ASSERT_EQ(block.findInputById(11), i1.get());
120+
ASSERT_EQ(block.findInputById(12), i2.get());
121+
ASSERT_EQ(block.findInputById(15), i3.get());
122+
}
123+
124+
TEST_F(BlockTest, Fields)
125+
{
126+
auto f1 = std::make_shared<Field>("VARIABLE1", Value());
127+
f1->setFieldId(11);
128+
129+
auto f2 = std::make_shared<Field>("VARIABLE2", Value());
130+
f2->setFieldId(12);
131+
132+
auto f3 = std::make_shared<Field>("VARIABLE3", Value());
133+
f3->setFieldId(15);
134+
135+
Block block("", "");
136+
ASSERT_EQ(block.addField(f1), 0);
137+
ASSERT_EQ(block.addField(f2), 1);
138+
ASSERT_EQ(block.addField(f3), 2);
139+
ASSERT_EQ(block.addField(f2), 1); // add existing field
140+
141+
ASSERT_EQ(block.fields(), std::vector<std::shared_ptr<Field>>({ f1, f2, f3 }));
142+
ASSERT_EQ(block.fieldAt(0), f1);
143+
ASSERT_EQ(block.fieldAt(1), f2);
144+
ASSERT_EQ(block.fieldAt(2), f3);
145+
ASSERT_EQ(block.fieldAt(3), nullptr);
146+
ASSERT_EQ(block.fieldAt(-1), nullptr);
147+
148+
ASSERT_EQ(block.findField("invalid"), -1);
149+
ASSERT_EQ(block.findField("VARIABLE1"), 0);
150+
ASSERT_EQ(block.findField("VARIABLE2"), 1);
151+
ASSERT_EQ(block.findField("VARIABLE3"), 2);
152+
153+
block.updateFieldMap();
154+
ASSERT_EQ(block.findFieldById(5), nullptr);
155+
ASSERT_EQ(block.findFieldById(11), f1.get());
156+
ASSERT_EQ(block.findFieldById(12), f2.get());
157+
ASSERT_EQ(block.findFieldById(15), f3.get());
158+
}
159+
160+
TEST_F(BlockTest, Shadow)
161+
{
162+
Block block("", "");
163+
ASSERT_FALSE(block.shadow());
164+
165+
block.setShadow(true);
166+
ASSERT_TRUE(block.shadow());
167+
}
168+
169+
TEST_F(BlockTest, TopLevel)
170+
{
171+
Block block("", "");
172+
ASSERT_TRUE(block.topLevel());
173+
174+
block.setParentId("hello");
175+
ASSERT_FALSE(block.topLevel());
176+
177+
auto parentBlock = std::make_shared<Block>("abc", "");
178+
block.setParent(parentBlock);
179+
ASSERT_FALSE(block.topLevel());
180+
181+
block.setParentId("def");
182+
ASSERT_FALSE(block.topLevel());
183+
184+
block.setParent(nullptr);
185+
ASSERT_TRUE(block.topLevel());
186+
}
187+
188+
TEST_F(BlockTest, Engine)
189+
{
190+
Block block("", "");
191+
ASSERT_EQ(block.engine(), nullptr);
192+
193+
EngineMock engine;
194+
block.setEngine(&engine);
195+
ASSERT_EQ(block.engine(), &engine);
196+
}
197+
198+
TEST_F(BlockTest, Target)
199+
{
200+
Block block("", "");
201+
ASSERT_EQ(block.target(), nullptr);
202+
203+
Target target;
204+
block.setTarget(&target);
205+
ASSERT_EQ(block.target(), &target);
206+
}
207+
208+
TEST_F(BlockTest, CompileFunction)
209+
{
210+
Block block("", "");
211+
ASSERT_EQ(block.compileFunction(), nullptr);
212+
213+
block.setCompileFunction(&compileTest);
214+
ASSERT_EQ(block.compileFunction(), &compileTest);
215+
}
216+
217+
TEST_F(BlockTest, Compile)
218+
{
219+
Block block("", "");
220+
EngineMock engine;
221+
Compiler compiler(&engine);
222+
223+
block.compile(&compiler); // test with null compile function
224+
225+
block.setCompileFunction(&compileTest);
226+
EXPECT_CALL(m_mock, compileTest(&compiler)).Times(1);
227+
block.compile(&compiler);
228+
}
229+
230+
TEST_F(BlockTest, MutationHasNext)
231+
{
232+
Block block("", "");
233+
ASSERT_TRUE(block.mutationHasNext());
234+
235+
block.setMutationHasNext(false);
236+
ASSERT_FALSE(block.mutationHasNext());
237+
}
238+
239+
TEST_F(BlockTest, MutationPrototype)
240+
{
241+
Block block("", "");
242+
ASSERT_TRUE(block.mutationPrototype());
243+
}

0 commit comments

Comments
 (0)