#![allow(clippy::unwrap_used)]
mod compare;
mod inputs;
use compare::{difference, microsofts};
use d3d9_reader::disassemble;
use inputs::{Game, OracleSet};
use primase_testdata::Tree;
fn compare(tree: &Tree, listing: impl Fn(&str) -> String) -> usize {
let programs: Vec<&str> = tree
.names()
.into_iter()
.filter(|n| !n.ends_with(".asm"))
.collect();
let mut differing = Vec::new();
for program in &programs {
let read = |name: &str| tree.read(name).unwrap_or_else(|e| panic!("{name}: {e}"));
let theirs = microsofts(&read(&listing(program)));
match disassemble(&read(program)) {
Ok(ours) => differing.extend(difference(program, &ours, &theirs)),
Err(e) => differing.push(format!("{program}: refused: {e}")),
}
}
assert!(
differing.is_empty(),
"{} of {} listings differ:\n{}",
differing.len(),
programs.len(),
differing.join("\n")
);
programs.len()
}
#[test]
fn shaun_white_sdb2_programs() {
let Some(tree) = inputs::oracle_tree(OracleSet::D3dDisassembler, Game::ShaunWhite, "sdb2") else {
return;
};
assert_eq!(compare(&tree, |program| format!("{program}.asm")), 7306);
}
#[test]
fn general_sm3_programs() {
let Some(tree) = inputs::oracle_tree(OracleSet::D3dDisassembler, Game::General, "sm3") else {
return;
};
let listing = |program: &str| {
let stem = program.rsplit_once('.').map_or(program, |(stem, _)| stem);
format!("{stem}.asm")
};
assert_eq!(compare(&tree, listing), 3);
}