59 lines
3.7 KiB
C#
59 lines
3.7 KiB
C#
using game.PlayerDataStorage;
|
|
using System.Globalization;
|
|
|
|
static partial class Tests
|
|
{
|
|
static async Task RunCampEventSchemaTests()
|
|
{
|
|
await Run("M07-camp-strict-fields-and-copy", () =>
|
|
{
|
|
var raw=new Dictionary<string,string> { ["IsFix"]="True",["IsOpenSkyscraper"]="1",["CampDataDic"]="{\"CampId\":205}" };
|
|
var state=PlayerKVSaveSchema.DecodeCamp(raw,new());
|
|
Check(state.IsFix && state.Skyscraper=="1" && state.Values["CampId"]==205,"all raw fields");
|
|
var missing=PlayerKVSaveSchema.DecodeCamp(new Dictionary<string,string>(),new());
|
|
Check(!missing.IsFix && missing.Skyscraper=="0" && missing.Values.Count==0,"missing defaults");
|
|
foreach(var key in raw.Keys)
|
|
{
|
|
foreach(var bad in new[] { "null",null,"[]","1.0" })
|
|
Check(PlayerKVSaveSchema.DecodeCamp(new Dictionary<string,string>(raw) { [key]=bad },new())==null,"bad optional fails");
|
|
}
|
|
Check(PlayerKVSaveSchema.DecodeCamp(new Dictionary<string,string> { ["IsOpenSkyscraper"]="true" },new())==null,"exact sky flag");
|
|
var source=new Dictionary<string,int> { ["CampId"]=205 };
|
|
var copied=new PlayerKVCampState(true,"1",source); source.Clear();
|
|
Check(copied.Values.Count==1,"independent map");
|
|
return Task.CompletedTask;
|
|
});
|
|
await Run("M20-event-pack-active-dormant-config", () =>
|
|
{
|
|
var events=new Dictionary<int,PlayerKVEventConfig> {
|
|
[1]=new(100,"2026-09-24T00:00:00.0000000Z"),[2]=new(999,"2026-09-22T00:00:00.0000000Z"),
|
|
[3]=new(200,"2026-09-24T00:00:00.0000000Z"),[4]=new(100,null)
|
|
};
|
|
var snapshot=new PlayerKVSchemaSnapshot("M20",Array.Empty<int>(),Array.Empty<int>(),new Dictionary<string,int>(),
|
|
CultureInfo.InvariantCulture,new DateTime(2026,9,23,0,0,0,DateTimeKind.Utc),0,
|
|
new Dictionary<int,int> { [100]=1,[200]=3,[4054001]=1 },events);
|
|
events.Clear();
|
|
Dictionary<string,string> Raw(int eventId,int redirect=0) => new() {
|
|
["EventPackData"]=$"{{\"currentEventID\":{eventId},\"purchaseCount\":2,\"VIPLvlWhenEventActivate\":3,\"redirectID\":{redirect}}}"
|
|
};
|
|
var state=PlayerKVSaveSchema.DecodeEventPack(Raw(1),snapshot,new());
|
|
Check(state.EventId==1 && state.PurchaseCount==2 && state.VipLevel==3 && state.RedirectId==4054001,"active old default normalized after copied config");
|
|
foreach(var eventId in new[] { 0,2,999 })
|
|
{
|
|
state=PlayerKVSaveSchema.DecodeEventPack(Raw(eventId),snapshot,new());
|
|
Check(state.EventId==eventId && state.RedirectId==0 && state.PurchaseCount==2,"dormant values retained");
|
|
}
|
|
foreach(var invalid in new[] { Raw(3),Raw(4),Raw(1,999) })
|
|
{
|
|
var e=new PlayerKVSchemaDiagnostics();
|
|
Check(PlayerKVSaveSchema.DecodeEventPack(invalid,snapshot,e)==null && e.Count(20,PlayerKVSchemaError.UnsupportedSchema)==1,"config dereference failure explicit");
|
|
}
|
|
foreach(var bad in new[] { "null","{}","{\"currentEventID\":1,\"purchaseCount\":\"2\",\"VIPLvlWhenEventActivate\":3,\"redirectID\":0}" })
|
|
Check(PlayerKVSaveSchema.DecodeEventPack(new Dictionary<string,string> { ["EventPackData"]=bad },snapshot,new())==null,"strict object");
|
|
state=PlayerKVSaveSchema.DecodeEventPack(new Dictionary<string,string>(),snapshot,new());
|
|
Check(state.EventId==0 && state.PurchaseCount==0 && state.VipLevel==0 && state.RedirectId==0,"missing all zero without normalization");
|
|
return Task.CompletedTask;
|
|
});
|
|
}
|
|
}
|