use chironaut::{
action::Action,
game::Game,
rules::{GameRules, GameVariant},
card::Card,
game::GameStage,
};
#[test]
fn test_game_setup() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
let p1 = game.add_player("Player 1".to_string(), 1000).unwrap();
let p2 = game.add_player("Player 2".to_string(), 1000).unwrap();
let p3 = game.add_player("Player 3".to_string(), 1000).unwrap();
assert_eq!(game.players.len(), 3);
assert_eq!(game.players[p1].name, "Player 1");
assert_eq!(game.players[p2].name, "Player 2");
assert_eq!(game.players[p3].name, "Player 3");
assert_eq!(game.players[p1].chips, 1000);
assert_eq!(game.active_player_count, 0); }
#[test]
fn test_starting_hand() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
game.add_player("Player 1".to_string(), 1000).unwrap();
game.add_player("Player 2".to_string(), 1000).unwrap();
game.start_hand().unwrap();
assert_eq!(game.pot, 30); assert_eq!(game.current_bet, 20);
assert_eq!(game.players[0].hand.cards().len(), 2);
assert_eq!(game.players[1].hand.cards().len(), 2);
assert_eq!(game.stage, GameStage::Preflop);
assert_eq!(game.active_player_count, 2);
}
#[test]
fn test_basic_betting_round() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
game.add_player("Player 1".to_string(), 1000).unwrap();
game.add_player("Player 2".to_string(), 1000).unwrap();
game.start_hand().unwrap();
println!("Starting positions - Dealer: {}, Current: {}",
game.dealer_position, game.current_position);
println!("Player 1 bet: {}, Player 2 bet: {}",
game.players[0].bet_amount, game.players[1].bet_amount);
game.handle_action(Action::Bet(10)).unwrap();
println!("After Player 1 calls - players_acted: {:?}, current_bet: {}",
game.players_acted, game.current_bet);
game.handle_action(Action::Bet(0)).unwrap();
println!("After Player 2 checks - players_acted: {:?}, current_bet: {}, is_round_complete: {}, stage: {:?}",
game.players_acted, game.current_bet, game.is_round_complete(), game.stage);
println!("Current game stage: {:?}, community cards: {}",
game.stage, game.community_cards.len());
if game.stage == GameStage::Preflop {
println!("Manually advancing to flop");
game.next_street().unwrap();
}
println!("Flop state - stage: {:?}, community cards: {}",
game.stage, game.community_cards.len());
game.handle_action(Action::Bet(50)).unwrap();
println!("After first player bets - players_acted: {:?}, current_bet: {}",
game.players_acted, game.current_bet);
game.handle_action(Action::Bet(50)).unwrap();
println!("After second player calls - players_acted: {:?}, current_bet: {}, is_round_complete: {}, stage: {:?}",
game.players_acted, game.current_bet, game.is_round_complete(), game.stage);
println!("Current game stage after players act: {:?}, community cards: {}",
game.stage, game.community_cards.len());
if game.stage == GameStage::Flop {
println!("Manually advancing to turn");
game.next_street().unwrap();
}
println!("Turn state - stage: {:?}, community cards: {}",
game.stage, game.community_cards.len());
assert!(game.community_cards.len() >= 3, "Should have at least 3 community cards");
assert_eq!(game.players[0].bet_amount, 0);
assert_eq!(game.players[1].bet_amount, 0);
}
#[test]
fn test_folding() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
game.add_player("Player 1".to_string(), 1000).unwrap();
game.add_player("Player 2".to_string(), 1000).unwrap();
game.start_hand().unwrap();
let dealer_pos = game.dealer_position;
let non_dealer_pos = (dealer_pos + 1) % 2;
let initial_pot = game.pot; let p1_chips = game.players[dealer_pos].chips;
let p2_chips = game.players[non_dealer_pos].chips;
println!("Initial pot: {}, P1 chips: {}, P2 chips: {}",
initial_pot, p1_chips, p2_chips);
println!("Dealer position: {}, Current position: {}",
game.dealer_position, game.current_position);
game.handle_action(Action::Fold).unwrap();
assert!(game.is_round_complete());
println!("Game stage after fold: {:?}", game.stage);
assert_eq!(game.stage, GameStage::Showdown);
if game.pot > 0 {
println!("Manually evaluating winner to distribute pot");
game.evaluate_winner();
}
println!("P1 final chips: {}, P2 final chips: {}",
game.players[dealer_pos].chips,
game.players[non_dealer_pos].chips);
if game.current_position == dealer_pos {
assert_eq!(game.players[non_dealer_pos].chips, p2_chips + initial_pot);
} else {
assert_eq!(game.players[dealer_pos].chips, p1_chips + initial_pot);
}
assert_eq!(game.pot, 0);
}
#[test]
fn test_complete_hand() {
let rules = GameRules::nlhe(10, 20);
let mut game = Game::new(rules);
game.add_player("Player 1".to_string(), 1000).unwrap();
game.add_player("Player 2".to_string(), 1000).unwrap();
game.start_hand().unwrap();
game.handle_action(Action::Bet(10)).unwrap();
game.handle_action(Action::Bet(0)).unwrap();
if game.stage == GameStage::Preflop {
game.next_street().unwrap();
}
game.handle_action(Action::Bet(0)).unwrap();
game.handle_action(Action::Bet(0)).unwrap();
if game.stage == GameStage::Flop {
game.next_street().unwrap();
}
game.handle_action(Action::Bet(0)).unwrap();
game.handle_action(Action::Bet(0)).unwrap();
if game.stage == GameStage::Turn {
game.next_street().unwrap();
}
println!("Stage after river deal: {:?}", game.stage);
game.handle_action(Action::Bet(0)).unwrap();
game.handle_action(Action::Bet(0)).unwrap();
println!("Stage after river betting: {:?}", game.stage);
if game.stage != GameStage::Showdown {
println!("Manually advancing to showdown");
game.stage = GameStage::Showdown;
game.evaluate_winner();
}
assert_eq!(game.stage, GameStage::Showdown);
println!("Final pot: {}", game.pot);
assert_eq!(game.pot, 0);
let total_chips = game.players[0].chips + game.players[1].chips;
assert_eq!(total_chips, 2000); }