using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalCivilizationFactsTests
{
private static GalaxyMapFilter Filter(string key)=>new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Civilization,Values=new HashSet<string>{key},RequireOriginalCivilizationFacts=true};
private static GalacticSystem Sample(GalaxyNativeCivilizationFacts? fact,bool requested=true)=>new("Actual",new(0,0,0),300)
{Data=new(){Civilizations=["human","guardian","thargoid"],Civilization="human",Population=1000000000,
NativeFilterFacts=new("F1",42,100){Civilization=fact,CivilizationRequested=requested}}};
[Test] public void OriginalUnknownCannotUsePublicLandmarksPopulationOrMatchingProof()
{
var filter=Filter("human");
foreach(var requested in new[]{false,true})
{
var system=Sample(null,requested);system=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{filter.QueryKey}}};
Check.That(!filter.Matches(system)&&filter.IsUnknown(system)&&!filter.Evaluate(system).Matches);
Check.That(filter.GetOriginalRgba(system) is null&&(filter with{IncludeUnknown=true}).Matches(system));
}
Check.That(!JsonSerializer.Serialize(filter).Contains("RequireOriginalCivilizationFacts"));
}
[Test] public void ACoherentSingleClassificationOverridesContradictoryPublicMultivalues()
{
foreach(var key in new[]{"none","human","guardian","thargoid"})
{
var system=Sample(new(9007199254740995UL,key));var filter=Filter(key);
Check.That(filter.Matches(system)&&!filter.IsUnknown(system));
Check.Equal(key,GalaxyMapFilter.Keys(system,GalaxyFilterCategory.Civilization)!.Single());
Check.That(!(filter with{Values=new HashSet<string>{key=="human"?"guardian":"human"}}).Matches(system));
Check.Equal(filter.ColourForValue(key),filter.GetColour(system));
Check.That(filter.GetOriginalRgba(system) is not null);
}
var fallback=Sample(new(ulong.MaxValue,"none",true));
Check.That(Filter("none").Matches(fallback)&&!Filter("none").IsUnknown(fallback));
Check.That(!Filter("none").Matches(Sample(null)));
}
[Test] public void ExactWireIdsAndUnknownFutureClassificationStayDistinctFromNone()
{
var known=GalaxyNativeCivilizationFacts.FromWire(Check.Json("{\"definitionId\":\"9007199254740995\",\"key\":\"guardian\",\"defaulted\":false}"))!;
Check.Equal(9007199254740995UL,known.DefinitionId);Check.Equal("guardian",known.Key);
var future=GalaxyNativeCivilizationFacts.FromWire(Check.Json("{\"definitionId\":\"9007199254740995\",\"key\":\"future\"}"))!;
var system=Sample(future);Check.That(future.Key is null&&Filter("none").IsUnknown(system)&&!Filter("none").Matches(system));
Check.That(GalaxyNativeCivilizationFacts.FromWire(Check.Json("null")) is null);
foreach(var json in new[]{"{\"definitionId\":9007199254740995,\"key\":\"human\"}","{\"definitionId\":\"18446744073709551616\",\"key\":\"none\"}","{\"definitionId\":\"1\",\"key\":\"none\",\"defaulted\":true}","{\"definitionId\":\"18446744073709551615\",\"key\":\"human\",\"defaulted\":true}"})
Check.Throws<InvalidDataException>(()=>GalaxyNativeCivilizationFacts.FromWire(Check.Json(json)));
}
[Test] public void UnrelatedReceiptsPreserveClassificationButExplicitUnknownAndContextLossClearIt()
{
var old=Sample(new(9007199254740995UL,"guardian"));var filter=Filter("guardian");
var unrelated=old with{Data=old.Data.Merge(new(){NativeFilterFacts=new("F1",42,100,Visited:true)})};
Check.That(unrelated.Data.NativeFilterFacts is{CivilizationRequested:true,Civilization:not null}&&filter.Matches(unrelated));
var unknown=old with{Data=old.Data.Merge(new(){NativeFilterFacts=new("F1",42,100){CivilizationRequested=true}})};
Check.That(filter.IsUnknown(unknown)&&!filter.Matches(unknown));
var otherProcess=old with{Data=old.Data.ForNativeContext("F1",43,100)};
Check.That(otherProcess.Data.NativeFilterFacts is null&&!filter.Matches(otherProcess));
Check.That(!JsonSerializer.Serialize(old.Data).Contains("CivilizationRequested"));
Check.That(filter.RequestsOriginalCivilizationFacts&&!(filter with{Category=GalaxyFilterCategory.Services}).RequestsOriginalCivilizationFacts);
}
}
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalCivilizationFactsTests
{
private static GalaxyMapFilter Filter(string key)=>new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Civilization,Values=new HashSet<string>{key},RequireOriginalCivilizationFacts=true};
private static GalacticSystem Sample(GalaxyNativeCivilizationFacts? fact,bool requested=true)=>new("Actual",new(0,0,0),300)
{Data=new(){Civilizations=["human","guardian","thargoid"],Civilization="human",Population=1000000000,
NativeFilterFacts=new("F1",42,100){Civilization=fact,CivilizationRequested=requested}}};
[Test] public void OriginalUnknownCannotUsePublicLandmarksPopulationOrMatchingProof()
{
var filter=Filter("human");
foreach(var requested in new[]{false,true})
{
var system=Sample(null,requested);system=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{filter.QueryKey}}};
Check.That(!filter.Matches(system)&&filter.IsUnknown(system)&&!filter.Evaluate(system).Matches);
Check.That(filter.GetOriginalRgba(system) is null&&(filter with{IncludeUnknown=true}).Matches(system));
}
Check.That(!JsonSerializer.Serialize(filter).Contains("RequireOriginalCivilizationFacts"));
}
[Test] public void ACoherentSingleClassificationOverridesContradictoryPublicMultivalues()
{
foreach(var key in new[]{"none","human","guardian","thargoid"})
{
var system=Sample(new(9007199254740995UL,key));var filter=Filter(key);
Check.That(filter.Matches(system)&&!filter.IsUnknown(system));
Check.Equal(key,GalaxyMapFilter.Keys(system,GalaxyFilterCategory.Civilization)!.Single());
Check.That(!(filter with{Values=new HashSet<string>{key=="human"?"guardian":"human"}}).Matches(system));
Check.Equal(filter.ColourForValue(key),filter.GetColour(system));
Check.That(filter.GetOriginalRgba(system) is not null);
}
var fallback=Sample(new(ulong.MaxValue,"none",true));
Check.That(Filter("none").Matches(fallback)&&!Filter("none").IsUnknown(fallback));
Check.That(!Filter("none").Matches(Sample(null)));
}
[Test] public void ExactWireIdsAndUnknownFutureClassificationStayDistinctFromNone()
{
var known=GalaxyNativeCivilizationFacts.FromWire(Check.Json("{\"definitionId\":\"9007199254740995\",\"key\":\"guardian\",\"defaulted\":false}"))!;
Check.Equal(9007199254740995UL,known.DefinitionId);Check.Equal("guardian",known.Key);
var future=GalaxyNativeCivilizationFacts.FromWire(Check.Json("{\"definitionId\":\"9007199254740995\",\"key\":\"future\"}"))!;
var system=Sample(future);Check.That(future.Key is null&&Filter("none").IsUnknown(system)&&!Filter("none").Matches(system));
Check.That(GalaxyNativeCivilizationFacts.FromWire(Check.Json("null")) is null);
foreach(var json in new[]{"{\"definitionId\":9007199254740995,\"key\":\"human\"}","{\"definitionId\":\"18446744073709551616\",\"key\":\"none\"}","{\"definitionId\":\"1\",\"key\":\"none\",\"defaulted\":true}","{\"definitionId\":\"18446744073709551615\",\"key\":\"human\",\"defaulted\":true}"})
Check.Throws<InvalidDataException>(()=>GalaxyNativeCivilizationFacts.FromWire(Check.Json(json)));
}
[Test] public void UnrelatedReceiptsPreserveClassificationButExplicitUnknownAndContextLossClearIt()
{
var old=Sample(new(9007199254740995UL,"guardian"));var filter=Filter("guardian");
var unrelated=old with{Data=old.Data.Merge(new(){NativeFilterFacts=new("F1",42,100,Visited:true)})};
Check.That(unrelated.Data.NativeFilterFacts is{CivilizationRequested:true,Civilization:not null}&&filter.Matches(unrelated));
var unknown=old with{Data=old.Data.Merge(new(){NativeFilterFacts=new("F1",42,100){CivilizationRequested=true}})};
Check.That(filter.IsUnknown(unknown)&&!filter.Matches(unknown));
var otherProcess=old with{Data=old.Data.ForNativeContext("F1",43,100)};
Check.That(otherProcess.Data.NativeFilterFacts is null&&!filter.Matches(otherProcess));
Check.That(!JsonSerializer.Serialize(old.Data).Contains("CivilizationRequested"));
Check.That(filter.RequestsOriginalCivilizationFacts&&!(filter with{Category=GalaxyFilterCategory.Services}).RequestsOriginalCivilizationFacts);
}
}