use chs::chess::perft::run_perft; use chs::constants::*; #[derive(Default)] struct TestRunner { passed: usize, failed: usize, } impl TestRunner { fn run_test bool>(&mut self, f: F) { let result = f(); if result { self.passed += 1; } else { self.failed += 1; } } fn summarise(&self) { println!( "Ran {total} tests: {passed} passed, {failed} failed", total = self.passed + self.failed, passed = self.passed, failed = self.failed ); } } fn main() { let mut runner = TestRunner::default(); let mut perft = |fen: &str, depth: u64, expected_positions: u64| { runner.run_test(|| run_perft(fen, depth, expected_positions)) }; // Start position println!("Start position"); perft(START_FEN, 0, 1); perft(START_FEN, 1, 20); perft(START_FEN, 2, 400); perft(START_FEN, 3, 8_902); perft(START_FEN, 4, 197_281); // Other test positions (https://www.chessprogramming.org/Perft_Results) // Position 2 println!("Position 2"); perft(POSITION_2, 1, 48); perft(POSITION_2, 2, 2_039); perft(POSITION_2, 3, 97_862); perft(POSITION_2, 4, 4_085_603); // Position 3 println!("Position 3"); perft(POSITION_3, 1, 14); perft(POSITION_3, 2, 191); perft(POSITION_3, 3, 2_812); perft(POSITION_3, 4, 43_238); perft(POSITION_3, 5, 674_624); perft(POSITION_3, 6, 11_030_083); // Position 4 println!("Position 4"); perft(POSITION_4, 1, 6); perft(POSITION_4, 2, 264); perft(POSITION_4, 3, 9_467); perft(POSITION_4, 4, 422_333); perft(POSITION_4, 5, 15_833_292); // Position 5 println!("Position 5"); perft(POSITION_5, 1, 44); perft(POSITION_5, 2, 1_486); perft(POSITION_5, 3, 62_379); perft(POSITION_5, 4, 2_103_487); // Position 6 println!("Position 6"); perft(POSITION_6, 1, 46); perft(POSITION_6, 2, 2_079); perft(POSITION_6, 3, 89_890); perft(POSITION_6, 4, 3_894_594); runner.summarise(); }