From fc59ef77cda14d97d854dfcaa848307cfa512b69 Mon Sep 17 00:00:00 2001 From: salmonik Date: Wed, 28 Oct 2026 23:13:24 +0100 Subject: v1.0.0: replace slots with 5x3 reels and five paylines --- tests/server_core.rs | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'tests/server_core.rs') diff --git a/tests/server_core.rs b/tests/server_core.rs index fe2b3d3..f3736e9 100644 --- a/tests/server_core.rs +++ b/tests/server_core.rs @@ -6,7 +6,7 @@ use zagan_bet::server::database; use zagan_bet::server::games::registry::GameRegistry; use zagan_bet::server::games::slots::SlotsGame; -fn setup(name: &str, reels: &str) -> (ServerCore, String) { +fn setup(name: &str, grid: &str) -> (ServerCore, String) { let path = PathBuf::from(env!("CARGO_TARGET_TMPDIR")) .join(format!("server-core-{name}.db")) .to_string_lossy() @@ -17,12 +17,18 @@ fn setup(name: &str, reels: &str) -> (ServerCore, String) { database::init_db(&conn); let registry = GameRegistry::new(); - registry.register_game(SlotsGame::with_reels(reels)); + registry.register_game(SlotsGame::with_grid(grid)); // Low bcrypt cost keeps the tests fast. (ServerCore::with_registry(conn, registry, 4), path) } +/// Column-major 5x3 grid with no winning line. +const LOSS: &str = "CLOOGDSLCDCOGLS"; + +/// Top line is C C C D D; it pays 2x total bet. +const WIN3: &str = "CCCCLLCLODGSDGS"; + fn register(core: &mut ServerCore, state: &mut ConnectionState, user: &str) { assert_eq!( core.handle_message(state, &format!("REGISTER {user} credential")), @@ -39,7 +45,7 @@ fn login(core: &mut ServerCore, state: &mut ConnectionState, user: &str) { #[test] fn register_stores_a_bcrypt_hash_and_auth_accepts_it() { - let (mut core, path) = setup("register", "CLO"); + let (mut core, path) = setup("register", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); @@ -59,7 +65,7 @@ fn register_stores_a_bcrypt_hash_and_auth_accepts_it() { #[test] fn the_same_credential_gets_a_different_salt() { - let (mut core, path) = setup("salt", "CLO"); + let (mut core, path) = setup("salt", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); @@ -73,7 +79,7 @@ fn the_same_credential_gets_a_different_salt() { #[test] fn legacy_sha256_rows_are_upgraded_on_login() { - let (mut core, path) = setup("legacy", "CLO"); + let (mut core, path) = setup("legacy", LOSS); let conn = Connection::open(&path).unwrap(); database::add_user(&conn, "legacy", "deadbeef").unwrap(); @@ -96,7 +102,7 @@ fn legacy_sha256_rows_are_upgraded_on_login() { #[test] fn duplicate_registration_returns_an_error() { - let (mut core, _path) = setup("duplicate", "CLO"); + let (mut core, _path) = setup("duplicate", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); @@ -108,7 +114,7 @@ fn duplicate_registration_returns_an_error() { #[test] fn a_malicious_username_cannot_change_another_balance() { - let (mut core, _path) = setup("injection", "CLO"); + let (mut core, _path) = setup("injection", LOSS); let mut admin = ConnectionState::default(); register(&mut core, &mut admin, "victim"); @@ -132,7 +138,7 @@ fn a_malicious_username_cannot_change_another_balance() { #[test] fn a_failed_audit_insert_rolls_back_the_balance_change() { - let (mut core, path) = setup("rollback", "CLO"); + let (mut core, path) = setup("rollback", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); login(&mut core, &mut state, "alice"); @@ -155,7 +161,7 @@ fn a_failed_audit_insert_rolls_back_the_balance_change() { #[test] fn spins_write_audit_rows_and_leave_no_sessions() { - let (mut core, _path) = setup("audit", "CLO"); + let (mut core, _path) = setup("audit", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); login(&mut core, &mut state, "alice"); @@ -175,7 +181,7 @@ fn spins_write_audit_rows_and_leave_no_sessions() { #[test] fn a_winning_spin_updates_the_balance_and_the_audit_row() { - let (mut core, _path) = setup("win", "CCC"); + let (mut core, _path) = setup("win", WIN3); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); login(&mut core, &mut state, "alice"); @@ -183,6 +189,7 @@ fn a_winning_spin_updates_the_balance_and_the_audit_row() { let response = core.handle_message(&mut state, "PLAY_START slots 10"); assert!(response.starts_with("GAME_RESULT"), "spin failed: {response}"); assert!(response.contains(" 20 10 1010 "), "response: {response}"); + assert!(response.ends_with(" win 1"), "response: {response}"); assert_eq!(core.balance("alice"), Some(1010)); assert_eq!(core.play_count("alice"), 1); @@ -191,7 +198,7 @@ fn a_winning_spin_updates_the_balance_and_the_audit_row() { #[test] fn insufficient_balance_does_not_write_an_audit_row() { - let (mut core, path) = setup("insufficient", "CLO"); + let (mut core, path) = setup("insufficient", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); login(&mut core, &mut state, "alice"); @@ -211,7 +218,7 @@ fn insufficient_balance_does_not_write_an_audit_row() { #[test] fn a_negative_balance_is_rejected_without_wrapping() { - let (mut core, path) = setup("negative", "CLO"); + let (mut core, path) = setup("negative", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); login(&mut core, &mut state, "alice"); @@ -233,7 +240,7 @@ fn a_negative_balance_is_rejected_without_wrapping() { #[test] fn unknown_games_are_rejected_before_a_session_is_created() { - let (mut core, _path) = setup("unknown", "CLO"); + let (mut core, _path) = setup("unknown", LOSS); let mut state = ConnectionState::default(); register(&mut core, &mut state, "alice"); login(&mut core, &mut state, "alice"); -- cgit v1.2.3