using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyCommodityTreeTests
{
[Test] public void ObservedOriginalTokensPlaceCommodityInItsActualParentWithoutGuessingUnknownNames()
{
var groups=GalaxyCommodityTree.Build([new("gold","Gold"),new("newgoldenmedicine","A new golden medicine")]);
Check.Equal(386,GalaxyCommodityTree.Definitions.Count);Check.Equal(15,groups.Count(g=>g.OriginalCategory));Check.Equal(64,GalaxyCommodityTree.SourceSha256.Length);
var gold=groups.Single(g=>g.Children.Any(c=>c.Key=="gold"));Check.Equal("metals",gold.Key);Check.Equal("金属",gold.Label);
var unknown=groups.Single(g=>g.Children.Any(c=>c.Key=="newgoldenmedicine"));Check.That(!unknown.OriginalCategory);Check.Equal("分类尚未确认",unknown.Label);
Check.That(groups.SelectMany(g=>g.Children).Select(c=>c.Key).Distinct().Count()==groups.Sum(g=>g.Children.Count));
}
[Test] public void ParentTogglePreservesOtherCategoriesAndIndeterminateSelectionIsNotEmptyOrAll()
{
var children=new[]{new GalaxyFilterChoice("gold","Gold"),new("silver","Silver")};var all=new[]{"gold","silver","water","unknown"};
Check.Equal((bool?)true,GalaxyCommodityTree.Selected(null,children));Check.Equal((bool?)false,GalaxyCommodityTree.Selected(new HashSet<string>(),children));Check.Equal((bool?)null,GalaxyCommodityTree.Selected(new HashSet<string>{"gold"},children));
var deselected=GalaxyCommodityTree.SelectGroup(null,all,children.Select(c=>c.Key),false);Check.That(deselected.SetEquals(new[]{"water","unknown"}));
var partial=GalaxyCommodityTree.SelectGroup(new HashSet<string>{"water","gold"},all,children.Select(c=>c.Key),true);Check.That(partial.SetEquals(new[]{"water","gold","silver"}));
var empty=GalaxyCommodityTree.SelectGroup(new HashSet<string>{"gold","silver"},all,children.Select(c=>c.Key),false);Check.Equal(0,empty.Count);
}
[Test] public void HistoricalGroupsNeverAddCommoditiesAbsentFromTheActualCache()
{
var actual=new[]{new GalaxyFilterChoice("gold","Gold"),new("water","Water"),new("unclassifiedroutecommodity","Actual cache item")};
var groups=GalaxyCommodityTree.Build(actual,includeDefinitions:false);
Check.That(groups.SelectMany(g=>g.Children).Select(c=>c.Key).ToHashSet().SetEquals(actual.Select(c=>c.Key)));
Check.Equal("metals",groups.Single(g=>g.Children.Any(c=>c.Key=="gold")).Key);
Check.Equal(0,GalaxyCommodityTree.Build([],includeDefinitions:false).Count);
}
}
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyCommodityTreeTests
{
[Test] public void ObservedOriginalTokensPlaceCommodityInItsActualParentWithoutGuessingUnknownNames()
{
var groups=GalaxyCommodityTree.Build([new("gold","Gold"),new("newgoldenmedicine","A new golden medicine")]);
Check.Equal(386,GalaxyCommodityTree.Definitions.Count);Check.Equal(15,groups.Count(g=>g.OriginalCategory));Check.Equal(64,GalaxyCommodityTree.SourceSha256.Length);
var gold=groups.Single(g=>g.Children.Any(c=>c.Key=="gold"));Check.Equal("metals",gold.Key);Check.Equal("金属",gold.Label);
var unknown=groups.Single(g=>g.Children.Any(c=>c.Key=="newgoldenmedicine"));Check.That(!unknown.OriginalCategory);Check.Equal("分类尚未确认",unknown.Label);
Check.That(groups.SelectMany(g=>g.Children).Select(c=>c.Key).Distinct().Count()==groups.Sum(g=>g.Children.Count));
}
[Test] public void ParentTogglePreservesOtherCategoriesAndIndeterminateSelectionIsNotEmptyOrAll()
{
var children=new[]{new GalaxyFilterChoice("gold","Gold"),new("silver","Silver")};var all=new[]{"gold","silver","water","unknown"};
Check.Equal((bool?)true,GalaxyCommodityTree.Selected(null,children));Check.Equal((bool?)false,GalaxyCommodityTree.Selected(new HashSet<string>(),children));Check.Equal((bool?)null,GalaxyCommodityTree.Selected(new HashSet<string>{"gold"},children));
var deselected=GalaxyCommodityTree.SelectGroup(null,all,children.Select(c=>c.Key),false);Check.That(deselected.SetEquals(new[]{"water","unknown"}));
var partial=GalaxyCommodityTree.SelectGroup(new HashSet<string>{"water","gold"},all,children.Select(c=>c.Key),true);Check.That(partial.SetEquals(new[]{"water","gold","silver"}));
var empty=GalaxyCommodityTree.SelectGroup(new HashSet<string>{"gold","silver"},all,children.Select(c=>c.Key),false);Check.Equal(0,empty.Count);
}
[Test] public void HistoricalGroupsNeverAddCommoditiesAbsentFromTheActualCache()
{
var actual=new[]{new GalaxyFilterChoice("gold","Gold"),new("water","Water"),new("unclassifiedroutecommodity","Actual cache item")};
var groups=GalaxyCommodityTree.Build(actual,includeDefinitions:false);
Check.That(groups.SelectMany(g=>g.Children).Select(c=>c.Key).ToHashSet().SetEquals(actual.Select(c=>c.Key)));
Check.Equal("metals",groups.Single(g=>g.Children.Any(c=>c.Key=="gold")).Key);
Check.Equal(0,GalaxyCommodityTree.Build([],includeDefinitions:false).Count);
}
}