use manasight_parser::events::GameEvent;
use manasight_parser::log::entry::{EntryHeader, LogEntry};
use manasight_parser::router::Router;
const FIXTURE: &str = include_str!("fixtures/game_over_with_damage_annotations.txt");
#[test]
fn test_game_over_with_damage_annotations_emits_game_state_then_game_result() {
let entry = LogEntry {
header: EntryHeader::UnityCrossThreadLogger,
body: FIXTURE.trim_end_matches('\n').to_owned(),
};
let router = Router::new();
let events = router.route(&entry);
assert_eq!(
events.len(),
2,
"GameOver GSM with annotations must emit GameState + GameResult, got {events:?}",
);
assert!(
matches!(events[0], GameEvent::GameState(_)),
"first event must be GameState (carries the killing-damage annotations)",
);
assert!(
matches!(events[1], GameEvent::GameResult(_)),
"second event must be GameResult (carries the result fields)",
);
let GameEvent::GameState(ref state) = events[0] else {
unreachable!("guarded by matches! above");
};
let payload = state.payload();
let annotations = payload["annotations"]
.as_array()
.unwrap_or_else(|| unreachable!("annotations field must be an array"));
assert_eq!(annotations.len(), 4);
let damage_count = annotations
.iter()
.filter(|a| a["type"] == "AnnotationType_DamageDealt")
.count();
assert_eq!(damage_count, 2, "two DamageDealt annotations must survive");
let has_loss = annotations
.iter()
.any(|a| a["type"] == "AnnotationType_LossOfGame");
assert!(has_loss, "LossOfGame annotation must survive");
let GameEvent::GameResult(ref result) = events[1] else {
unreachable!("guarded by matches! above");
};
let result_payload = result.payload();
assert_eq!(result_payload["winning_team_id"], 1);
assert_eq!(result_payload["result_type"], "ResultType_WinLoss");
assert_eq!(result_payload["reason"], "ResultReason_Game");
}