diff --git a/PkmnLib.Dataloader/AbilityDataLoader.cs b/PkmnLib.Dataloader/AbilityDataLoader.cs index 103c0b2..f443967 100644 --- a/PkmnLib.Dataloader/AbilityDataLoader.cs +++ b/PkmnLib.Dataloader/AbilityDataLoader.cs @@ -15,17 +15,15 @@ public static class AbilityDataLoader { private static Dictionary LoadAbilitiesData(Stream stream) { - var obj = JsonSerializer.Deserialize(stream); + var obj = JsonSerializer.Deserialize(stream, JsonOptions.DefaultOptions); if (obj == null) throw new InvalidDataException("Ability data is empty."); obj.Remove("$schema"); var cleanedString = obj.ToJsonString(); - var objects = JsonSerializer.Deserialize>(cleanedString, - new JsonSerializerOptions() - { - PropertyNameCaseInsensitive = true, - }); + var objects = + JsonSerializer.Deserialize>(cleanedString, + JsonOptions.DefaultOptions); if (objects == null) throw new InvalidDataException("Ability data is empty."); return objects; diff --git a/PkmnLib.Dataloader/GrowthRateDataLoader.cs b/PkmnLib.Dataloader/GrowthRateDataLoader.cs index 03c4853..ac4d938 100644 --- a/PkmnLib.Dataloader/GrowthRateDataLoader.cs +++ b/PkmnLib.Dataloader/GrowthRateDataLoader.cs @@ -10,7 +10,7 @@ public static class GrowthRateDataLoader { public static GrowthRateLibrary LoadGrowthRates(Stream stream) { - var objects = JsonSerializer.Deserialize>(stream)!; + var objects = JsonSerializer.Deserialize>(stream, JsonOptions.DefaultOptions)!; var library = new GrowthRateLibrary(); foreach (var (key, value) in objects) { diff --git a/PkmnLib.Dataloader/ItemDataLoader.cs b/PkmnLib.Dataloader/ItemDataLoader.cs index 6f9fed3..34a12d8 100644 --- a/PkmnLib.Dataloader/ItemDataLoader.cs +++ b/PkmnLib.Dataloader/ItemDataLoader.cs @@ -17,10 +17,7 @@ public static class ItemDataLoader public static ItemLibrary LoadItems(Stream stream) { var library = new ItemLibrary(); - var obj = JsonSerializer.Deserialize(stream, new JsonSerializerOptions() - { - PropertyNameCaseInsensitive = true, - }); + var obj = JsonSerializer.Deserialize(stream, JsonOptions.DefaultOptions); if (obj == null) throw new InvalidDataException("Item data is empty."); var items = obj.Select(DeserializeItem); diff --git a/PkmnLib.Dataloader/JsonOptions.cs b/PkmnLib.Dataloader/JsonOptions.cs new file mode 100644 index 0000000..3322391 --- /dev/null +++ b/PkmnLib.Dataloader/JsonOptions.cs @@ -0,0 +1,13 @@ +using System.Text.Json; + +namespace PkmnLib.Dataloader; + +internal static class JsonOptions +{ + public static JsonSerializerOptions DefaultOptions => new JsonSerializerOptions() + { + PropertyNameCaseInsensitive = true, + AllowTrailingCommas = true, + ReadCommentHandling = JsonCommentHandling.Skip, + }; +} \ No newline at end of file diff --git a/PkmnLib.Dataloader/MoveDataLoader.cs b/PkmnLib.Dataloader/MoveDataLoader.cs index 7abd882..a00242d 100644 --- a/PkmnLib.Dataloader/MoveDataLoader.cs +++ b/PkmnLib.Dataloader/MoveDataLoader.cs @@ -17,11 +17,7 @@ public static class MoveDataLoader public static MoveLibrary LoadMoves(Stream stream, TypeLibrary typeLibrary) { var library = new MoveLibrary(); - var objects = JsonSerializer.Deserialize(stream, - new JsonSerializerOptions() - { - PropertyNameCaseInsensitive = true, - }); + var objects = JsonSerializer.Deserialize(stream, JsonOptions.DefaultOptions); if (objects == null) throw new InvalidDataException("Move data is empty."); var moves = objects.Data.Select(x => DeserializeMove(x, typeLibrary)); diff --git a/PkmnLib.Dataloader/SpeciesDataLoader.cs b/PkmnLib.Dataloader/SpeciesDataLoader.cs index 2332bf2..c48ccd1 100644 --- a/PkmnLib.Dataloader/SpeciesDataLoader.cs +++ b/PkmnLib.Dataloader/SpeciesDataLoader.cs @@ -17,15 +17,11 @@ public static class SpeciesDataLoader { private static Dictionary LoadSpeciesData(Stream stream) { - var obj = JsonSerializer.Deserialize(stream); + var obj = JsonSerializer.Deserialize(stream, JsonOptions.DefaultOptions); if (obj == null) throw new InvalidDataException("Species data is empty."); - var jsonConfig = new JsonSerializerOptions() - { - PropertyNameCaseInsensitive = true, - }; return obj.Where(x => x.Key != "$schema") - .ToDictionary(x => x.Key, x => x.Value.Deserialize(jsonConfig)); + .ToDictionary(x => x.Key, x => x.Value.Deserialize(JsonOptions.DefaultOptions)); } public static SpeciesLibrary LoadSpecies(Stream[] streams, IReadOnlyTypeLibrary typeLibrary) diff --git a/PkmnLib.Tests/Data/Moves.json b/PkmnLib.Tests/Data/Moves.json index 5bd7f4b..551e25b 100755 --- a/PkmnLib.Tests/Data/Moves.json +++ b/PkmnLib.Tests/Data/Moves.json @@ -3614,6 +3614,7 @@ } } }, + // Done up to here { "name": "fire_spin", "type": "fire", diff --git a/PkmnLib.Tests/DataTests/MoveDataTests.cs b/PkmnLib.Tests/DataTests/MoveDataTests.cs index feb5ab2..a7100ed 100644 --- a/PkmnLib.Tests/DataTests/MoveDataTests.cs +++ b/PkmnLib.Tests/DataTests/MoveDataTests.cs @@ -1,12 +1,22 @@ +using PkmnLib.Dynamic.Libraries; using PkmnLib.Dynamic.ScriptHandling; +using PkmnLib.Static.Moves; using PkmnLib.Tests.Integration; namespace PkmnLib.Tests.DataTests; public class MoveDataTests { - [Test] - public async Task AllMoveEffectsHaveValidScripts() + public record TestCaseData(IDynamicLibrary Library, IMoveData Move) + { + /// + public override string ToString() + { + return Move.Name + " has valid scripts"; + } + } + + public static IEnumerable AllMovesHaveValidScriptsData() { var library = LibraryHelpers.LoadLibrary(); var moveLibrary = library.StaticLibrary.Moves; @@ -14,17 +24,26 @@ public class MoveDataTests { if (move.SecondaryEffect == null) continue; - var scriptName = move.SecondaryEffect.Name; + yield return new TestCaseData(library, move); + } + } + + [Test] + [MethodDataSource(nameof(AllMovesHaveValidScriptsData))] + public async Task AllMoveEffectsHaveValidScripts(TestCaseData test) + { + if (test.Move.SecondaryEffect == null) + return; + var scriptName = test.Move.SecondaryEffect.Name; - try - { - await Assert.That(library.ScriptResolver.TryResolve(ScriptCategory.Move, scriptName, - move.SecondaryEffect.Parameters, out var script)).IsTrue(); - } - catch (Exception e) - { - throw new AggregateException($"Failed to resolve script for move {move.Name} with effect {scriptName}", e); - } + try + { + await Assert.That(test.Library.ScriptResolver.TryResolve(ScriptCategory.Move, scriptName, + test.Move.SecondaryEffect.Parameters, out var script)).IsTrue(); + } + catch (Exception e) + { + throw new AggregateException($"Failed to resolve script for move {test.Move.Name} with effect {scriptName}", e); } } } \ No newline at end of file diff --git a/PkmnLib.Tests/Integration/IntegrationTestRunner.cs b/PkmnLib.Tests/Integration/IntegrationTestRunner.cs index daba4e5..c164479 100644 --- a/PkmnLib.Tests/Integration/IntegrationTestRunner.cs +++ b/PkmnLib.Tests/Integration/IntegrationTestRunner.cs @@ -15,6 +15,8 @@ public class IntegrationTestRunner var serializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, + AllowTrailingCommas = true, + ReadCommentHandling = JsonCommentHandling.Skip, }; foreach (var file in files) { diff --git a/PkmnLib.Tests/Integration/Models/IntegrationTestModel.cs b/PkmnLib.Tests/Integration/Models/IntegrationTestModel.cs index 7e38c64..921db2c 100644 --- a/PkmnLib.Tests/Integration/Models/IntegrationTestModel.cs +++ b/PkmnLib.Tests/Integration/Models/IntegrationTestModel.cs @@ -6,6 +6,12 @@ public class IntegrationTestModel public string Description { get; set; } = null!; public IntegrationTestBattleSetup BattleSetup { get; set; } = null!; public IntegrationTestAction[] Actions { get; set; } = null!; + + /// + public override string ToString() + { + return Name; + } } public class IntegrationTestBattleSetup diff --git a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs index 7df9942..5fd1ee2 100644 --- a/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs +++ b/Plugins/PkmnLib.Plugin.Gen7/Scripts/Moves/FireFang.cs @@ -2,6 +2,7 @@ using PkmnLib.Plugin.Gen7.Scripts.Pokemon; namespace PkmnLib.Plugin.Gen7.Scripts.Moves; +[Script(ScriptCategory.Move, "fire_fang")] public class FireFang : Script { ///