Replace all raw string comparisons with StringKey, source generator that creates cache keys for all names for Gen7 plugin
All checks were successful
Build / Build (push) Successful in 2m21s
All checks were successful
Build / Build (push) Successful in 2m21s
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
using PkmnLib.Dynamic.Libraries;
|
||||
using PkmnLib.Plugin.Gen7.Common;
|
||||
using PkmnLib.Static.Utils;
|
||||
|
||||
namespace PkmnLib.Plugin.Gen7.Tests.DataTests;
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
public class GeneratedConstantsTests
|
||||
{
|
||||
private static readonly IDynamicLibrary Library = LibraryHelpers.LoadLibrary();
|
||||
|
||||
private static HashSet<StringKey> 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<StringKey>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,7 @@ public class MoveDataTests
|
||||
var moveLibrary = library.StaticLibrary.Moves;
|
||||
foreach (var move in moveLibrary)
|
||||
{
|
||||
if (move.SecondaryEffect?.Name != "set_status")
|
||||
if (move.SecondaryEffect?.Name != MoveEffectNames.SetStatus)
|
||||
continue;
|
||||
yield return () => new SetStatusTestCaseData(library, move);
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public class DreamEaterTests
|
||||
{
|
||||
// Arrange
|
||||
var (script, move, target, _) = CreateTestSetup(100);
|
||||
target.HasStatus(new StringKey("asleep")).Returns(false);
|
||||
target.HasStatus(new StringKey("sleep")).Returns(false);
|
||||
var block = false;
|
||||
|
||||
// Act
|
||||
@@ -77,7 +77,7 @@ public class DreamEaterTests
|
||||
{
|
||||
// Arrange
|
||||
var (script, move, target, _) = CreateTestSetup(100);
|
||||
target.HasStatus(new StringKey("asleep")).Returns(true);
|
||||
target.HasStatus(new StringKey("sleep")).Returns(true);
|
||||
var block = false;
|
||||
|
||||
// Act
|
||||
@@ -96,7 +96,7 @@ public class DreamEaterTests
|
||||
{
|
||||
// Arrange
|
||||
var (script, move, target, _) = CreateTestSetup(100);
|
||||
target.HasStatus(new StringKey("asleep")).Returns(false);
|
||||
target.HasStatus(new StringKey("sleep")).Returns(false);
|
||||
var comatose = Substitute.For<IAbility>();
|
||||
comatose.Name.Returns(new StringKey("comatose"));
|
||||
target.ActiveAbility.Returns(comatose);
|
||||
|
||||
Reference in New Issue
Block a user