using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalCommodityTests
{
[Test] public void SavedUidResolvesOnlyThroughActualDefinitionsAndKeepsItsActualParentIndependentOfMarketIds()
{
var actual=new GalaxyNativeCommodityOption(671333304,"gold","Chemicals",1,true);
var f=GalaxyOriginalSettings.Parse("",new(){OriginalCommodityOptions=[actual]}).Filter;
Check.That(f.Values!.SetEquals(["gold"]));Check.Equal(GalaxyCommodityDirection.Imports,f.CommodityDirection);Check.Equal(671333304u,f.OriginalCommodityUid);
var observed=GalaxyCommodityTree.Definitions.Single(d=>d.Symbol=="gold");Check.That(observed.Id!=actual.Uid);Check.That(GalaxyOriginalCommodities.Resolve([actual],(uint)observed.Id) is null);
var tree=GalaxyCommodityTree.Build([],originalOptions:[actual]);Check.Equal(1,tree.Count);Check.Equal("Chemicals",tree[0].Key);Check.That(tree[0].Children.Single().Key=="gold");
Check.That(ReferenceEquals(f,GalaxyOriginalCommodities.WithOptions(f,[actual])));
}
[Test] public void MissingDefinitionRetainsRawUidForLaterResolutionAndVerifiedBothModesAreRestored()
{
var current=new GalaxyMapFilter{Category=GalaxyFilterCategory.Commodity,Values=new HashSet{"previous"},CommodityDirection=GalaxyCommodityDirection.Exports};
var imported=GalaxyOriginalSettings.Parse("",current);
Check.Equal(0xF0000001u,imported.Filter.OriginalCommodityUid);Check.Equal(GalaxyCommodityDirection.Both,imported.Filter.CommodityDirection);Check.That(imported.Filter.Values!.Contains("previous"));Check.That(imported.Limitations.Any(l=>l.Contains("UID"))&&!imported.Limitations.Any(l=>l.Contains("尚未完整恢复")));
var actual=new GalaxyNativeCommodityOption(0xF0000001,"Actual item","Actual category",2,null);
var ready=GalaxyOriginalCommodities.WithOptions(imported.Filter,[actual]);Check.That(ready.Values!.SetEquals(["actualitem"]));Check.That(ready.OriginalCommodityOptions[0].PublisherEligible is null);
var unavailable=GalaxyOriginalCommodities.WithOptions(ready,[actual with{PublisherEligible=false}]);Check.That(unavailable.Values!.Count==0&&unavailable.OriginalCommodityUid==actual.Uid);
Check.Equal(0,GalaxyCommodityTree.Build([],originalOptions:[actual with{PublisherEligible=false}]).Count);
var extra=GalaxyCommodityTree.Build([new("actualitem","Actual item")],originalOptions:[actual with{PublisherEligible=false}]);Check.Equal("__notpublished",extra.Single().Key);Check.That(!extra.Single().OriginalCategory);
var edited=ready with{OriginalCommodityUid=null,Values=new HashSet{"chosen"}};Check.That(GalaxyOriginalCommodities.WithOptions(edited,[actual]).Values!.Contains("chosen"));
Check.That(GalaxyOriginalCommodities.TrySavedUid("0",out var zero)&&zero==0);Check.That(GalaxyOriginalCommodities.TrySavedUid("4294967294",out var high)&&high==uint.MaxValue-1);Check.That(!GalaxyOriginalCommodities.TrySavedUid("-1",out _));
Check.Equal(GalaxyCommodityDirection.Exports,GalaxyOriginalCommodities.SingleDirectionFromSavedPriceMode(2));Check.That(GalaxyOriginalCommodities.SingleDirectionFromSavedPriceMode(3) is null);
}
}