using System.Text.Json; using XFEEDToolBox.Core.Models; using XFEEDToolBox.Core.Presentation; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public class ShipStatusTests { [Test] public void InternalHeatMustNotMasqueradeAsTheUnverifiedHudPercentage() { using var raw=JsonDocument.Parse("""{"heatPercent":94.5,"heatHudPercent":63,"heatNormalizationVerified":false}"""); var rows=ShipStatusRows.Flight(raw.RootElement); Check.Equal("待核对",rows.Single(r=>r.Key=="heat").Value); Check.Equal("94.50%",rows.Single(r=>r.Key=="heatRaw").Value); Check.Equal("—",rows.Single(r=>r.Key=="scoop").Value); using var verified=JsonDocument.Parse("""{"heatPercent":94.5,"heatHudPercent":63,"heatNormalizationVerified":true}"""); Check.Equal("63.0%",ShipStatusRows.Flight(verified.RootElement).Single(r=>r.Key=="heat").Value); } [Test] public void AmmunitionRetainsSnapshotProvenanceAndUnknownShieldStaysUnknown() { var at=DateTimeOffset.Parse("2026-10-22T01:00:00Z"); var p=new PlayerState{CurrentShipId=7,Ships=[new(){ShipId=7,ConfigurationAt=at,Modules=[new(){Slot="HugeHardpoint1",Item="hpt_multicannon_gimbal_huge",AmmoInClip=90,AmmoInHopper=1800}]}]}; var ammo=ShipStatusRows.Ammunition(p).Single();Check.Equal("90",ammo.Clip);Check.Equal("1800",ammo.Reserve); Check.That(ammo.Source.Contains("快照")&&ammo.Source.Contains(ShipStatusRows.At(at))); Check.Equal("—",ShipStatusRows.Cockpit(p).Single(r=>r.Key=="shield").Value); } [Test] public void NativeReadingsUpdateSurvivingRowsWithoutResettingThePanel() { var rows=new LiveCollection(x=>x.Key,x=>new(x)); using var first=JsonDocument.Parse("""{"heatPercent":90}""");using var next=JsonDocument.Parse("""{"heatPercent":91}"""); rows.Apply(ShipStatusRows.Flight(first.RootElement));var row=rows.Single(r=>r.Record.Key=="heatRaw");var changes=0; rows.CollectionChanged+=(_,_)=>changes++; rows.Apply(ShipStatusRows.Flight(next.RootElement)); Check.That(ReferenceEquals(row,rows.Single(r=>r.Record.Key=="heatRaw"))&&changes==0); Check.Equal("91.00%",row.Value); } }