diff options
Diffstat (limited to 'cli/src/main.rs')
| -rw-r--r-- | cli/src/main.rs | 105 |
1 files changed, 101 insertions, 4 deletions
diff --git a/cli/src/main.rs b/cli/src/main.rs index 963544c..5a7fd96 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -22,6 +22,12 @@ pub struct PerftTest { pub expected: u64, } +pub struct HashTest { + pub position: &'static str, + pub moves: &'static str, + pub hash: u64, +} + pub const PERFT_TESTS: &[PerftTest; 17] = &[ PerftTest { position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", @@ -112,6 +118,72 @@ pub const PERFT_TESTS: &[PerftTest; 17] = &[ expected: 422333, }, ]; +pub const HASH_TESTS: &[HashTest; 12] = &[ + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "", + hash: 5060803636482931868, + }, + // one moves + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "d2d4", + hash: 9443689642921087454, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "e2e4", + hash: 9384546495678726550, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "c2c4", + hash: 14562399549841627035, + }, + // two moves + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "e2e4 e7e5", + hash: 595762792459712928, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "e2e4 c7c5", + hash: 7227515431820872427, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "e2e4 e7e6", + hash: 17603279437685838276, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "e2e4 c7c6", + hash: 1172755318016414253, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "d2d4 d7d5", + hash: 460664201775194104, + }, + // three moves + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "e2e4 e7e5 g1f3", + hash: 15213300192948443293, + }, + HashTest { + position: "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + moves: "d2d4 d7d5 c2c4", + hash: 9963937660605248767, + }, + // kiwipete + HashTest { + position: "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", + moves: "", + hash: 14109232545397825053, + }, +]; impl ChessEngine { /// Spawns the engine process and initializes UCI mode @@ -186,8 +258,8 @@ fn test_perft(test: &PerftTest, engine: &mut ChessEngine) { let cmd = "perft ".to_string() + &test.depth.to_string(); engine.send_command(&cmd); - let line = engine.read_line(); - let result = parse_perft_result(&line); + let raw = engine.read_line(); + let result: Result<PerftResult> = serde_json::from_str(&raw); match result { Err(err) => { println!("error: {}", err); @@ -208,8 +280,29 @@ fn test_perft(test: &PerftTest, engine: &mut ChessEngine) { } } } -fn parse_perft_result(raw: &str) -> Result<PerftResult> { - serde_json::from_str(raw) + +fn test_hash(test: &HashTest, engine: &mut ChessEngine) { + let cmd = "position fen ".to_string() + &test.position + " moves " + &test.moves; + engine.send_command(&cmd); + + engine.send_command("hash"); + let line = engine.read_line(); + let hash: u64 = match line.trim().parse() { + Ok(num) => num, + Err(_) => { + println!("Failed to parse hash: {}", line); + std::process::exit(1) + } + }; + if hash == test.hash { + println!( + "passed {}: position: {}, moves: {}", + hash, test.position, test.moves + ); + } else { + println!("FAILED position: {}, moves: {}", test.position, test.moves); + std::process::exit(1); + } } fn main() { @@ -227,6 +320,10 @@ fn main() { engine.send_command("isready"); engine.wait_for_response("readyok"); + + for test in HASH_TESTS.iter() { + test_hash(&test, &mut engine); + } for test in PERFT_TESTS.iter() { test_perft(test, &mut engine); } |
