using PkmnLib.Dynamic.Libraries;
using PkmnLib.Plugin.Gen7.Common;
using PkmnLib.Static.Utils;
namespace PkmnLib.Plugin.Gen7.Tests.DataTests;
///
/// Validates that the source-generated constant classes stay in sync with the data files: every
/// generated constant must resolve in the loaded library, and every library entry must have a
/// generated constant.
///
public class GeneratedConstantsTests
{
private static readonly IDynamicLibrary Library = LibraryHelpers.LoadLibrary();
private static HashSet ConstantsOf(Type type) => type.GetFields()
.Where(x => x is { IsStatic: true, IsPublic: true } && x.FieldType == typeof(StringKey))
.Select(x => (StringKey)x.GetValue(null)!).ToHashSet();
[Test]
public async Task MoveNamesMatchMoveLibrary()
{
var constants = ConstantsOf(typeof(MoveNames));
var libraryNames = Library.StaticLibrary.Moves.Select(x => x.Name).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task AbilityNamesMatchAbilityLibrary()
{
var constants = ConstantsOf(typeof(AbilityNames));
var libraryNames = Library.StaticLibrary.Abilities.Select(x => x.Name).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task ItemNamesMatchItemLibrary()
{
var constants = ConstantsOf(typeof(ItemNames));
var libraryNames = Library.StaticLibrary.Items.Select(x => x.Name).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task SpeciesNamesMatchSpeciesLibrary()
{
var constants = ConstantsOf(typeof(SpeciesNames));
var libraryNames = Library.StaticLibrary.Species.Select(x => x.Name).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task FormNamesMatchSpeciesForms()
{
var constants = ConstantsOf(typeof(FormNames));
var libraryNames = Library.StaticLibrary.Species.SelectMany(x => x.Forms.Keys).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task NatureNamesMatchNatureLibrary()
{
var constants = ConstantsOf(typeof(NatureNames));
var libraryNames = Library.StaticLibrary.Natures.Select(x => x.Name).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task TypeNamesMatchTypeLibrary()
{
var constants = ConstantsOf(typeof(TypeNames));
var libraryNames = new HashSet();
for (byte index = 1; Library.StaticLibrary.Types.TryGetTypeIdentifierFromIndex(index, out var type); index++)
{
libraryNames.Add(type.Name);
}
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task MoveFlagsMatchMoveData()
{
var constants = ConstantsOf(typeof(MoveFlags));
var libraryNames = Library.StaticLibrary.Moves.SelectMany(x => x.Flags).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
[Test]
public async Task MoveEffectNamesMatchMoveData()
{
var constants = ConstantsOf(typeof(MoveEffectNames));
var libraryNames = Library.StaticLibrary.Moves.Where(x => x.SecondaryEffect != null)
.Select(x => x.SecondaryEffect!.Name).ToHashSet();
await Assert.That(constants.Where(x => !libraryNames.Contains(x))).IsEmpty();
await Assert.That(libraryNames.Where(x => !constants.Contains(x))).IsEmpty();
}
}