use chironaut::{
action::Action,
game::Game,
rules::GameRules,
game::GameStage,
};
#[test]
fn test_basic_game_flow() {
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, 1).unwrap();
game.add_player_to_seat("Player 3".to_string(), 1000, 2).unwrap();
game.start_hand().unwrap();
println!("\nInitial game state:");
println!("Dealer position: {}", game.dealer_position);
println!("SB position: {}", (game.dealer_position + 1) % 3);
println!("BB position: {}", (game.dealer_position + 2) % 3);
println!("UTG position: {}", (game.dealer_position + 3) % 3);
println!("Current position: {}", game.current_position);
println!("\nUTG calls:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(20)).unwrap();
println!("Pot: {}", game.pot);
println!("\nSB raises:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(40)).unwrap(); println!("Pot: {}", game.pot);
println!("\nBB calls:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(30)).unwrap(); println!("Pot: {}", game.pot);
println!("\nUTG calls the raise:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(30)).unwrap(); println!("Pot: {}", game.pot);
println!("Game stage: {:?}, is_round_complete: {}",
game.stage, game.is_round_complete());
println!("\nMoving to flop");
if game.stage == GameStage::Preflop {
game.next_street().unwrap();
}
assert_eq!(game.stage, GameStage::Flop);
assert_eq!(game.community_cards.len(), 3);
println!("Community cards: {} {} {}",
game.community_cards[0],
game.community_cards[1],
game.community_cards[2]);
println!("Current position at flop: {} ({})",
game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(0)).unwrap();
println!("\nSecond player bets:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(50)).unwrap();
println!("Pot: {}", game.pot);
println!("\nThird player folds:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Fold).unwrap();
println!("\nFirst player calls:");
println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(50)).unwrap();
println!("Pot: {}", game.pot);
println!("Game stage: {:?}, is_round_complete: {}",
game.stage, game.is_round_complete());
println!("\nManually moving to turn");
if game.stage == GameStage::Flop {
game.next_street().unwrap();
}
println!("\nPot after flop: {}", game.pot);
println!("\nCompleting hand to showdown");
for _ in 0..2 { println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(0)).unwrap();
}
println!("\nManually moving to river");
if game.stage == GameStage::Turn {
game.next_street().unwrap();
}
for _ in 0..2 { println!("Player at position {}: {}", game.current_position,
game.players[game.current_position].name);
game.handle_action(Action::Bet(0)).unwrap();
}
println!("\nManually moving to showdown");
if game.stage == GameStage::River {
game.stage = GameStage::Showdown;
game.evaluate_winner();
}
println!("\nFinal state:");
println!("Stage: {:?}", game.stage);
println!("Pot: {}", game.pot);
println!("Community cards: {} {} {} {} {}",
game.community_cards[0],
game.community_cards[1],
game.community_cards[2],
game.community_cards[3],
game.community_cards[4]);
for (i, player) in game.players.iter().enumerate() {
println!("Player {}: {}, Chips: {}, Folded: {}, All-in: {}",
i, player.name, player.chips, player.is_folded, player.is_all_in);
}
}