179 lines
3.3 KiB
C++
179 lines
3.3 KiB
C++
|
#define DOCTEST_CONFIG_COLORS_NONE
|
||
|
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||
|
#include "doctest.h"
|
||
|
|
||
|
#include "emu.hpp"
|
||
|
|
||
|
TEST_CASE("Test 0x1") {
|
||
|
state.reset();
|
||
|
|
||
|
process_opcode(0x1100);
|
||
|
|
||
|
CHECK(state.PC == 0x100);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x3") {
|
||
|
state.reset();
|
||
|
|
||
|
// set v[1] to 1
|
||
|
process_opcode(0x6101);
|
||
|
|
||
|
// should skip if v[1] == 1
|
||
|
process_opcode(0x3101);
|
||
|
CHECK(state.PC == 0x206);
|
||
|
|
||
|
// should not skip since v[1] != 2
|
||
|
process_opcode(0x3102);
|
||
|
CHECK(state.PC == 0x208);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x4") {
|
||
|
state.reset();
|
||
|
|
||
|
// set v[1] to 1
|
||
|
process_opcode(0x6101);
|
||
|
|
||
|
// should not skip since v[1] == 1
|
||
|
process_opcode(0x4101);
|
||
|
CHECK(state.PC == 0x204);
|
||
|
|
||
|
// should skip since v[1] != 2
|
||
|
process_opcode(0x4102);
|
||
|
CHECK(state.PC == 0x208);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x6") {
|
||
|
state.reset();
|
||
|
|
||
|
process_opcode(0x6199);
|
||
|
|
||
|
CHECK(state.v[1] == 0x99);
|
||
|
CHECK(state.PC == 0x202);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x7") {
|
||
|
state.reset();
|
||
|
|
||
|
// add 1 + 1
|
||
|
process_opcode(0x7101);
|
||
|
process_opcode(0x7101);
|
||
|
|
||
|
CHECK(state.v[1] == 0x02);
|
||
|
CHECK(state.PC == 0x204);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x8XY0") {
|
||
|
state.reset();
|
||
|
|
||
|
// set v[1] to 3
|
||
|
process_opcode(0x6103);
|
||
|
|
||
|
// set v[2] = 4
|
||
|
process_opcode(0x6204);
|
||
|
|
||
|
// set v[1] to v[2]
|
||
|
process_opcode(0x8120);
|
||
|
|
||
|
CHECK(state.v[1] == 0x04);
|
||
|
CHECK(state.PC == 0x206);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0xA") {
|
||
|
state.reset();
|
||
|
|
||
|
process_opcode(0xABCD);
|
||
|
|
||
|
CHECK(state.I == 0xBCD);
|
||
|
CHECK(state.PC == 0x202);
|
||
|
}
|
||
|
|
||
|
// TODO: find a way to test this!!
|
||
|
TEST_CASE("Test 0xC") {
|
||
|
state.reset();
|
||
|
|
||
|
process_opcode(0xC122);
|
||
|
|
||
|
CHECK(state.PC == 0x202);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0xFX07") {
|
||
|
state.reset();
|
||
|
|
||
|
state.delay_timer = 5;
|
||
|
|
||
|
process_opcode(0xF107);
|
||
|
|
||
|
CHECK(state.v[1] == 0x5);
|
||
|
CHECK(state.PC == 0x202);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0xFX1E") {
|
||
|
SUBCASE("") {
|
||
|
state.reset();
|
||
|
|
||
|
state.I = 5;
|
||
|
|
||
|
// set v[1] to 5
|
||
|
process_opcode(0x6105);
|
||
|
|
||
|
process_opcode(0xF11E);
|
||
|
|
||
|
CHECK(state.I == 10);
|
||
|
CHECK(state.PC == 0x204);
|
||
|
}
|
||
|
|
||
|
SUBCASE("Overflow") {
|
||
|
state.reset();
|
||
|
|
||
|
state.I = 4095;
|
||
|
|
||
|
// set v[1] to 5
|
||
|
process_opcode(0x6125);
|
||
|
|
||
|
process_opcode(0xF11E);
|
||
|
|
||
|
CHECK(state.v[0xF] == 1);
|
||
|
CHECK(state.PC == 0x204);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x33") {
|
||
|
SUBCASE("Zero") {
|
||
|
state.reset();
|
||
|
|
||
|
process_opcode(0xF133);
|
||
|
|
||
|
CHECK(state.memory[state.I] == 0);
|
||
|
CHECK(state.PC == 0x202);
|
||
|
}
|
||
|
|
||
|
SUBCASE("Larger than Zero") {
|
||
|
state.reset();
|
||
|
|
||
|
// store 0x65 == 101
|
||
|
process_opcode(0x6165);
|
||
|
|
||
|
process_opcode(0xF133);
|
||
|
|
||
|
CHECK(state.memory[state.I] == 1);
|
||
|
CHECK(state.memory[state.I + 1] == 0);
|
||
|
CHECK(state.memory[state.I + 2] == 1);
|
||
|
CHECK(state.PC == 0x204);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST_CASE("Test 0x65") {
|
||
|
state.reset();
|
||
|
|
||
|
state.memory[state.I] = 0x1;
|
||
|
state.memory[state.I + 1] = 0x2;
|
||
|
state.memory[state.I + 2] = 0x3;
|
||
|
|
||
|
process_opcode(0xF265);
|
||
|
|
||
|
CHECK(state.v[0] == 0x1);
|
||
|
CHECK(state.v[1] == 0x2);
|
||
|
CHECK(state.v[2] == 0x3);
|
||
|
CHECK(state.PC == 0x202);
|
||
|
}
|