From d9f1fe513e6f7696809d3a9b4d44ca485fe99c97 Mon Sep 17 00:00:00 2001 From: salmonik Date: Thu, 29 Oct 2026 17:18:34 +0100 Subject: v2.1.0: add European roulette with split bets and wheel animation --- tests/client_core.rs | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'tests/client_core.rs') diff --git a/tests/client_core.rs b/tests/client_core.rs index 4749d99..7fb7e29 100644 --- a/tests/client_core.rs +++ b/tests/client_core.rs @@ -47,6 +47,15 @@ impl Screen { self.region_start = None; self.region_len = 0; } + Effect::AnimateRoulette { final_lines, .. } => { + if let Some(start) = self.region_start { + self.lines.truncate(start); + } else { + self.region_start = Some(self.lines.len()); + } + self.lines.extend(final_lines.iter().cloned()); + self.region_len = final_lines.len(); + } Effect::SetPrompt { text, cursor_col } => { self.prompt = text.clone(); self.prompt_cursor = *cursor_col; @@ -125,6 +134,11 @@ impl Harness { self.line(&format!("play slots {bet}")); self.reply("INFO alice 1 1000"); } + + fn enter_roulette(&mut self) { + self.line("play roulette"); + self.reply("INFO alice 1 1000"); + } } #[test] @@ -559,3 +573,77 @@ fn rejects_a_grid_with_the_wrong_size() { assert!(parse_spin_response(response).is_err()); } + +#[test] +fn roulette_split_bets_spin_and_show_the_result() { + let mut h = Harness::new(); + h.enter_roulette(); + + assert_eq!(h.board().len(), 8); + assert_eq!(h.board()[0], "=== ROULETTE ==="); + assert!(h.board()[1].contains("Balance: 1000 PLN")); + assert!(h.board()[1].contains("Chip: 10 PLN")); + assert!(h.board()[2].contains("Bets: (none)")); + + h.key(Key::Char('r')); + h.key(Key::Char('e')); + h.key(Key::Char('1')); + h.key(Key::Char('7')); + h.key(Key::Enter); + + assert!(h.board()[2].contains("RED 10")); + assert!(h.board()[2].contains("EVEN 10")); + assert!(h.board()[2].contains("#17 10")); + assert!(h.board()[2].contains("Total: 30 PLN")); + + h.key(Key::Char(' ')); + let request = h + .sent + .iter() + .find(|line| line.starts_with("PLAY_START roulette")) + .expect("roulette request"); + assert_eq!( + request, + "PLAY_START roulette 30 {\"red\":10,\"black\":0,\"even\":10,\"odd\":0,\"numbers\":[{\"number\":17,\"amount\":10}]}" + ); + + let bets = + r#"{"red":10,"black":0,"even":10,"odd":0,"numbers":[{"number":17,"amount":10}]}"#; + h.reply(&format!( + "ROULETTE_RESULT session-1 360 30 1330 17 black {bets}" + )); + + assert_eq!(h.board().len(), 8); + assert!(h.board()[1].contains("Balance: 1330 PLN")); + assert!(h.board()[4].contains("Winning: 17 BLACK ODD")); + assert!(h.board()[5].contains("Won 360 PLN")); +} + +#[test] +fn roulette_rejects_an_empty_spin_and_accepts_the_equals_chip_key() { + let mut h = Harness::new(); + h.enter_roulette(); + + h.key(Key::Char(' ')); + assert!(h.board()[4].contains("ERROR: Place at least one bet")); + assert!(!h.sent.iter().any(|line| line.starts_with("PLAY_START roulette"))); + + h.key(Key::Char('=')); + assert!(h.board()[1].contains("Chip: 20 PLN")); + h.key(Key::Char('r')); + assert!(h.board()[2].contains("RED 20")); + assert!(h.board()[2].contains("Total: 20 PLN")); +} + +#[test] +fn roulette_rejects_an_out_of_range_number() { + let mut h = Harness::new(); + h.enter_roulette(); + + h.key(Key::Char('9')); + h.key(Key::Char('9')); + h.key(Key::Enter); + + assert!(h.board()[4].contains("ERROR: Number must be 0-36")); + assert!(h.board()[2].contains("Bets: (none)")); +} -- cgit v1.2.3