219 lines
5.8 KiB
Rust
219 lines
5.8 KiB
Rust
mod test_utils;
|
|
use std::path::{Path, PathBuf};
|
|
use std::time::Instant;
|
|
use gemma::chip8::computer::Chip8Computer;
|
|
use gemma::chip8::computer_manager::Chip8ComputerManager;
|
|
use gemma::chip8::quirk_modes::QuirkMode;
|
|
use gemma::chip8::quirk_modes::QuirkMode::{Chip8, SChipModern, XOChip};
|
|
use gemma::chip8::registers::Chip8Registers;
|
|
use gemma::constants::{CHIP8_VIDEO_MEMORY, TESTS_ROOT};
|
|
use crate::test_utils::{load_compressed_result, load_result, load_rom};
|
|
|
|
#[test]
|
|
fn smoke() {
|
|
assert!(true)
|
|
}
|
|
|
|
|
|
#[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 level3_compressed_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_compressed_result("gemma_integration.corax_plus.deflated")
|
|
);
|
|
}
|
|
|
|
#[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_compressed_result("gemma_integration_rps_stage1")
|
|
);
|
|
x.keypad.push_key(0x01);
|
|
for _ in 0..0x200 {
|
|
x.step_system();
|
|
}
|
|
assert_eq!(
|
|
x.dump_video_to_string(),
|
|
load_compressed_result("gemma_integration_rps_stage2")
|
|
);
|
|
}
|
|
|
|
#[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")
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn registers_equality() {
|
|
let data_set: Vec<(Chip8Registers, Chip8Registers, bool)> = vec![
|
|
(Chip8Registers::default(), Chip8Registers::default(), true),
|
|
(Chip8Registers {
|
|
registers: [0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,],
|
|
i_register: 0,
|
|
pc: 0,
|
|
},
|
|
Chip8Registers {
|
|
registers:[0x01, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,],
|
|
i_register: 0,
|
|
pc: 0,
|
|
}, false)
|
|
];
|
|
|
|
for (first, second, matches) in data_set.iter() {
|
|
assert_eq!(first == second, *matches)
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn default_test() {
|
|
let new_manager = Chip8ComputerManager::default();
|
|
|
|
assert_eq!(new_manager.core_should_run, false);
|
|
assert_eq!(new_manager.num_cycles(), 0);
|
|
assert_eq!(new_manager.quirks_mode(), Chip8);
|
|
}
|
|
|
|
#[test]
|
|
fn quirks_mode_test() {
|
|
let mut new_manager = Chip8ComputerManager::default();
|
|
|
|
assert_eq!(new_manager.quirks_mode(), Chip8);
|
|
|
|
new_manager.reset(QuirkMode::XOChip);
|
|
|
|
assert_eq!(new_manager.quirks_mode(), XOChip);
|
|
|
|
new_manager.reset(QuirkMode::SChipModern);
|
|
|
|
assert_eq!(new_manager.quirks_mode(), SChipModern);
|
|
|
|
new_manager.reset(Chip8);
|
|
|
|
assert_eq!(new_manager.quirks_mode(), Chip8);
|
|
}
|
|
|
|
#[test]
|
|
fn load_rom_allows_starting() {
|
|
let mut new_manager = Chip8ComputerManager::default();
|
|
assert!(!new_manager.core_should_run);
|
|
let p = format!("{}/../resources/test/roms/1-chip8-logo.ch8" , std::env::current_dir().unwrap().display());
|
|
let full_path = Path::new(p.as_str());
|
|
new_manager.load_new_program_from_disk_to_system_memory(full_path);
|
|
assert!(new_manager.core_should_run)
|
|
}
|
|
|
|
#[test]
|
|
fn reset_clears_run_state() {
|
|
let mut new_manager = Chip8ComputerManager::default();
|
|
let p = format!("{}/../resources/test/roms/1-chip8-logo.ch8", std::env::current_dir().unwrap().display());
|
|
new_manager.load_new_program_from_disk_to_system_memory(Path::new(p.as_str()));
|
|
new_manager.reset(QuirkMode::Chip8);
|
|
assert!(!new_manager.core_should_run);
|
|
}
|
|
|
|
#[test]
|
|
fn tick_when_ready() {
|
|
let mut new_manager = Chip8ComputerManager::default();
|
|
new_manager.load_new_program_from_disk_to_system_memory(Path::new(
|
|
format!("{}/../resources/test/roms/1-chip8-logo.ch8", std::env::current_dir().unwrap().display()).as_str()));
|
|
assert!(new_manager.core_should_run);
|
|
|
|
}
|
|
|
|
#[test]
|
|
fn tick_when_not_ready() {}
|
|
|
|
#[test]
|
|
fn tick_one_step_only() {}
|