diff --git a/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs b/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs index 50d9fd809..46fc72727 100644 --- a/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs +++ b/PKHeX.Core/Legality/Encounters/Generator/EncounterMovesetGenerator.cs @@ -32,7 +32,7 @@ public static IEnumerable GeneratePKMs(PKM pk, ITrainerInfo info, int[] mov #if DEBUG var la = new LegalityAnalysis(result); if (!la.Valid) - throw new Exception(); + throw new Exception("Legality analysis of generated Pokémon is invalid"); #endif yield return result; } diff --git a/PKHeX.Core/Util/DataUtil.cs b/PKHeX.Core/Util/DataUtil.cs index 99bf57790..5afa5103d 100644 --- a/PKHeX.Core/Util/DataUtil.cs +++ b/PKHeX.Core/Util/DataUtil.cs @@ -15,6 +15,8 @@ public static partial class Util private static readonly Dictionary resourceNameMap = new Dictionary(); private static readonly Dictionary stringListCache = new Dictionary(); + private static object getStringListLoadLock = new object(); + #region String Lists /// @@ -85,7 +87,15 @@ public static string[] GetStringList(string f) string[] rawlist = txt.Split('\n'); for (int i = 0; i < rawlist.Length; i++) rawlist[i] = rawlist[i].TrimEnd('\r'); - stringListCache.Add(f, rawlist); + + lock (getStringListLoadLock) // Make sure only one thread can write to the cache + { + if (!stringListCache.ContainsKey(f)) // Check cache again in case of race condition + { + stringListCache.Add(f, rawlist); + } + } + return (string[])rawlist.Clone(); } diff --git a/PKHeX.sln b/PKHeX.sln index 0c0d7f3c4..f6312a2ef 100644 --- a/PKHeX.sln +++ b/PKHeX.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26430.4 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PKHeX.Tests", "Tests\PKHeX.Tests\PKHeX.Tests.csproj", "{8E2499BC-C11A-4809-8737-66D35A625425}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{7C0598C9-DDF3-4ACC-B15D-6A626ADB7530}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0137B955-AED7-4769-BDFE-637034CA9F8A}" @@ -15,7 +13,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PKHeX.WinForms", "PKHeX.WinForms\PKHeX.WinForms.csproj", "{D1B91861-A448-4762-A313-C7BC179F4415}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PKHeX.Core", "PKHeX.Core\PKHeX.Core.csproj", "{279E59F2-50EA-475D-8BA4-FA69F0578C0D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PKHeX.Core", "PKHeX.Core\PKHeX.Core.csproj", "{279E59F2-50EA-475D-8BA4-FA69F0578C0D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PKHeX.Core.Tests", "Tests\PKHeX.Core.Tests\PKHeX.Core.Tests.csproj", "{C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -31,22 +31,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce|Any CPU.ActiveCfg = Release|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce|Any CPU.Build.0 = Release|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce|x86.ActiveCfg = Release|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.ClickOnce|x86.Build.0 = Release|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.Debug|x86.ActiveCfg = Debug|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.Debug|x86.Build.0 = Debug|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.Mono-Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.Mono-Debug|x86.ActiveCfg = Debug|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.Mono-Release|Any CPU.ActiveCfg = Release|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.Mono-Release|x86.ActiveCfg = Release|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.Release|Any CPU.Build.0 = Release|Any CPU - {8E2499BC-C11A-4809-8737-66D35A625425}.Release|x86.ActiveCfg = Release|x86 - {8E2499BC-C11A-4809-8737-66D35A625425}.Release|x86.Build.0 = Release|x86 {D1B91861-A448-4762-A313-C7BC179F4415}.ClickOnce|Any CPU.ActiveCfg = ClickOnce|Any CPU {D1B91861-A448-4762-A313-C7BC179F4415}.ClickOnce|Any CPU.Build.0 = ClickOnce|Any CPU {D1B91861-A448-4762-A313-C7BC179F4415}.ClickOnce|x86.ActiveCfg = Release|x86 @@ -87,11 +71,34 @@ Global {279E59F2-50EA-475D-8BA4-FA69F0578C0D}.Release|Any CPU.Build.0 = Release|Any CPU {279E59F2-50EA-475D-8BA4-FA69F0578C0D}.Release|x86.ActiveCfg = Release|Any CPU {279E59F2-50EA-475D-8BA4-FA69F0578C0D}.Release|x86.Build.0 = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.ClickOnce|Any CPU.ActiveCfg = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.ClickOnce|Any CPU.Build.0 = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.ClickOnce|x86.ActiveCfg = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.ClickOnce|x86.Build.0 = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Debug|x86.ActiveCfg = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Debug|x86.Build.0 = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Debug|Any CPU.Build.0 = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Debug|x86.ActiveCfg = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Debug|x86.Build.0 = Debug|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Release|Any CPU.ActiveCfg = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Release|Any CPU.Build.0 = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Release|x86.ActiveCfg = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Mono-Release|x86.Build.0 = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Release|Any CPU.Build.0 = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Release|x86.ActiveCfg = Release|Any CPU + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {8E2499BC-C11A-4809-8737-66D35A625425} = {7C0598C9-DDF3-4ACC-B15D-6A626ADB7530} + {C3B5B74F-ACE8-4FB2-A917-0DEDBFD5703B} = {7C0598C9-DDF3-4ACC-B15D-6A626ADB7530} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AAD7224E-2087-43E8-A7C9-D5555BFBB3B9} EndGlobalSection EndGlobal diff --git a/Tests/PKHeX.Tests/Legality/Illegal/AltForm/105-02 - Marowak - A36BF82DC6F6.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/AltForm/105-02 - Marowak - A36BF82DC6F6.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/AltForm/105-02 - Marowak - A36BF82DC6F6.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/AltForm/105-02 - Marowak - A36BF82DC6F6.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/AltForm/423-01 - Gastrodon - 6CE785FF60E2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/AltForm/423-01 - Gastrodon - 6CE785FF60E2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/AltForm/423-01 - Gastrodon - 6CE785FF60E2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/AltForm/423-01 - Gastrodon - 6CE785FF60E2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/AltForm/678-01 ★ - Meowstic - 01873505869C.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/AltForm/678-01 ★ - Meowstic - 01873505869C.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/AltForm/678-01 ★ - Meowstic - 01873505869C.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/AltForm/678-01 ★ - Meowstic - 01873505869C.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/038 - タマゴ - D8E92C842F48 Evo Egg.pk3 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/038 - タマゴ - D8E92C842F48 Evo Egg.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/038 - タマゴ - D8E92C842F48 Evo Egg.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/038 - タマゴ - D8E92C842F48 Evo Egg.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/094 - Gengar - B781C838BA27 Transfer BadAbilNum.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/094 - Gengar - B781C838BA27 Transfer BadAbilNum.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/094 - Gengar - B781C838BA27 Transfer BadAbilNum.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/094 - Gengar - B781C838BA27 Transfer BadAbilNum.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/121 ★ - EGG - 1B87 Evo Egg.pk2 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/121 ★ - EGG - 1B87 Evo Egg.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/121 ★ - EGG - 1B87 Evo Egg.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/121 ★ - EGG - 1B87 Evo Egg.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/196 - Mentali - 16FD27C35E93 Transfer LevelUp VC1.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/196 - Mentali - 16FD27C35E93 Transfer LevelUp VC1.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/196 - Mentali - 16FD27C35E93 Transfer LevelUp VC1.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/196 - Mentali - 16FD27C35E93 Transfer LevelUp VC1.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/199 ★ - EGG - EDB6 Evo Egg.pk2 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/199 ★ - EGG - EDB6 Evo Egg.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/199 ★ - EGG - EDB6 Evo Egg.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/199 ★ - EGG - EDB6 Evo Egg.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/208 - タマゴ - E4466BAA9428 Evo Egg.pk3 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/208 - タマゴ - E4466BAA9428 Evo Egg.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/208 - タマゴ - E4466BAA9428 Evo Egg.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/208 - タマゴ - E4466BAA9428 Evo Egg.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/497 - Serperior - gen5 HA not available.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/497 - Serperior - gen5 HA not available.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/497 - Serperior - gen5 HA not available.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/497 - Serperior - gen5 HA not available.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/JPN mew long nickname.pk6 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/JPN mew long nickname.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/JPN mew long nickname.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/JPN mew long nickname.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/Kingdra Korean VC1.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/Kingdra Korean VC1.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/Kingdra Korean VC1.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/Kingdra Korean VC1.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/Regigigas No Language.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/Regigigas No Language.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/Regigigas No Language.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/Regigigas No Language.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/Spearow VC Contest Stats.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/Spearow VC Contest Stats.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/Spearow VC Contest Stats.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/Spearow VC Contest Stats.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/VC1 Celebi transfer.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/VC1 Celebi transfer.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/VC1 Celebi transfer.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/VC1 Celebi transfer.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/VC1 Sentret transfer.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/VC1 Sentret transfer.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/VC1 Sentret transfer.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/VC1 Sentret transfer.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Misc/XD Shuckle Gift no Fateful.ck3 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/XD Shuckle Gift no Fateful.ck3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Misc/XD Shuckle Gift no Fateful.ck3 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Misc/XD Shuckle Gift no Fateful.ck3 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Moves/292 - SHEDINJA - 4E10A0E852EE (two Ninjask Moves).pk3 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Moves/292 - SHEDINJA - 4E10A0E852EE (two Ninjask Moves).pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Moves/292 - SHEDINJA - 4E10A0E852EE (two Ninjask Moves).pk3 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Moves/292 - SHEDINJA - 4E10A0E852EE (two Ninjask Moves).pk3 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Moves/803 - Poipole - C7B3534918F0.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Moves/803 - Poipole - C7B3534918F0.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Moves/803 - Poipole - C7B3534918F0.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Moves/803 - Poipole - C7B3534918F0.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/WC3/001 - Bulbasaur - 4543EBE98C5F.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/WC3/001 - Bulbasaur - 4543EBE98C5F.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/WC3/001 - Bulbasaur - 4543EBE98C5F.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/WC3/001 - Bulbasaur - 4543EBE98C5F.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/WC3/004 - ヒトカゲ - 1CCD0A2B1E99.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/WC3/004 - ヒトカゲ - 1CCD0A2B1E99.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/WC3/004 - ヒトカゲ - 1CCD0A2B1E99.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/WC3/004 - ヒトカゲ - 1CCD0A2B1E99.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/WC7/745-01 - Lycanroc - AA223CC9A6E7.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/WC7/745-01 - Lycanroc - AA223CC9A6E7.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/WC7/745-01 - Lycanroc - AA223CC9A6E7.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/WC7/745-01 - Lycanroc - AA223CC9A6E7.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B2A43CC9A6E7.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B2A43CC9A6E7.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B2A43CC9A6E7.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B2A43CC9A6E7.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B3A83CC9A6E7.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B3A83CC9A6E7.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B3A83CC9A6E7.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/WC7/745-02 - Lycanroc - B3A83CC9A6E7.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Wild/132 - Ditto - 5CD1D273663D.pk6 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/132 - Ditto - 5CD1D273663D.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Wild/132 - Ditto - 5CD1D273663D.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/132 - Ditto - 5CD1D273663D.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Wild/213 - Shuckle - 825B411103A3.pk6 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/213 - Shuckle - 825B411103A3.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Wild/213 - Shuckle - 825B411103A3.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/213 - Shuckle - 825B411103A3.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Wild/646-01 ★ - キュレム - 0D420000000A.pk5 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/646-01 ★ - キュレム - 0D420000000A.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Wild/646-01 ★ - キュレム - 0D420000000A.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/646-01 ★ - キュレム - 0D420000000A.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Wild/706_-_Goodra_-_971B6773DCC2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/706_-_Goodra_-_971B6773DCC2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Wild/706_-_Goodra_-_971B6773DCC2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/706_-_Goodra_-_971B6773DCC2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Wild/744-01 - Rockruff - BEBC85FF60E2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/744-01 - Rockruff - BEBC85FF60E2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Wild/744-01 - Rockruff - BEBC85FF60E2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/744-01 - Rockruff - BEBC85FF60E2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Illegal/Wild/745-02 - Lycanroc - 047385FF60E2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/745-02 - Lycanroc - 047385FF60E2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Illegal/Wild/745-02 - Lycanroc - 047385FF60E2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Illegal/Wild/745-02 - Lycanroc - 047385FF60E2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/004 - CHARMANDER - D5EF.pk1 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/004 - CHARMANDER - D5EF.pk1 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/004 - CHARMANDER - D5EF.pk1 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/004 - CHARMANDER - D5EF.pk1 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/124 - ZYNX - 70DF498A2E1D.pk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/124 - ZYNX - 70DF498A2E1D.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/124 - ZYNX - 70DF498A2E1D.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/124 - ZYNX - 70DF498A2E1D.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/172 - Egg - 7D3CF55CFC10.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/172 - Egg - 7D3CF55CFC10.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/172 - Egg - 7D3CF55CFC10.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/172 - Egg - 7D3CF55CFC10.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/183 - 알 - AA4E3344817C.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/183 - 알 - AA4E3344817C.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/183 - 알 - AA4E3344817C.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/183 - 알 - AA4E3344817C.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/235 - 알 - 10DB.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/235 - 알 - 10DB.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/235 - 알 - 10DB.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/235 - 알 - 10DB.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/236 - Œuf - 314CC020CB44.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/236 - Œuf - 314CC020CB44.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/236 - Œuf - 314CC020CB44.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/236 - Œuf - 314CC020CB44.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/236 - 알 - F55CC3F29788.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/236 - 알 - F55CC3F29788.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/236 - 알 - F55CC3F29788.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/236 - 알 - F55CC3F29788.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/292 - SHEDINJA - 4889A0E852EE.pk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/292 - SHEDINJA - 4889A0E852EE.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/292 - SHEDINJA - 4889A0E852EE.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/292 - SHEDINJA - 4889A0E852EE.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/300 - Egg - 0673311A3560.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/300 - Egg - 0673311A3560.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/300 - Egg - 0673311A3560.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/300 - Egg - 0673311A3560.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/300 - Uovo - 0C910B68370A.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/300 - Uovo - 0C910B68370A.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/300 - Uovo - 0C910B68370A.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/300 - Uovo - 0C910B68370A.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/343 - 알 - 4569F88A9BCE.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/343 - 알 - 4569F88A9BCE.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/343 - 알 - 4569F88A9BCE.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/343 - 알 - 4569F88A9BCE.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/479 - Ei - B7178C463B60.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/479 - Ei - B7178C463B60.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/479 - Ei - B7178C463B60.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/479 - Ei - B7178C463B60.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/479 ★ - 알 - BE0D0000000A.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/479 ★ - 알 - BE0D0000000A.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/479 ★ - 알 - BE0D0000000A.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/479 ★ - 알 - BE0D0000000A.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/610 - キバゴ - 6F91B110EED1.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/610 - キバゴ - 6F91B110EED1.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/610 - キバゴ - 6F91B110EED1.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/610 - キバゴ - 6F91B110EED1.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/General/645-01 - Landorus - 57BA472C4EB8.pk6 b/Tests/PKHeX.Core.Tests/Legality/Legal/General/645-01 - Landorus - 57BA472C4EB8.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/General/645-01 - Landorus - 57BA472C4EB8.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Legal/General/645-01 - Landorus - 57BA472C4EB8.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 1 Tradeback/107 ★ - エビワラー - 68EC Gen2 Future-Gen Evo Egg.pk1 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 1 Tradeback/107 ★ - エビワラー - 68EC Gen2 Future-Gen Evo Egg.pk1 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 1 Tradeback/107 ★ - エビワラー - 68EC Gen2 Future-Gen Evo Egg.pk1 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 1 Tradeback/107 ★ - エビワラー - 68EC Gen2 Future-Gen Evo Egg.pk1 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/025 - PIKACHU - 2129.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/025 - PIKACHU - 2129.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/025 - PIKACHU - 2129.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/025 - PIKACHU - 2129.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/035 - CLEFAIRY - 8A0C.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/035 - CLEFAIRY - 8A0C.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/035 - CLEFAIRY - 8A0C.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/035 - CLEFAIRY - 8A0C.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/043 - ODDISH - 2DCE.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/043 - ODDISH - 2DCE.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/043 - ODDISH - 2DCE.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/043 - ODDISH - 2DCE.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/106 - HITMONLEE - 6500.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/107 - HITMONCHAN - 26B0.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/107 - HITMONCHAN - 26B0.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/107 - HITMONCHAN - 26B0.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/107 - HITMONCHAN - 26B0.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/112 - DON - 4DD6.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/112 - DON - 4DD6.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/112 - DON - 4DD6.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/112 - DON - 4DD6.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/230 - KINGDRA - 3712.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/230 - KINGDRA - 3712.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/230 - KINGDRA - 3712.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/230 - KINGDRA - 3712.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/230 - 킹드라 - D74685FF60E2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/230 - 킹드라 - D74685FF60E2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/230 - 킹드라 - D74685FF60E2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/230 - 킹드라 - D74685FF60E2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/251 - Celebi - FDB063C95344.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/251 - Celebi - FDB063C95344.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/251 - Celebi - FDB063C95344.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/251 - Celebi - FDB063C95344.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 2/251_-_CELEBI_-_1EE8.pk2 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/251_-_CELEBI_-_1EE8.pk2 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 2/251_-_CELEBI_-_1EE8.pk2 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 2/251_-_CELEBI_-_1EE8.pk2 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/195 - QUAGSIRE - E2AD60FEC722.pk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/195 - QUAGSIRE - E2AD60FEC722.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/195 - QUAGSIRE - E2AD60FEC722.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/195 - QUAGSIRE - E2AD60FEC722.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/229 - HOUNDOOM - 4311EC0CD621.pk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/229 - HOUNDOOM - 4311EC0CD621.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/229 - HOUNDOOM - 4311EC0CD621.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/229 - HOUNDOOM - 4311EC0CD621.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/284 - MASQUERAIN - 8C49324DA947.pk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/284 - MASQUERAIN - 8C49324DA947.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/284 - MASQUERAIN - 8C49324DA947.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/284 - MASQUERAIN - 8C49324DA947.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/461 - Weavile - 041331D10483.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/461 - Weavile - 041331D10483.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/461 - Weavile - 041331D10483.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/LevelUp learn move then Evolve/461 - Weavile - 041331D10483.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/Misc/054 - PSYDUCK - 42FFF661FBE0 WC3 Hatched.pk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/Misc/054 - PSYDUCK - 42FFF661FBE0 WC3 Hatched.pk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/Misc/054 - PSYDUCK - 42FFF661FBE0 WC3 Hatched.pk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/Misc/054 - PSYDUCK - 42FFF661FBE0 WC3 Hatched.pk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/Misc/250 - HO-OH - 2241C625EB05 Italian longOT.ck3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/Misc/250 - HO-OH - 2241C625EB05 Italian longOT.ck3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/Misc/250 - HO-OH - 2241C625EB05 Italian longOT.ck3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/Misc/250 - HO-OH - 2241C625EB05 Italian longOT.ck3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 1904411103A3 NoFateful.xk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 1904411103A3 NoFateful.xk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 1904411103A3 NoFateful.xk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 1904411103A3 NoFateful.xk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 475E411103A3 Fateful.xk3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 475E411103A3 Fateful.xk3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 475E411103A3 Fateful.xk3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 475E411103A3 Fateful.xk3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 6FC4411103A3 Fateful.ck3 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 6FC4411103A3 Fateful.ck3 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 6FC4411103A3 Fateful.ck3 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 3/XD Fateful Gifts/213 - SHUCKLE - 6FC4411103A3 Fateful.ck3 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - 86943584D01B.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - 86943584D01B.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - 86943584D01B.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - 86943584D01B.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - C589B4EFB45F.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - C589B4EFB45F.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - C589B4EFB45F.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Rock Smash/098 - KRABBY - C589B4EFB45F.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/104 ★ - CUBONE - ABE400000004.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/104 ★ - CUBONE - ABE400000004.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/104 ★ - CUBONE - ABE400000004.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/104 ★ - CUBONE - ABE400000004.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/201 - UNOWN - E8FFA68025F9.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/201 - UNOWN - E8FFA68025F9.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/201 - UNOWN - E8FFA68025F9.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/201 - UNOWN - E8FFA68025F9.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/215 - SNEASEL - 72E6A36A07BD.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/215 - SNEASEL - 72E6A36A07BD.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/215 - SNEASEL - 72E6A36A07BD.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/215 - SNEASEL - 72E6A36A07BD.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/231 - PHANPY - 579744E8F948.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/231 - PHANPY - 579744E8F948.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/231 - PHANPY - 579744E8F948.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/231 - PHANPY - 579744E8F948.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 - LARVITAR - 2AC20000000E.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 - LARVITAR - 2AC20000000E.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 - LARVITAR - 2AC20000000E.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 - LARVITAR - 2AC20000000E.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 ★ - LARVITAR - E4CF00000002.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 ★ - LARVITAR - E4CF00000002.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 ★ - LARVITAR - E4CF00000002.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/246 ★ - LARVITAR - E4CF00000002.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/308 - MEDICHAM - 25F8A56FA3F2.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/308 - MEDICHAM - 25F8A56FA3F2.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/308 - MEDICHAM - 25F8A56FA3F2.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/308 - MEDICHAM - 25F8A56FA3F2.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/477 - DUSKNOIR - 12DF9E28828D.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/477 - DUSKNOIR - 12DF9E28828D.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/477 - DUSKNOIR - 12DF9E28828D.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 EncounterType/Special Handling/477 - DUSKNOIR - 12DF9E28828D.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 Transfer/230 - SEASOR - 4E170000007F.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 Transfer/230 - SEASOR - 4E170000007F.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 Transfer/230 - SEASOR - 4E170000007F.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 Transfer/230 - SEASOR - 4E170000007F.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4 Transfer/323 - CAMERUPT - 1EAB066E02B3.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 Transfer/323 - CAMERUPT - 1EAB066E02B3.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4 Transfer/323 - CAMERUPT - 1EAB066E02B3.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4 Transfer/323 - CAMERUPT - 1EAB066E02B3.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4/242 - HEITEIRA - E83AB36E7C5C.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/242 - HEITEIRA - E83AB36E7C5C.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4/242 - HEITEIRA - E83AB36E7C5C.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/242 - HEITEIRA - E83AB36E7C5C.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4/407 - ROSERADE - E24C58625928.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/407 - ROSERADE - E24C58625928.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4/407 - ROSERADE - E24C58625928.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/407 - ROSERADE - E24C58625928.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 4/470 - LEAFEON - 65B05FEF8D69.pk4 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/470 - LEAFEON - 65B05FEF8D69.pk4 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 4/470 - LEAFEON - 65B05FEF8D69.pk4 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 4/470 - LEAFEON - 65B05FEF8D69.pk4 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 5/143 - Tripón - D4336200001F Evolved.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/143 - Tripón - D4336200001F Evolved.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 5/143 - Tripón - D4336200001F Evolved.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/143 - Tripón - D4336200001F Evolved.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 5/242 - Heiteira - C871311C7FE4.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/242 - Heiteira - C871311C7FE4.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 5/242 - Heiteira - C871311C7FE4.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/242 - Heiteira - C871311C7FE4.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 5/407 - Roserade - 8404F7E60F78.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/407 - Roserade - 8404F7E60F78.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 5/407 - Roserade - 8404F7E60F78.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/407 - Roserade - 8404F7E60F78.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 5/446 - Tripón - BDC46200001F Trade Ability Mismatch.pk5 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/446 - Tripón - BDC46200001F Trade Ability Mismatch.pk5 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 5/446 - Tripón - BDC46200001F Trade Ability Mismatch.pk5 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 5/446 - Tripón - BDC46200001F Trade Ability Mismatch.pk5 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 6/236 - Tyrogue - 88A5A8BF7345.pk6 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 6/236 - Tyrogue - 88A5A8BF7345.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 6/236 - Tyrogue - 88A5A8BF7345.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 6/236 - Tyrogue - 88A5A8BF7345.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 6/280 - Ralts - 4732E9FE3B34 No Nickname Trade.pk6 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 6/280 - Ralts - 4732E9FE3B34 No Nickname Trade.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 6/280 - Ralts - 4732E9FE3B34 No Nickname Trade.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 6/280 - Ralts - 4732E9FE3B34 No Nickname Trade.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 6/357 ★ - Walker Mower - 0272CF40335F.pk6 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 6/357 ★ - Walker Mower - 0272CF40335F.pk6 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 6/357 ★ - Walker Mower - 0272CF40335F.pk6 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 6/357 ★ - Walker Mower - 0272CF40335F.pk6 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Static/664-07 - Scatterbug - 6703815D4F75.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Static/664-07 - Scatterbug - 6703815D4F75.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Static/664-07 - Scatterbug - 6703815D4F75.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Static/664-07 - Scatterbug - 6703815D4F75.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Static/666-07 - Vivillon - 6560815D4F75.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Static/666-07 - Vivillon - 6560815D4F75.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Static/666-07 - Vivillon - 6560815D4F75.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Static/666-07 - Vivillon - 6560815D4F75.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/028 ★ - Sandslash - 583900000000.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/028 ★ - Sandslash - 583900000000.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/028 ★ - Sandslash - 583900000000.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/028 ★ - Sandslash - 583900000000.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/106 - Kicklee - 4DF62085C4CF.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/106 - Kicklee - 4DF62085C4CF.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/106 - Kicklee - 4DF62085C4CF.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/106 - Kicklee - 4DF62085C4CF.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/107 - Tygnon - 0AADC469F5A7.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/107 - Tygnon - 0AADC469F5A7.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/107 - Tygnon - 0AADC469F5A7.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/107 - Tygnon - 0AADC469F5A7.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/107 ★ - エビワラー - F5486DD483CC.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/107 ★ - エビワラー - F5486DD483CC.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/107 ★ - エビワラー - F5486DD483CC.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/107 ★ - エビワラー - F5486DD483CC.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/124 - LOLA - 0F0EBB7A9D04.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/124 - LOLA - 0F0EBB7A9D04.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/124 - LOLA - 0F0EBB7A9D04.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/124 - LOLA - 0F0EBB7A9D04.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/151 - ミュウ - 6B9DADB23EB0.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/151 - ミュウ - 6B9DADB23EB0.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/151 - ミュウ - 6B9DADB23EB0.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/151 - ミュウ - 6B9DADB23EB0.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/204 - クヌギダマ - 4CF0E7EAFE99.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/204 - クヌギダマ - 4CF0E7EAFE99.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/204 - クヌギダマ - 4CF0E7EAFE99.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/204 - クヌギダマ - 4CF0E7EAFE99.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/230 - Kingdra - DFF1FEBB3C31.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/230 - Kingdra - DFF1FEBB3C31.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/230 - Kingdra - DFF1FEBB3C31.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/230 - Kingdra - DFF1FEBB3C31.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/266 ★ - Silcoon - 319000000002.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/266 ★ - Silcoon - 319000000002.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/266 ★ - Silcoon - 319000000002.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/266 ★ - Silcoon - 319000000002.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/268 ★ - Cascoon - A8FB00000007.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/268 ★ - Cascoon - A8FB00000007.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/268 ★ - Cascoon - A8FB00000007.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/268 ★ - Cascoon - A8FB00000007.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/269 ★ - Dustox - C03700000003.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/269 ★ - Dustox - C03700000003.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/269 ★ - Dustox - C03700000003.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/269 ★ - Dustox - C03700000003.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/466 - エレキブル - 45ED6A2454B8.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/466 - エレキブル - 45ED6A2454B8.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/466 - エレキブル - 45ED6A2454B8.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/466 - エレキブル - 45ED6A2454B8.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/700 - ニンフィア - F14C560A57A2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/700 - ニンフィア - F14C560A57A2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Transfer/700 - ニンフィア - F14C560A57A2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Transfer/700 - ニンフィア - F14C560A57A2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Wild/080 - Slowbro - A0935F4796B1.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Wild/080 - Slowbro - A0935F4796B1.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Wild/080 - Slowbro - A0935F4796B1.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Wild/080 - Slowbro - A0935F4796B1.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Wild/744 - Rockruff - B6F085FF60E2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Wild/744 - Rockruff - B6F085FF60E2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Wild/744 - Rockruff - B6F085FF60E2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Wild/744 - Rockruff - B6F085FF60E2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/Legal/Generation 7 Wild/745 - Lycanroc - F45085FF60E2.pk7 b/Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Wild/745 - Lycanroc - F45085FF60E2.pk7 similarity index 100% rename from Tests/PKHeX.Tests/Legality/Legal/Generation 7 Wild/745 - Lycanroc - F45085FF60E2.pk7 rename to Tests/PKHeX.Core.Tests/Legality/Legal/Generation 7 Wild/745 - Lycanroc - F45085FF60E2.pk7 diff --git a/Tests/PKHeX.Tests/Legality/LegalityTests.cs b/Tests/PKHeX.Core.Tests/Legality/LegalityTests.cs similarity index 56% rename from Tests/PKHeX.Tests/Legality/LegalityTests.cs rename to Tests/PKHeX.Core.Tests/Legality/LegalityTests.cs index 095e2906b..99610f199 100644 --- a/Tests/PKHeX.Tests/Legality/LegalityTests.cs +++ b/Tests/PKHeX.Core.Tests/Legality/LegalityTests.cs @@ -1,36 +1,29 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; +using FluentAssertions; using PKHeX.Core; +using System.IO; +using Xunit; namespace PKHeX.Tests.Legality { - [TestClass] public class LegalityTest { - private const string LegalityWordCategory = "PKM Wordfilter Tests"; - private const string LegalityValidCategory = "PKM Validity Tests"; - static LegalityTest() { if (!EncounterEvent.Initialized) EncounterEvent.RefreshMGDB(); } - [TestMethod] - [TestCategory(LegalityWordCategory)] - public void BadwordTest() - { - string[] phrases = - { - "censor", "buttnugget", "18넘" - }; - foreach (var phrase in phrases) - Assert.IsTrue(WordFilter.IsFiltered(phrase, out _), $"Word not filtered: {phrase}."); + [Theory] + [InlineData("censor")] + [InlineData("buttnugget")] + [InlineData("18넘")] + public void CensorsBadWords(string badword) + { + WordFilter.IsFiltered(badword, out _).Should().BeTrue($"the word should have been identified as a bad word"); } - [TestMethod] - [TestCategory(LegalityValidCategory)] - public void VerifyLegalityTest() + [Fact] + public void TestFilesPassOrFailLegalityChecks() { var folder = Directory.GetCurrentDirectory(); while (!folder.EndsWith(nameof(Tests))) @@ -43,28 +36,28 @@ public void VerifyLegalityTest() } // ReSharper disable once UnusedParameter.Local - private static void VerifyAll(string folder, string name, bool IsValid) + private static void VerifyAll(string folder, string name, bool isValid) { var path = Path.Combine(folder, name); - Assert.IsTrue(Directory.Exists(path), $"Folder does not exist: {folder}."); + Directory.Exists(path).Should().BeTrue($"the specified test directory at '{path}' should exist"); var files = Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories); foreach (var file in files) { var fi = new FileInfo(file); - Assert.IsNotNull(fi, $"Invalid file: {file}"); - Assert.IsTrue(PKX.IsPKM(fi.Length), $"Invalid file in {fi.Directory.Name} folder."); + fi.Should().NotBeNull($"the test file '{file}' should be a valid file"); + PKX.IsPKM(fi.Length).Should().BeTrue($"the test file '{file}' should have a valid file length"); var data = File.ReadAllBytes(file); var format = PKX.GetPKMFormatFromExtension(file[file.Length - 1], -1); if (format > 10) format = 6; var pkm = PKMConverter.GetPKMfromBytes(data, prefer: format); - Assert.IsNotNull(pkm, $"Failed to load PKM: {new FileInfo(file).Name}."); + pkm.Should().NotBe($"the PKM '{new FileInfo(file).Name}' should have been loaded"); ParseSettings.AllowGBCartEra = fi.DirectoryName.Contains("GBCartEra"); ParseSettings.AllowGen1Tradeback = fi.DirectoryName.Contains("1 Tradeback"); var legality = new LegalityAnalysis(pkm); - Assert.IsTrue(legality.Valid == IsValid, $"Failed to validate PKM as {(IsValid ? "Valid" : "Invalid")}: {fi.Directory.Name}\\{fi.Name}."); + legality.Valid.Should().Be(isValid, $"because the file '{fi.Directory.Name}\\{fi.Name}' should be {(isValid ? "Valid" : "Invalid")}"); } } } diff --git a/Tests/PKHeX.Core.Tests/Legality/ShadowTests.cs b/Tests/PKHeX.Core.Tests/Legality/ShadowTests.cs new file mode 100644 index 000000000..b8760f94e --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Legality/ShadowTests.cs @@ -0,0 +1,207 @@ +using System.Collections.Generic; +using FluentAssertions; +using PKHeX.Core; +using Xunit; + +namespace PKHeX.Tests.Legality +{ + public class ShadowTests + { + public class ValidityTests : ShadowTests + { + public static IEnumerable Lock1() + { + // Zubat (F) (Serious) + yield return new object[] { Encounters3Teams.Poochyena, 0xAF4E3161, new[] { 11, 29, 25, 6, 23, 10 } }; + + // Murkrow (M) (Docile) + yield return new object[] { Encounters3Teams.Pineco, 0xC3A0F1E5, new[] { 30, 3, 9, 10, 27, 30 } }; + } + + public static IEnumerable Lock2() + { + // Goldeen (F) (Serious) + // Horsea (M) (Quirky) + yield return new object[] { Encounters3Teams.Spheal, 0xA459BF44, new[] { 0, 11, 4, 28, 6, 13 } }; + + // Kirlia (M) (Hardy) + // Linoone (F) (Hardy) + yield return new object[] { Encounters3Teams.Natu, 0x8E14DAB6, new[] { 29, 24, 30, 16, 3, 18 } }; + + // Remoraid (M) (Docile) -- 73DB58CC + // Golbat (M) (Bashful) -- F6B04390 + yield return new object[] { Encounters3Teams.Roselia, 0x30E87CC7, new[] { 22, 11, 8, 26, 4, 29 } }; + + // 519AEF0E + // Duskull (M) (Quirky) -- 45BE3B97 + // Spinarak (F) (Hardy) -- E18F5A3E + yield return new object[] { Encounters3Teams.ColoMakuhita, 0xC252FEBA, new[] { 15, 9, 17, 16, 24, 22 } }; + + // 559C5F72 -- Quirky F => skip + // Duskull (M) (Quirky) -- A5AC2CCB + // Spinarak (F) (Hardy) -- D08FF135 + yield return new object[] { Encounters3Teams.ColoMakuhita, 0x61C676FC, new[] { 20, 28, 21, 18, 9, 1 } }; + + // 3CCB97BA -- Quirky F => skip * 2, Hardy Skip + // Duskull (M) (Quirky) -- 7F0D6783 @ 161 + // Spinarak (F) (Hardy) -- 6C03F545 @ 182 + yield return new object[] { Encounters3Teams.ColoMakuhita, 0x3B27608D, new[] { 7, 12, 5, 19, 3, 7 } }; + } + + public static IEnumerable Lock3() + { + // Luvdisc (F) (Docile) + // Beautifly (M) (Hardy) + // Roselia (M) (Quirky) + yield return new object[] { Encounters3Teams.Delcatty, 0x9BECA2A6, new[] { 31, 31, 25, 13, 22, 1 } }; + + // Kadabra (M) (Docile) + // Sneasel (F) (Hardy) + // Misdreavus (F) (Bashful) + yield return new object[] { Encounters3Teams.Meowth, 0x77D87601, new[] { 10, 27, 26, 13, 30, 19 } }; + + // Ralts (M) (Docile) + // Voltorb (-) (Hardy) + // Bagon (F) (Quirky) + yield return new object[] { Encounters3Teams.Numel, 0x37F95B26, new[] { 11, 8, 5, 10, 28, 14 } }; + } + + public static IEnumerable Lock4() + { + // Ninetales (F) (Serious) + // Jumpluff (M) (Docile) + // Azumarill (F) (Hardy) + // Shadow Tangela + yield return new object[] { Encounters3Teams.Butterfree, 0x2E49AC34, new[] { 15, 24, 7, 2, 11, 2 } }; + + // Huntail (M) (Docile) + // Cacturne (F) (Hardy) + // Weezing (F) (Serious) + // Ursaring (F) (Bashful) + yield return new object[] { Encounters3Teams.Arbok, 0x1973FD07, new[] { 13, 30, 3, 16, 20, 9 } }; + + // Lairon (F) (Bashful) + // Sealeo (F) (Serious) + // Slowking (F) (Docile) + // Ursaring (M) (Quirky) + yield return new object[] { Encounters3Teams.Primeape, 0x33893D4C, new[] { 26, 25, 24, 28, 29, 30 } }; + } + + + public static IEnumerable Lock5() + { + // many prior, all non shadow + yield return new object[] { Encounters3Teams.Seedot, 0x8CBD29DB, new[] { 19, 29, 30, 0, 7, 2 } }; + } + + [Theory] + [MemberData(nameof(Lock1))] + [MemberData(nameof(Lock2))] + [MemberData(nameof(Lock3))] + [MemberData(nameof(Lock4))] + public static void Verify(TeamLock[] teams, uint pid, int[] ivs) + { + var pk3 = new PK3 { PID = pid, IVs = ivs }; + var info = MethodFinder.Analyze(pk3); + info.Type.Should().Be(PIDType.CXD, "because the PID should match the CXD spread"); + bool match = GetCanOriginateFrom(teams, info); + match.Should().BeTrue($"because the lock conditions for {teams[0].Species} should have been verified"); + } + + [Theory] + [MemberData(nameof(Lock5))] + public static void VerifySingle(TeamLock[] teams, uint pid, int[] ivs) + { + var pk3 = new PK3 { PID = pid, IVs = ivs }; + var info = MethodFinder.Analyze(pk3); + info.Type.Should().Be(PIDType.CXD, "because the PID should match the CXD spread"); + bool match = LockFinder.IsFirstShadowLockValid(info, teams); + match.Should().BeTrue($"because the lock conditions for {teams[0].Species} should have been verified"); + } + } + + public class PIDTests : ShadowTests + { + public static IEnumerable TestData() + { + yield return new object[] + { + new[] + { + new uint[] {0xD118BA52, 0xA3127782, 0x16D95FA5, 0x31538B48}, + new uint[] {0x7D5FFE3E, 0x1D5720ED, 0xE0D89C99, 0x3494CDA1}, + new uint[] {0xAEB0C3A6, 0x956DC2FD, 0x3C11DCE8, 0xC93DF897}, + new uint[] {0xACCE2655, 0xFF2BA0A2, 0x22A8A7E6, 0x5F5380F4}, + new uint[] {0xDC1D1894, 0xFC0F75E2, 0x97BFAEBC, 0x38DDE117}, + new uint[] {0xDE278967, 0xFD86C9F7, 0x3E16FCFD, 0x1956D8B5}, + new uint[] {0xF8CB4CAE, 0x42DE628B, 0x48796CDA, 0xF6EAD3E2}, + new uint[] {0x56548F49, 0xA308E7DA, 0x28CB8ADF, 0xBEADBDC3}, + new uint[] {0xF2AC8419, 0xADA208E3, 0xDB3A0BA6, 0x5EEF1076}, + new uint[] {0x9D28899D, 0xA3ECC9F0, 0x606EC6F0, 0x451FAE3C}, + }, + Encounters3Teams.Delcatty + }; + yield return new object[] + { + new[] + { + new uint[] {0x4D6BE487, 0xBB3EFBFB, 0x6FD7EE06, 0x289D435F, 0x0EC25CE5}, + new uint[] {0xB04DF5B3, 0x661E499C, 0x94EB752D, 0xC5FA9DE5, 0x0A8C9738}, + new uint[] {0xCBB9A3B0, 0x9AC1A0B8, 0xCA3CAD46, 0x54FFCA27, 0x1D5AEC4F}, + new uint[] {0xB2AF145E, 0x455155C9, 0xB5CE4932, 0x4B8C6554, 0x55CE5E4B}, + new uint[] {0x193A0F3B, 0xE1474ECF, 0x4C30D215, 0x72262B89, 0x9B2F5B53}, + new uint[] {0xB73010B9, 0x361F1DB1, 0x2C65320A, 0x329A4A1E, 0x9334337E}, + new uint[] {0xFB6A6770, 0xE0068ECC, 0xB99B326E, 0x08A18311, 0x92D31CC2}, + new uint[] {0x5B1214BC, 0xB82FDDA9, 0x606D3D18, 0xA142F730, 0xCBA7A0C3}, + new uint[] {0xC7315E32, 0x76566AA1, 0xC0CE436E, 0x98C45DA8, 0x9D1BDC4A}, + new uint[] {0xB687F0AF, 0xC01DB6C6, 0xAD6DEC75, 0xDB041314, 0x0D949325}, + }, + Encounters3Teams.Butterfree + }; + } + + [Theory] + [MemberData(nameof(TestData))] + public static void VerifyResults(IReadOnlyList results, TeamLock[] team) + { + var pkm = new PK3(); + for (int i = 0; i < results.Count; i++) + { + var result = results[i]; + var seeds = getSeeds(result[result.Length - 1]); + bool match = false; + foreach (var seed in seeds) + { + PIDGenerator.SetValuesFromSeed(pkm, PIDType.CXD, seed); + var info = MethodFinder.Analyze(pkm); + info.OriginSeed.Should().Be(seed); + info.Type.Should().Be(PIDType.CXD, "because the PID should have matched the CXD spread"); + if (!GetCanOriginateFrom(team, info)) + continue; + match = true; + break; + } + match.Should().BeTrue($"because the lock conditions for result {i} and species {team[0].Species} should have been verified"); + } + + IEnumerable getSeeds(uint PID) + { + var top = PID >> 16; + var bot = PID & 0xFFFF; + + var seeds = MethodFinder.GetSeedsFromPIDEuclid(RNG.XDRNG, top, bot); + foreach (var s in seeds) + yield return RNG.XDRNG.Reverse(s, 3); + } + } + } + + /// + /// Checks if the PIDIV can originate from + /// + private static bool GetCanOriginateFrom(TeamLock[] possibleTeams, PIDIV info) + { + return LockFinder.IsAllShadowLockValid(info, possibleTeams); + } + } +} diff --git a/Tests/PKHeX.Core.Tests/PKHeX.Core.Tests.csproj b/Tests/PKHeX.Core.Tests/PKHeX.Core.Tests.csproj new file mode 100644 index 000000000..ce0662bc5 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/PKHeX.Core.Tests.csproj @@ -0,0 +1,35 @@ + + + + netcoreapp2.1 + + false + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + diff --git a/Tests/PKHeX.Tests/PKM/PIDIVTests.cs b/Tests/PKHeX.Core.Tests/PKM/PIDIVTests.cs similarity index 54% rename from Tests/PKHeX.Tests/PKM/PIDIVTests.cs rename to Tests/PKHeX.Core.Tests/PKM/PIDIVTests.cs index 875d1c9fd..cf66f9f51 100644 --- a/Tests/PKHeX.Tests/PKM/PIDIVTests.cs +++ b/Tests/PKHeX.Core.Tests/PKM/PIDIVTests.cs @@ -1,150 +1,142 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Linq; +using System.Linq; +using FluentAssertions; using PKHeX.Core; +using Xunit; namespace PKHeX.Tests.PKM { - [TestClass] public class PIDIVTest { private const string PIDIVTestCategory = "PKM PIDIV Matching Tests"; // Note: IVs are stored HP/ATK/DEF/SPE/SPA/SPD - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMatchingTest3() { // Method 1/2/4 var pk1 = new PK3 {PID = 0xE97E0000, IVs = new[] {17, 19, 20, 16, 13, 12}}; var ga1 = MethodFinder.Analyze(pk1); - Assert.AreEqual(PIDType.Method_1, ga1.Type, "Unable to match PID to Method 1 spread"); + Assert.Equal(PIDType.Method_1, ga1.Type); var pk2 = new PK3 {PID = 0x5271E97E, IVs = new[] {02, 18, 03, 12, 22, 24}}; - Assert.AreEqual(PIDType.Method_2, MethodFinder.Analyze(pk2)?.Type, "Unable to match PID to Method 2 spread"); + Assert.Equal(PIDType.Method_2, MethodFinder.Analyze(pk2)?.Type); var pk4 = new PK3 {PID = 0x31B05271, IVs = new[] {02, 18, 03, 05, 30, 11}}; - Assert.AreEqual(PIDType.Method_4, MethodFinder.Analyze(pk4)?.Type, "Unable to match PID to Method 4 spread"); + Assert.Equal(PIDType.Method_4, MethodFinder.Analyze(pk4)?.Type); var gk1 = new PK3(); PIDGenerator.SetValuesFromSeed(gk1, ga1.Type, ga1.OriginSeed); - Assert.AreEqual(pk1.PID, gk1.PID, "Unable to match generated PID to Method 1 PID"); - Assert.IsTrue(gk1.IVs.SequenceEqual(pk1.IVs), "Unable to match generated PID to Method 1 IVs"); + Assert.Equal(pk1.PID, gk1.PID); + Assert.True(gk1.IVs.SequenceEqual(pk1.IVs), "Unable to match generated PID to Method 1 IVs"); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMatchingTest3Unown() { // Method 1/2/4, reversed for Unown. var pk1U = new PK3 {PID = 0x815549A2, IVs = new[] {02, 26, 30, 30, 11, 26}, Species = 201}; // Unown-C - Assert.AreEqual(PIDType.Method_1_Unown, MethodFinder.Analyze(pk1U)?.Type, "Unable to match PID to Method 1 Unown spread"); + Assert.Equal(PIDType.Method_1_Unown, MethodFinder.Analyze(pk1U)?.Type); var pk2U = new PK3 {PID = 0x8A7B5190, IVs = new[] {14, 02, 21, 30, 29, 15}, Species = 201}; // Unown-M - Assert.AreEqual(PIDType.Method_2_Unown, MethodFinder.Analyze(pk2U)?.Type, "Unable to match PID to Method 2 Unown spread"); + Assert.Equal(PIDType.Method_2_Unown, MethodFinder.Analyze(pk2U)?.Type); var pk4U = new PK3 {PID = 0x5FA80D70, IVs = new[] {02, 06, 03, 26, 04, 19}, Species = 201}; // Unown-A - Assert.AreEqual(PIDType.Method_4_Unown, MethodFinder.Analyze(pk4U)?.Type, "Unable to match PID to Method 4 Unown spread"); + Assert.Equal(PIDType.Method_4_Unown, MethodFinder.Analyze(pk4U)?.Type); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMatchingTest3Misc() { // Colosseum / XD var pk3 = new PK3 {PID = 0x0985A297, IVs = new[] {06, 01, 00, 07, 17, 07}}; var ak3 = MethodFinder.Analyze(pk3); - Assert.AreEqual(PIDType.CXD, MethodFinder.Analyze(pk3)?.Type, "Unable to match PID to CXD spread"); + Assert.Equal(PIDType.CXD, MethodFinder.Analyze(pk3)?.Type); var gk3 = new PK3(); PIDGenerator.SetValuesFromSeed(gk3, PIDType.CXD, ak3.OriginSeed); - Assert.AreEqual(pk3.PID, gk3.PID, "Unable to match generated PID to CXD spread"); - Assert.IsTrue(pk3.IVs.SequenceEqual(gk3.IVs), "Unable to match generated IVs to CXD spread"); + Assert.Equal(pk3.PID, gk3.PID); + Assert.True(pk3.IVs.SequenceEqual(gk3.IVs), "Unable to match generated IVs to CXD spread"); // Channel Jirachi var pkC = new PK3 {PID = 0x264750D9, IVs = new[] {06, 31, 14, 27, 05, 27}, SID = 45819, OT_Gender = 1, Version = (int)GameVersion.R}; var akC = MethodFinder.Analyze(pkC); - Assert.AreEqual(PIDType.Channel,akC.Type, "Unable to match PID to Channel spread"); + Assert.Equal(PIDType.Channel,akC.Type); var gkC = new PK3(); PIDGenerator.SetValuesFromSeed(gkC, PIDType.Channel, akC.OriginSeed); - Assert.AreEqual(pkC.PID, gkC.PID, "Unable to match generated PID to Channel spread"); - Assert.IsTrue(pkC.IVs.SequenceEqual(gkC.IVs), "Unable to match generated IVs to Channel spread"); + Assert.Equal(pkC.PID, gkC.PID); + Assert.True(pkC.IVs.SequenceEqual(gkC.IVs), "Unable to match generated IVs to Channel spread"); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMatchingTest3Event() { // Restricted: TID/SID are zero. var pkR = new PK3 {PID = 0x0000E97E, IVs = new[] {17, 19, 20, 16, 13, 12}}; - Assert.AreEqual(PIDType.BACD_R, MethodFinder.Analyze(pkR)?.Type, "Unable to match PID to BACD-R spread"); + Assert.Equal(PIDType.BACD_R, MethodFinder.Analyze(pkR)?.Type); // Restricted Antishiny: PID is incremented 2 times to lose shininess. var pkRA = new PK3 {PID = 0x0000E980, IVs = new[] {17, 19, 20, 16, 13, 12}, TID = 01337, SID = 60486}; - Assert.AreEqual(PIDType.BACD_R_A, MethodFinder.Analyze(pkRA)?.Type, "Unable to match PID to BACD-R antishiny spread"); + Assert.Equal(PIDType.BACD_R_A, MethodFinder.Analyze(pkRA)?.Type); // Unrestricted: TID/SID are zero. var pkU = new PK3 {PID = 0x67DBFC33, IVs = new[] {12, 25, 27, 30, 02, 31}}; - Assert.AreEqual(PIDType.BACD_U, MethodFinder.Analyze(pkU)?.Type, "Unable to match PID to BACD-U spread"); + Assert.Equal(PIDType.BACD_U, MethodFinder.Analyze(pkU)?.Type); // Unrestricted Antishiny: PID is incremented 5 times to lose shininess. var pkUA = new PK3 {PID = 0x67DBFC38, IVs = new[] {12, 25, 27, 30, 02, 31}, TID = 01337, SID = 40657}; - Assert.AreEqual(PIDType.BACD_U_A, MethodFinder.Analyze(pkUA)?.Type, "Unable to match PID to BACD-U antishiny spread"); + Assert.Equal(PIDType.BACD_U_A, MethodFinder.Analyze(pkUA)?.Type); // berry fix zigzagoon: seed 0x0020 var pkRS = new PK3 {PID = 0x38CA4EA0, IVs = new[] {00, 20, 28, 11, 19, 00}, TID = 30317, SID = 00000}; var a_pkRS = MethodFinder.Analyze(pkRS); - Assert.AreEqual(PIDType.BACD_R_S, a_pkRS?.Type, "Unable to match PID to BACD-R shiny spread"); - Assert.IsTrue(0x0020 == a_pkRS?.OriginSeed, "Unable to match PID to BACD-R shiny spread origin seed"); + Assert.Equal(PIDType.BACD_R_S, a_pkRS?.Type); + Assert.True(0x0020 == a_pkRS?.OriginSeed, "Unable to match PID to BACD-R shiny spread origin seed"); var gkRS = new PK3 { TID = 30317, SID = 00000 }; PIDGenerator.SetValuesFromSeed(gkRS, PIDType.BACD_R_S, a_pkRS.OriginSeed); - Assert.AreEqual(pkRS.PID, gkRS.PID, "Unable to match generated PID to BACD-R shiny spread"); - Assert.IsTrue(pkRS.IVs.SequenceEqual(gkRS.IVs), "Unable to match generated IVs to BACD-R shiny spread"); + Assert.Equal(pkRS.PID, gkRS.PID); + Assert.True(pkRS.IVs.SequenceEqual(gkRS.IVs), "Unable to match generated IVs to BACD-R shiny spread"); // Unrestricted Antishiny nyx var nyxUA = new PK3 {PID = 0xBD3DF676, IVs = new[] {00, 15, 05, 04, 21, 05}, TID = 80, SID = 0}; var nyx_pkUA = MethodFinder.Analyze(nyxUA); - Assert.AreEqual(PIDType.BACD_U_AX, nyx_pkUA?.Type, "Unable to match PID to BACD-U antishiny nyx spread"); + Assert.Equal(PIDType.BACD_U_AX, nyx_pkUA?.Type); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMatchingTest4() { // Cute Charm: Male Bulbasaur var pkCC = new PK4 {PID = 0x00000037, IVs = new[] {16, 13, 12, 02, 18, 03}, Species = 1, Gender = 0}; - Assert.AreEqual(PIDType.CuteCharm, MethodFinder.Analyze(pkCC)?.Type, "Unable to match PID to Cute Charm spread"); + Assert.Equal(PIDType.CuteCharm, MethodFinder.Analyze(pkCC)?.Type); // Antishiny Mystery Gift: TID/SID are zero. Original PID of 0x5271E97E is rerolled. var pkASR = new PK4 {PID = 0x07578CB7, IVs = new[] {16, 13, 12, 02, 18, 03}}; - Assert.AreEqual(PIDType.G4MGAntiShiny, MethodFinder.Analyze(pkASR)?.Type, "Unable to match PID to Antishiny4 spread"); + Assert.Equal(PIDType.G4MGAntiShiny, MethodFinder.Analyze(pkASR)?.Type); // Chain Shiny: TID/SID are zero. var pkCS = new PK4 {PID = 0xA9C1A9C6, IVs = new[] {22, 14, 23, 24, 11, 04}}; - Assert.AreEqual(PIDType.ChainShiny, MethodFinder.Analyze(pkCS)?.Type, "Unable to match PID to Chain Shiny spread"); + Assert.Equal(PIDType.ChainShiny, MethodFinder.Analyze(pkCS)?.Type); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMatchingTest5() { // Shiny Mystery Gift PGF; IVs are unrelated. var pkS5 = new PK5 {PID = 0xBEEF0037, TID = 01337, SID = 48097}; - Assert.AreEqual(PIDType.G5MGShiny, MethodFinder.Analyze(pkS5)?.Type, "Unable to match PID to PGF Shiny spread"); + Assert.Equal(PIDType.G5MGShiny, MethodFinder.Analyze(pkS5)?.Type); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVPokeSpotTest() { // XD PokeSpots: Check all 3 Encounter Slots (examples are one for each location). var pkPS0 = new PK3 { PID = 0x7B2D9DA7 }; // Zubat (Cave) - Assert.IsTrue(MethodFinder.GetPokeSpotSeeds(pkPS0, 0).Any(), "PokeSpot encounter info mismatch (Common)"); + Assert.True(MethodFinder.GetPokeSpotSeeds(pkPS0, 0).Any(), "PokeSpot encounter info mismatch (Common)"); var pkPS1 = new PK3 { PID = 0x3EE9AF66 }; // Gligar (Rock) - Assert.IsTrue(MethodFinder.GetPokeSpotSeeds(pkPS1, 1).Any(), "PokeSpot encounter info mismatch (Uncommon)"); + Assert.True(MethodFinder.GetPokeSpotSeeds(pkPS1, 1).Any(), "PokeSpot encounter info mismatch (Uncommon)"); var pkPS2 = new PK3 { PID = 0x9B667F3C }; // Surskit (Oasis) - Assert.IsTrue(MethodFinder.GetPokeSpotSeeds(pkPS2, 2).Any(), "PokeSpot encounter info mismatch (Rare)"); + Assert.True(MethodFinder.GetPokeSpotSeeds(pkPS2, 2).Any(), "PokeSpot encounter info mismatch (Rare)"); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVPokewalkerTest() { var pkPW = new[] @@ -161,40 +153,36 @@ public void PIDIVPokewalkerTest() new PK4 { Species = 025, PID = 0x59FFFFFE, TID = 51223, SID = 28044, Gender = 0}, // Pikachu }; foreach (var pk in pkPW) - Assert.AreEqual(PIDType.Pokewalker, MethodFinder.Analyze(pk)?.Type, "Unable to match PID to Pokewalker method"); + Assert.Equal(PIDType.Pokewalker, MethodFinder.Analyze(pk)?.Type); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVEncounterSlotTest() { // Modest Method 1 var pk = new PK3 {PID = 0x6937DA48, IVs = new[] {31, 31, 31, 31, 31, 31}}; var pidiv = MethodFinder.Analyze(pk); - Assert.AreEqual(PIDType.Method_1, pidiv?.Type, "Unable to match PID to Method 1 spread"); + Assert.Equal(PIDType.Method_1, pidiv?.Type); // Test for Method J { // Pearl pk.Version = (int) GameVersion.P; - var results = FrameFinder.GetFrames(pidiv, pk); - const int failSyncCount = 1; - const int noSyncCount = 2; - const int SyncCount = 37; - var r2 = results.ToArray(); - var failSync = r2.Where(z => z.Lead == LeadRequired.SynchronizeFail); - var noSync = r2.Where(z => z.Lead == LeadRequired.None); - var sync = r2.Where(z => z.Lead == LeadRequired.Synchronize); + var results = FrameFinder.GetFrames(pidiv, pk).ToArray(); - Assert.AreEqual(failSync.Count(), failSyncCount, "Failed Sync count mismatch."); - Assert.AreEqual(sync.Count(), SyncCount, "Sync count mismatch."); - Assert.AreEqual(noSync.Count(), noSyncCount, "Non-Sync count mismatch."); + var failSync = results.Where(z => z.Lead == LeadRequired.SynchronizeFail); + var noSync = results.Where(z => z.Lead == LeadRequired.None); + var sync = results.Where(z => z.Lead == LeadRequired.Synchronize); + + failSync.Should().HaveCount(1); + sync.Should().HaveCount(37); + noSync.Should().HaveCount(2); var type = SlotType.Grass; var slots = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 9 }; - Assert.IsTrue(slots.All(s => r2.Any(z => z.GetSlot(type) == s)), "Required slots not present."); - var slotsForType = r2.Where(z => !z.LevelSlotModified).Select(z => z.GetSlot(type)).Distinct().OrderBy(z => z); - Assert.IsTrue(slotsForType.SequenceEqual(slots), "Unexpected slots present."); + Assert.True(slots.All(s => results.Any(z => z.GetSlot(type) == s)), "Required slots not present."); + var slotsForType = results.Where(z => !z.LevelSlotModified).Select(z => z.GetSlot(type)).Distinct().OrderBy(z => z); + Assert.True(slotsForType.SequenceEqual(slots), "Unexpected slots present."); } // Test for Method H and K { @@ -204,12 +192,13 @@ public void PIDIVEncounterSlotTest() } } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVMethod4IVs() { var pk4 = new PK3 { PID = 0xFEE73213, IVs = new[] { 03, 29, 23, 30, 28, 24 } }; - Assert.AreEqual(PIDType.Method_4, MethodFinder.Analyze(pk4)?.Type, "Unable to match PID to Method 4 spread"); + var analysis = MethodFinder.Analyze(pk4); + analysis.Should().NotBeNull(); + analysis.Type.Should().Be(PIDType.Method_4); // See if any origin seed for the IVs matches what we expect // Load the IVs @@ -221,11 +210,10 @@ public void PIDIVMethod4IVs() rand1 |= (uint)IVs[i] << (5 * i); rand3 |= (uint)IVs[i+3] << (5 * i); } - Assert.IsTrue(MethodFinder.GetSeedsFromIVsSkip(RNG.LCRNG, rand1, rand3).Any(z => z == 0xFEE7047C)); + Assert.Contains(MethodFinder.GetSeedsFromIVsSkip(RNG.LCRNG, rand1, rand3), z => z == 0xFEE7047C); } - [TestMethod] - [TestCategory(PIDIVTestCategory)] + [Fact] public void PIDIVSearchEuclid() { const uint seed = 0x2E15555E; @@ -233,8 +221,8 @@ public void PIDIVSearchEuclid() const uint rand1 = 0x7E1DBEC8; var pidseeds = MethodFinder.GetSeedsFromPIDEuclid(RNG.XDRNG, rand0 >> 16, rand1 >> 16); var ivseeds = MethodFinder.GetSeedsFromIVsEuclid(RNG.XDRNG, (rand0 >> 16) & 0x7FFF, (rand1 >> 16) & 0x7FFF); - Assert.IsTrue(pidseeds.Any(z => z == seed)); - Assert.IsTrue(ivseeds.Any(z => z == seed)); + Assert.Contains(pidseeds, z => z == seed); + Assert.Contains(ivseeds, z => z == seed); } } } diff --git a/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs b/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs new file mode 100644 index 000000000..5de9664a4 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using FluentAssertions; +using PKHeX.Core; +using Xunit; + +namespace PKHeX.Tests +{ + public class PKMTests + { + public class StringTests : PKMTests + { + [Fact] + public void EncodesOTNameCorrectly() + { + const string name_fabian = "Fabian♂"; + var pkm = new PK7 { OT_Name = name_fabian }; + var byte_fabian = new byte[] + { + 0x46, 0x00, // F + 0x61, 0x00, // a + 0x62, 0x00, // b + 0x69, 0x00, // i + 0x61, 0x00, // a + 0x6E, 0x00, // n + 0x8E, 0xE0, // ♂ + 0x00, 0x00, // \0 terminator + }; + CheckStringGetSet(nameof(pkm.OT_Name), name_fabian, pkm.OT_Name, byte_fabian, pkm.OT_Trash); + } + + [Fact] + public void EncodesNicknameCorrectly() + { + const string name_nidoran = "ニドラン♀"; + var pkm = new PK7 { Nickname = name_nidoran }; + var byte_nidoran = new byte[] + { + 0xCB, 0x30, // ニ + 0xC9, 0x30, // ド + 0xE9, 0x30, // ラ + 0xF3, 0x30, // ン + 0x40, 0x26, // ♀ + 0x00, 0x00, // \0 terminator + }; + CheckStringGetSet(nameof(pkm.Nickname), name_nidoran, pkm.Nickname, byte_nidoran, pkm.Nickname_Trash); + } + + private static void CheckStringGetSet(string check, string instr, string outstr, byte[] indata, byte[] outdata) + { + outdata = outdata.Take(indata.Length).ToArray(); + + Assert.True(indata.SequenceEqual(outdata), + $"{check} did not set properly." + + Environment.NewLine + string.Join(", ", outdata.Select(z => $"{z:X2}"))); + + Assert.Equal(instr, outstr); + } + } + + + public class MetDateTests : PKMTests + { + [Fact] + public void MetDateNullWhenDateComponentsAreAllZero() + { + var pk = new PK7 + { + Met_Day = 0, + Met_Month = 0, + Met_Year = 0 + }; + + pk.MetDate.HasValue.Should().BeFalse(); + } + + [Fact] + public void MetDateReturnsCorrectDate() + { + var pk = new PK7 + { + Met_Day = 10, + Met_Month = 8, + Met_Year = 16 + }; + + pk.MetDate.GetValueOrDefault().Should().Be(new DateTime(2016, 8, 10).Date); + } + + [Fact] + public void MetDateCalculatesYear0Correctly() + { + var pk = new PK7 + { + Met_Day = 1, + Met_Month = 1, + Met_Year = 0 + }; + + pk.MetDate.GetValueOrDefault().Date.Year.Should().Be(2000); + } + + [Fact] + public void SettingToNullZerosComponents() + { + var pk = new PK7 + { + Met_Day = 12, + Met_Month = 12, + Met_Year = 12 + }; + + pk.MetDate = null; + + pk.Met_Day.Should().Be(0); + pk.Met_Month.Should().Be(0); + pk.Met_Year.Should().Be(0); + } + + [Fact] + public void SettingMetDateSetsComponents() + { + var pk = new PK7 + { + Met_Day = 12, + Met_Month = 12, + Met_Year = 12 + }; + + pk.MetDate = new DateTime(2005, 5, 5); + + pk.Met_Day.Should().Be(5); + pk.Met_Month.Should().Be(5); + pk.Met_Year.Should().Be(5); + } + } + + public class EggMetDateTests : PKMTests + { + [Fact] + public void EggMetDateNullWhenDateComponentsAreAllZero() + { + var pk = new PK7 + { + Egg_Day = 0, + Egg_Month = 0, + Egg_Year = 0 + }; + + pk.EggMetDate.HasValue.Should().BeFalse(); + } + + [Fact] + public void EggMetDateReturnsCorrectDate() + { + var pk = new PK7 + { + Egg_Day = 10, + Egg_Month = 8, + Egg_Year = 16 + }; + + pk.EggMetDate.GetValueOrDefault().Should().Be(new DateTime(2016, 8, 10).Date); + } + + [Fact] + public void EggMetDateCalculatesYear0Correctly() + { + var pk = new PK7 + { + Egg_Day = 1, + Egg_Month = 1, + Egg_Year = 0 + }; + + pk.EggMetDate.GetValueOrDefault().Date.Year.Should().Be(2000); + } + + [Fact] + public void SettingEggMetDateToNullZerosComponents() + { + var pk = new PK7 + { + Egg_Day = 12, + Egg_Month = 12, + Egg_Year = 12 + }; + + pk.EggMetDate = null; + + pk.Egg_Day.Should().Be(0); + pk.Egg_Month.Should().Be(0); + pk.Egg_Year.Should().Be(0); + } + + [Fact] + public void SettingEggMetDateSetsComponents() + { + var pk = new PK7 + { + Egg_Day = 12, + Egg_Month = 12, + Egg_Year = 12 + }; + + pk.EggMetDate = new DateTime(2005, 5, 5); + + pk.Egg_Day.Should().Be(5); + pk.Egg_Month.Should().Be(5); + pk.Egg_Year.Should().Be(5); + } + } + } +} diff --git a/Tests/PKHeX.Tests/Properties/Resources.Designer.cs b/Tests/PKHeX.Core.Tests/Properties/Resources.Designer.cs similarity index 94% rename from Tests/PKHeX.Tests/Properties/Resources.Designer.cs rename to Tests/PKHeX.Core.Tests/Properties/Resources.Designer.cs index b182833b8..73ba5c21a 100644 --- a/Tests/PKHeX.Tests/Properties/Resources.Designer.cs +++ b/Tests/PKHeX.Core.Tests/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace PKHeX.Tests.Properties { +namespace PKHeX.Core.Tests.Properties { using System; @@ -39,7 +39,7 @@ internal class Resources { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PKHeX.Tests.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PKHeX.Core.Tests.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; diff --git a/Tests/PKHeX.Tests/Properties/Resources.resx b/Tests/PKHeX.Core.Tests/Properties/Resources.resx similarity index 100% rename from Tests/PKHeX.Tests/Properties/Resources.resx rename to Tests/PKHeX.Core.Tests/Properties/Resources.resx diff --git a/Tests/PKHeX.Tests/Resources/SM Project 802.main b/Tests/PKHeX.Core.Tests/Resources/SM Project 802.main similarity index 100% rename from Tests/PKHeX.Tests/Resources/SM Project 802.main rename to Tests/PKHeX.Core.Tests/Resources/SM Project 802.main diff --git a/Tests/PKHeX.Core.Tests/Saves/MemeCrypto/MemeCryptoTests.cs b/Tests/PKHeX.Core.Tests/Saves/MemeCrypto/MemeCryptoTests.cs new file mode 100644 index 000000000..e32dc1093 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Saves/MemeCrypto/MemeCryptoTests.cs @@ -0,0 +1,112 @@ +using System.Collections.Generic; +using FluentAssertions; +using PKHeX.Core; +using Xunit; + +namespace PKHeX.Tests.Saves +{ + public class MemeCryptoTests + { + [Fact] + public void TestVerifySaveSignature() + { + var savebuffer = + "58EA53A7133F34DA9F2BEC12F1560354E8BDF8A484ADE4E2954D3C48673118EB67E2D52ED0196E54DC5D93013E9F3B00C8A43B556AEE8C2F763EA9DC125988C6B5F2D3C74CA2C58026BB024B403D09BC5950C54CEB6F21E45D0B66B68791BCBB6D7E67C2F7E4A7F4A517FC50B4FEED9A65BF901ABEB0FFAC44AE07237BE5DD2D" + .ToByteArray(); + Assert.True(MemeCrypto.VerifyMemeData(savebuffer, out var _)); + } + + [Fact] + public void TestVerifyMemeBuffer() + { + var encrypted = + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F4185F2713D5A8BCFFBFF47F86867DF680354913FEFEF08D0D0F1054CB054B508E7DE3AA789AC444D087AB9412CEE965A6D38E45EA010C77FF174F8F8D9993AEAFB9C0616E287B74487E0FF3F1874291B8170C71113971752717F8D188A319EA6" + .ToByteArray(); + var decrypted = + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7431E10EF7681217C" + .ToByteArray(); + + Assert.True(MemeCrypto.VerifyMemeData(encrypted, out var actual, MemeKeyIndex.PokedexAndSaveFile)); + for (var i = 0; i < decrypted.Length; i++) + { + Assert.Equal(decrypted[i], actual[i]); + } + } + + [Fact] + public void TestSignMemeBuffer() + { + var encrypted = + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F4185F2713D5A8BCFFBFF47F86867DF680354913FEFEF08D0D0F1054CB054B508E7DE3AA789AC444D087AB9412CEE965A6D38E45EA010C77FF174F8F8D9993AEAFB9C0616E287B74487E0FF3F1874291B8170C71113971752717F8D188A319EA6" + .ToByteArray(); + var decrypted = + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF" + .ToByteArray(); + + var actual = MemeCrypto.SignMemeData(decrypted); + for (var i = 0; i < encrypted.Length; i++) + { + Assert.Equal(encrypted[i], actual[i]); + } + } + + [Fact] + public void TestVerifyMemeBufferOffsetLength() + { + var encrypted = + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F4185F2713D5A8BCFFBFF47F86867DF680354913FEFEF08D0D0F1054CB054B508E7DE3AA789AC444D087AB9412CEE965A6D38E45EA010C77FF174F8F8D9993AEAFB9C0616E287B74487E0FF3F1874291B8170C71113971752717F8D188A319EA6CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" + .ToByteArray(); + var decrypted = + "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7431E10EF7681217CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" + .ToByteArray(); + + Assert.True(MemeCrypto.VerifyMemeData(encrypted, out var actual, 0x10, 0x100, + MemeKeyIndex.PokedexAndSaveFile)); + for (var i = 0; i < decrypted.Length; i++) + { + Assert.Equal(decrypted[i], actual[i]); + } + } + + [Fact] + public void TestVerifyPoke() + { + var vector = + "A96E2D8D9B99DBFB934939C097E3AC101C7D48CEC52FCA717B14B19890208592045C430035DD09A31446142E9EA33CF3E6B6E69484B6D2EED500B8389048013491602403DBE7B814EA069667CFADAFE74895217D78037B4A456FAB2CAFD71E69504F4B4509000000000000" + .ToByteArray(); + var vector2 = + "A96E2D8D9B99DBFB934939C097E3AC101C7D48CEC52FCA717B14B19890208592045C430035DD09A31446142E9EA33CF3E6B6E69484B6D2EED500B8389048013491602403DBE7B814EA069667CFADAFE74895217D78037B4A456FAB2CAFD71E690000504F4B4509000000000000" + .ToByteArray(); + + Assert.True(MemeCrypto.VerifyMemePOKE(vector, out var _)); + Assert.True(MemeCrypto.VerifyMemePOKE(vector2, out var _)); + + } + + public static IEnumerable KnownKeys() + { + yield return new object[] { MemeKeyIndex.LocalWireless, "1010030000030000000A0070300051308B3001FFD43020AB301003B430FC30B90830C830D10007C630A382000D6E300A005F00055700305D3046306A300000307530933044304D28306B000B5500158F308C203066002581305A3089A0002744002344308D30612A304C00276E0031DF0001C30830AD30E500110A0042A0004973003D4D305F308880007B0A006830823060C4002F10516A3063004D42305F5200536D009900A6F002F014F026FFF038F04AF05CF06EF080F092F0A4F0B6FFF0C8F0DAF0ECF0FEF110F122F134F1460000B5E400004646F86000F1AB31AB0030D730EC0E30BC30F3020FF173A723C162C9700608C5DCAFAB898032382AF1FA717BBC5D91C61AD7B6EA356220742C2DD4595765FCD8123D1E10ED6B0A1DA45D0C2148035A560BB1C5C246FA7EB64D729FC1DD8B61B4737DC51E184A97E4795E82BFD045743EC2AEAED26E87".ToByteArray() }; + yield return new object[] { MemeKeyIndex.FriendlyCompetition, "0300000077000000000000000D0106060404003204000101000000000000000000000000000000000000C00000000000000000000000000E000000000000000000000000000000C0070000000000000000000000987E000000000000000000000000000000000000D80300000000000000F00300000000000000E001070000000000000000000000000000000000000000000000000000000101920200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E2D0100015A03000000BE0700000000C287010050006F006B00E9006D006F006E00200054007200610069006E006500720020004F006E006C0069006E006500200043006F006D007000650074006900740069006F006E000000000000007700770077002E0070006F006B0065006D006F006E002D0074007200610069007DC67F945B27557C97D6C0B6D20FF11AFCE1580C5E9E80C7C3FBBA53B67F24D1A91BA2FB8CDD31F7FE29D894B3764A45407658BB9A6E6DC8B3F6A45F77686AC56EA64C0298D1B22F3D3850ADE10AEA6E185FD0EEA91AA38E3F0F0AA9E7ADA132".ToByteArray() }; + yield return new object[] { MemeKeyIndex.LiveCompetition, "0300000077000000000000000D0006060303003204000101000000000000000000000000000000000000C00000000000000000000000000E000000000000000000000000000000C0070000000000000000000000987E000000000000000000000000000000000000D80300000000000000F00300000000000000E001070000000000000000000000000000000000000000000000000000000101920200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E2D0100015A03000000BE07000000000B9101004900720069007300200043006D007000650074006900740069006F006E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066007200650065000000000000000000000000000000000000000000000000006425CA0A78E79154EBA19550A0734F84A0C49F8B02E51FA8310548FFF14B7338276188C11C85C15701DAED228099FBF95A277E6249625208D8992FF027385D897AC097F0240C93A70E35FB8AD971DFE14832988DC70F5D1BE19C7EF5FBAFCC12".ToByteArray() }; + yield return new object[] { MemeKeyIndex.RentalTeam, "0300000077000000B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C74E35E4783A7E9E161C919C0E736F61B31741B8C1873C5D06D1D408D9DA9FE28DCB53851518FCC0758915EE2911B2194B20131C2E87BC63A255F3A5187763FAF99B1B99D0E4460125CCB7F1CE4A3CC0FC64463454DB25CC851EF9A360EA3D4BDB44B8DE96D1C9839744A3BF7A27FDF41A86491666DAA7BEF55EBFB954BA3FF741657252490BD11350EEF367DA0D229E04EE61DCA1220576014AC2E24232337AB4E7ADEE92B59C44E9AB8D19E0BA87547A0351C4088EDF8808D692461C84EB5D07C795D3B037290AC7C5A9FD2775A86EAD628F545F6E5193145ED22B3BCDE16FD3CCEEA80A5FD90CF8FD320C1D064C8881BF369F0D82EE0E637C434EC6CA4221FE0952C28A7E930956DC2B990817BCC2349EC4339CDD09E2ABB94DC44C171A1E70E2CC5538B9686A1E4AFF907436378FE2915F217EC7C3BA69E47C913794FFE8285DD399D3E39154CE51BA0C74663BD685634697D76EAB8890CF77E371BA7E5CD5FA78FAC7D58A3843C993331C8AFC5ABDCD17FC42B7C28A196C2FB0EF03FE84CAF3FD626A584D9406BC6FC5DC20DD0E19D1D08C96D9065F376E052639FFC0F61CCCE84CDC833F31B9A6C830DE9F58B257F5CBE5991FCA51871752B611AE3B21F5E1F1AE3CFAB49BC6F6721C1C18B74B11400D029E268D".ToByteArray() }; + yield return new object[] { MemeKeyIndex.PokedexAndSaveFile, "4F3994147824D4F9D9B3EEBDC2DA6777585413FA41D22347A3593E22467E2F117B51EDFEAE5977E19AD88EB1C63ADB7E9DEDB7F5AEEFECA5F777C7F12527729025C82DC4A12C8B344EB472B9F68BFD999916F0D03460FF1D3FDC5EF0F7A7F8FE".ToByteArray() }; + yield return new object[] { MemeKeyIndex.GaOle, "7C7F70413806DFD1D4E8F5610BE3CA705245593C24AB3102D7768D43B3D873EEB5BB6B188FD4F38F06EB06C1A27369E9822D10093DAD17692EA2D71BCB8941F883F3F0E2068941F65FB26950B7E54F5990E163809594381C99CF3330F052452C".ToByteArray() }; + yield return new object[] { MemeKeyIndex.MagearnaEvent, "9D741CBA2ABA23408461AC168B3227199C15FFA2784662FE169459DDC2409AE08FA302A6E7026051C8378D09898500028021FE21B1A8165C9918779BA140597E03ED3EAF2FD82C026B17E6BB0D1C4BC6CE06E9FAC2E5DCDD4025983DE57C67CA".ToByteArray() }; + yield return new object[] { MemeKeyIndex.MoncolleGet, "9914945B3280796FF8EC694681ED2218F8FCD1C6628FCFACD633A86622D278C09FD1BA1B2E60AF2896EDDAF76110CA246AED9E08D7D90F7F285764BBD3E20E05A11BA214C96B1A54E1A8D48DE6EF060C79011A4B3326FBE55F29FDE40B31F470".ToByteArray() }; + yield return new object[] { MemeKeyIndex.IslandScanEventSpecial, "34B08442E3D68D3730CF5CEE9E82BCFD5F6664168F43E9F2EA26CC7B94B1F44FF7B3C0BAD5C346693DDAD5461E6087AD061015744F6DBA294F9BCD6F0E7A35859F0A15F358EB00BED5A4C18841A8B6A69D91FC603E6DCE058DD96983C5DFBB04".ToByteArray() }; + yield return new object[] { MemeKeyIndex.TvTokyoDataBroadcasting, "195B4EA9F48E6ADBEE73EB0D529C14EDC99BB011F214E0812E5198BE40739783646FB8C75ABFFD84AA11FB095EFFF5E383F7F45A56A96780C79EBABB430D860FA6CB3D0BFC163C52EDC5C199963D3E518758F911569E1C667BF8A15643A19E2F".ToByteArray() }; + yield return new object[] { MemeKeyIndex.CapPikachuEvent, "A96E2D8D9B99DBFB934939C097E3AC101C7D48CEC52FCA717B14B19890208592045C430035DD09A31446142E9EA33CF3E6B6E69484B6D2EED500B8389048013491602403DBE7B814EA069667CFADAFE74895217D78037B4A456FAB2CAFD71E69".ToByteArray() }; + //yield return new object[] { MemeKeyIndex.Unknown10, null }; + //yield return new object[] { MemeKeyIndex.Unknown11, null }; + //yield return new object[] { MemeKeyIndex.Unknown12, null }; + //yield return new object[] { MemeKeyIndex.Unknown13, null }; + } + + [Theory] + [MemberData(nameof(KnownKeys))] + public void TestVerifyKnownKeys(MemeKeyIndex keyIndex, byte[] key) + { + MemeCrypto.VerifyMemeData(key, out var _, keyIndex).Should().BeTrue("becuase they key should be valid"); + } + } +} diff --git a/Tests/PKHeX.Core.Tests/Saves/SMTests.cs b/Tests/PKHeX.Core.Tests/Saves/SMTests.cs new file mode 100644 index 000000000..bc798934f --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Saves/SMTests.cs @@ -0,0 +1,33 @@ +using FluentAssertions; +using PKHeX.Core; +using Xunit; + +namespace PKHeX.Tests.Saves +{ + public class SMTests + { + private SAV7 GetSave() + { + return new SAV7(Core.Tests.Properties.Resources.SM_Project_802); + } + + [Fact] + public void ChecksumsValid() + { + GetSave().ChecksumsValid.Should().BeTrue(); + } + + [Fact] + public void ChecksumsUpdate() + { + var save = GetSave(); + var originalChecksumInfo = save.ChecksumInfo; + var newSave = new SAV7(save.Write(false, false)); + + save.ChecksumInfo.Should().BeEquivalentTo(originalChecksumInfo, "because the checksum should have been modified"); + save.ChecksumsValid.Should().BeTrue("because the checksum should be valid after write"); + newSave.ChecksumsValid.Should().BeTrue("because the checksums should be valid after reopening the save"); + newSave.ChecksumInfo.Should().BeEquivalentTo(save.ChecksumInfo, "because the checksums should be the same since write and open"); + } + } +} diff --git a/Tests/PKHeX.Tests/Simulator/ShowdownSetTests.cs b/Tests/PKHeX.Core.Tests/Simulator/ShowdownSetTests.cs similarity index 75% rename from Tests/PKHeX.Tests/Simulator/ShowdownSetTests.cs rename to Tests/PKHeX.Core.Tests/Simulator/ShowdownSetTests.cs index 315dd6a98..5cf759d2c 100644 --- a/Tests/PKHeX.Tests/Simulator/ShowdownSetTests.cs +++ b/Tests/PKHeX.Core.Tests/Simulator/ShowdownSetTests.cs @@ -1,12 +1,13 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using FluentAssertions; using PKHeX.Core; +using Xunit; namespace PKHeX.Tests.Simulator { - [TestClass] public class ShowdownSetTests { private const string SimulatorParse = "Set Parsing Tests"; @@ -17,179 +18,175 @@ static ShowdownSetTests() EncounterEvent.RefreshMGDB(); } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetParse() { foreach (var setstr in Sets) { var set = new ShowdownSet(setstr).Text; var lines = set.Split('\n').Select(z => z.Trim()); - Assert.IsTrue(lines.All(z => setstr.Contains(z)), setstr); + Assert.True(lines.All(z => setstr.Contains(z)), setstr); } } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetEncounters() { var set = new ShowdownSet(SetGlaceonUSUMTutor); var pk7 = new PK7 {Species = set.Species, AltForm = set.FormIndex, Moves = set.Moves}; var encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.MN); - Assert.IsTrue(!encs.Any()); + Assert.True(!encs.Any()); pk7.HT_Name = "PKHeX"; encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.MN); var first = encs.FirstOrDefault(); - Assert.IsTrue(first != null); + Assert.True(first != null); var egg = (EncounterEgg)first; var info = new SimpleTrainerInfo(); var pk = egg.ConvertToPKM(info); - Assert.IsTrue(pk.Species != set.Species); + Assert.True(pk.Species != set.Species); var la = new LegalityAnalysis(pk); - Assert.IsTrue(la.Valid); + Assert.True(la.Valid); var test = EncounterMovesetGenerator.GeneratePKMs(pk7, info).ToList(); foreach (var t in test) { var la2 = new LegalityAnalysis(t); - Assert.IsTrue(la2.Valid); + Assert.True(la2.Valid); } } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetWC3() { var set = new ShowdownSet(SetROCKSMetang); var pk3 = new PK3 { Species = set.Species, AltForm = set.FormIndex, Moves = set.Moves }; var encs = EncounterMovesetGenerator.GenerateEncounters(pk3, set.Moves, GameVersion.R); - Assert.IsTrue(encs.Any()); + Assert.True(encs.Any()); encs = EncounterMovesetGenerator.GenerateEncounters(pk3, set.Moves, GameVersion.R); var first = encs.FirstOrDefault(); - Assert.IsTrue(first != null); + Assert.True(first != null); var wc3 = (WC3)first; var info = new SimpleTrainerInfo(); var pk = wc3.ConvertToPKM(info); var la = new LegalityAnalysis(pk); - Assert.IsTrue(la.Valid); + Assert.True(la.Valid); } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetCelebi() { var set = new ShowdownSet(SetCelebi); var pk7 = new PK7 { Species = set.Species, AltForm = set.FormIndex, Moves = set.Moves }; var encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.X); - Assert.IsTrue(encs.Any()); + Assert.True(encs.Any()); encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.X); var first = encs.FirstOrDefault(); - Assert.IsTrue(first != null); + Assert.True(first != null); var enc = first; var info = new SimpleTrainerInfo(); var pk = enc.ConvertToPKM(info); var la = new LegalityAnalysis(pk); - Assert.IsTrue(la.Valid); + Assert.True(la.Valid); } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetSplitBreed() { var set = new ShowdownSet(SetMunchSnorLax); var pk7 = new PK7 { Species = set.Species, AltForm = set.FormIndex, Moves = set.Moves, HT_Name = "PKHeX" }; // !! specify the HT name, we need tutors for this one var encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.SN).ToList(); - Assert.IsTrue(encs.Count > 0); - Assert.IsTrue(encs.All(z => z.Species > 150)); + Assert.True(encs.Count > 0); + Assert.True(encs.All(z => z.Species > 150)); var info = new SimpleTrainerInfo(); var enc = encs[0]; var pk = enc.ConvertToPKM(info); var la = new LegalityAnalysis(pk); - Assert.IsTrue(la.Valid); + Assert.True(la.Valid); } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetVCEgg1() { var set = new ShowdownSet(SetSlowpoke12); var pk7 = new PK7 { Species = set.Species, AltForm = set.FormIndex, Moves = set.Moves, HT_Name = "PKHeX" }; var encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.GD).ToList(); - Assert.IsTrue(encs.Count > 0); + Assert.True(encs.Count > 0); var info = new SimpleTrainerInfo(); var enc = encs[0]; var pk = enc.ConvertToPKM(info); var la = new LegalityAnalysis(pk); - Assert.IsTrue(la.Valid); + Assert.True(la.Valid); } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorGetSmeargle() { var set = new ShowdownSet(SetSmeargle); var pk7 = new PK7 { Species = set.Species, AltForm = set.FormIndex, Moves = set.Moves }; var encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.MN); - Assert.IsTrue(encs.Any()); + Assert.True(encs.Any()); encs = EncounterMovesetGenerator.GenerateEncounters(pk7, set.Moves, GameVersion.MN); var first = encs.FirstOrDefault(); - Assert.IsTrue(first != null); + Assert.NotNull(first); var enc = first; var info = new SimpleTrainerInfo(); var pk = enc.ConvertToPKM(info); var la = new LegalityAnalysis(pk); - Assert.IsTrue(la.Valid); + Assert.True(la.Valid); } - [TestMethod] - [TestCategory(SimulatorParse)] + [Fact] public void SimulatorParseMultiple() { var text = string.Join("\r\n\r\n", Sets); var lines = text.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None); var sets = ShowdownSet.GetShowdownSets(lines); - Assert.IsTrue(sets.Count() == Sets.Length); + Assert.True(sets.Count() == Sets.Length); sets = ShowdownSet.GetShowdownSets(Enumerable.Empty()); - Assert.IsTrue(!sets.Any()); + Assert.True(!sets.Any()); sets = ShowdownSet.GetShowdownSets(new [] {"", " ", " "}); - Assert.IsTrue(!sets.Any()); + Assert.True(!sets.Any()); } - //[TestMethod] - //[TestCategory(SimulatorParse)] - public void TestGenerate() + public static IEnumerable PokemonGenerationTestData() { - int count = 0; - var tr = new SimpleTrainerInfo(); for (int i = 1; i <= 807; i++) { - var pk = new PK7 { Species = i }; - pk.Gender = pk.GetSaneGender(); - var ez = EncounterMovesetGenerator.GeneratePKMs(pk, tr); - Debug.WriteLine($"Starting {i:000}"); - foreach (var e in ez) - { - var la = new LegalityAnalysis(e); - Assert.IsTrue(la.Valid); - count++; - } - Debug.WriteLine($"Finished {i:000}"); + yield return new object[] { i }; + } + } + + [Theory(Skip = "Feature not ready yet")] + [MemberData(nameof(PokemonGenerationTestData))] + public void PokemonGenerationReturnsLegalPokemon(int species) + { + int count = 0; + var tr = new SimpleTrainerInfo(); + + var pk = new PK7 { Species = species }; + pk.Gender = pk.GetSaneGender(); + var ez = EncounterMovesetGenerator.GeneratePKMs(pk, tr); + foreach (var e in ez) + { + var la = new LegalityAnalysis(e); + la.Valid.Should().BeTrue($"Because generated Pokemon {count} for {species:000} should be valid"); + Assert.True(la.Valid); + count++; } - Debug.WriteLine($"Generated {count} PKMs!"); } private const string SetROCKSMetang = diff --git a/Tests/PKHeX.Core.Tests/Util/DataUtilTests.cs b/Tests/PKHeX.Core.Tests/Util/DataUtilTests.cs new file mode 100644 index 000000000..0b88d9551 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Util/DataUtilTests.cs @@ -0,0 +1,16 @@ + +using FluentAssertions; +using Xunit; + +namespace PKHeX.Tests.Util +{ + public class DataUtilTests + { + [Fact] + public void GetsCorrectNumberOfPokemonNames() + { + var names = PKHeX.Core.Util.GetSpeciesList("en"); + names.Length.Should().Be(810); + } + } +} diff --git a/Tests/PKHeX.Core.Tests/Util/DateUtilTests.cs b/Tests/PKHeX.Core.Tests/Util/DateUtilTests.cs new file mode 100644 index 000000000..2952b7980 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Util/DateUtilTests.cs @@ -0,0 +1,99 @@ +using Xunit; + +namespace PKHeX.Tests.Util +{ + public class DateUtilTests + { + [Theory] + [InlineData(2000, 1, 1)] + [InlineData(2001, 1, 31)] + public void RecognizesCorrectDates(int year, int month, int day) + { + Assert.True(Core.Util.IsDateValid(year, month, day), $"Failed to recognize {year}/{month}/{day}"); + } + + [Theory] + [InlineData(2016, 1, 31)] + [InlineData(2016, 2, 28)] + [InlineData(2016, 3, 31)] + [InlineData(2016, 4, 30)] + [InlineData(2016, 5, 31)] + [InlineData(2016, 6, 30)] + [InlineData(2016, 7, 31)] + [InlineData(2016, 8, 31)] + [InlineData(2016, 9, 30)] + [InlineData(2016, 10, 31)] + [InlineData(2016, 11, 30)] + [InlineData(2016, 12, 31)] + public void RecognizesValidMonthBoundaries(int year, int month, int day) + { + Assert.True(Core.Util.IsDateValid(year, month, day), $"Incorrect month boundary for {year}/{month}/{day}"); + } + + [Fact] + public void RecognizeCorrectLeapYear() + { + Assert.True(Core.Util.IsDateValid(2004, 2, 29)); + } + + [Fact] + public void FailsWithIncorrectLeapYear() + { + Assert.False(Core.Util.IsDateValid(2005, 2, 29)); + } + + [Fact] + public void FailsWithZeroDate() + { + Assert.False(Core.Util.IsDateValid(0, 0, 0)); + } + + [Fact] + public void FailsWithNegativeDate() + { + Assert.False(Core.Util.IsDateValid(-1, -1, -1)); + } + + [Fact] + public void FailsWithBigDay() + { + Assert.False(Core.Util.IsDateValid(2000, 1, 32)); + } + + [Fact] + public void FailsWithBigMonth() + { + Assert.False(Core.Util.IsDateValid(2000, 13, 1)); + } + + [Fact] + public void FailsWithBigYear() + { + Assert.False(Core.Util.IsDateValid(10000, 1, 1)); + } + + [Fact] + public void FailsWithZeroDay() + { + Assert.False(Core.Util.IsDateValid(2000, 1, 0)); + } + + [Fact] + public void FailsWithZeroMonth() + { + Assert.False(Core.Util.IsDateValid(2000, 0, 1)); + } + + [Fact] + public void FailsWithZeroYear() + { + Assert.False(Core.Util.IsDateValid(0, 1, 1)); + } + + [Fact] + public void FailsWithMaxUInt() + { + Assert.False(Core.Util.IsDateValid(uint.MaxValue, uint.MaxValue, uint.MaxValue), "Failed with uint.MaxValue"); + } + } +} diff --git a/Tests/PKHeX.Core.Tests/Util/GeoLocationTests.cs b/Tests/PKHeX.Core.Tests/Util/GeoLocationTests.cs new file mode 100644 index 000000000..6a385f887 --- /dev/null +++ b/Tests/PKHeX.Core.Tests/Util/GeoLocationTests.cs @@ -0,0 +1,37 @@ +using FluentAssertions; +using PKHeX.Core; +using Xunit; + +namespace PKHeX.Tests.Util +{ + public class GeoLocationTests + { + [Theory] + [InlineData("en", 1, "Japan")] + public void ReturnsCorrectCountryNameByString(string language, int country, string expectedName) + { + GeoLocation.GetCountryName(language, country).Should().Be(expectedName); + } + + [Theory] + [InlineData(LanguageID.English, 10, "Argentina")] + public void ReturnsCorrectCountryNameByLanguageId(LanguageID languageId, int country, string expectedName) + { + GeoLocation.GetCountryName(languageId, country).Should().Be(expectedName); + } + + [Theory] + [InlineData("en", 1, 2, "Tokyo")] + public void ReturnsCorrectRegionNameByString(string language, int country, int region, string expectedName) + { + GeoLocation.GetRegionName(language, country, region).Should().Be(expectedName); + } + + [Theory] + [InlineData(LanguageID.Korean, 186, 1, "버뮤다")] + public void ReturnsCorrectRegionNameByLanguageId(LanguageID languageId, int country, int region, string expectedName) + { + GeoLocation.GetRegionName(languageId, country, region).Should().Be(expectedName); + } + } +} diff --git a/Tests/PKHeX.Tests/Legality/ShadowTests.cs b/Tests/PKHeX.Tests/Legality/ShadowTests.cs deleted file mode 100644 index d8e6db1fe..000000000 --- a/Tests/PKHeX.Tests/Legality/ShadowTests.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System.Collections.Generic; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using PKHeX.Core; - -namespace PKHeX.Tests.Legality -{ - [TestClass] - public class ShadowTests - { - private const string LegalityValidCategory = "Shadow Lock Validity Tests"; - private const string VerifyPIDCategory = "Shadow Lock Result Tests"; - - [TestMethod] - [TestCategory(LegalityValidCategory)] - public void VerifyLock1() - { - // Zubat (F) (Serious) - Verify(Encounters3Teams.Poochyena, 0xAF4E3161, new[] { 11, 29, 25, 6, 23, 10 }); - - // Murkrow (M) (Docile) - Verify(Encounters3Teams.Pineco, 0xC3A0F1E5, new[] { 30, 3, 9, 10, 27, 30 }); - } - - [TestMethod] - [TestCategory(LegalityValidCategory)] - public void VerifyLock2() - { - // Goldeen (F) (Serious) - // Horsea (M) (Quirky) - Verify(Encounters3Teams.Spheal, 0xA459BF44, new[] { 0, 11, 4, 28, 6, 13 }); - - // Kirlia (M) (Hardy) - // Linoone (F) (Hardy) - Verify(Encounters3Teams.Natu, 0x8E14DAB6, new[] { 29, 24, 30, 16, 3, 18 }); - - // Remoraid (M) (Docile) -- 73DB58CC - // Golbat (M) (Bashful) -- F6B04390 - Verify(Encounters3Teams.Roselia, 0x30E87CC7, new[] { 22, 11, 8, 26, 4, 29 }); - - // 519AEF0E - // Duskull (M) (Quirky) -- 45BE3B97 - // Spinarak (F) (Hardy) -- E18F5A3E - Verify(Encounters3Teams.ColoMakuhita, 0xC252FEBA, new[] { 15, 9, 17, 16, 24, 22 }); - - // 559C5F72 -- Quirky F => skip - // Duskull (M) (Quirky) -- A5AC2CCB - // Spinarak (F) (Hardy) -- D08FF135 - Verify(Encounters3Teams.ColoMakuhita, 0x61C676FC, new[] { 20, 28, 21, 18, 9, 1 }); - - // 3CCB97BA -- Quirky F => skip * 2, Hardy Skip - // Duskull (M) (Quirky) -- 7F0D6783 @ 161 - // Spinarak (F) (Hardy) -- 6C03F545 @ 182 - Verify(Encounters3Teams.ColoMakuhita, 0x3B27608D, new[] { 7, 12, 5, 19, 3, 7 }); - } - - [TestMethod] - [TestCategory(LegalityValidCategory)] - public void VerifyLock3() - { - // Luvdisc (F) (Docile) - // Beautifly (M) (Hardy) - // Roselia (M) (Quirky) - Verify(Encounters3Teams.Delcatty, 0x9BECA2A6, new[] { 31, 31, 25, 13, 22, 1 }); - - // Kadabra (M) (Docile) - // Sneasel (F) (Hardy) - // Misdreavus (F) (Bashful) - Verify(Encounters3Teams.Meowth, 0x77D87601, new[] { 10, 27, 26, 13, 30, 19 }); - - // Ralts (M) (Docile) - // Voltorb (-) (Hardy) - // Bagon (F) (Quirky) - Verify(Encounters3Teams.Numel, 0x37F95B26, new[] { 11, 8, 5, 10, 28, 14 }); - } - - [TestMethod] - [TestCategory(LegalityValidCategory)] - public void VerifyLock4() - { - // Ninetales (F) (Serious) - // Jumpluff (M) (Docile) - // Azumarill (F) (Hardy) - // Shadow Tangela - Verify(Encounters3Teams.Butterfree, 0x2E49AC34, new[] { 15, 24, 7, 2, 11, 2 }); - - // Huntail (M) (Docile) - // Cacturne (F) (Hardy) - // Weezing (F) (Serious) - // Ursaring (F) (Bashful) - Verify(Encounters3Teams.Arbok, 0x1973FD07, new[] { 13, 30, 3, 16, 20, 9 }); - - // Lairon (F) (Bashful) - // Sealeo (F) (Serious) - // Slowking (F) (Docile) - // Ursaring (M) (Quirky) - Verify(Encounters3Teams.Primeape, 0x33893D4C, new[] { 26, 25, 24, 28, 29, 30 }); - } - - [TestMethod] - [TestCategory(LegalityValidCategory)] - public void VerifyLock5() - { - // many prior, all non shadow - VerifySingle(Encounters3Teams.Seedot, 0x8CBD29DB, new[] { 19, 29, 30, 0, 7, 2 }); - } - - private static void Verify(TeamLock[] teams, uint pid, int[] ivs) - { - var pk3 = new PK3 { PID = pid, IVs = ivs }; - var info = MethodFinder.Analyze(pk3); - Assert.AreEqual(PIDType.CXD, info.Type, "Unable to match PID to CXD spread!"); - bool match = GetCanOriginateFrom(teams, info); - Assert.IsTrue(match, "Unable to verify lock conditions: " + teams[0].Species); - } - - private static void VerifySingle(TeamLock[] teams, uint pid, int[] ivs) - { - var pk3 = new PK3 { PID = pid, IVs = ivs }; - var info = MethodFinder.Analyze(pk3); - Assert.AreEqual(PIDType.CXD, info.Type, "Unable to match PID to CXD spread!"); - bool match = LockFinder.IsFirstShadowLockValid(info, teams); - Assert.IsTrue(match, "Unable to verify lock conditions: " + teams[0].Species); - } - - [TestMethod] - [TestCategory(VerifyPIDCategory)] - public void VerifyPIDResultsDelcatty() - { - var results = new[] - { - new uint[] {0xD118BA52, 0xA3127782, 0x16D95FA5, 0x31538B48}, - new uint[] {0x7D5FFE3E, 0x1D5720ED, 0xE0D89C99, 0x3494CDA1}, - new uint[] {0xAEB0C3A6, 0x956DC2FD, 0x3C11DCE8, 0xC93DF897}, - new uint[] {0xACCE2655, 0xFF2BA0A2, 0x22A8A7E6, 0x5F5380F4}, - new uint[] {0xDC1D1894, 0xFC0F75E2, 0x97BFAEBC, 0x38DDE117}, - new uint[] {0xDE278967, 0xFD86C9F7, 0x3E16FCFD, 0x1956D8B5}, - new uint[] {0xF8CB4CAE, 0x42DE628B, 0x48796CDA, 0xF6EAD3E2}, - new uint[] {0x56548F49, 0xA308E7DA, 0x28CB8ADF, 0xBEADBDC3}, - new uint[] {0xF2AC8419, 0xADA208E3, 0xDB3A0BA6, 0x5EEF1076}, - new uint[] {0x9D28899D, 0xA3ECC9F0, 0x606EC6F0, 0x451FAE3C}, - }; - VerifyResults(results, Encounters3Teams.Delcatty); - } - - [TestMethod] - [TestCategory(VerifyPIDCategory)] - public void VerifyPIDResultsButterfree() - { - var results = new[] - { - new uint[] {0x4D6BE487, 0xBB3EFBFB, 0x6FD7EE06, 0x289D435F, 0x0EC25CE5}, - new uint[] {0xB04DF5B3, 0x661E499C, 0x94EB752D, 0xC5FA9DE5, 0x0A8C9738}, - new uint[] {0xCBB9A3B0, 0x9AC1A0B8, 0xCA3CAD46, 0x54FFCA27, 0x1D5AEC4F}, - new uint[] {0xB2AF145E, 0x455155C9, 0xB5CE4932, 0x4B8C6554, 0x55CE5E4B}, - new uint[] {0x193A0F3B, 0xE1474ECF, 0x4C30D215, 0x72262B89, 0x9B2F5B53}, - new uint[] {0xB73010B9, 0x361F1DB1, 0x2C65320A, 0x329A4A1E, 0x9334337E}, - new uint[] {0xFB6A6770, 0xE0068ECC, 0xB99B326E, 0x08A18311, 0x92D31CC2}, - new uint[] {0x5B1214BC, 0xB82FDDA9, 0x606D3D18, 0xA142F730, 0xCBA7A0C3}, - new uint[] {0xC7315E32, 0x76566AA1, 0xC0CE436E, 0x98C45DA8, 0x9D1BDC4A}, - new uint[] {0xB687F0AF, 0xC01DB6C6, 0xAD6DEC75, 0xDB041314, 0x0D949325}, - }; - VerifyResults(results, Encounters3Teams.Butterfree); - } - - private static void VerifyResults(IReadOnlyList results, TeamLock[] team) - { - var pkm = new PK3(); - for (int i = 0; i < results.Count; i++) - { - var result = results[i]; - var seeds = getSeeds(result[result.Length - 1]); - bool match = false; - foreach (var seed in seeds) - { - PIDGenerator.SetValuesFromSeed(pkm, PIDType.CXD, seed); - var info = MethodFinder.Analyze(pkm); - Assert.IsTrue(seed == info.OriginSeed); - Assert.AreEqual(PIDType.CXD, info.Type, "Unable to match PID to CXD spread!"); - if (!GetCanOriginateFrom(team, info)) - continue; - match = true; - break; - } - Assert.IsTrue(match, $"Unable to verify lock conditions for result {i}: " + team[0].Species); - } - - IEnumerable getSeeds(uint PID) - { - var top = PID >> 16; - var bot = PID & 0xFFFF; - - var seeds = MethodFinder.GetSeedsFromPIDEuclid(RNG.XDRNG, top, bot); - foreach (var s in seeds) - yield return RNG.XDRNG.Reverse(s, 3); - } - } - - /// - /// Checks if the PIDIV can originate from - /// - /// - /// - /// - private static bool GetCanOriginateFrom(TeamLock[] possibleTeams, PIDIV info) - { - return LockFinder.IsAllShadowLockValid(info, possibleTeams); - } - } -} diff --git a/Tests/PKHeX.Tests/PKHeX.Tests.csproj b/Tests/PKHeX.Tests/PKHeX.Tests.csproj deleted file mode 100644 index 229e2cc4f..000000000 --- a/Tests/PKHeX.Tests/PKHeX.Tests.csproj +++ /dev/null @@ -1,141 +0,0 @@ - - - - Debug - AnyCPU - {8E2499BC-C11A-4809-8737-66D35A625425} - Library - Properties - PKHeX.Tests - PKHeX.Tests - v4.6 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - bin\x86\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - - - - - - - {279e59f2-50ea-475d-8ba4-fa69f0578c0d} - PKHeX.Core - - - {d1b91861-a448-4762-a313-c7bc179f4415} - PKHeX.WinForms - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - \ No newline at end of file diff --git a/Tests/PKHeX.Tests/PKM/PKMTests.cs b/Tests/PKHeX.Tests/PKM/PKMTests.cs deleted file mode 100644 index 0e3385de1..000000000 --- a/Tests/PKHeX.Tests/PKM/PKMTests.cs +++ /dev/null @@ -1,178 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Linq; -using PKHeX.Core; - -namespace PKHeX.Tests -{ - [TestClass] - public class PKMTests - { - private const string StringTestCategory = "PKM String Tests"; - - [TestMethod] - [TestCategory(StringTestCategory)] - public void StringEncodingTest() - { - const string name_fabian = "Fabian♂"; - var pkm = new PK7 { OT_Name = name_fabian }; - var byte_fabian = new byte[] - { - 0x46, 0x00, // F - 0x61, 0x00, // a - 0x62, 0x00, // b - 0x69, 0x00, // i - 0x61, 0x00, // a - 0x6E, 0x00, // n - 0x8E, 0xE0, // ♂ - 0x00, 0x00, // \0 terminator - }; - CheckStringGetSet(nameof(pkm.OT_Name), name_fabian, pkm.OT_Name, byte_fabian, pkm.OT_Trash); - - const string name_nidoran = "ニドラン♀"; - pkm.Nickname = name_nidoran; - var byte_nidoran = new byte[] - { - 0xCB, 0x30, // ニ - 0xC9, 0x30, // ド - 0xE9, 0x30, // ラ - 0xF3, 0x30, // ン - 0x40, 0x26, // ♀ - 0x00, 0x00, // \0 terminator - }; - CheckStringGetSet(nameof(pkm.Nickname), name_nidoran, pkm.Nickname, byte_nidoran, pkm.Nickname_Trash); - } - - private static void CheckStringGetSet(string check, string instr, string outstr, byte[] indata, byte[] outdata) - { - outdata = outdata.Take(indata.Length).ToArray(); - - Assert.IsTrue(indata.SequenceEqual(outdata), - $"{check} did not set properly." - + Environment.NewLine + string.Join(", ", outdata.Select(z => $"{z:X2}"))); - - Assert.AreEqual(instr, outstr, $"{check} did not get properly."); - } - - private const string DateTestCategory = "PKM Date Tests"; - - [TestMethod] - [TestCategory(DateTestCategory)] - public void MetDateGetterTest() - { - var pk = new PK7(); - - // Ensure MetDate is null when components are all 0 - pk.Met_Day = 0; - pk.Met_Month = 0; - pk.Met_Year = 0; - Assert.IsFalse(pk.MetDate.HasValue, "MetDate should be null when date components are all 0."); - - // Ensure MetDate gives correct date - pk.Met_Day = 10; - pk.Met_Month = 8; - pk.Met_Year = 16; - Assert.AreEqual(new DateTime(2016, 8, 10).Date, pk.MetDate.Value.Date, "Met date does not return correct date."); - - // Ensure 0 year is calculated correctly - pk.Met_Day = 1; - pk.Met_Month = 1; - pk.Met_Year = 0; - Assert.AreEqual(2000, pk.MetDate.Value.Date.Year, "Year is not calculated correctly."); - } - - [TestMethod] - [TestCategory(DateTestCategory)] - public void MetDateSetterTest() - { - var pk = new PK7(); - - // Ensure setting to null zeros the components - // -- Set to something else first - pk.Met_Day = 12; - pk.Met_Month = 12; - pk.Met_Year = 12; - // -- Act - pk.MetDate = null; - // -- Assert - Assert.AreEqual(0, pk.Met_Day, "Met_Day was not zeroed when MetDate is set to null"); - Assert.AreEqual(0, pk.Met_Month, "Met_Month was not zeroed when MetDate is set to null"); - Assert.AreEqual(0, pk.Met_Year, "Met_Year was not zeroed when MetDate is set to null"); - - // Ensure setting to a date sets the components - var now = DateTime.UtcNow; - // -- Set to something else first - pk.Met_Day = 12; - pk.Met_Month = 12; - pk.Met_Year = 12; - if (now.Month == 12) - { - // We don't want the test to work just because it's 12/12 right now. - pk.Met_Month = 11; - } - // -- Act - pk.MetDate = now; - // -- Assert - Assert.AreEqual(now.Day, pk.Met_Day, "Met_Day was not correctly set"); - Assert.AreEqual(now.Month, pk.Met_Month, "Met_Month was not correctly set"); - Assert.AreEqual(now.Year - 2000, pk.Met_Year, "Met_Year was not correctly set"); - } - - [TestMethod] - [TestCategory(DateTestCategory)] - public void EggMetDateGetterTest() - { - var pk = new PK7(); - - // Ensure MetDate is null when components are all 0 - pk.Egg_Day = 0; - pk.Egg_Month = 0; - pk.Egg_Year = 0; - Assert.IsFalse(pk.MetDate.HasValue, "EggMetDate should be null when date components are all 0."); - - // Ensure MetDate gives correct date - pk.Egg_Day = 10; - pk.Egg_Month = 8; - pk.Egg_Year = 16; - Assert.AreEqual(new DateTime(2016, 8, 10).Date, pk.EggMetDate.Value.Date, "Egg met date does not return correct date."); - } - - [TestMethod] - [TestCategory(DateTestCategory)] - public void EggMetDateSetterTest() - { - var pk = new PK7(); - - // Ensure setting to null zeros the components - // -- Set to something else first - pk.Egg_Day = 12; - pk.Egg_Month = 12; - pk.Egg_Year = 12; - // -- Act - pk.EggMetDate = null; - // -- Assert - Assert.AreEqual(0, pk.Egg_Day, "Egg_Day was not zeroed when EggMetDate is set to null"); - Assert.AreEqual(0, pk.Egg_Month, "Egg_Month was not zeroed when EggMetDate is set to null"); - Assert.AreEqual(0, pk.Egg_Year, "Egg_Year was not zeroed when EggMetDate is set to null"); - - // Ensure setting to a date sets the components - var now = DateTime.UtcNow; - // -- Set to something else first - pk.Egg_Day = 12; - pk.Egg_Month = 12; - pk.Egg_Year = 12; - if (now.Month == 12) - { - // We don't want the test to work just because it's 12/12 right now. - pk.Egg_Month = 11; - } - // -- Act - pk.EggMetDate = now; - // -- Assert - Assert.AreEqual(now.Day, pk.Egg_Day, "Egg_Day was not correctly set"); - Assert.AreEqual(now.Month, pk.Egg_Month, "Egg_Month was not correctly set"); - Assert.AreEqual(now.Year - 2000, pk.Egg_Year, "Egg_Year was not correctly set"); - } - } -} diff --git a/Tests/PKHeX.Tests/Properties/AssemblyInfo.cs b/Tests/PKHeX.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index ca6b4b728..000000000 --- a/Tests/PKHeX.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("PKHeX.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PKHeX.Tests")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8e2499bc-c11a-4809-8737-66d35a625425")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests/PKHeX.Tests/Saves/MemeCrypto/MemeCryptoTests.cs b/Tests/PKHeX.Tests/Saves/MemeCrypto/MemeCryptoTests.cs deleted file mode 100644 index f38b48ddb..000000000 --- a/Tests/PKHeX.Tests/Saves/MemeCrypto/MemeCryptoTests.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System.Collections.Generic; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using PKHeX.Core; - -namespace PKHeX.Tests.Saves -{ - [TestClass] - public class MemeCryptoTests - { - private const string TestCategory = "MemeCrypto Tests"; - - [TestMethod] - [TestCategory(TestCategory)] - public void TestVerifySaveSignature() - { - var savebuffer = - "58EA53A7133F34DA9F2BEC12F1560354E8BDF8A484ADE4E2954D3C48673118EB67E2D52ED0196E54DC5D93013E9F3B00C8A43B556AEE8C2F763EA9DC125988C6B5F2D3C74CA2C58026BB024B403D09BC5950C54CEB6F21E45D0B66B68791BCBB6D7E67C2F7E4A7F4A517FC50B4FEED9A65BF901ABEB0FFAC44AE07237BE5DD2D" - .ToByteArray(); - Assert.IsTrue(MemeCrypto.VerifyMemeData(savebuffer, out var _)); - } - - [TestMethod] - [TestCategory(TestCategory)] - public void TestVerifyMemeBuffer() - { - var encrypted = - "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F4185F2713D5A8BCFFBFF47F86867DF680354913FEFEF08D0D0F1054CB054B508E7DE3AA789AC444D087AB9412CEE965A6D38E45EA010C77FF174F8F8D9993AEAFB9C0616E287B74487E0FF3F1874291B8170C71113971752717F8D188A319EA6" - .ToByteArray(); - var decrypted = - "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7431E10EF7681217C" - .ToByteArray(); - - Assert.IsTrue(MemeCrypto.VerifyMemeData(encrypted, out var actual, MemeKeyIndex.PokedexAndSaveFile)); - for (var i = 0; i < decrypted.Length; i++) - { - Assert.AreEqual(decrypted[i], actual[i]); - } - } - - - [TestMethod] - [TestCategory(TestCategory)] - public void TestSignMemeBuffer() - { - var encrypted = - "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F4185F2713D5A8BCFFBFF47F86867DF680354913FEFEF08D0D0F1054CB054B508E7DE3AA789AC444D087AB9412CEE965A6D38E45EA010C77FF174F8F8D9993AEAFB9C0616E287B74487E0FF3F1874291B8170C71113971752717F8D188A319EA6" - .ToByteArray(); - var decrypted = - "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF" - .ToByteArray(); - - var actual = MemeCrypto.SignMemeData(decrypted); - for (var i = 0; i < encrypted.Length; i++) - { - Assert.AreEqual(encrypted[i], actual[i]); - } - } - - [TestMethod] - [TestCategory(TestCategory)] - public void TestVerifyMemeBufferOffsetLength() - { - var encrypted = - "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F4185F2713D5A8BCFFBFF47F86867DF680354913FEFEF08D0D0F1054CB054B508E7DE3AA789AC444D087AB9412CEE965A6D38E45EA010C77FF174F8F8D9993AEAFB9C0616E287B74487E0FF3F1874291B8170C71113971752717F8D188A319EA6CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" - .ToByteArray(); - var decrypted = - "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7431E10EF7681217CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" - .ToByteArray(); - - Assert.IsTrue(MemeCrypto.VerifyMemeData(encrypted, out var actual, 0x10, 0x100, - MemeKeyIndex.PokedexAndSaveFile)); - for (var i = 0; i < decrypted.Length; i++) - { - Assert.AreEqual(decrypted[i], actual[i]); - } - } - - [TestMethod] - [TestCategory(TestCategory)] - public void TestVerifyPoke() - { - var vector = - "A96E2D8D9B99DBFB934939C097E3AC101C7D48CEC52FCA717B14B19890208592045C430035DD09A31446142E9EA33CF3E6B6E69484B6D2EED500B8389048013491602403DBE7B814EA069667CFADAFE74895217D78037B4A456FAB2CAFD71E69504F4B4509000000000000" - .ToByteArray(); - var vector2 = - "A96E2D8D9B99DBFB934939C097E3AC101C7D48CEC52FCA717B14B19890208592045C430035DD09A31446142E9EA33CF3E6B6E69484B6D2EED500B8389048013491602403DBE7B814EA069667CFADAFE74895217D78037B4A456FAB2CAFD71E690000504F4B4509000000000000" - .ToByteArray(); - - Assert.IsTrue(MemeCrypto.VerifyMemePOKE(vector, out var _)); - Assert.IsTrue(MemeCrypto.VerifyMemePOKE(vector2, out var _)); - - } - - [TestMethod] - [TestCategory(TestCategory)] - public void TestVerifyKnownKeys() - { - var vectors = new Dictionary - { - {MemeKeyIndex.LocalWireless, "1010030000030000000A0070300051308B3001FFD43020AB301003B430FC30B90830C830D10007C630A382000D6E300A005F00055700305D3046306A300000307530933044304D28306B000B5500158F308C203066002581305A3089A0002744002344308D30612A304C00276E0031DF0001C30830AD30E500110A0042A0004973003D4D305F308880007B0A006830823060C4002F10516A3063004D42305F5200536D009900A6F002F014F026FFF038F04AF05CF06EF080F092F0A4F0B6FFF0C8F0DAF0ECF0FEF110F122F134F1460000B5E400004646F86000F1AB31AB0030D730EC0E30BC30F3020FF173A723C162C9700608C5DCAFAB898032382AF1FA717BBC5D91C61AD7B6EA356220742C2DD4595765FCD8123D1E10ED6B0A1DA45D0C2148035A560BB1C5C246FA7EB64D729FC1DD8B61B4737DC51E184A97E4795E82BFD045743EC2AEAED26E87".ToByteArray()}, - {MemeKeyIndex.FriendlyCompetition, "0300000077000000000000000D0106060404003204000101000000000000000000000000000000000000C00000000000000000000000000E000000000000000000000000000000C0070000000000000000000000987E000000000000000000000000000000000000D80300000000000000F00300000000000000E001070000000000000000000000000000000000000000000000000000000101920200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E2D0100015A03000000BE0700000000C287010050006F006B00E9006D006F006E00200054007200610069006E006500720020004F006E006C0069006E006500200043006F006D007000650074006900740069006F006E000000000000007700770077002E0070006F006B0065006D006F006E002D0074007200610069007DC67F945B27557C97D6C0B6D20FF11AFCE1580C5E9E80C7C3FBBA53B67F24D1A91BA2FB8CDD31F7FE29D894B3764A45407658BB9A6E6DC8B3F6A45F77686AC56EA64C0298D1B22F3D3850ADE10AEA6E185FD0EEA91AA38E3F0F0AA9E7ADA132".ToByteArray()}, - {MemeKeyIndex.LiveCompetition, "0300000077000000000000000D0006060303003204000101000000000000000000000000000000000000C00000000000000000000000000E000000000000000000000000000000C0070000000000000000000000987E000000000000000000000000000000000000D80300000000000000F00300000000000000E001070000000000000000000000000000000000000000000000000000000101920200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001E2D0100015A03000000BE07000000000B9101004900720069007300200043006D007000650074006900740069006F006E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066007200650065000000000000000000000000000000000000000000000000006425CA0A78E79154EBA19550A0734F84A0C49F8B02E51FA8310548FFF14B7338276188C11C85C15701DAED228099FBF95A277E6249625208D8992FF027385D897AC097F0240C93A70E35FB8AD971DFE14832988DC70F5D1BE19C7EF5FBAFCC12".ToByteArray()}, - {MemeKeyIndex.RentalTeam, "0300000077000000B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C74E35E4783A7E9E161C919C0E736F61B31741B8C1873C5D06D1D408D9DA9FE28DCB53851518FCC0758915EE2911B2194B20131C2E87BC63A255F3A5187763FAF99B1B99D0E4460125CCB7F1CE4A3CC0FC64463454DB25CC851EF9A360EA3D4BDB44B8DE96D1C9839744A3BF7A27FDF41A86491666DAA7BEF55EBFB954BA3FF741657252490BD11350EEF367DA0D229E04EE61DCA1220576014AC2E24232337AB4E7ADEE92B59C44E9AB8D19E0BA87547A0351C4088EDF8808D692461C84EB5D07C795D3B037290AC7C5A9FD2775A86EAD628F545F6E5193145ED22B3BCDE16FD3CCEEA80A5FD90CF8FD320C1D064C8881BF369F0D82EE0E637C434EC6CA4221FE0952C28A7E930956DC2B990817BCC2349EC4339CDD09E2ABB94DC44C171A1E70E2CC5538B9686A1E4AFF907436378FE2915F217EC7C3BA69E47C913794FFE8285DD399D3E39154CE51BA0C74663BD685634697D76EAB8890CF77E371BA7E5CD5FA78FAC7D58A3843C993331C8AFC5ABDCD17FC42B7C28A196C2FB0EF03FE84CAF3FD626A584D9406BC6FC5DC20DD0E19D1D08C96D9065F376E052639FFC0F61CCCE84CDC833F31B9A6C830DE9F58B257F5CBE5991FCA51871752B611AE3B21F5E1F1AE3CFAB49BC6F6721C1C18B74B11400D029E268D".ToByteArray()}, - {MemeKeyIndex.PokedexAndSaveFile, "4F3994147824D4F9D9B3EEBDC2DA6777585413FA41D22347A3593E22467E2F117B51EDFEAE5977E19AD88EB1C63ADB7E9DEDB7F5AEEFECA5F777C7F12527729025C82DC4A12C8B344EB472B9F68BFD999916F0D03460FF1D3FDC5EF0F7A7F8FE".ToByteArray()}, - {MemeKeyIndex.GaOle, "7C7F70413806DFD1D4E8F5610BE3CA705245593C24AB3102D7768D43B3D873EEB5BB6B188FD4F38F06EB06C1A27369E9822D10093DAD17692EA2D71BCB8941F883F3F0E2068941F65FB26950B7E54F5990E163809594381C99CF3330F052452C".ToByteArray()}, - {MemeKeyIndex.MagearnaEvent, "9D741CBA2ABA23408461AC168B3227199C15FFA2784662FE169459DDC2409AE08FA302A6E7026051C8378D09898500028021FE21B1A8165C9918779BA140597E03ED3EAF2FD82C026B17E6BB0D1C4BC6CE06E9FAC2E5DCDD4025983DE57C67CA".ToByteArray()}, - {MemeKeyIndex.MoncolleGet, "9914945B3280796FF8EC694681ED2218F8FCD1C6628FCFACD633A86622D278C09FD1BA1B2E60AF2896EDDAF76110CA246AED9E08D7D90F7F285764BBD3E20E05A11BA214C96B1A54E1A8D48DE6EF060C79011A4B3326FBE55F29FDE40B31F470".ToByteArray()}, - {MemeKeyIndex.IslandScanEventSpecial, "34B08442E3D68D3730CF5CEE9E82BCFD5F6664168F43E9F2EA26CC7B94B1F44FF7B3C0BAD5C346693DDAD5461E6087AD061015744F6DBA294F9BCD6F0E7A35859F0A15F358EB00BED5A4C18841A8B6A69D91FC603E6DCE058DD96983C5DFBB04".ToByteArray()}, - {MemeKeyIndex.TvTokyoDataBroadcasting, "195B4EA9F48E6ADBEE73EB0D529C14EDC99BB011F214E0812E5198BE40739783646FB8C75ABFFD84AA11FB095EFFF5E383F7F45A56A96780C79EBABB430D860FA6CB3D0BFC163C52EDC5C199963D3E518758F911569E1C667BF8A15643A19E2F".ToByteArray()}, - {MemeKeyIndex.CapPikachuEvent, "A96E2D8D9B99DBFB934939C097E3AC101C7D48CEC52FCA717B14B19890208592045C430035DD09A31446142E9EA33CF3E6B6E69484B6D2EED500B8389048013491602403DBE7B814EA069667CFADAFE74895217D78037B4A456FAB2CAFD71E69".ToByteArray()}, - {MemeKeyIndex.Unknown10, null}, - {MemeKeyIndex.Unknown11, null}, - {MemeKeyIndex.Unknown12, null}, - {MemeKeyIndex.Unknown13, null} - - }; - - foreach (var keyIndex in vectors.Keys) - { - if (vectors[keyIndex] != null) - { - Assert.IsTrue(MemeCrypto.VerifyMemeData(vectors[keyIndex], out var _, keyIndex), $"Failed to verify test vector for MemeKey {keyIndex}!"); - } - } - } - } -} diff --git a/Tests/PKHeX.Tests/Saves/SMTests.cs b/Tests/PKHeX.Tests/Saves/SMTests.cs deleted file mode 100644 index 3697846d0..000000000 --- a/Tests/PKHeX.Tests/Saves/SMTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using PKHeX.Core; - -namespace PKHeX.Tests.Saves -{ - [TestClass] - public class SMTests - { - public const string TestCategory = "SM Save Data Tests"; - - private SAV7 GetSave() - { - return new SAV7(Properties.Resources.SM_Project_802); - } - - [TestMethod] - [TestCategory(TestCategory)] - public void TestChecksumRead() - { - Assert.IsTrue(GetSave().ChecksumsValid, "Checksums are not valid."); - } - - [TestMethod] - [TestCategory(TestCategory)] - public void TestChecksumUpdate() - { - var save = GetSave(); - var saveChecksumInfo = save.ChecksumInfo; - var newSave = new SAV7(save.Write(false, false)); - Assert.AreEqual(saveChecksumInfo, save.ChecksumInfo, "Checksum info modified on Write"); - Assert.IsTrue(save.ChecksumsValid, "Checksum not valid after write"); - Assert.IsTrue(newSave.ChecksumsValid, "Checksums are not valid after open"); - Assert.AreEqual(save.ChecksumInfo, newSave.ChecksumInfo, "Checksums changed since write and open"); - } - } -} diff --git a/Tests/PKHeX.Tests/Util/DataUtilTests.cs b/Tests/PKHeX.Tests/Util/DataUtilTests.cs deleted file mode 100644 index e258b0fa0..000000000 --- a/Tests/PKHeX.Tests/Util/DataUtilTests.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace PKHeX.Tests.Util -{ - [TestClass] - public class DataUtilTests - { - const string TestCategory = "Data Util Tests"; - - [TestMethod] - [TestCategory(TestCategory)] - public void TestGetPokemonNames() - { - var names = PKHeX.Core.Util.GetSpeciesList("en"); - Assert.AreEqual(808, names.Length); - } - } -} diff --git a/Tests/PKHeX.Tests/Util/DateUtilTests.cs b/Tests/PKHeX.Tests/Util/DateUtilTests.cs deleted file mode 100644 index cbcaa0b23..000000000 --- a/Tests/PKHeX.Tests/Util/DateUtilTests.cs +++ /dev/null @@ -1,114 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace PKHeX.Tests.Util -{ - [TestClass] - public class DateUtilTests - { - const string DateUtilCategory = "Date Util Tests"; - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void RecognizesCorrectDates() - { - Assert.IsTrue(Core.Util.IsDateValid(2000, 1, 1), "Failed to recognize 1/1/2000"); - Assert.IsTrue(Core.Util.IsDateValid(2001, 1, 31), "Failed to recognize 1/31/2001"); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void MonthBoundaries() - { - Assert.IsTrue(Core.Util.IsDateValid(2016, 1, 31), "Incorrect month boundary for January"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 2, 28), "Incorrect month boundary for February"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 3, 31), "Incorrect month boundary for March"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 4, 30), "Incorrect month boundary for April"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 5, 31), "Incorrect month boundary for May"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 6, 30), "Incorrect month boundary for June"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 7, 31), "Incorrect month boundary for July"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 8, 31), "Incorrect month boundary for August"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 9, 30), "Incorrect month boundary for September"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 10, 31), "Incorrect month boundary for October"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 11, 30), "Incorrect month boundary for November"); - Assert.IsTrue(Core.Util.IsDateValid(2016, 12, 31), "Incorrect month boundary for December"); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void RecognizeCorrectLeapYear() - { - Assert.IsTrue(Core.Util.IsDateValid(2004, 2, 29)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithIncorrectLeapYear() - { - Assert.IsFalse(Core.Util.IsDateValid(2005, 2, 29)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithZeroDate() - { - Assert.IsFalse(Core.Util.IsDateValid(0, 0, 0)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithNegativeDate() - { - Assert.IsFalse(Core.Util.IsDateValid(-1, -1, -1)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithBigDay() - { - Assert.IsFalse(Core.Util.IsDateValid(2000, 1, 32)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithBigMonth() - { - Assert.IsFalse(Core.Util.IsDateValid(2000, 13, 1)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithBigYear() - { - Assert.IsFalse(Core.Util.IsDateValid(10000, 1, 1)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithZeroDay() - { - Assert.IsFalse(Core.Util.IsDateValid(2000, 1, 0)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithZeroMonth() - { - Assert.IsFalse(Core.Util.IsDateValid(2000, 0, 1)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void FailsWithZeroYear() - { - Assert.IsFalse(Core.Util.IsDateValid(0, 1, 1)); - } - - [TestMethod] - [TestCategory(DateUtilCategory)] - public void TestUIntOverload() - { - Assert.IsTrue(Core.Util.IsDateValid((uint)2000, (uint)1, (uint)1), "Failed 1/1/2000"); - Assert.IsFalse(Core.Util.IsDateValid(uint.MaxValue, uint.MaxValue, uint.MaxValue), "Failed with uint.MaxValue"); - } - } -} diff --git a/Tests/PKHeX.Tests/Util/GeoLocationTests.cs b/Tests/PKHeX.Tests/Util/GeoLocationTests.cs deleted file mode 100644 index 84962444a..000000000 --- a/Tests/PKHeX.Tests/Util/GeoLocationTests.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using PKHeX.Core; - -namespace PKHeX.Tests.Util -{ - [TestClass] - public class GeoLocationTests - { - private const string GeoLocationCategory = "GeoLocation Tests"; - - [TestMethod] - [TestCategory(GeoLocationCategory)] - public void CountryFetch() - { - string japan = GeoLocation.GetCountryName("en", 1); - Assert.AreEqual("Japan", japan); - - string argentina = GeoLocation.GetCountryName(LanguageID.English, 10); - Assert.AreEqual("Argentina", argentina); - } - - [TestMethod] - [TestCategory(GeoLocationCategory)] - public void RegionFetch() - { - string tokyo = GeoLocation.GetRegionName("en", 1, 2); - Assert.AreEqual("Tokyo", tokyo); - - string bermuda = GeoLocation.GetRegionName(LanguageID.Korean, 186, 1); - Assert.AreEqual("버뮤다", bermuda); - } - } -}