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<ShipStatusLiveRow,ShipStatusValue,string>(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);
}
}
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<ShipStatusLiveRow,ShipStatusValue,string>(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);
}
}