diff options
| author | salmonik <salmonik@tuta.io> | 2026-10-29 17:18:34 +0100 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-10-29 17:18:34 +0100 |
| commit | d9f1fe513e6f7696809d3a9b4d44ca485fe99c97 (patch) | |
| tree | 9da99200fdfe004a47056d10340b3f59c7ccc52e /tests/server_core.rs | |
| parent | v2.0.0: reset plays audit to a generic per-game schema (diff) | |
| download | zagan-bet-d9f1fe513e6f7696809d3a9b4d44ca485fe99c97.tar.gz zagan-bet-d9f1fe513e6f7696809d3a9b4d44ca485fe99c97.zip | |
v2.1.0: add European roulette with split bets and wheel animation
Diffstat (limited to '')
| -rw-r--r-- | tests/server_core.rs | 59 |
1 files changed, 59 insertions, 0 deletions
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; | |||
| 4 | use zagan_bet::server::core::{ConnectionState, ServerCore}; | 4 | use zagan_bet::server::core::{ConnectionState, ServerCore}; |
| 5 | use zagan_bet::server::database; | 5 | use zagan_bet::server::database; |
| 6 | use zagan_bet::server::games::registry::GameRegistry; | 6 | use zagan_bet::server::games::registry::GameRegistry; |
| 7 | use zagan_bet::server::games::roulette::RouletteGame; | ||
| 7 | use zagan_bet::server::games::slots::SlotsGame; | 8 | use zagan_bet::server::games::slots::SlotsGame; |
| 9 | use zagan_bet::roulette::Bets; | ||
| 8 | 10 | ||
| 9 | fn setup(name: &str, grid: &str) -> (ServerCore, String) { | 11 | fn setup(name: &str, grid: &str) -> (ServerCore, String) { |
| 10 | let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) | 12 | let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) |
| @@ -29,6 +31,22 @@ const LOSS: &str = "CLOOGDSLCDCOGLS"; | |||
| 29 | /// Top line is C C C D D; it pays 2x total bet. | 31 | /// Top line is C C C D D; it pays 2x total bet. |
| 30 | const WIN3: &str = "CCCCLLCLODGSDGS"; | 32 | const WIN3: &str = "CCCCLLCLODGSDGS"; |
| 31 | 33 | ||
| 34 | fn setup_roulette(name: &str, number: u8) -> (ServerCore, String) { | ||
| 35 | let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) | ||
| 36 | .join(format!("server-core-{name}.db")) | ||
| 37 | .to_string_lossy() | ||
| 38 | .into_owned(); | ||
| 39 | let _ = std::fs::remove_file(&path); | ||
| 40 | |||
| 41 | let conn = Connection::open(&path).unwrap(); | ||
| 42 | database::init_db(&conn); | ||
| 43 | |||
| 44 | let registry = GameRegistry::new(); | ||
| 45 | registry.register_game(RouletteGame::with_result(number)); | ||
| 46 | |||
| 47 | (ServerCore::with_registry(conn, registry, 4), path) | ||
| 48 | } | ||
| 49 | |||
| 32 | fn register(core: &mut ServerCore, state: &mut ConnectionState, user: &str) { | 50 | fn register(core: &mut ServerCore, state: &mut ConnectionState, user: &str) { |
| 33 | assert_eq!( | 51 | assert_eq!( |
| 34 | core.handle_message(state, &format!("REGISTER {user} credential")), | 52 | core.handle_message(state, &format!("REGISTER {user} credential")), |
| @@ -164,6 +182,47 @@ fn plays_record_the_game_type_and_game_specific_details() { | |||
| 164 | } | 182 | } |
| 165 | 183 | ||
| 166 | #[test] | 184 | #[test] |
| 185 | fn roulette_settles_split_bets_and_records_details() { | ||
| 186 | let (mut core, path) = setup_roulette("roulette", 17); | ||
| 187 | let mut state = ConnectionState::default(); | ||
| 188 | register(&mut core, &mut state, "alice"); | ||
| 189 | login(&mut core, &mut state, "alice"); | ||
| 190 | |||
| 191 | let bets = | ||
| 192 | r#"{"red":10,"black":10,"even":10,"odd":10,"numbers":[{"number":17,"amount":5}]}"#; | ||
| 193 | let response = core.handle_message(&mut state, &format!("PLAY_START roulette 45 {bets}")); | ||
| 194 | |||
| 195 | assert!( | ||
| 196 | response.starts_with("ROULETTE_RESULT"), | ||
| 197 | "response: {response}" | ||
| 198 | ); | ||
| 199 | assert!( | ||
| 200 | response.contains(" 220 45 1175 17 black "), | ||
| 201 | "response: {response}" | ||
| 202 | ); | ||
| 203 | assert!(response.ends_with(&format!(" {bets}")), "response: {response}"); | ||
| 204 | assert_eq!(core.balance("alice"), Some(1175)); | ||
| 205 | assert_eq!(core.play_count("alice"), 1); | ||
| 206 | assert_eq!(core.session_count(), 0); | ||
| 207 | |||
| 208 | let conn = Connection::open(&path).unwrap(); | ||
| 209 | let (game_type, details): (String, String) = conn | ||
| 210 | .query_row( | ||
| 211 | "SELECT game_type, details FROM plays WHERE username = 'alice'", | ||
| 212 | [], | ||
| 213 | |row| Ok((row.get(0)?, row.get(1)?)), | ||
| 214 | ) | ||
| 215 | .unwrap(); | ||
| 216 | |||
| 217 | assert_eq!(game_type, "roulette"); | ||
| 218 | let details: serde_json::Value = serde_json::from_str(&details).unwrap(); | ||
| 219 | assert_eq!(details["number"], "17"); | ||
| 220 | assert_eq!(details["color"], "black"); | ||
| 221 | let stored: Bets = serde_json::from_str(details["bets"].as_str().unwrap()).unwrap(); | ||
| 222 | assert_eq!(stored.total(), 45); | ||
| 223 | } | ||
| 224 | |||
| 225 | #[test] | ||
| 167 | fn a_failed_audit_insert_rolls_back_the_balance_change() { | 226 | fn a_failed_audit_insert_rolls_back_the_balance_change() { |
| 168 | let (mut core, path) = setup("rollback", LOSS); | 227 | let (mut core, path) = setup("rollback", LOSS); |
| 169 | let mut state = ConnectionState::default(); | 228 | let mut state = ConnectionState::default(); |
