XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Net;
using System.Text;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;

namespace XFEEDToolBox.Test;

[TestFixture]
public class GalaxyFilterTests
{
    private static GalacticSystem Star(string type="G")=>new("Fixture",new(0,0,0),StarClass:type);
    [Test] public void UnknownPoliticalDataNeverMasqueradesAsNoneOrUninhabited()
    {
        var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Allegiance,Values=new HashSet<string>{"none"},IncludeUnknown=false};
        Check.That(!f.Matches(Star()));Check.That(f.Matches(Star() with{Data=new(){Allegiance="None"}}));
        Check.That((f with{IncludeUnknown=true}).Matches(Star()));
        var population=f with{Category=GalaxyFilterCategory.Population,Values=new HashSet<string>{"uninhabited"}};
        Check.That(!population.Matches(Star()));Check.That(population.Matches(Star() with{Data=new(){Population=0}}));
        Check.That(!population.Matches(Star() with{Data=new(){Population=500}}));
    }
    [Test] public void MainSequenceAndSpecialStarClassesRemainIndependentlySelectable()
    {
        var tests=new[]{("K (Yellow-Orange) Star","k"),("M_RedGiant","m_redgiant"),("M (Red super giant) Star","m_redsupergiant"),("White Dwarf (DA) Star","da"),("DAB","dab"),("Neutron Star","n"),("Black Hole","h"),("Supermassive Black Hole","supermassiveblackhole"),("Herbig Ae/Be Star","aebe"),("T Tauri Star","tts"),("WN","wn")};
        foreach(var (input,key) in tests)
        {
            Check.Equal(key,GalaxyMapFilter.StarKey(input));
            var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Values=new HashSet<string>{key},IncludeUnknown=false};
            Check.That(f.Matches(Star(input)),input);Check.That(!f.Matches(Star("Unknown exotic")));
            Check.That(GalaxyFilterDefinitions.All.Single(x=>x.Category==GalaxyFilterCategory.StarClass).Choices.Any(c=>c.Key==key),input);
        }
        var scoop=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Values="obafgkm".Select(x=>x.ToString()).ToHashSet(),IncludeUnknown=false};
        Check.That(scoop.Matches(Star("G")));Check.That(!scoop.Matches(Star("L")));Check.That(!scoop.Matches(Star("N")));
    }
    [Test] public void EmptySelectionHidesKnownDataAndUnknownIsAnIndependentChoice()
    {
        var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Values=new HashSet<string>(),IncludeUnknown=false};
        Check.That(!f.Matches(Star()));Check.That(!f.Matches(Star("")));
        Check.That((f with{IncludeUnknown=true}).Matches(Star("")));Check.That(!(f with{IncludeUnknown=true}).Matches(Star()));
        Check.That((f with{Values=null}).Matches(Star()));Check.That((f with{Mode=GalaxyMapMode.Realistic}).Matches(Star()));
    }
    [Test] public void MultipleServicesAndEconomiesUseAnInclusiveChoiceWithinTheSelectedCategory()
    {
        var s=Star() with{Data=new(){Services=["repair","refuel"],Economy="Agriculture",SecondaryEconomy="High Tech"}};
        var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Services,Values=new HashSet<string>{"refuel"},IncludeUnknown=false};
        Check.That(f.Matches(s));Check.That(!(f with{Values=new HashSet<string>{"blackmarket"}}).Matches(s));
        Check.That((f with{Category=GalaxyFilterCategory.Economy,Values=new HashSet<string>{"hightech"}}).Matches(s));
        Check.That(!f.Matches(Star() with{Data=new(){Services=[]}}));
    }
    [Test] public void PartialStationObservationsNeverProveTheWholeSystemLacksAService()
    {
        var observed=Star() with{Data=new(){Services=["refuel","materialtrader"]}};
        var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Services,Values=new HashSet<string>{"shipyard"},IncludeUnknown=true};
        Check.That(f.IsUnknown(observed));Check.That(f.Matches(observed));Check.That(!(f with{IncludeUnknown=false}).Matches(observed));
        var subtype=f with{Values=new HashSet<string>{"materialtraderraw"}};
        Check.That(subtype.IsUnknown(observed));Check.That(!(subtype with{IncludeUnknown=false}).Matches(observed));
        Check.That(!(f with{Values=new HashSet<string>{"refuel"}}).IsUnknown(observed));
    }
    [Test] public void OriginalNativeGiantAndBlackHoleNamesAgreeWithPublicSpectralDescriptions()
    {
        foreach(var (name,key,palette) in new[]{("Wolf-Rayet Star","w",0),("A_BlueWhiteSuperGiant","a_bluewhitesupergiant",2),("F_WhiteSuperGiant","f_whitesupergiant",3),("M_RedGiant","m_redgiant",6),("SupermassiveBlackHole","supermassiveblackhole",12)})
        {
            Check.Equal(key,GalaxyMapFilter.StarKey(name));Check.Equal(palette,StellarAppearance.ColourIndex(name));
            var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Values=new HashSet<string>{key},IncludeUnknown=false};Check.That(f.Matches(Star(name)));
        }
    }
    [Test] public void NativeCompactLuminositySeparatesGiantsFromDwarfsWithoutReusingXOrNebulaTypeIds()
    {
        GalacticSystem Native(int type,int luminosity,string stale="M_RedGiant")=>Star(stale) with
        {OriginalAppearance=new(0,null,null,0,(ushort)(type|luminosity<<10),.7f,.7f,null)};
        var giants=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Values=new HashSet<string>{"m_redgiant","a_bluewhitesupergiant","k_orangegiant"}};
        Check.That(giants.Matches(Native(6,10)));Check.That(giants.Matches(Native(5,6)));Check.That(giants.Matches(Native(2,3)));
        Check.That(!giants.Matches(Native(6,18)));Check.That(!giants.Matches(Native(6,14)));Check.That(!giants.Matches(Native(43,3)));Check.That(!giants.Matches(Native(44,3)));
        Check.Equal("x",GalaxyMapFilter.StarKey(Native(43,3)));Check.Equal((string?)null,GalaxyMapFilter.StarKey(Native(44,3)));
        Check.Equal("III",Native(6,10).OriginalAppearance!.LuminosityClass);Check.Equal("IV",Native(6,14).OriginalAppearance!.LuminosityClass);
        Check.That((giants with{Values=new HashSet<string>{"m"}}).Matches(Native(6,18)));
    }
    [Test] public void JournalTokensAndVisitsAreObservedWithoutGuessingMissingFacts()
    {
        var d=GalaxySystemData.FromJournal(Check.Json("""{"SystemAllegiance":"Federation","SystemGovernment":"$government_Democracy;","SystemEconomy":"$economy_HighTech;","SystemSecurity":"$SYSTEM_SECURITY_high;","Population":0,"SystemFaction":{"Name":"Fixture","FactionState":"Boom"},"StationServices":["refuel","repair"]}"""));
        Check.Equal("Democracy",d.Government);Check.Equal("HighTech",d.Economy);Check.Equal("high",d.Security);Check.Equal("Boom",d.State);Check.That(d.Visited==true);
        Check.That(d.FleetCarrier is null&&d.Exploration is null&&d.TradeData is null);
        var older=new GalaxySystemData{Population=4000,Government="Corporate",Services=["shipyard"]};
        var merged=older.Merge(new(){Population=0,Visited=true});Check.Equal(0L,merged.Population);Check.Equal("Corporate",merged.Government);Check.That(merged.Services!.Contains("shipyard"));
    }
    [Test] public async Task PublicCatalogRequestsRealInformationAndKeepsMissingInformationUnknown()
    {
        var handler=new CatalogHandler();using var http=new HttpClient(handler);var catalog=new GalaxyCatalog(http);
        var rows=await catalog.RegionAsync(new(0,0,0));Check.That(handler.Url.Contains("showInformation=1"));
        Check.Equal(2,rows.Count);Check.Equal("Federation",rows[0].Data.Allegiance);Check.Equal(0L,rows[0].Data.Population);Check.That(rows[1].Data.Population is null);
        Check.That(rows[1].Data.Visited is null);Check.That(rows[0].Data.Services is null);
    }
    [Test] public void EveryOriginalFilterCategoryHasAUniqueInventoryAndMapColoursAreStable()
    {
        Check.Equal(Enum.GetValues<GalaxyFilterCategory>().Length,GalaxyFilterDefinitions.All.Count);
        Check.Equal(GalaxyFilterDefinitions.All.Count,GalaxyFilterDefinitions.All.Select(x=>x.Category).Distinct().Count());
        foreach(var definition in GalaxyFilterDefinitions.All)Check.Equal(definition.Choices.Count,definition.Choices.Select(x=>x.Key).Distinct().Count());
        var f=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Allegiance};var a=Star() with{Data=new(){Allegiance="Alliance"}};var b=Star() with{Data=new(){Allegiance="Empire"}};
        Check.That(f.GetColour(a)!=f.GetColour(b));Check.Equal(f.GetColour(a),f.GetColour(a with{Name="Other"}));
    }
    private sealed class CatalogHandler:HttpMessageHandler
    {
        public string Url="";
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken token)
        {Url=request.RequestUri!.OriginalString;return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK){Content=new StringContent("""[{"name":"Known","coords":{"x":0,"y":0,"z":0},"primaryStar":{"type":"G"},"information":{"allegiance":"Federation","government":"Democracy","population":0,"economy":"High Tech","security":"High"}},{"name":"Unknown","coords":{"x":1,"y":0,"z":0}}]""",Encoding.UTF8,"application/json")});}
    }
}