using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyOriginalTradeCategoriesTests
{
[Test] public void CachedOriginalLeavesUseTheOriginalThirteenParentsWithoutAddingUnobservedRoutes()
{
Check.Equal(13,GalaxyOriginalTradeCategories.Categories.Count);Check.Equal(123,GalaxyOriginalTradeCategories.Commodities.Count);
var choices=new[]{new GalaxyFilterChoice("gold","Gold"),new GalaxyFilterChoice("imperialslaves","Imperial Slaves"),new GalaxyFilterChoice("lowtemperaturediamonds","Low Temperature Diamonds")};
var groups=GalaxyOriginalTradeCategories.Build(choices);Check.Equal(3,groups.Sum(g=>g.Children.Count));
Check.That(groups.Single(g=>g.Key=="originaltrade:0").Children.Single().Key=="gold");
// The original TradeRoute table puts ImperialSlaves in Other, whereas
// the current market taxonomy has an independent slaves category.
Check.That(groups.Single(g=>g.Key=="originaltrade:12").Children.Single().Key=="imperialslaves");
var unknown=groups.Single(g=>!g.OriginalCategory);Check.That(unknown.Children.Single().Key=="lowtemperaturediamonds");
Check.Equal(0,GalaxyOriginalTradeCategories.Build([]).Count);
}
[Test] public void SavedTraderSourceDoesNotSelectAnUnrelatedCommodityParentOrActivateHistoricalTrade()
{
Check.Equal(GalaxyTradeFlowSource.Npc,GalaxyOriginalTradeCategories.FromSavedTraderCategory(1));Check.Equal(GalaxyTradeFlowSource.Players,GalaxyOriginalTradeCategories.FromSavedTraderCategory(2));Check.Equal(GalaxyTradeFlowSource.All,GalaxyOriginalTradeCategories.FromSavedTraderCategory(3));
Check.That(GalaxyOriginalTradeCategories.FromSavedTraderCategory(0) is null&&GalaxyOriginalTradeCategories.FromSavedTraderCategory(13) is null);
var imported=GalaxyOriginalSettings.Parse("",new(){HistoricalTradeSource=GalaxyTradeFlowSource.Players});
Check.Equal(GalaxyTradeFlowSource.All,imported.Filter.HistoricalTradeSource);Check.Equal(GalaxyTradeFlowSource.All,imported.Filter.CurrentTradeSource);Check.That(imported.Filter.ShowCurrentTradeFlows&&!imported.Filter.ShowHistoricalTradeFlows);Check.Equal("1",imported.OriginalOptions["TradeRoutes"]);
var invalid=GalaxyOriginalSettings.Parse("",new(){HistoricalTradeSource=GalaxyTradeFlowSource.Players});Check.Equal(GalaxyTradeFlowSource.Players,invalid.Filter.HistoricalTradeSource);Check.That(invalid.Limitations.Any(l=>l.Contains("交易者来源编号")));
}
[Test] public void SavedParentVisibilityAndLeafSelectionRemainIndependentAndAndTogether()
{
var imported=GalaxyOriginalSettings.Parse("",new());
Check.That(imported.Filter.CurrentTradeCategories is {} categories&&!categories.Contains(0)&&categories.Count==12);
Check.That(imported.Filter.CurrentTradeCommodities is {} commodities&&commodities.Contains("gold")&&!commodities.Contains("silver")&&commodities.Contains("copper"));
Check.Equal("0",imported.OriginalOptions["VisibilityFlags/categories/Metals"]);
var snapshot=new GalaxyCurrentTradeFlowsSnapshot(true,1000,100,50,1,[new(42,43,1,"Gold",.5f,0,1000),new(42,43,2,"Silver",.4f,0,1000)],0);
Check.Equal(0,GalaxyCurrentTradeRoutes.Select(snapshot,GalaxyTradeFlowSource.Npc,imported.Filter.CurrentTradeCommodities,imported.Filter.CurrentTradeCategories).Count);
// Re-enabling the parent must recover Gold while Silver stays off.
var restored=GalaxyCurrentTradeRoutes.Select(snapshot,GalaxyTradeFlowSource.Npc,imported.Filter.CurrentTradeCommodities,new HashSet{0});
Check.Equal(1,restored.Count);Check.Equal(.5f,restored[0].Amount);Check.Equal("Gold",restored[0].Contributions.Single().CommodityName);
Check.That(!imported.Filter.ShowHistoricalTradeFlows);
}
[Test] public void AbsentOriginalTradeEntriesDefaultOnAndUnknownFlagsRemainRaw()
{
var imported=GalaxyOriginalSettings.Parse("",new());
Check.Equal(13,imported.Filter.CurrentTradeCategories!.Count);Check.Equal(123,imported.Filter.CurrentTradeCommodities!.Count);
Check.Equal("0",imported.OriginalOptions["VisibilityFlags/categories/FutureParent"]);Check.Equal("1",imported.OriginalOptions["VisibilityFlags/commodities/FutureCommodity"]);
Check.Equal(2,imported.Limitations.Count);Check.That(!imported.Filter.CurrentTradeCommodities.Contains("futurecommodity"));
var empty=GalaxyOriginalSettings.Parse("",new(){CurrentTradeCategories=new HashSet(),CurrentTradeCommodities=new HashSet()});
Check.Equal(13,empty.Filter.CurrentTradeCategories!.Count);Check.Equal(123,empty.Filter.CurrentTradeCommodities!.Count);
}
}