using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalStateFactsTests
{
private static GalaxyMapFilter Filter(params string[] keys)=>new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.State,
RequireOriginalStateFacts=true,RequireOriginalBasicSystemFacts=true,Values=keys.ToHashSet()};
private static GalacticSystem Star(GalaxyNativeStateFact? state,bool requested=true)=>new("Actual system",new(0,0,0))
{Data=new(){State="War",NativeFilterFacts=new("F1",123,42){State=state,StateRequested=requested,BasicSystemRequested=true,
BasicSystem=new(1,4,1,1,8,0,0)}}};
[Test] public void PseudoUnpopulatedOverridesBaseWarAndQueryReceiptsWithoutBorrowingPublicState()
{
var system=Star(new(39,true,false,"Unpopulated",[.1f,.2f,.3f,1]));var war=Filter("war") with{IncludeUnknown=true};
system=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{war.QueryKey}}};
Check.That(!war.Matches(system)&&!war.IsUnknown(system));Check.That(!war.Evaluate(system).Matches);
var unpopulated=Filter("unpopulated");Check.That(unpopulated.Matches(system)&&!unpopulated.IsUnknown(system));
Check.Equal("unpopulated",GalaxyMapFilter.Keys(system,GalaxyFilterCategory.State)!.Single());
// An older independently requested Basic row may still be pending.
// Effective State owns its classification and is not masked by it.
var withoutBasic=system with{Data=system.Data with{NativeFilterFacts=system.Data.NativeFilterFacts! with{BasicSystem=null}}};
Check.That(unpopulated.Matches(withoutBasic)&&!unpopulated.IsUnknown(withoutBasic)&&unpopulated.Evaluate(withoutBasic) is{Unknown:false,Matches:true});
Check.That(unpopulated.GetOriginalRgba(withoutBasic) is not null);
}
[Test] public void ActualProviderKeysAndHdrRgbaRemainIndependentOfBasicEnumsAndUnknownFallbacks()
{
var system=Star(new(38,false,false,"Frontline",[.5f,2f,.5f,.75f]));var filter=Filter("frontline");
Check.That(filter.Matches(system)&&!filter.IsUnknown(system));var rgba=filter.GetOriginalRgba(system);
Check.That(rgba is{} colour&&colour.X==.5f&&colour.Y==2&&colour.W==.75f);
Check.Equal(new GalaxyRawColour(.5f,2,.5f,.75f).DisplayColour(),filter.GetColour(system));
var unknown=Star(new(38,false,false,null,null));
Check.That(!filter.Matches(unknown)&&filter.IsUnknown(unknown)&&filter.GetOriginalRgba(unknown) is null);
Check.That((filter with{IncludeUnknown=true}).Matches(unknown));
}
[Test] public void UnrequestedOrMissingStateNeverRecoversFromBasicOrPublicPositives()
{
var filter=Filter("war");
foreach(var system in new[]{Star(null),Star(new(8,false,false,"War",[1,1,1,1]),false)})
{
var withProof=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{filter.QueryKey}}};
Check.That(!filter.Matches(withProof)&&filter.IsUnknown(withProof));
Check.That(filter.GetOriginalRgba(withProof) is null);
}
var known=Star(new(0,false,true,"None",[.2f,.3f,.4f,1]));Check.That(!filter.Matches(known)&&!filter.IsUnknown(known));
Check.That(Filter("none").Matches(known));
Check.That((filter with{Mode=GalaxyMapMode.Realistic}).Matches(Star(null)));
}
[Test] public void WireKeepsSourceKeysUnknownRawIdsAndRejectsContradictoryProvenanceOrColours()
{
const string payload="{\"stateId\":39,\"pseudoUnpopulated\":true,\"defaulted\":false,\"key\":\"Unpopulated\",\"rawRgba\":[0.5,2,0.5,1]}";
var fact=GalaxyNativeStateFact.FromWire(Check.Json(payload))!;Check.Equal(39u,fact.StateId);Check.Equal("unpopulated",fact.NormalizedKey);
Check.Equal(2f,fact.RawRgba![1]);Check.That(GalaxyNativeStateFact.FromWire(Check.Json("null")) is null);
var future=GalaxyNativeStateFact.FromWire(Check.Json("{\"stateId\":4294967295,\"pseudoUnpopulated\":false,\"defaulted\":false,\"key\":null,\"rawRgba\":null}"))!;
Check.Equal(uint.MaxValue,future.StateId);Check.That(future.NormalizedKey is null);
foreach(var invalid in new[]{payload.Replace("39","8"),payload.Replace("\"defaulted\":false","\"defaulted\":true"),
payload.Replace("[0.5,2,0.5,1]","[0,1,0]"),payload.Replace("[0.5,2,0.5,1]","[0,-1,0,1]"),
payload.Replace("\"Unpopulated\"","null"),payload.Replace("[0.5,2,0.5,1]","null")})
Check.Throws<InvalidDataException>(()=>GalaxyNativeStateFact.FromWire(Check.Json(invalid)));
}
}
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalStateFactsTests
{
private static GalaxyMapFilter Filter(params string[] keys)=>new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.State,
RequireOriginalStateFacts=true,RequireOriginalBasicSystemFacts=true,Values=keys.ToHashSet()};
private static GalacticSystem Star(GalaxyNativeStateFact? state,bool requested=true)=>new("Actual system",new(0,0,0))
{Data=new(){State="War",NativeFilterFacts=new("F1",123,42){State=state,StateRequested=requested,BasicSystemRequested=true,
BasicSystem=new(1,4,1,1,8,0,0)}}};
[Test] public void PseudoUnpopulatedOverridesBaseWarAndQueryReceiptsWithoutBorrowingPublicState()
{
var system=Star(new(39,true,false,"Unpopulated",[.1f,.2f,.3f,1]));var war=Filter("war") with{IncludeUnknown=true};
system=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{war.QueryKey}}};
Check.That(!war.Matches(system)&&!war.IsUnknown(system));Check.That(!war.Evaluate(system).Matches);
var unpopulated=Filter("unpopulated");Check.That(unpopulated.Matches(system)&&!unpopulated.IsUnknown(system));
Check.Equal("unpopulated",GalaxyMapFilter.Keys(system,GalaxyFilterCategory.State)!.Single());
// An older independently requested Basic row may still be pending.
// Effective State owns its classification and is not masked by it.
var withoutBasic=system with{Data=system.Data with{NativeFilterFacts=system.Data.NativeFilterFacts! with{BasicSystem=null}}};
Check.That(unpopulated.Matches(withoutBasic)&&!unpopulated.IsUnknown(withoutBasic)&&unpopulated.Evaluate(withoutBasic) is{Unknown:false,Matches:true});
Check.That(unpopulated.GetOriginalRgba(withoutBasic) is not null);
}
[Test] public void ActualProviderKeysAndHdrRgbaRemainIndependentOfBasicEnumsAndUnknownFallbacks()
{
var system=Star(new(38,false,false,"Frontline",[.5f,2f,.5f,.75f]));var filter=Filter("frontline");
Check.That(filter.Matches(system)&&!filter.IsUnknown(system));var rgba=filter.GetOriginalRgba(system);
Check.That(rgba is{} colour&&colour.X==.5f&&colour.Y==2&&colour.W==.75f);
Check.Equal(new GalaxyRawColour(.5f,2,.5f,.75f).DisplayColour(),filter.GetColour(system));
var unknown=Star(new(38,false,false,null,null));
Check.That(!filter.Matches(unknown)&&filter.IsUnknown(unknown)&&filter.GetOriginalRgba(unknown) is null);
Check.That((filter with{IncludeUnknown=true}).Matches(unknown));
}
[Test] public void UnrequestedOrMissingStateNeverRecoversFromBasicOrPublicPositives()
{
var filter=Filter("war");
foreach(var system in new[]{Star(null),Star(new(8,false,false,"War",[1,1,1,1]),false)})
{
var withProof=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{filter.QueryKey}}};
Check.That(!filter.Matches(withProof)&&filter.IsUnknown(withProof));
Check.That(filter.GetOriginalRgba(withProof) is null);
}
var known=Star(new(0,false,true,"None",[.2f,.3f,.4f,1]));Check.That(!filter.Matches(known)&&!filter.IsUnknown(known));
Check.That(Filter("none").Matches(known));
Check.That((filter with{Mode=GalaxyMapMode.Realistic}).Matches(Star(null)));
}
[Test] public void WireKeepsSourceKeysUnknownRawIdsAndRejectsContradictoryProvenanceOrColours()
{
const string payload="{\"stateId\":39,\"pseudoUnpopulated\":true,\"defaulted\":false,\"key\":\"Unpopulated\",\"rawRgba\":[0.5,2,0.5,1]}";
var fact=GalaxyNativeStateFact.FromWire(Check.Json(payload))!;Check.Equal(39u,fact.StateId);Check.Equal("unpopulated",fact.NormalizedKey);
Check.Equal(2f,fact.RawRgba![1]);Check.That(GalaxyNativeStateFact.FromWire(Check.Json("null")) is null);
var future=GalaxyNativeStateFact.FromWire(Check.Json("{\"stateId\":4294967295,\"pseudoUnpopulated\":false,\"defaulted\":false,\"key\":null,\"rawRgba\":null}"))!;
Check.Equal(uint.MaxValue,future.StateId);Check.That(future.NormalizedKey is null);
foreach(var invalid in new[]{payload.Replace("39","8"),payload.Replace("\"defaulted\":false","\"defaulted\":true"),
payload.Replace("[0.5,2,0.5,1]","[0,1,0]"),payload.Replace("[0.5,2,0.5,1]","[0,-1,0,1]"),
payload.Replace("\"Unpopulated\"","null"),payload.Replace("[0.5,2,0.5,1]","null")})
Check.Throws<InvalidDataException>(()=>GalaxyNativeStateFact.FromWire(Check.Json(invalid)));
}
}