Spaces:
Running
Running
| use crate::core::logic::*; | |
| use crate::core::enums::*; | |
| const TEST_CARDS: &str = r#"{ | |
| "member_db": { | |
| "0": { | |
| "card_id": 0, | |
| "card_no": "TEST-001", | |
| "name": "Test Member", | |
| "cost": 2, | |
| "hearts": [1, 0, 0, 0, 0, 0, 0], | |
| "blade_hearts": [0, 0, 0, 0, 0, 0, 0], | |
| "blades": 1, | |
| "groups": [], | |
| "units": [], | |
| "abilities": [], | |
| "rare": "R", | |
| "volume_icons": 0, | |
| "draw_icons": 0 | |
| } | |
| }, | |
| "live_db": { | |
| "11000": { | |
| "card_id": 11000, | |
| "card_no": "LIVE-001", | |
| "name": "Test Live", | |
| "score": 1, | |
| "required_hearts": [1, 0, 0, 0, 0, 0, 0], | |
| "abilities": [], | |
| "groups": [], | |
| "units": [], | |
| "volume_icons": 0, | |
| "blade_hearts": [0, 0, 0, 0, 0, 0, 0] | |
| } | |
| } | |
| }"#; | |
| fn test_database_load() { | |
| let db = CardDatabase::from_json(TEST_CARDS).unwrap(); | |
| assert_eq!(db.members.len(), 1); | |
| assert_eq!(db.lives.len(), 1); | |
| assert_eq!(db.members[&0].name, "Test Member"); | |
| } | |
| fn test_game_initialization() { | |
| let db = CardDatabase::from_json(TEST_CARDS).unwrap(); | |
| let mut state = GameState { | |
| players: [ | |
| PlayerState { | |
| player_id: 0, | |
| ..PlayerState::default() | |
| }, | |
| PlayerState { | |
| player_id: 1, | |
| ..PlayerState::default() | |
| }, | |
| ], | |
| ..GameState::default() | |
| }; | |
| state.initialize_game( | |
| vec![0; 10], // P0 Deck | |
| vec![0; 10], // P1 Deck | |
| vec![0; 5], // P0 Energy | |
| vec![0; 5], // P1 Energy | |
| vec![11000], // P0 Lives | |
| vec![11000], // P1 Lives | |
| ); | |
| assert_eq!(state.players[0].hand.len(), 6); | |
| assert_eq!(state.players[0].energy_zone.len(), 3); // Based on logic.rs (3 energy) | |
| // Lives are mixed into deck in current implementation, not placed in live_zone | |
| // assert_eq!(state.players[0].live_zone[0], 11000); | |
| assert!(state.players[0].deck.contains(&11000) || state.players[0].hand.contains(&11000)); | |
| } | |
| fn test_play_member() { | |
| let db = CardDatabase::from_json(TEST_CARDS).unwrap(); | |
| let mut state = GameState { | |
| players: [ | |
| PlayerState { | |
| player_id: 0, | |
| hand: vec![0], | |
| energy_zone: vec![0, 0], | |
| tapped_energy: vec![false, false], | |
| ..PlayerState::default() | |
| }, | |
| PlayerState { | |
| player_id: 1, | |
| ..PlayerState::default() | |
| }, | |
| ], | |
| phase: Phase::Main, | |
| ..GameState::default() | |
| }; | |
| // Play card 0 (cost 2) to slot 0 | |
| state.play_member(&db, 0, 0).unwrap(); | |
| assert_eq!(state.players[0].stage[0], 0); | |
| assert_eq!(state.players[0].hand.len(), 0); | |
| assert_eq!(state.players[0].tapped_energy.iter().filter(|&&t| t).count(), 2); | |
| } | |
| fn test_performance_phase() { | |
| let db = CardDatabase::from_json(TEST_CARDS).unwrap(); | |
| let mut state = GameState { | |
| players: [ | |
| PlayerState { | |
| player_id: 0, | |
| deck: vec![0], // Deck for yelling | |
| live_zone: [11000, -1, -1], | |
| stage: [0, -1, -1], | |
| ..PlayerState::default() | |
| }, | |
| PlayerState { | |
| player_id: 1, | |
| ..PlayerState::default() | |
| }, | |
| ], | |
| phase: Phase::PerformanceP1, | |
| ..GameState::default() | |
| }; | |
| state.do_performance_phase(&db); | |
| // After performance, if successful, the live should remain in live_zone | |
| // It is moved to success_lives only in LiveResult phase | |
| assert_eq!(state.players[0].live_zone[0], 11000); | |
| assert_eq!(state.players[0].current_turn_volume, 0); // Icons: 0 | |
| } | |