diff --git a/SVSim.UnitTests/BattleNode/Integration/CaptureConformanceTests.cs b/SVSim.UnitTests/BattleNode/Integration/CaptureConformanceTests.cs index bdc97aa..44f3c13 100644 --- a/SVSim.UnitTests/BattleNode/Integration/CaptureConformanceTests.cs +++ b/SVSim.UnitTests/BattleNode/Integration/CaptureConformanceTests.cs @@ -221,6 +221,48 @@ public class CaptureConformanceTests var seq = 0; return NodeCrypto.GenerateKey(() => (seq++ * 13) % 16); } + + [Test] + public void SynthesizedKnownList_matches_prod_recv_PlayActions_entry_shape() + { + // Prod recv PlayActions knownList entry (battle-traffic_tk2_regular.ndjson:27). + const string prodEntry = """ + { "idx": 17, "cardId": 128821011, "to": 20, "cost": 2, "clan": 8, "tribe": "7,16", "spellboost": 0, "attachTarget": "" } + """; + + // Build the same entry through our synthesizer. + var deckMap = new Dictionary { [17] = 128821011L }; + var orderList = new List + { + new Dictionary + { + ["move"] = new Dictionary + { + ["idx"] = new List { 17L }, ["isSelf"] = 1L, ["from"] = 10L, ["to"] = 20L, + } + } + }; + var entry = SVSim.BattleNode.Sessions.Dispatch.KnownListBuilder.BuildPlayedCard(deckMap, 17, orderList); + Assert.That(entry, Is.Not.Null); + + var body = new SVSim.BattleNode.Protocol.Bodies.PlayActionsBroadcastBody( + PlayIdx: 17, Type: 30, KnownList: new[] { entry! }, OppoTargetList: null); + var env = new MsgEnvelope(NetworkBattleUri.PlayActions, ViewerId: 1, Uuid: "u", Bid: null, Try: 0, + Cat: EmitCategory.Battle, PubSeq: null, PlaySeq: null, Body: body); + + using var ourDoc = JsonDocument.Parse(MsgEnvelope.ToJson(env)); + var ourEntry = ourDoc.RootElement.GetProperty("knownList")[0]; + using var prodDoc = JsonDocument.Parse(prodEntry); + + // We are responsible for idx/cardId/to (+ spellboost/attachTarget). cost/clan/tribe are deferred. + foreach (var key in new[] { "idx", "cardId", "to" }) + { + Assert.That(ourEntry.TryGetProperty(key, out var ours), Is.True, $"knownList entry missing '{key}'"); + var prodVal = prodDoc.RootElement.GetProperty(key); + Assert.That(ours.ValueKind, Is.EqualTo(prodVal.ValueKind), $"'{key}' type category mismatch"); + } + Assert.That(ourEntry.GetProperty("cardId").GetInt64(), Is.EqualTo(128821011L)); + } } ///