trevors_chip8_toy/gemma/tests/computer_tests.rs
Trevor Merritt 67ca71ccb7 my first schip rom works in my schip emulator.
BUGFIX: Corrects runaway after drawing in my first schip rom
scroll down, left, right all test with test rom
assembler now assembles to the expected output it seems
fixes incorrect loading of schip font to memory
replaces schip font from new chatgpt feedback
2024-11-06 10:40:52 -05:00

120 lines
2.8 KiB
Rust

use gemma::chip8::computer::Chip8Computer;
use gemma::constants::CHIP8_VIDEO_MEMORY;
#[test]
fn smoke() {
assert!(true)
}
fn load_result(to_load: &str) -> String {
std::fs::read_to_string(format!("../resources/test/{}", to_load)).unwrap()
}
fn load_rom(to_load: &str) -> Vec<u8> {
std::fs::read(format!("../resources/roms/{}", to_load)).unwrap()
}
#[test]
fn reset_clears_video() {
let mut x = Chip8Computer::new();
for i in 0..CHIP8_VIDEO_MEMORY {
x.video_memory.poke(i as u16, i % 2 == 0);
}
x.reset(gemma::chip8::quirk_modes::QuirkMode::Chip8);
x.video_memory.reset();
assert_eq!(x.dump_video_to_string(), x.video_memory.format_as_string());
for i in 0..CHIP8_VIDEO_MEMORY {
assert!(!x.video_memory.peek(i as u16));
}
}
#[test]
fn level1_test() {
let mut x = Chip8Computer::new();
let level_1_rom = load_rom("1-chip8-logo.ch8");
x.load_bytes_to_memory(0x200, (&level_1_rom));
// run for 0x40 cycles
while x.num_cycles < 0x40 {
x.step_system();
}
assert_eq!(
x.dump_video_to_string(),
load_result("gemma_integration_level_1_test.asc")
);
}
#[test]
fn level2_test() {
let mut x = Chip8Computer::new();
// Load the IBM rom and run it.
// it takes 39 cycles to get to the end so lets run it 40.
let test_rom_to_run = load_rom("2-ibm-logo.ch8");
x.load_bytes_to_memory(0x200, (&test_rom_to_run));
for _ in 0..40 {
x.step_system();
}
// ...then verify that the current video memory of the chip-8
// simulator matches what we expect it to be
assert_eq!(
x.dump_video_to_string(),
load_result("gemma_integration_ibm_rom_output.asc")
);
}
#[test]
fn level3_test() {
let mut x = Chip8Computer::new();
x.load_bytes_to_memory(0x200, (&load_rom("3-corax+.ch8")));
for i in 0..0x180 {
x.step_system();
}
assert_eq!(
x.dump_video_to_string(),
load_result("gemma_integration_corax_plus.asc")
);
}
#[test]
fn rps_test() {
let mut x = Chip8Computer::new();
x.load_bytes_to_memory(0x200, &load_rom("RPS.ch8"));
for _ in 0..0xF0 {
x.step_system();
}
assert_eq!(
x.dump_video_to_string(),
load_result("gemma_integration_rps_stage1.asc")
);
x.keypad.push_key(0x01);
for _ in 0..0x200 {
x.step_system();
}
assert_eq!(
x.dump_video_to_string(),
load_result("gemma_integration_rps_stage2.asc")
);
}
#[test]
fn level4_test() {
// flags
let mut x = Chip8Computer::new();
x.load_bytes_to_memory(0x200, &load_rom("4-flags.ch8"));
for _ in 0..0x400 {
x.step_system();
}
assert_eq!(
x.dump_video_to_string(),
load_result("gemma_integration_flags.asc")
);
}