#![cfg(target_arch = "wasm32")]
use gfcore::{act, get_state, new_bot_game, new_game, new_human_vs_bots_game, step_bot, version};
use wasm_bindgen_test::*;
fn parse(json: &str) -> serde_json::Value {
serde_json::from_str(json).expect("response must be valid JSON")
}
fn is_error(v: &serde_json::Value) -> bool {
v.get("error").is_some()
}
#[wasm_bindgen_test]
fn version_returns_semver() {
let v = version();
assert!(!v.is_empty(), "version must be non-empty");
assert!(
v.contains('.'),
"version must look like semver (contains '.')"
);
}
#[wasm_bindgen_test]
fn new_game_standard_returns_valid_state() {
let json = new_game("Standard", r#"["Alice","Bob"]"#, 0.0);
let state = parse(&json);
assert!(!is_error(&state), "unexpected error: {json}");
assert_eq!(state["current_player"], 0);
assert_eq!(state["phase"], "WaitingForAsk");
assert_eq!(
state["players"].as_array().unwrap().len(),
2,
"must have 2 players"
);
let hand_size = state["players"][0]["hand_size"].as_u64().unwrap();
assert_eq!(hand_size, 7);
}
#[wasm_bindgen_test]
fn new_game_happy_families_returns_valid_state() {
let json = new_game("HappyFamilies", r#"["Alice","Bob"]"#, 0.0);
let state = parse(&json);
assert!(!is_error(&state), "unexpected error: {json}");
assert_eq!(state["phase"], "WaitingForAsk");
let hand_size = state["players"][0]["hand_size"].as_u64().unwrap();
assert_eq!(hand_size, 6);
}
#[wasm_bindgen_test]
fn new_game_quartet_returns_valid_state() {
let json = new_game("Quartet", r#"["Alice","Bob"]"#, 0.0);
let state = parse(&json);
assert!(!is_error(&state), "unexpected error: {json}");
assert_eq!(state["phase"], "WaitingForAsk");
let hand_size = state["players"][0]["hand_size"].as_u64().unwrap();
assert_eq!(hand_size, 8);
}
#[wasm_bindgen_test]
fn new_game_unknown_variant_returns_error() {
let json = new_game("Bogus", r#"["Alice","Bob"]"#, 0.0);
let v = parse(&json);
assert!(
is_error(&v),
"expected error for unknown variant, got: {json}"
);
}
#[wasm_bindgen_test]
fn new_game_bad_player_json_returns_error() {
let json = new_game("Standard", "not-json", 0.0);
let v = parse(&json);
assert!(is_error(&v), "expected error for bad JSON, got: {json}");
}
#[wasm_bindgen_test]
fn get_state_without_game_returns_error() {
let _json = new_game("Standard", r#"["P1","P2"]"#, 0.0);
let state_json = get_state();
let state = parse(&state_json);
assert!(
!is_error(&state),
"get_state after new_game must not error: {state_json}"
);
assert_eq!(state["current_player"], 0);
}
#[wasm_bindgen_test]
fn get_state_consistent_with_new_game() {
let initial = parse(&new_game("Standard", r#"["Alice","Bob"]"#, 0.0));
let state = parse(&get_state());
assert_eq!(initial["phase"], state["phase"]);
assert_eq!(initial["current_player"], state["current_player"]);
}
#[wasm_bindgen_test]
fn new_bot_game_two_bots_returns_valid_state() {
let json = new_bot_game("Standard", 2, 0.0);
let state = parse(&json);
assert!(!is_error(&state), "unexpected error: {json}");
assert_eq!(state["players"].as_array().unwrap().len(), 2);
assert_eq!(state["phase"], "WaitingForAsk");
}
#[wasm_bindgen_test]
fn step_bot_produces_event_or_done() {
let _init = new_bot_game("Standard", 2, 0.0);
let result_json = step_bot();
let result = parse(&result_json);
assert!(
!is_error(&result),
"step_bot must not return error: {result_json}"
);
let done = result["done"]
.as_bool()
.expect("step_bot must have 'done' key");
if !done {
assert!(
result.get("event").is_some(),
"non-done step_bot must include 'event'"
);
}
}
#[wasm_bindgen_test]
fn act_bad_json_returns_error() {
let _init = new_game("Standard", r#"["Alice","Bob"]"#, 0.0);
let result = parse(&act("not-json"));
assert!(is_error(&result), "expected error for bad action JSON");
}
#[wasm_bindgen_test]
fn new_human_vs_bots_game_returns_valid_state() {
let json = new_human_vs_bots_game("Standard", "You", 3, 0.0);
let state = parse(&json);
assert!(!is_error(&state), "unexpected error: {json}");
assert_eq!(state["current_player"], 0);
assert_eq!(state["phase"], "WaitingForAsk");
assert_eq!(
state["players"].as_array().unwrap().len(),
4,
"must have 4 players"
);
assert_eq!(state["players"][0]["name"], "You");
}
#[wasm_bindgen_test]
fn new_human_vs_bots_game_step_bot_done_on_human_turn() {
let _init = new_human_vs_bots_game("Standard", "You", 3, 0.0);
let result = parse(&step_bot());
assert!(!is_error(&result), "step_bot must not error");
assert_eq!(
result["done"], true,
"step_bot must return done:true on human player's turn"
);
}
#[wasm_bindgen_test]
fn new_human_vs_bots_game_unknown_variant_errors() {
let json = new_human_vs_bots_game("Bogus", "You", 3, 0.0);
assert!(is_error(&parse(&json)));
}
#[wasm_bindgen_test]
fn new_human_vs_bots_game_zero_bots_errors() {
let json = new_human_vs_bots_game("Standard", "You", 0, 0.0);
assert!(is_error(&parse(&json)));
}
#[wasm_bindgen_test]
fn two_shuffled_decks_differ() {
let json_a = new_game("Standard", r#"["A","B"]"#, 0.0);
let json_b = new_game("Standard", r#"["A","B"]"#, 0.0);
let a = parse(&json_a);
let b = parse(&json_b);
let hands_a = &a["players"];
let hands_b = &b["players"];
assert!(!is_error(&a), "first deal must not error");
assert!(!is_error(&b), "second deal must not error");
assert_eq!(
hands_a.as_array().unwrap().len(),
hands_b.as_array().unwrap().len()
);
}