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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Numerics;
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEEDToolBox.Core.Outfitting;
using XFEEDToolBox.Core.Rendering;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;

[TestFixture]
public class GalaxyGatheringTests
{
    [Test] public void ManufacturedRulesMatchAllEightRowsAndRequestCurrentFactionStates()
    {
        Check.Equal(8,MaterialGathering.Manufactured.Count);
        var empire=MaterialGathering.Rule("Imperial Shielding");Check.That(empire.Allegiances.SequenceEqual(new[]{"Empire"}));Check.That(empire.States.SequenceEqual(new[]{"Election","None"}));
        foreach(var name in new[]{"Military Grade Alloys","Military Supercapacitors"})Check.That(MaterialGathering.Rule(name).States.SequenceEqual(new[]{"War","Civil War"}));
        Check.That(MaterialGathering.Rule("Improvised Components").States.SequenceEqual(new[]{"Civil Unrest"}));
        Check.That(MaterialGathering.Rule("Pharmaceutical Isolators").States.SequenceEqual(new[]{"Outbreak"}));
        using var request=JsonDocument.Parse(JsonSerializer.Serialize(MaterialGathering.Request("Pharmaceutical Isolators",new(1,2,3))));
        Check.Equal("Outbreak",request.RootElement.GetProperty("filters").GetProperty("minor_faction_presences")[0].GetProperty("state").GetProperty("value")[0].GetString());
        Check.Throws<ArgumentException>(()=>MaterialGathering.Request("Unknown material",new(0,0,0)));
    }
    [Test] public void NearestCandidateRejectsWrongAllegianceMissingStatesAndPendingOutbreak()
    {
        using var json=JsonDocument.Parse("""
        {"results":[
          {"name":"Far","x":50,"y":0,"z":0,"allegiance":"Independent","minor_faction_presences":[{"name":"Active","state":"Outbreak"}]},
          {"name":"Wrong faction","x":1,"y":0,"z":0,"allegiance":"Empire","minor_faction_presences":[{"state":"Outbreak"}]},
          {"name":"Pending only","x":2,"y":0,"z":0,"allegiance":"Alliance","minor_faction_presences":[{"state":"Boom","pending_states":["Outbreak"]}]},
          {"name":"Missing state","x":3,"y":0,"z":0,"allegiance":"Independent","minor_faction_presences":[{}]},
          {"name":"Nearest","x":10,"y":0,"z":0,"allegiance":"Alliance","minor_faction_presences":[{"name":"Active","state":"Outbreak"}]}
        ]}
        """);
        var result=MaterialGathering.ParseManufactured(json.RootElement,"Pharmaceutical Isolators",new(0,0,0));Check.Equal(1,result.Count);Check.Equal("Nearest",result[0].SystemName);Check.Equal(10d,result[0].Distance);
    }
    [Test] public void RawSitesPreserveBodiesSurfaceCoordinatesAndSortFromThePlayer()
    {
        Check.Equal(7,MaterialGathering.RawSites.Count);var origin=new Coordinates(432.625,-129.28125,-90.15625);
        var chromium=MaterialGathering.FixedPlaces(GatheringCategory.Raw,"Chromium",origin);
        Check.Equal(6,chromium.Count);Check.Equal("Synuefe AN-H d11-101",chromium[0].SystemName);Check.Equal(0d,chromium[0].Distance);
        Check.That(chromium.Zip(chromium.Skip(1)).All(p=>p.First.Distance<=p.Second.Distance));
        Check.That(!MaterialGathering.FixedPlaces(GatheringCategory.Raw,"Germanium",origin).Any(p=>p.SystemName=="Synuefe AN-H d11-101"));
        var selenium=MaterialGathering.RawSites.Single(s=>s.Materials.Contains("Selenium"));Check.Equal("3 a a",selenium.Body);Check.Equal(52.64,selenium.Latitude);Check.Equal(-165.74,selenium.Longitude);
        var data=MaterialGathering.FixedPlaces(GatheringCategory.Encoded,"",origin).Single();Check.Equal("HIP 12099",data.SystemName);Check.Equal(560216394075L,data.SystemAddress!.Value);Check.That(data.Description.Contains("-54.3803"));
    }
    [Test] public void OriginalNebulaPositionsAndRealVolumeReferencesAreBounded()
    {
        var index=EliteNebulae.Reference;Check.Equal(172,index.Nebulae.Length);Check.That(index.Templates.Length>=36);
        var coal=index.Nebulae.Single(n=>n.Name=="Coalsack");Check.Equal(new Coordinates(418.84375,-.875,273.03125),coal.Position);Check.That(coal.Dark&&coal.HalfSize is >12 and <13);
        var pleiades=index.Nebulae.Single(n=>n.Name=="Pleiades Nebula");Check.Equal(new Coordinates(-81.78125,-149.4375,-343.375),pleiades.Position);Check.That(pleiades.ExactTemplate);
        Check.That(index.Nebulae.All(n=>n.HalfSize>0&&n.Position.IsValid&&index.Templates.Any(t=>t.Name.Equals(n.Template,StringComparison.OrdinalIgnoreCase))));
        var entry=index.Templates[0];Check.Throws<InvalidDataException>(()=>EliteNebulae.Decode(new byte[entry.InflatedBytes],entry with{VolumeOffset=int.MaxValue}));
    }
    [Test] public void ACloudOnlyAttenuatesThePortionBetweenAStarAndTheViewer()
    {
        var volume=new NebulaVolume(4,Enumerable.Range(0,4*4*4*4).Select(i=>i%4==3?(byte)255:(byte)0).ToArray(),Enumerable.Repeat(new Vector4(.1f,.2f,.3f,1),256).ToArray());
        var front=volume.Transmission(new(0,0,-3),-Vector3.UnitZ);var inside=volume.Transmission(Vector3.Zero,-Vector3.UnitZ);var behind=volume.Transmission(new(0,0,3),-Vector3.UnitZ);
        Check.Equal(1f,front);Check.That(front>inside&&inside>behind&&behind<.05f);Check.Equal(1f,volume.Transmission(new(3,0,3),-Vector3.UnitZ));
    }
    [Test] public void WeaponVariantsUseTheGameFamiliesAndChineseCategoryCaptions()
    {
        var modules=OutfittingCatalog.Default.Modules;
        string Key(string name)=>RefitModuleBrowser.TypeKey(modules.First(m=>m.Name==name));
        Check.Equal(Key("Pulse Laser"),Key("Pulse Disruptor Laser"));Check.Equal(Key("Burst Laser"),Key("Cytoscrambler Burst Laser"));
        Check.Equal(Key("Beam Laser"),Key("Retributor Beam Laser"));Check.Equal(Key("Multi-Cannon"),Key("Enforcer Cannon"));
        Check.That(modules.Where(m=>m.Name.Contains("Missile Rack")).Select(RefitModuleBrowser.TypeKey).Distinct().SequenceEqual(new[]{"weapon.missile"}));
        Check.Equal("weapon.mining",Key("Sub-Surface Extraction Missile"));Check.Equal("weapon.mining",Key("Mining Lance"));
        var types=RefitModuleBrowser.Types(ShipRefit.Choices(new(),OutfittingCatalog.Default).Where(c=>c.Definition.Category=="hardpoint"));
        Check.Equal(12,types.Count);Check.Equal("脉冲激光",types.Single(t=>t.Key=="weapon.pulse").Name);Check.Equal("爆发激光",types.Single(t=>t.Key=="weapon.burst").Name);Check.Equal("霰弹炮",types.Single(t=>t.Key=="weapon.fragment").Name);
        Check.That(types.All(t=>EliteModuleIcons.References.Any(i=>i.Name==t.IconItem)));
    }
}