Skip to content

Commit 5e5410f

Browse files
committed
Use RandomGenerator to generate random numbers
1 parent 25a49d9 commit 5e5410f

File tree

6 files changed

+51
-40
lines changed

6 files changed

+51
-40
lines changed

src/engine/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ target_sources(scratchcpp
1818
internal/timer.h
1919
internal/blocksectioncontainer.cpp
2020
internal/blocksectioncontainer.h
21-
internal/global.h
2221
internal/randomgenerator.h
2322
internal/randomgenerator.cpp
2423
internal/irandomgenerator.h

src/engine/internal/global.h

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/engine/script_p.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include <vector>
66
#include <scratchcpp/value.h>
77

8-
#include "engine/internal/global.h"
9-
108
namespace libscratchcpp
119
{
1210

src/engine/virtualmachine_p.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <cassert>
99

1010
#include "virtualmachine_p.h"
11-
#include "internal/global.h"
11+
#include "internal/randomgenerator.h"
1212

1313
#define MAX_REG_COUNT 1024
1414

@@ -29,6 +29,8 @@ using namespace vm;
2929

3030
static const double pi = std::acos(-1); // TODO: Use std::numbers::pi in C++20
3131

32+
IRandomGenerator *VirtualMachinePrivate::rng = nullptr;
33+
3234
const unsigned int VirtualMachinePrivate::instruction_arg_count[] = {
3335
0, // OP_START
3436
0, // OP_HALT
@@ -106,6 +108,9 @@ VirtualMachinePrivate::VirtualMachinePrivate(VirtualMachine *vm, Target *target,
106108
regs[i] = new Value();
107109
loops.reserve(256);
108110
callTree.reserve(1024);
111+
112+
if (!rng)
113+
rng = RandomGenerator::instance().get();
109114
}
110115

111116
VirtualMachinePrivate::~VirtualMachinePrivate()
@@ -360,7 +365,7 @@ do_loop_end : {
360365
DISPATCH();
361366

362367
do_random:
363-
REPLACE_RET_VALUE(randint<long>(READ_REG(0, 2)->toDouble(), READ_REG(1, 2)->toDouble()), 2);
368+
REPLACE_RET_VALUE(rng->randint(READ_REG(0, 2)->toDouble(), READ_REG(1, 2)->toDouble()), 2);
364369
FREE_REGS(1);
365370
DISPATCH();
366371

@@ -539,7 +544,7 @@ do_list_del : {
539544
index = 0;
540545
} else if (str == "random") {
541546
size_t size = list->size();
542-
index = size == 0 ? 0 : randint<size_t>(1, size);
547+
index = size == 0 ? 0 : rng->randint(1, size);
543548
} else
544549
index = 0;
545550
} else {
@@ -567,7 +572,7 @@ do_list_insert : {
567572
index = 0;
568573
} else if (str == "random") {
569574
size_t size = list->size();
570-
index = size == 0 ? 1 : randint<size_t>(1, size);
575+
index = size == 0 ? 1 : rng->randint(1, size);
571576
} else
572577
index = 0;
573578
} else {
@@ -594,7 +599,7 @@ do_list_replace : {
594599
index = list->size();
595600
else if (str == "random") {
596601
size_t size = list->size();
597-
index = size == 0 ? 0 : randint<size_t>(1, size);
602+
index = size == 0 ? 0 : rng->randint(1, size);
598603
} else
599604
index = 0;
600605
} else {
@@ -617,7 +622,7 @@ do_list_get_item : {
617622
index = list->size();
618623
else if (str == "random") {
619624
size_t size = list->size();
620-
index = size == 0 ? 0 : randint<size_t>(1, size);
625+
index = size == 0 ? 0 : rng->randint(1, size);
621626
} else
622627
index = 0;
623628
} else {

src/engine/virtualmachine_p.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class IEngine;
1515
class Script;
1616
class Value;
1717
class List;
18+
class IRandomGenerator;
1819

1920
struct VirtualMachinePrivate
2021
{
@@ -65,6 +66,8 @@ struct VirtualMachinePrivate
6566

6667
Value **regs = nullptr;
6768
size_t regCount = 0;
69+
70+
static IRandomGenerator *rng;
6871
};
6972

7073
} // namespace libscratchcpp

test/virtual_machine/virtual_machine_test.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
#include <scratchcpp/list.h>
33
#include <scratchcpp/script.h>
44
#include <enginemock.h>
5+
#include <randomgeneratormock.h>
56

7+
#include "engine/virtualmachine_p.h"
68
#include "engine/internal/engine.h"
9+
#include "engine/internal/randomgenerator.h"
710
#include "../common.h"
811

912
using namespace libscratchcpp;
1013
using namespace vm;
1114

15+
using ::testing::Return;
16+
1217
TEST(VirtualMachineTest, Constructors)
1318
{
1419
VirtualMachine vm1;
@@ -867,11 +872,19 @@ TEST(VirtualMachineTest, OP_LIST_DEL)
867872
list1.push_back("h");
868873
List *lists[] = { &list1 };
869874

875+
RandomGeneratorMock rng;
876+
VirtualMachinePrivate::rng = &rng;
877+
870878
VirtualMachine vm;
871879
vm.setBytecode(bytecode);
872880
vm.setConstValues(constValues);
873881
vm.setLists(lists);
882+
883+
EXPECT_CALL(rng, randint(1, 4)).WillOnce(Return(2));
874884
vm.run();
885+
886+
VirtualMachinePrivate::rng = RandomGenerator::instance().get();
887+
875888
ASSERT_EQ(vm.registerCount(), 14);
876889
ASSERT_EQ(vm.getInput(0, 14)->toString(), "a b d e f g h");
877890
ASSERT_EQ(vm.getInput(1, 14)->toString(), "b d e f g h");
@@ -931,11 +944,19 @@ TEST(VirtualMachineTest, OP_LIST_INSERT)
931944
list1.push_back("h");
932945
List *lists[] = { &list1 };
933946

947+
RandomGeneratorMock rng;
948+
VirtualMachinePrivate::rng = &rng;
949+
934950
VirtualMachine vm;
935951
vm.setBytecode(bytecode);
936952
vm.setConstValues(constValues);
937953
vm.setLists(lists);
954+
955+
EXPECT_CALL(rng, randint(1, 12)).WillOnce(Return(5));
938956
vm.run();
957+
958+
VirtualMachinePrivate::rng = RandomGenerator::instance().get();
959+
939960
ASSERT_EQ(vm.registerCount(), 13);
940961
ASSERT_EQ(vm.getInput(0, 13)->toString(), "a b new item c d e f g h");
941962
ASSERT_EQ(vm.getInput(1, 13)->toString(), "new item a b new item c d e f g h");
@@ -976,11 +997,19 @@ TEST(VirtualMachineTest, OP_LIST_REPLACE)
976997
list1.push_back("h");
977998
List *lists[] = { &list1 };
978999

1000+
RandomGeneratorMock rng;
1001+
VirtualMachinePrivate::rng = &rng;
1002+
9791003
VirtualMachine vm;
9801004
vm.setBytecode(bytecode);
9811005
vm.setConstValues(constValues);
9821006
vm.setLists(lists);
1007+
1008+
EXPECT_CALL(rng, randint(1, 8)).WillOnce(Return(7));
9831009
vm.run();
1010+
1011+
VirtualMachinePrivate::rng = RandomGenerator::instance().get();
1012+
9841013
ASSERT_EQ(vm.registerCount(), 13);
9851014
ASSERT_EQ(vm.getInput(0, 13)->toString(), "a b new item d e f g h");
9861015
ASSERT_EQ(vm.getInput(1, 13)->toString(), "new item b new item d e f g h");
@@ -1016,11 +1045,19 @@ TEST(VirtualMachineTest, OP_LIST_GET_ITEM)
10161045
list1.push_back("h");
10171046
List *lists[] = { &list1 };
10181047

1048+
RandomGeneratorMock rng;
1049+
VirtualMachinePrivate::rng = &rng;
1050+
10191051
VirtualMachine vm;
10201052
vm.setBytecode(bytecode);
10211053
vm.setConstValues(constValues);
10221054
vm.setLists(lists);
1055+
1056+
EXPECT_CALL(rng, randint(1, 8)).WillOnce(Return(1));
10231057
vm.run();
1058+
1059+
VirtualMachinePrivate::rng = RandomGenerator::instance().get();
1060+
10241061
ASSERT_EQ(vm.registerCount(), 13);
10251062
ASSERT_EQ(vm.getInput(0, 13)->toString(), "c");
10261063
ASSERT_EQ(vm.getInput(1, 13)->toString(), "a");

0 commit comments

Comments
 (0)