use chironaut::{
action::Action,
game::Game,
rules::GameRules,
game::GameStage,
};
#[test]
fn test_force_win_basic() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
let p1 = game.add_player_to_seat("Player 1".to_string(), 1000, 0).unwrap();
let p2 = game.add_player_to_seat("Player 2".to_string(), 1000, 2).unwrap();
let p3 = game.add_player_to_seat("Player 3".to_string(), 1000, 4).unwrap();
assert_eq!(game.players[p1].seat_position, 0);
assert_eq!(game.players[p2].seat_position, 2);
assert_eq!(game.players[p3].seat_position, 4);
game.start_hand().unwrap();
let initial_pot = game.pot; let initial_chips = game.players.iter().map(|p| p.chips).collect::<Vec<_>>();
println!("Initial state:");
println!("Pot: {}", initial_pot);
for (i, chips) in initial_chips.iter().enumerate() {
println!("Player {} chips: {}", i, chips);
}
let winning_seat = 2;
let result = game.force_win(winning_seat).unwrap();
assert_eq!(game.stage, GameStage::Showdown);
let active_players: Vec<usize> = game.players.iter()
.enumerate()
.filter(|(_, p)| !p.is_folded)
.map(|(i, _)| i)
.collect();
assert_eq!(active_players.len(), 1);
assert_eq!(game.players[active_players[0]].seat_position, winning_seat);
assert_eq!(game.pot, 0);
let winner_index = active_players[0];
let expected_winnings = initial_chips[winner_index] + initial_pot;
assert_eq!(game.players[winner_index].chips, expected_winnings);
assert_eq!(result.winners.len(), 1);
assert_eq!(result.winners[0], winner_index);
assert_eq!(result.pot_distributions.len(), 1);
assert_eq!(result.pot_distributions[0].chips_per_winner, initial_pot);
assert_eq!(result.disbursements.len(), 1);
assert_eq!(result.disbursements[0].player, winner_index);
assert_eq!(result.disbursements[0].total_won, initial_pot);
}
#[test]
fn test_force_win_after_betting() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
game.add_player_to_seat("Player 1".to_string(), 1000, 0).unwrap();
game.add_player_to_seat("Player 2".to_string(), 1000, 2).unwrap();
game.add_player_to_seat("Player 3".to_string(), 1000, 4).unwrap();
game.start_hand().unwrap();
game.handle_action(Action::Bet(100)).unwrap();
let current_bet = game.current_bet;
let player_bet = game.players[game.current_position].bet_amount;
let call_amount = current_bet - player_bet;
game.handle_action(Action::Bet(call_amount)).unwrap();
let current_bet = game.current_bet;
let player_bet = game.players[game.current_position].bet_amount;
let call_amount = current_bet - player_bet;
game.handle_action(Action::Bet(call_amount)).unwrap();
let pot_after_betting = game.pot;
println!("Pot after betting: {}", pot_after_betting);
let chips_before = game.players.iter().map(|p| p.chips).collect::<Vec<_>>();
let winning_seat = 4;
let winner_idx = game.players.iter().position(|p| p.seat_position == winning_seat).unwrap();
let result = game.force_win(winning_seat).unwrap();
assert_eq!(game.players[winner_idx].chips, chips_before[winner_idx] + pot_after_betting);
assert_eq!(game.pot, 0);
assert_eq!(result.winners.len(), 1);
assert_eq!(result.winners[0], winner_idx);
assert_eq!(result.disbursements[0].total_won, pot_after_betting);
}
#[test]
fn test_force_win_errors() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
game.add_player_to_seat("Player 1".to_string(), 1000, 0).unwrap();
game.add_player_to_seat("Player 2".to_string(), 1000, 3).unwrap();
assert_eq!(game.pot, 0); assert_eq!(game.community_cards.len(), 0);
let result = game.force_win(0);
assert!(result.is_err(), "force_win should fail before hand starts");
game.start_hand().unwrap();
let result = game.force_win(7);
assert!(result.is_err(), "force_win should fail for non-existent seat");
game.force_win(0).unwrap();
assert_eq!(game.stage, GameStage::Showdown, "Game should be at showdown stage");
let result = game.force_win(0);
assert!(result.is_err(), "force_win should fail after showdown");
}