diff --git a/openfut-adapter-fifa17/tests/squad_projection.rs b/openfut-adapter-fifa17/tests/squad_projection.rs index d818b2f..3a2e680 100644 --- a/openfut-adapter-fifa17/tests/squad_projection.rs +++ b/openfut-adapter-fifa17/tests/squad_projection.rs @@ -11,8 +11,9 @@ //! ``` //! //! Fidelity is asserted by ownership class: -//! CANONICAL player instance per index, formation, captain, bench split -//! EXTENSION custom, kicktakers, manager, kit numbers (by player), squadType +//! CANONICAL player instance per index, formation, captain, bench split, and +//! the ownership-backed manager assignment (migration 0023) +//! EXTENSION custom, kicktakers, kit numbers (by player), squadType //! SHADOW chemistry/rating/starRating (client-reported, round-tripped as-is) //! DERIVED correct FIFA 17 item identity (wire id + resourceId) //! @@ -146,6 +147,9 @@ fn project_put( slots, ext: SquadExtInput::Fresh(extension), owned, + // This stand-in supplies no owned manager; the manager is projected from + // the ownership-backed assignment, exercised in persisted_read below. + manager: None, }; match project_squad(&input, ident, &NoEntities).unwrap() { SquadProjection::Projected(v) => v, @@ -194,9 +198,11 @@ fn baseline_projects_the_known_squad_round_trip() { projected["captain"], 100000001, "captain is the player's WIRE id" ); - // EXTENSION: custom byte-identical, manager + squadType preserved. + // EXTENSION: custom byte-identical, squadType preserved. The manager is now + // an ownership-backed assignment (not projected from the PUT/ext); with none + // supplied to this stand-in it projects empty. assert_eq!(projected["custom"], put_v["custom"]); - assert_eq!(projected["manager"], put_v["manager"]); + assert!(projected["manager"].as_array().unwrap().is_empty()); assert_eq!(projected["squadType"], "REGULAR_SQUAD"); // SHADOW: client-reported values carried as-is (baseline chemistry 52). assert_eq!(projected["chemistry"], 52); @@ -268,13 +274,11 @@ fn persisted_read_round_trips_via_reconstructed_canonical_and_extension() { // evidence, then project and require the read back — the strongest fidelity // check across all four ownership classes. use openfut_adapter_fifa17::fut::squad::ClientReportedSquadEval; - use openfut_adapter_fifa17::fut::squad_ext::{ - Fifa17SquadExtensionV1, KicktakerRef, WireItemRef, - }; + use openfut_adapter_fifa17::fut::squad_ext::{Fifa17SquadExtensionV1, KicktakerRef}; use std::collections::BTreeMap; let oracle: Value = serde_json::from_str(READ_ORACLE).unwrap(); - let (owned, ident) = oracle_tables(); + let (owned, mut ident) = oracle_tables(); let captain = oracle["captain"].as_i64().unwrap(); let mut slots = Vec::new(); @@ -294,14 +298,35 @@ fn persisted_read_round_trips_via_reconstructed_canonical_and_extension() { is_on_bench: index >= 11, }); } - let manager: Vec = serde_json::from_value(oracle["manager"].clone()).unwrap(); + // The manager is now ownership-backed: register its owned instance + identity + // and pass it as the assignment, not as an opaque extension field. + let mgr_wire = oracle["manager"][0]["id"].as_i64().unwrap(); + let mgr_oc = format!("oc-{mgr_wire}"); + ident.0.insert( + mgr_oc.clone(), + Fifa17Identity { + item_id: mgr_wire as u32, + asset_id: 5001, + resource_id: 5001, + rareflag: 1, + }, + ); + let manager_item = CoreOwnedItem { + owned_card_id: mgr_oc, + card_id: "def-manager".to_string(), + rating: 0, + position: String::new(), + nation: String::new(), + league: String::new(), + club: String::new(), + attributes: [0; 6], + }; let kicktakers: Vec = serde_json::from_value(oracle["kicktakers"].clone()).unwrap(); let ext = Fifa17SquadExtensionV1 { custom: oracle["custom"].as_str().map(str::to_string), squad_type: oracle["squadType"].as_str().map(str::to_string), kit_numbers, - manager, kicktakers, client_reported: ClientReportedSquadEval { chemistry: oracle["chemistry"].as_i64(), @@ -316,6 +341,7 @@ fn persisted_read_round_trips_via_reconstructed_canonical_and_extension() { slots, ext: SquadExtInput::Fresh(ext), owned: &owned, + manager: Some(manager_item), }; let SquadProjection::Projected(projected) = project_squad(&input, &ident, &NoEntities).unwrap() else {