aboutsummaryrefslogtreecommitdiff
path: root/cli/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src/main.rs')
-rw-r--r--cli/src/main.rs105
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);
}