using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyPowerOuterTests
{
private static GalacticSystem Sample(GalaxyNativePowerOuter? outer)=>new("Actual",new(0,0,0))
{Data=new(){Power="Unrelated Power",PowerState="Unoccupied",PowerActivities=["reinforcing"],NativeFilterFacts=new("F1",42,100){PowerOuter=outer}}};
[Test] public void ActivitiesUsesItsOriginalPredicateInsteadOfOwnerMasksOrPositiveActivityProgress()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Powerplay,PowerplayView=GalaxyPowerplayView.Activities,Category=GalaxyFilterCategory.Power,
Values=new HashSet<string>(),PowerStateValues=new HashSet<string>(),UseMinimumActivity=true,MinimumActivity=1};
Check.That(filter.UsesPowerOuter&&!filter.UsesPowerActivityCounter&&filter.IsQueryActive);
Check.That(filter.Matches(Sample(new(true,100,new(10,20,30),50))));
Check.That(!filter.Matches(Sample(new(false,100,new(10,20,30),50))));Check.That(!(filter with{IncludeUnknown=true}).Matches(Sample(new(false,null,null,null))));
Check.That(!filter.Matches(Sample(null)));Check.That((filter with{IncludeUnknown=true}).Matches(Sample(new(null,null,null,null))));
Check.Equal(filter.QueryKey,(filter with{Values=null,UseMinimumActivity=false,MinimumActivity=0}).QueryKey);
}
[Test] public void ExplicitUnknownSnapshotsClearPreviousOuterFactsAndNoRuntimeOuterEvidencePersists()
{
var old=Sample(new(true,100,new(10,20,30),50)).Data;
var next=old.Merge(new(){NativeFilterFacts=new("F1",42,100){PowerOuter=null}});
Check.That(next.NativeFilterFacts?.PowerOuter is null);Check.That(old.ForNativeContext("F1",42,101).NativeFilterFacts is null);
var persisted=JsonSerializer.Serialize(old);Check.That(!persisted.Contains("PowerOuter")&&!persisted.Contains("NativeFilterFacts"));
}
[Test] public async Task OriginalActivitiesNeverIssuesAPublicOwnerQueryAndTerritoryCounterRemainsIndependent()
{
using var http=new HttpClient(new NoHttp());var query=new GalaxyQueryService(http);
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Powerplay,Category=GalaxyFilterCategory.Power,PowerplayView=GalaxyPowerplayView.Activities};
Check.Equal(0,(await query.PlansAsync(filter)).Count);
var territory=filter with{PowerplayView=GalaxyPowerplayView.Territory,TerritoryActivityFilterEnabled=true,UseMinimumActivity=true,ActivityAllPowers=true,MinimumActivity=0};
Check.That(!territory.UsesPowerOuter&&territory.UsesPowerActivityCounter&&territory.ActivityNativeQueryReady);Check.That(territory.QueryKey!=filter.QueryKey);
var known=Sample(null) with{Data=new(){Power="Actual",NativeFilterFacts=new("F1",42,100,PowerActivity:new("",GalaxyPowerActivity.Undermining,0,AllPowers:true)){PowerStatus=new(0,0,null,null,0,0,true)}}};
Check.That(territory.Matches(known));Check.That(!(territory with{MinimumActivity=.1}).Matches(known));
}
[Test] public void ActivitiesUseTheirOwnOriginalHdrColourAndSizeAndExplicitNullClearsThem()
{
var style=new GalaxyNativePowerOuterStyle([.4f,.5f,1.5f],[.13286832f,.21404114f,2.5371552f],.7f,.35f);
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Powerplay,PowerplayView=GalaxyPowerplayView.Activities,Category=GalaxyFilterCategory.Power};
var system=Sample(new(true,100,new(10,20,30),50){Style=style});
var rgba=filter.GetOriginalRgba(system)!.Value;
Check.Equal(1.5f,rgba.Z);Check.Equal(.35f,rgba.W);Check.Equal(.7f,filter.RelativeSize(system));Check.Equal(.35f,filter.GetOpacity(system));
Check.That(filter.Matches(system));
var unknown=system with{Data=system.Data.Merge(new(){NativeFilterFacts=new("F1",42,100){PowerOuter=new(true,100,new(10,20,30),50){Style=null}}})};
Check.That(filter.Matches(unknown));Check.That(filter.GetOriginalRgba(unknown) is null);Check.Equal(1f,filter.GetOpacity(unknown));
var equivalent=new GalaxyNativePowerOuterStyle(new[]{.4f,.5f,1.5f},new[]{.13286832f,.21404114f,2.5371552f},.7f,.35f);
Check.Equal(style,equivalent);Check.Equal(style.GetHashCode(),equivalent.GetHashCode());
Check.That(!JsonSerializer.Serialize(system.Data).Contains("RawRgb"));
}
private sealed class NoHttp:HttpMessageHandler
{protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)=>throw new InvalidOperationException("An original Activities query cannot call a public catalogue.");}
}
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyPowerOuterTests
{
private static GalacticSystem Sample(GalaxyNativePowerOuter? outer)=>new("Actual",new(0,0,0))
{Data=new(){Power="Unrelated Power",PowerState="Unoccupied",PowerActivities=["reinforcing"],NativeFilterFacts=new("F1",42,100){PowerOuter=outer}}};
[Test] public void ActivitiesUsesItsOriginalPredicateInsteadOfOwnerMasksOrPositiveActivityProgress()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Powerplay,PowerplayView=GalaxyPowerplayView.Activities,Category=GalaxyFilterCategory.Power,
Values=new HashSet<string>(),PowerStateValues=new HashSet<string>(),UseMinimumActivity=true,MinimumActivity=1};
Check.That(filter.UsesPowerOuter&&!filter.UsesPowerActivityCounter&&filter.IsQueryActive);
Check.That(filter.Matches(Sample(new(true,100,new(10,20,30),50))));
Check.That(!filter.Matches(Sample(new(false,100,new(10,20,30),50))));Check.That(!(filter with{IncludeUnknown=true}).Matches(Sample(new(false,null,null,null))));
Check.That(!filter.Matches(Sample(null)));Check.That((filter with{IncludeUnknown=true}).Matches(Sample(new(null,null,null,null))));
Check.Equal(filter.QueryKey,(filter with{Values=null,UseMinimumActivity=false,MinimumActivity=0}).QueryKey);
}
[Test] public void ExplicitUnknownSnapshotsClearPreviousOuterFactsAndNoRuntimeOuterEvidencePersists()
{
var old=Sample(new(true,100,new(10,20,30),50)).Data;
var next=old.Merge(new(){NativeFilterFacts=new("F1",42,100){PowerOuter=null}});
Check.That(next.NativeFilterFacts?.PowerOuter is null);Check.That(old.ForNativeContext("F1",42,101).NativeFilterFacts is null);
var persisted=JsonSerializer.Serialize(old);Check.That(!persisted.Contains("PowerOuter")&&!persisted.Contains("NativeFilterFacts"));
}
[Test] public async Task OriginalActivitiesNeverIssuesAPublicOwnerQueryAndTerritoryCounterRemainsIndependent()
{
using var http=new HttpClient(new NoHttp());var query=new GalaxyQueryService(http);
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Powerplay,Category=GalaxyFilterCategory.Power,PowerplayView=GalaxyPowerplayView.Activities};
Check.Equal(0,(await query.PlansAsync(filter)).Count);
var territory=filter with{PowerplayView=GalaxyPowerplayView.Territory,TerritoryActivityFilterEnabled=true,UseMinimumActivity=true,ActivityAllPowers=true,MinimumActivity=0};
Check.That(!territory.UsesPowerOuter&&territory.UsesPowerActivityCounter&&territory.ActivityNativeQueryReady);Check.That(territory.QueryKey!=filter.QueryKey);
var known=Sample(null) with{Data=new(){Power="Actual",NativeFilterFacts=new("F1",42,100,PowerActivity:new("",GalaxyPowerActivity.Undermining,0,AllPowers:true)){PowerStatus=new(0,0,null,null,0,0,true)}}};
Check.That(territory.Matches(known));Check.That(!(territory with{MinimumActivity=.1}).Matches(known));
}
[Test] public void ActivitiesUseTheirOwnOriginalHdrColourAndSizeAndExplicitNullClearsThem()
{
var style=new GalaxyNativePowerOuterStyle([.4f,.5f,1.5f],[.13286832f,.21404114f,2.5371552f],.7f,.35f);
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Powerplay,PowerplayView=GalaxyPowerplayView.Activities,Category=GalaxyFilterCategory.Power};
var system=Sample(new(true,100,new(10,20,30),50){Style=style});
var rgba=filter.GetOriginalRgba(system)!.Value;
Check.Equal(1.5f,rgba.Z);Check.Equal(.35f,rgba.W);Check.Equal(.7f,filter.RelativeSize(system));Check.Equal(.35f,filter.GetOpacity(system));
Check.That(filter.Matches(system));
var unknown=system with{Data=system.Data.Merge(new(){NativeFilterFacts=new("F1",42,100){PowerOuter=new(true,100,new(10,20,30),50){Style=null}}})};
Check.That(filter.Matches(unknown));Check.That(filter.GetOriginalRgba(unknown) is null);Check.Equal(1f,filter.GetOpacity(unknown));
var equivalent=new GalaxyNativePowerOuterStyle(new[]{.4f,.5f,1.5f},new[]{.13286832f,.21404114f,2.5371552f},.7f,.35f);
Check.Equal(style,equivalent);Check.Equal(style.GetHashCode(),equivalent.GetHashCode());
Check.That(!JsonSerializer.Serialize(system.Data).Contains("RawRgb"));
}
private sealed class NoHttp:HttpMessageHandler
{protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)=>throw new InvalidOperationException("An original Activities query cannot call a public catalogue.");}
}