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/server_core.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'tests/server_core.rs') diff --git a/tests/server_core.rs b/tests/server_core.rs index cab74a7..cf05102 100644 --- a/tests/server_core.rs +++ b/tests/server_core.rs @@ -4,7 +4,9 @@ use rusqlite::Connection; use zagan_bet::server::core::{ConnectionState, ServerCore}; use zagan_bet::server::database; use zagan_bet::server::games::registry::GameRegistry; +use zagan_bet::server::games::roulette::RouletteGame; use zagan_bet::server::games::slots::SlotsGame; +use zagan_bet::roulette::Bets; fn setup(name: &str, grid: &str) -> (ServerCore, String) { let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) @@ -29,6 +31,22 @@ const LOSS: &str = "CLOOGDSLCDCOGLS"; /// Top line is C C C D D; it pays 2x total bet. const WIN3: &str = "CCCCLLCLODGSDGS"; +fn setup_roulette(name: &str, number: u8) -> (ServerCore, String) { + let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) + .join(format!("server-core-{name}.db")) + .to_string_lossy() + .into_owned(); + let _ = std::fs::remove_file(&path); + + let conn = Connection::open(&path).unwrap(); + database::init_db(&conn); + + let registry = GameRegistry::new(); + registry.register_game(RouletteGame::with_result(number)); + + (ServerCore::with_registry(conn, registry, 4), path) +} + fn register(core: &mut ServerCore, state: &mut ConnectionState, user: &str) { assert_eq!( core.handle_message(state, &format!("REGISTER {user} credential")), @@ -163,6 +181,47 @@ fn plays_record_the_game_type_and_game_specific_details() { assert_eq!(details["win_cells"], "0,3,6"); } +#[test] +fn roulette_settles_split_bets_and_records_details() { + let (mut core, path) = setup_roulette("roulette", 17); + let mut state = ConnectionState::default(); + register(&mut core, &mut state, "alice"); + login(&mut core, &mut state, "alice"); + + let bets = + r#"{"red":10,"black":10,"even":10,"odd":10,"numbers":[{"number":17,"amount":5}]}"#; + let response = core.handle_message(&mut state, &format!("PLAY_START roulette 45 {bets}")); + + assert!( + response.starts_with("ROULETTE_RESULT"), + "response: {response}" + ); + assert!( + response.contains(" 220 45 1175 17 black "), + "response: {response}" + ); + assert!(response.ends_with(&format!(" {bets}")), "response: {response}"); + assert_eq!(core.balance("alice"), Some(1175)); + assert_eq!(core.play_count("alice"), 1); + assert_eq!(core.session_count(), 0); + + let conn = Connection::open(&path).unwrap(); + let (game_type, details): (String, String) = conn + .query_row( + "SELECT game_type, details FROM plays WHERE username = 'alice'", + [], + |row| Ok((row.get(0)?, row.get(1)?)), + ) + .unwrap(); + + assert_eq!(game_type, "roulette"); + let details: serde_json::Value = serde_json::from_str(&details).unwrap(); + assert_eq!(details["number"], "17"); + assert_eq!(details["color"], "black"); + let stored: Bets = serde_json::from_str(details["bets"].as_str().unwrap()).unwrap(); + assert_eq!(stored.total(), 45); +} + #[test] fn a_failed_audit_insert_rolls_back_the_balance_change() { let (mut core, path) = setup("rollback", LOSS); -- cgit v1.2.3