using System.Text.Json.Nodes; using System.Text.Json.Serialization; using CSPath; using PkmnLib.Dynamic.Models; using PkmnLib.Dynamic.Models.Choices; using JsonSerializer = System.Text.Json.JsonSerializer; namespace PkmnLib.Tests.Integration.Models; [JsonDerivedType(typeof(SetPokemonAction), "setPokemon"), JsonDerivedType(typeof(SetMoveChoiceAction), "setMoveChoice"), JsonDerivedType(typeof(SetPassChoiceAction), "setPassChoice"), JsonDerivedType(typeof(AssertAction), "assert")] public abstract class IntegrationTestAction { public abstract Task Execute(IBattle battle); } public class SetPokemonAction : IntegrationTestAction { public List Place { get; set; } = null!; public List FromParty { get; set; } = null!; public override Task Execute(IBattle battle) { var mon = battle.Parties[FromParty[0]].Party[FromParty[1]]; battle.Sides[Place[0]].SwapPokemon(Place[1], mon); Console.WriteLine($"Set: {mon} to place {Place[0]}:{Place[1]}"); return Task.CompletedTask; } } public class SetMoveChoiceAction : IntegrationTestAction { public List Place { get; set; } = null!; public string Move { get; set; } = null!; public List Target { get; set; } = null!; /// public override async Task Execute(IBattle battle) { var user = battle.Sides[Place[0]].Pokemon[Place[1]]; await Assert.That(user).IsNotNull(); var move = user!.Moves.First(m => m?.MoveData.Name == Move); await Assert.That(move).IsNotNull(); var res = battle.TrySetChoice(new MoveChoice(user, move!, Target[0], Target[1])); await Assert.That(res).IsTrue(); var target = battle.Sides[Target[0]].Pokemon[Target[1]]; Console.WriteLine($"Choice: {user} used {move} on {target} ({Target[0]}:{Target[1]})"); } } public class SetPassChoiceAction : IntegrationTestAction { public List Place { get; set; } = null!; /// public override async Task Execute(IBattle battle) { var user = battle.Sides[Place[0]].Pokemon[Place[1]]; await Assert.That(user).IsNotNull(); var res = battle.TrySetChoice(new PassChoice(user!)); await Assert.That(res).IsTrue(); Console.WriteLine($"Choice: {user} Pass"); } } public class AssertAction : IntegrationTestAction { public string Value { get; init; } = null!; public JsonNode Expected { get; init; } = null!; /// public override async Task Execute(IBattle battle) { var list = battle.Path(Value).ToList(); var value = list.Count == 1 ? list[0] : list; var serialized = JsonSerializer.Serialize(value); #pragma warning disable TUnitAssertions0003 await Assert.That(serialized, Value).IsEqualTo(Expected.ToJsonString()); #pragma warning restore TUnitAssertions0003 Console.WriteLine($"Assert: {Value} = {serialized}"); } }