Spaces:
Running
Running
| use crate::core::logic::*; | |
| use crate::core::enums::*; | |
| fn test_exile_zone_exists() { | |
| let mut state = GameState::default(); | |
| // Test that we can access and modify the exile zone | |
| state.players[0].exile.push(100); | |
| assert_eq!(state.players[0].exile.len(), 1); | |
| assert_eq!(state.players[0].exile[0], 100); | |
| } | |
| fn test_rule_10_5_3_orphan_energy_cleanup() { | |
| let mut state = GameState::default(); | |
| // Setup: Slot 0 has no member (-1) but has energy [10, 20] | |
| state.players[0].stage[0] = -1; | |
| state.players[0].stage_energy[0] = vec![10, 20]; | |
| state.players[0].stage_energy_count[0] = 2; // Although count is derived or tracked separately, let's set it | |
| // Setup: Energy deck is empty | |
| state.players[0].energy_deck = vec![]; | |
| // Ensure state before rule check | |
| assert!(!state.players[0].stage_energy[0].is_empty()); | |
| assert_eq!(state.players[0].energy_deck.len(), 0); | |
| // Execution | |
| state.process_rule_checks(); | |
| // Assertion | |
| // 1. Stage energy should be empty | |
| assert!(state.players[0].stage_energy[0].is_empty(), "Orphan energy should be removed from stage"); | |
| assert_eq!(state.players[0].stage_energy_count[0], 0, "Energy count should be reset"); | |
| // 2. Energy deck should contain the energy cards | |
| assert_eq!(state.players[0].energy_deck.len(), 2, "Energy deck should receive the orphan energy"); | |
| // Since we shuffle, we check containment | |
| assert!(state.players[0].energy_deck.contains(&10)); | |
| assert!(state.players[0].energy_deck.contains(&20)); | |
| } | |
| fn test_play_member_from_hand_opcode_preserves_energy() { | |
| let mut state = GameState::default(); | |
| // Setup | |
| // Slot 0 has member 999 and Energy [10, 20] | |
| state.players[0].stage[0] = 999; | |
| state.players[0].stage_energy[0] = vec![10, 20]; | |
| state.players[0].stage_energy_count[0] = 2; | |
| state.players[0].hand = vec![888]; // Card to play | |
| let db = CardDatabase { | |
| members: std::collections::HashMap::new(), | |
| lives: std::collections::HashMap::new(), | |
| members_vec: vec![], | |
| lives_vec: vec![], | |
| }; | |
| // Opcode: O_PLAY_MEMBER_FROM_HAND (57) | |
| // Args: none (uses ctx) | |
| let bytecode = vec![O_PLAY_MEMBER_FROM_HAND, 0, 0, 0, O_RETURN, 0, 0, 0]; | |
| let ctx = AbilityContext { | |
| player_id: 0, | |
| choice_index: 0, // Hand index 0 (Card 888) | |
| target_slot: 0, // Target Slot 0 | |
| ..AbilityContext::default() | |
| }; | |
| state.resolve_bytecode(&db, &bytecode, &ctx); | |
| // Assertions | |
| // 1. Old member 999 should be in discard | |
| assert_eq!(state.players[0].discard.len(), 1); | |
| assert_eq!(state.players[0].discard[0], 999); | |
| // 2. New member 888 should be in slot 0 | |
| assert_eq!(state.players[0].stage[0], 888); | |
| // 3. Energy should remain! | |
| assert_eq!(state.players[0].stage_energy[0].len(), 2, "Energy should be preserved"); | |
| assert_eq!(state.players[0].stage_energy[0][0], 10); | |
| assert_eq!(state.players[0].stage_energy[0][1], 20); | |
| assert_eq!(state.players[0].stage_energy_count[0], 2); | |
| } | |