use crate::core::logic::*; use crate::core::enums::*; #[test] 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); } #[test] 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)); } #[test] 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); }