Skip to content

Commit d2b6d9f

Browse files
authored
Merge pull request #164 from scratchcpp/script_test
Add Script test
2 parents 06526cf + 210424d commit d2b6d9f

File tree

8 files changed

+176
-6
lines changed

8 files changed

+176
-6
lines changed

include/scratchcpp/virtualmachine.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@ class LIBSCRATCHCPP_EXPORT VirtualMachine
105105

106106
void setBytecode(unsigned int *code);
107107

108+
unsigned int **procedures() const;
109+
const BlockFunc *functions() const;
108110
const Value *constValues() const;
111+
Value **variables() const;
112+
List **lists() const;
109113

110114
unsigned int *bytecode() const;
111115

src/engine/script_p.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ struct ScriptPrivate
1919
ScriptPrivate(Target *target, IEngine *engine);
2020
ScriptPrivate(const ScriptPrivate &) = delete;
2121

22-
unsigned int *bytecode;
22+
unsigned int *bytecode = nullptr;
2323
std::vector<unsigned int> bytecodeVector;
2424

25-
Target *target;
26-
IEngine *engine;
25+
Target *target = nullptr;
26+
IEngine *engine = nullptr;
2727

2828
unsigned int **procedures = nullptr;
2929
std::vector<unsigned int *> proceduresVector;
3030

31-
BlockFunc *functions;
31+
BlockFunc *functions = nullptr;
3232
std::vector<BlockFunc> functionsVector;
3333

3434
const Value *constValues = nullptr;

src/engine/virtualmachine.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,36 @@ void VirtualMachine::setBytecode(unsigned int *code)
5757
impl->pos = code;
5858
}
5959

60+
/*! Returns the array of procedures. */
61+
unsigned int **VirtualMachine::procedures() const
62+
{
63+
return impl->procedures;
64+
}
65+
66+
/*! Returns the array of functions (block implementation function pointers). */
67+
const BlockFunc *VirtualMachine::functions() const
68+
{
69+
return impl->functions;
70+
}
71+
6072
/*! Returns the array of constant values. */
6173
const Value *VirtualMachine::constValues() const
6274
{
6375
return impl->constValues;
6476
}
6577

78+
/*! Returns the array of Value pointers of variables. */
79+
Value **VirtualMachine::variables() const
80+
{
81+
return impl->variables;
82+
}
83+
84+
/*! Returns the array of lists. */
85+
List **VirtualMachine::lists() const
86+
{
87+
return impl->lists;
88+
}
89+
6690
/*! Returns the bytecode array. */
6791
unsigned int *VirtualMachine::bytecode() const
6892
{

src/engine/virtualmachine_p.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ struct VirtualMachinePrivate
5656
bool updatePos = false;
5757

5858
unsigned int **procedures = nullptr;
59-
BlockFunc *functions;
59+
BlockFunc *functions = nullptr;
6060
const Value *constValues = nullptr;
6161
Value **variables = nullptr;
6262
List **lists = nullptr;

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ add_subdirectory(target_interfaces)
2525
add_subdirectory(blocks)
2626
add_subdirectory(scratchconfiguration)
2727
add_subdirectory(assets)
28+
add_subdirectory(script)

test/script/CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
add_executable(
2+
script_test
3+
script_test.cpp
4+
)
5+
6+
target_link_libraries(
7+
script_test
8+
GTest::gtest_main
9+
GTest::gmock_main
10+
scratchcpp
11+
scratchcpp_mocks
12+
)
13+
14+
gtest_discover_tests(script_test)

test/script/script_test.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <scratchcpp/script.h>
2+
#include <scratchcpp/virtualmachine.h>
3+
#include <scratchcpp/target.h>
4+
#include <scratchcpp/list.h>
5+
#include <enginemock.h>
6+
7+
#include "../common.h"
8+
9+
using namespace libscratchcpp;
10+
11+
class ScriptTest : public testing::Test
12+
{
13+
public:
14+
Target m_target;
15+
EngineMock m_engine;
16+
};
17+
18+
TEST_F(ScriptTest, Bytecode)
19+
{
20+
Script script(nullptr, nullptr);
21+
ASSERT_EQ(script.bytecode(), nullptr);
22+
ASSERT_TRUE(script.bytecodeVector().empty());
23+
24+
script.setBytecode({ vm::OP_START, vm::OP_HALT });
25+
ASSERT_EQ(script.bytecode()[0], vm::OP_START);
26+
ASSERT_EQ(script.bytecode()[1], vm::OP_HALT);
27+
ASSERT_EQ(script.bytecodeVector(), std::vector<unsigned int>({ vm::OP_START, vm::OP_HALT }));
28+
}
29+
30+
unsigned int testFunction(VirtualMachine *)
31+
{
32+
return 0;
33+
}
34+
35+
TEST_F(ScriptTest, Start)
36+
{
37+
static std::vector<unsigned int> bytecode = { vm::OP_START, vm::OP_HALT };
38+
static std::vector<unsigned int *> procedures = { bytecode.data() };
39+
static std::vector<BlockFunc> functions = { &testFunction };
40+
static std::vector<Value> constValues = { "test" };
41+
42+
std::unique_ptr<Value> var = std::make_unique<Value>();
43+
static std::vector<Value *> variables = { var.get() };
44+
45+
std::unique_ptr<List> list = std::make_unique<List>("", "");
46+
static std::vector<List *> lists = { list.get() };
47+
48+
Script script1(nullptr, nullptr);
49+
50+
std::shared_ptr<VirtualMachine> vm = script1.start();
51+
ASSERT_TRUE(vm);
52+
ASSERT_EQ(vm->target(), nullptr);
53+
ASSERT_EQ(vm->engine(), nullptr);
54+
ASSERT_EQ(vm->bytecode(), nullptr);
55+
ASSERT_EQ(vm->procedures(), nullptr);
56+
ASSERT_EQ(vm->functions(), nullptr);
57+
ASSERT_EQ(vm->constValues(), nullptr);
58+
ASSERT_EQ(vm->variables(), nullptr);
59+
ASSERT_EQ(vm->lists(), nullptr);
60+
61+
Script script2(&m_target, &m_engine);
62+
63+
vm = script2.start();
64+
ASSERT_TRUE(vm);
65+
ASSERT_EQ(vm->target(), &m_target);
66+
ASSERT_EQ(vm->engine(), &m_engine);
67+
68+
Script script3(&m_target, &m_engine);
69+
script3.setBytecode(bytecode);
70+
script3.setProcedures(procedures);
71+
script3.setFunctions(functions);
72+
script3.setConstValues(constValues);
73+
script3.setVariables(variables);
74+
script3.setLists(lists);
75+
76+
vm = script3.start();
77+
ASSERT_TRUE(vm);
78+
ASSERT_EQ(vm->bytecode()[0], bytecode[0]);
79+
ASSERT_EQ(vm->procedures()[0], procedures[0]);
80+
ASSERT_EQ(vm->functions()[0], functions[0]);
81+
ASSERT_EQ(vm->constValues()[0].toString(), constValues[0].toString());
82+
ASSERT_EQ(vm->variables()[0], variables[0]);
83+
ASSERT_EQ(vm->lists()[0], lists[0]);
84+
}

test/virtual_machine/virtual_machine_test.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ TEST(VirtualMachineTest, Constructors)
2525
ASSERT_EQ(vm2.script(), &script);
2626
}
2727

28+
TEST(VirtualMachineTest, Procedures)
29+
{
30+
static unsigned int procedure[] = { OP_START, OP_HALT };
31+
static unsigned int *procedures[] = { procedure };
32+
33+
VirtualMachine vm;
34+
ASSERT_EQ(vm.procedures(), nullptr);
35+
vm.setProcedures(procedures);
36+
ASSERT_EQ(vm.procedures(), procedures);
37+
}
38+
2839
TEST(VirtualMachineTest, ConstValues)
2940
{
3041
static Value constValues[] = { "test1", "test2" };
@@ -35,6 +46,28 @@ TEST(VirtualMachineTest, ConstValues)
3546
ASSERT_EQ(vm.constValues(), constValues);
3647
}
3748

49+
TEST(VirtualMachineTest, Variables)
50+
{
51+
Value var;
52+
Value *variables[] = { &var };
53+
54+
VirtualMachine vm;
55+
ASSERT_EQ(vm.variables(), nullptr);
56+
vm.setVariables(variables);
57+
ASSERT_EQ(vm.variables(), variables);
58+
}
59+
60+
TEST(VirtualMachineTest, Lists)
61+
{
62+
List list("", "");
63+
List *lists[] = { &list };
64+
65+
VirtualMachine vm;
66+
ASSERT_EQ(vm.lists(), nullptr);
67+
vm.setLists(lists);
68+
ASSERT_EQ(vm.lists(), lists);
69+
}
70+
3871
TEST(VirtualMachineTest, Bytecode)
3972
{
4073
static unsigned int bytecode[] = { OP_START, OP_HALT };
@@ -1240,7 +1273,17 @@ TEST(VirtualMachineTest, OP_EXEC)
12401273
}
12411274
}
12421275

1243-
TEST(VirtualMachineTest, Procedures)
1276+
TEST(VirtualMachineTest, Functions)
1277+
{
1278+
static BlockFunc functions[] = { &testFunction1, &testFunction2 };
1279+
1280+
VirtualMachine vm;
1281+
ASSERT_EQ(vm.functions(), nullptr);
1282+
vm.setFunctions(functions);
1283+
ASSERT_EQ(vm.functions(), functions);
1284+
}
1285+
1286+
TEST(VirtualMachineTest, RunProcedures)
12441287
{
12451288
static unsigned int bytecode[] = {
12461289
OP_START, OP_INIT_PROCEDURE, OP_CONST, 0, OP_ADD_ARG, OP_CONST, 1, OP_ADD_ARG, OP_CALL_PROCEDURE, 0, OP_NULL, OP_EXEC, 0, OP_INIT_PROCEDURE, OP_CALL_PROCEDURE, 1, OP_HALT

0 commit comments

Comments
 (0)