using game.PlayerDataStorage; using Newtonsoft.Json.Linq; static partial class Tests { static async Task RunPinataSchemaTests() { await Run("M29-pinata-three-integer-record",() => { var valid=JObject.Parse("{\"EventID\":1,\"PinataMainID\":2,\"PurchasedCount\":3}"); Dictionary Raw(JObject obj)=>new() { ["EventPinataPackData"]=obj.ToString() }; var a=PlayerKVSaveSchema.DecodePinata(Raw(valid),new()); Check(a.EventID==1 && a.PinataMainID==2 && a.PurchasedCount==3,"all scalars"); foreach(var p in valid.Properties()) foreach(var invalid in new JToken[] { JValue.CreateNull(),new JValue("1"),new JValue(1.5),new JValue(2147483648L) }) { var bad=(JObject)valid.DeepClone(); bad[p.Name]=invalid; Check(PlayerKVSaveSchema.DecodePinata(Raw(bad),new())==null,"strict integer fields"); } var missing=PlayerKVSaveSchema.DecodePinata(new Dictionary(),new()); Check(missing.EventID==0 && missing.PinataMainID==0 && missing.PurchasedCount==0,"all missing zeros"); Check(PlayerKVSaveSchema.DecodePinata(new Dictionary { ["EventPinataPackData"]="null" },new())==null,"null not missing"); return Task.CompletedTask; }); } }