Skip to content

Commit ceed5a8

Browse files
committed
added test for genome printing
1 parent f85d1dc commit ceed5a8

1 file changed

Lines changed: 199 additions & 0 deletions

File tree

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
#include "emp/math/Random.hpp"
2+
3+
#include "../../../sgp_mode/hardware/SGPHardware.h"
4+
#include "../../../sgp_mode/SGPWorld.h"
5+
#include "../../../sgp_mode/SGPWorld.cc"
6+
#include "../../../sgp_mode/SGPWorldSetup.cc"
7+
#include "../../../sgp_mode/SGPWorldData.cc"
8+
#include "../../../sgp_mode/ProgramBuilder.h"
9+
10+
#include "../../../catch/catch.hpp"
11+
12+
#include <array>
13+
#include <string>
14+
15+
TEST_CASE("Test Printing Simple Instructions", "[elias]"){
16+
using world_t = sgpmode::SGPWorld;
17+
using cpu_state_t = sgpmode::CPUState<world_t>;
18+
using hw_spec_t = sgpmode::SGPHardwareSpec<sgpmode::Library, cpu_state_t, world_t>;
19+
using hardware_t = sgpmode::SGPHardware<hw_spec_t>;
20+
using program_t = typename world_t::sgp_prog_t;
21+
using sgp_host_t = sgpmode::SGPHost<hw_spec_t>;
22+
using tag_t = typename hw_spec_t::tag_t;
23+
24+
sgpmode::SymConfigSGP config;
25+
config.CYCLES_PER_UPDATE(0);
26+
config.HOST_REPRO_RES(1);
27+
config.SEED(61);
28+
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
29+
config.FILE_PATH("hardware_test_output");
30+
config.POP_SIZE(1);
31+
config.START_MOI(0);
32+
config.TASK_IO_UNIQUE_OUTPUT(true);
33+
34+
emp::Random random(config.SEED());
35+
world_t world(random, &config);
36+
world.Setup();
37+
auto& prog_builder = world.GetProgramBuilder();
38+
39+
auto& org = world.GetOrg(0);
40+
auto& sgp_host = static_cast<sgp_host_t&>(org);
41+
hardware_t& hw = sgp_host.GetHardware();
42+
43+
std::ostringstream output;
44+
45+
WHEN("Program contains Nop Instruction"){
46+
program_t program;
47+
prog_builder.AddStartAnchor(program);
48+
prog_builder.AddInst(program, "Nop-0", 0);
49+
hw.Reset();
50+
hw.SetProgram(program);
51+
52+
hw.PrintCode(output);
53+
54+
THEN("Global Anchor and Nop Instruction should be printed"){
55+
REQUIRE(output.str() == "AA:\n nop-0 \n");
56+
}
57+
}
58+
WHEN("Program contains Increment Instruction"){
59+
program_t program;
60+
prog_builder.AddStartAnchor(program);
61+
prog_builder.AddInst(program, "Increment", 0);
62+
hw.Reset();
63+
hw.SetProgram(program);
64+
65+
hw.PrintCode(output);
66+
67+
THEN("Global Anchor and Increment Instruction should be printed"){
68+
REQUIRE(output.str() == "AA:\n increment r0\n");
69+
}
70+
}
71+
WHEN("Program contains Decrement Instruction"){
72+
program_t program;
73+
prog_builder.AddStartAnchor(program);
74+
prog_builder.AddInst(program, "Decrement", 0);
75+
hw.Reset();
76+
hw.SetProgram(program);
77+
78+
hw.PrintCode(output);
79+
80+
THEN("Global Anchor and Increment Instruction should be printed"){
81+
REQUIRE(output.str() == "AA:\n decrement r0\n");
82+
}
83+
}
84+
85+
WHEN("Program contains Nand Instruction"){
86+
program_t program;
87+
prog_builder.AddStartAnchor(program);
88+
prog_builder.AddInst(program, "Nand", 0, 1, 0);
89+
hw.Reset();
90+
hw.SetProgram(program);
91+
92+
hw.PrintCode(output);
93+
94+
THEN("Global Anchor and Nand Instruction should be printed"){
95+
REQUIRE(output.str() == "AA:\n nand r0, r1, r0\n");
96+
}
97+
}
98+
}
99+
100+
TEST_CASE("Test Printing Complex Instructions", "[elias]"){
101+
using world_t = sgpmode::SGPWorld;
102+
using cpu_state_t = sgpmode::CPUState<world_t>;
103+
using hw_spec_t = sgpmode::SGPHardwareSpec<sgpmode::Library, cpu_state_t, world_t>;
104+
using hardware_t = sgpmode::SGPHardware<hw_spec_t>;
105+
using program_t = typename world_t::sgp_prog_t;
106+
using sgp_host_t = sgpmode::SGPHost<hw_spec_t>;
107+
using tag_t = typename hw_spec_t::tag_t;
108+
109+
sgpmode::SymConfigSGP config;
110+
config.CYCLES_PER_UPDATE(0);
111+
config.HOST_REPRO_RES(1);
112+
config.SEED(61);
113+
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
114+
config.FILE_PATH("hardware_test_output");
115+
config.POP_SIZE(1);
116+
config.START_MOI(0);
117+
config.TASK_IO_UNIQUE_OUTPUT(true);
118+
119+
emp::Random random(config.SEED());
120+
world_t world(random, &config);
121+
world.Setup();
122+
auto& prog_builder = world.GetProgramBuilder();
123+
124+
auto& org = world.GetOrg(0);
125+
auto& sgp_host = static_cast<sgp_host_t&>(org);
126+
hardware_t& hw = sgp_host.GetHardware();
127+
128+
std::ostringstream output;
129+
130+
WHEN("Program contains JumpIfNEq Instruction"){
131+
program_t program;
132+
tag_t start_tag(prog_builder.GetStartTag());
133+
tag_t tag1("0000000000000000000000000000000000000000000000000000000000000001");
134+
135+
prog_builder.AddStartAnchor(program);
136+
prog_builder.AddInst(program, "Nop-0", 0);
137+
prog_builder.AddInst(program, "Nop-0", 0);
138+
prog_builder.AddInst(program, "Nop-0", 0);
139+
prog_builder.AddInst(program, "Global Anchor", tag1);
140+
prog_builder.AddInst(program, "Nop-0", 0);
141+
prog_builder.AddInst(program, "Nop-0", 0);
142+
prog_builder.AddInst(program, "JumpIfNEq", 0, 1, 0, tag1);
143+
hw.Reset();
144+
hw.SetProgram(program);
145+
146+
hw.PrintCode(output);
147+
148+
THEN("Global Anchor and Nop Instruction should be printed"){
149+
REQUIRE(output.str() == "AA:\n nop-0 \n nop-0 \n nop-0 \nAB:\n nop-0 \n nop-0 \n jumpifneq r0, r1, AB\n");
150+
}
151+
}
152+
153+
WHEN("Program contains JumpIfEq Instruction"){
154+
program_t program;
155+
tag_t start_tag(prog_builder.GetStartTag());
156+
tag_t tag1("0000000000000000000000000000000000000000000000000000000000000001");
157+
158+
prog_builder.AddStartAnchor(program);
159+
prog_builder.AddInst(program, "Nop-0", 0);
160+
prog_builder.AddInst(program, "Nop-0", 0);
161+
prog_builder.AddInst(program, "Nop-0", 0);
162+
prog_builder.AddInst(program, "Global Anchor", tag1);
163+
prog_builder.AddInst(program, "Nop-0", 0);
164+
prog_builder.AddInst(program, "Nop-0", 0);
165+
prog_builder.AddInst(program, "JumpIfEq", 0, 1, 0, tag1);
166+
hw.Reset();
167+
hw.SetProgram(program);
168+
169+
hw.PrintCode(output);
170+
171+
THEN("Global Anchor and Nop Instruction should be printed"){
172+
REQUIRE(output.str() == "AA:\n nop-0 \n nop-0 \n nop-0 \nAB:\n nop-0 \n nop-0 \n jumpifeq r0, r1, AB\n");
173+
}
174+
}
175+
176+
WHEN("Program contains JumpIfLess Instruction"){
177+
program_t program;
178+
tag_t start_tag(prog_builder.GetStartTag());
179+
tag_t tag1("0000000000000000000000000000000000000000000000000000000000000010");
180+
181+
prog_builder.AddStartAnchor(program);
182+
prog_builder.AddInst(program, "Nop-0", 0);
183+
prog_builder.AddInst(program, "Nop-0", 0);
184+
prog_builder.AddInst(program, "Nop-0", 0);
185+
prog_builder.AddInst(program, "Global Anchor", tag1);
186+
prog_builder.AddInst(program, "Nop-0", 0);
187+
prog_builder.AddInst(program, "Nop-0", 0);
188+
prog_builder.AddInst(program, "JumpIfLess", 0, 1, 0, tag1);
189+
hw.Reset();
190+
hw.SetProgram(program);
191+
192+
hw.PrintCode(output);
193+
194+
THEN("Global Anchor and Nop Instruction should be printed"){
195+
REQUIRE(output.str() == "AA:\n nop-0 \n nop-0 \n nop-0 \nAB:\n nop-0 \n nop-0 \n jumpifless r0, r1, AB\n");
196+
}
197+
}
198+
199+
}

0 commit comments

Comments
 (0)