use rchess::{ChessGame, Color, DrawReason, GameResult, Square};
#[test]
fn repetition() {
let mut game = ChessGame::new();
for mv in [
"g1f3", "b8a6", "f3g1", "a6b8", "g1f3", "b8a6", "f3g1", "a6b8",
] {
let mv = game.create_str_move(mv).unwrap();
game.make_move(mv).unwrap();
}
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::ThreefoldRepetition
})
);
}
#[test]
fn stalemate() {
let game = ChessGame::from_fen("1r5k/8/8/8/8/8/7r/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::Stalemate
})
);
}
#[test]
fn checkmate_black() {
let mut game = ChessGame::new();
for mv in ["f2f3", "e7e6", "g2g4", "d8h4"] {
assert!(game.result().is_none());
let mv = game.create_str_move(mv).unwrap();
game.make_move(mv).unwrap();
}
assert_eq!(game.result(), Some(GameResult::BlackWins));
}
#[test]
fn checkmate_white() {
let game = ChessGame::from_fen("R5k1/8/6K1/8/8/8/8/8 b - -").unwrap();
assert_eq!(game.result(), Some(GameResult::WhiteWins));
}
#[test]
fn k_v_k() {
let game = ChessGame::from_fen("7k/8/8/8/8/8/8/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn kn_v_k() {
let game = ChessGame::from_fen("7k/8/8/8/8/2N5/8/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn k_v_kn() {
let game = ChessGame::from_fen("7k/8/8/8/8/2n5/8/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn k_v_kb() {
let game = ChessGame::from_fen("7k/8/b7/8/8/8/8/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn kb_v_k() {
let game = ChessGame::from_fen("7k/8/B7/8/8/8/8/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn kb_v_kb_draw() {
let game = ChessGame::from_fen("7k/8/B7/5b2/8/8/8/K7 w - -").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn kb_v_kb_in_play() {
let game = ChessGame::from_fen("7k/8/B7/b7/8/8/8/K7 w - -").unwrap();
assert!(game.result().is_none());
}
#[test]
fn kn_v_kn() {
let game = ChessGame::from_fen("7k/8/n7/N7/8/8/8/K7 w - -").unwrap();
assert!(game.result().is_none());
}
#[test]
fn insufficient_material() {
let mut game = ChessGame::from_fen("3k4/PK6/8/8/8/8/8/8 w - -").unwrap();
let mv = game.create_str_move("a7a8n").unwrap();
game.make_move(mv).unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::InsufficientMaterial
})
);
}
#[test]
fn fifty_moves() {
let mut game = ChessGame::from_fen("1R4r1/8/8/8/8/8/8/K6k w - -").unwrap();
let mut w_rook_sq = Square::B8;
let mut b_rook_sq = Square::G8;
for _ in 0..4 {
for _ in 0..12 {
let rook_sq = match game.board().turn() {
Color::White => &mut w_rook_sq,
Color::Black => &mut b_rook_sq,
};
let start = *rook_sq;
let end = start.down().unwrap();
*rook_sq = end;
let mv = game.create_move(start, end).unwrap();
game.make_move(mv).unwrap();
}
for _ in 0..12 {
let rook_sq = match game.board().turn() {
Color::White => &mut w_rook_sq,
Color::Black => &mut b_rook_sq,
};
let start = *rook_sq;
let end = start.up().unwrap();
*rook_sq = end;
let mv = game.create_move(start, end).unwrap();
game.make_move(mv).unwrap();
}
let (start, end) = match game.board().turn() {
Color::White => {
let start = w_rook_sq;
let end = w_rook_sq.right().unwrap();
w_rook_sq = end;
(start, end)
}
Color::Black => {
let start = b_rook_sq;
let end = b_rook_sq.left().unwrap();
b_rook_sq = end;
(start, end)
}
};
let mv = game.create_move(start, end).unwrap();
game.make_move(mv).unwrap();
}
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::FiftyMoves
})
);
}
#[test]
fn loaded_halfmoves() {
let game = ChessGame::from_fen("7k/8/1r6/8/8/6R1/8/K7 w - - 100").unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::FiftyMoves
})
);
}
#[test]
fn halfmove_reset() {
let mut game = ChessGame::from_fen("8/8/8/8/8/PK3k2/8/8 w - - 99").unwrap();
game.make_move(game.create_str_move("a3a4").unwrap())
.unwrap();
assert!(game.result().is_none());
}
#[test]
fn halfmove_not_reset() {
let mut game = ChessGame::from_fen("8/8/8/8/8/RK3k2/8/8 w - - 99").unwrap();
game.make_move(game.create_str_move("a3a4").unwrap())
.unwrap();
assert_eq!(
game.result(),
Some(GameResult::Draw {
reason: DrawReason::FiftyMoves
})
);
}