using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GameRouteMapFilterTests
{
[Test] public void RawSettingsKeepIndependentNamesWherePublicAliasesWouldMergeThem()
{
var f=GalaxyOriginalSettings.Parse("<Root><VisibilityFlags><security><Anarchy Value='1'/><Lawless Value='0'/><LowSecurity Value='0'/><affectsRoutePlotting Value='0'/></security></VisibilityFlags></Root>",new()).Filter.WithCategory(GalaxyFilterCategory.Security);
Check.That(f.OriginalRouteOptionKeys[f.Category].SetEquals(["anarchy","lawless","lowsecurity"]));
Check.That(GameRouteMapFilter.TryFromFilter(f,true,out var original,out _));
Check.That(original!.SelectedKeys.SequenceEqual(["anarchy"]));Check.That(!original.AffectsRoutePlotting);
Check.That(!GameRouteMapFilter.TryFromFilter(f,false,out _,out var reason)&&reason!.Contains("合并"));
}
[Test] public void CurrentSelectionsMapToExactNamesWithoutUsingTheirSortedOrderAsDisplayIndices()
{
var f=GalaxyOriginalSettings.Parse("<Root><VisibilityFlags><economy><Agri Value='0'/><HighTech Value='1'/><None Value='0'/><affectsRoutePlotting Value='1'/></economy></VisibilityFlags></Root>",new()).Filter.WithCategory(GalaxyFilterCategory.Economy);
Check.That(GameRouteMapFilter.TryFromFilter(f with{Values=new HashSet<string>{"agriculture"}},false,out var selected,out _));
Check.Equal(4,selected!.CategoryId);Check.That(selected.SelectedKeys.SequenceEqual(["agri"]));
Check.That(GameRouteMapFilter.TryFromFilter(f with{Values=new HashSet<string>()},false,out var empty,out _));Check.Equal(0,empty!.SelectedKeys.Count);
Check.That(GameRouteMapFilter.TryFromFilter(f with{Values=null},false,out var all,out _));Check.Equal(3,all!.SelectedKeys.Count);
Check.That(!GameRouteMapFilter.TryFromFilter(f with{Values=new HashSet<string>{"repair"}},false,out _,out _));
}
[Test] public void CategoryAndSourceBoundariesRejectUnconfirmedListsRatherThanAssumingEnumOrder()
{
var expected=new[]{(GalaxyFilterCategory.Allegiance,2),(GalaxyFilterCategory.Government,3),(GalaxyFilterCategory.Economy,4),(GalaxyFilterCategory.State,6),(GalaxyFilterCategory.Security,7),(GalaxyFilterCategory.Visited,8),(GalaxyFilterCategory.Civilization,10)};
foreach(var (category,id) in expected)
{Check.Equal(id,GameRouteMapFilter.CategoryIdFor(category)!.Value);Check.That(!GameRouteMapFilter.TryFromFilter(new(){Category=category},false,out _,out _));}
foreach(var category in new[]{GalaxyFilterCategory.Commodity,GalaxyFilterCategory.StarClass,GalaxyFilterCategory.FleetCarrier,GalaxyFilterCategory.ThargoidWar})
Check.That(GameRouteMapFilter.CategoryIdFor(category) is null);
Check.Throws<ArgumentException>(()=>new GameRouteMapFilter{CategoryId=3,ExpectedKeys=["none"],SelectedKeys=["unknown"]}.Validate());
Check.Throws<ArgumentException>(()=>new GameRouteMapFilter{CategoryId=3,ExpectedKeys=["none","none"]}.Validate());
Check.Throws<ArgumentException>(()=>new GameRouteMapFilter{CategoryId=5,ExpectedKeys=["o"]}.Validate());
}
[Test] public void ExplicitEmptyFalseAndOriginalNameListsSurviveOptionsPersistence()
{
var original=new GameRoutePlotOptions{MapFilter=new(){CategoryId=8,ExpectedKeys=["notvisited","visited"],SelectedKeys=[],AffectsRoutePlotting=false}};
original.Validate();Check.That(original.HasOverrides);
var restored=JsonSerializer.Deserialize<GameRoutePlotOptions>(JsonSerializer.Serialize(original,ToolboxSettings.JsonOptions),ToolboxSettings.JsonOptions)!;
restored.Validate();Check.Equal(8,restored.MapFilter!.CategoryId);Check.Equal(0,restored.MapFilter.SelectedKeys.Count);Check.That(!restored.MapFilter.AffectsRoutePlotting);
Check.That(restored.MapFilter.ExpectedKeys.SequenceEqual(original.MapFilter!.ExpectedKeys));
var changed=restored with{VirtualCargoMass=0,StarClassFilter=GameRouteStarClassFilter.Scoopable};Check.That(ReferenceEquals(restored.MapFilter,changed.MapFilter));
}
}
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GameRouteMapFilterTests
{
[Test] public void RawSettingsKeepIndependentNamesWherePublicAliasesWouldMergeThem()
{
var f=GalaxyOriginalSettings.Parse("<Root><VisibilityFlags><security><Anarchy Value='1'/><Lawless Value='0'/><LowSecurity Value='0'/><affectsRoutePlotting Value='0'/></security></VisibilityFlags></Root>",new()).Filter.WithCategory(GalaxyFilterCategory.Security);
Check.That(f.OriginalRouteOptionKeys[f.Category].SetEquals(["anarchy","lawless","lowsecurity"]));
Check.That(GameRouteMapFilter.TryFromFilter(f,true,out var original,out _));
Check.That(original!.SelectedKeys.SequenceEqual(["anarchy"]));Check.That(!original.AffectsRoutePlotting);
Check.That(!GameRouteMapFilter.TryFromFilter(f,false,out _,out var reason)&&reason!.Contains("合并"));
}
[Test] public void CurrentSelectionsMapToExactNamesWithoutUsingTheirSortedOrderAsDisplayIndices()
{
var f=GalaxyOriginalSettings.Parse("<Root><VisibilityFlags><economy><Agri Value='0'/><HighTech Value='1'/><None Value='0'/><affectsRoutePlotting Value='1'/></economy></VisibilityFlags></Root>",new()).Filter.WithCategory(GalaxyFilterCategory.Economy);
Check.That(GameRouteMapFilter.TryFromFilter(f with{Values=new HashSet<string>{"agriculture"}},false,out var selected,out _));
Check.Equal(4,selected!.CategoryId);Check.That(selected.SelectedKeys.SequenceEqual(["agri"]));
Check.That(GameRouteMapFilter.TryFromFilter(f with{Values=new HashSet<string>()},false,out var empty,out _));Check.Equal(0,empty!.SelectedKeys.Count);
Check.That(GameRouteMapFilter.TryFromFilter(f with{Values=null},false,out var all,out _));Check.Equal(3,all!.SelectedKeys.Count);
Check.That(!GameRouteMapFilter.TryFromFilter(f with{Values=new HashSet<string>{"repair"}},false,out _,out _));
}
[Test] public void CategoryAndSourceBoundariesRejectUnconfirmedListsRatherThanAssumingEnumOrder()
{
var expected=new[]{(GalaxyFilterCategory.Allegiance,2),(GalaxyFilterCategory.Government,3),(GalaxyFilterCategory.Economy,4),(GalaxyFilterCategory.State,6),(GalaxyFilterCategory.Security,7),(GalaxyFilterCategory.Visited,8),(GalaxyFilterCategory.Civilization,10)};
foreach(var (category,id) in expected)
{Check.Equal(id,GameRouteMapFilter.CategoryIdFor(category)!.Value);Check.That(!GameRouteMapFilter.TryFromFilter(new(){Category=category},false,out _,out _));}
foreach(var category in new[]{GalaxyFilterCategory.Commodity,GalaxyFilterCategory.StarClass,GalaxyFilterCategory.FleetCarrier,GalaxyFilterCategory.ThargoidWar})
Check.That(GameRouteMapFilter.CategoryIdFor(category) is null);
Check.Throws<ArgumentException>(()=>new GameRouteMapFilter{CategoryId=3,ExpectedKeys=["none"],SelectedKeys=["unknown"]}.Validate());
Check.Throws<ArgumentException>(()=>new GameRouteMapFilter{CategoryId=3,ExpectedKeys=["none","none"]}.Validate());
Check.Throws<ArgumentException>(()=>new GameRouteMapFilter{CategoryId=5,ExpectedKeys=["o"]}.Validate());
}
[Test] public void ExplicitEmptyFalseAndOriginalNameListsSurviveOptionsPersistence()
{
var original=new GameRoutePlotOptions{MapFilter=new(){CategoryId=8,ExpectedKeys=["notvisited","visited"],SelectedKeys=[],AffectsRoutePlotting=false}};
original.Validate();Check.That(original.HasOverrides);
var restored=JsonSerializer.Deserialize<GameRoutePlotOptions>(JsonSerializer.Serialize(original,ToolboxSettings.JsonOptions),ToolboxSettings.JsonOptions)!;
restored.Validate();Check.Equal(8,restored.MapFilter!.CategoryId);Check.Equal(0,restored.MapFilter.SelectedKeys.Count);Check.That(!restored.MapFilter.AffectsRoutePlotting);
Check.That(restored.MapFilter.ExpectedKeys.SequenceEqual(original.MapFilter!.ExpectedKeys));
var changed=restored with{VirtualCargoMass=0,StarClassFilter=GameRouteStarClassFilter.Scoopable};Check.That(ReferenceEquals(restored.MapFilter,changed.MapFilter));
}
}