From c8eeeaa1f6657c42326ad4e022068707ccfe3dc7 Mon Sep 17 00:00:00 2001 From: thibautbus <310327033+thibautbus@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:44:00 +0200 Subject: [PATCH] Cover the #DEX registry projection fix with a targeted test --- tests/gen2_pokedex_text_registry_test.lua | 91 +++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tests/gen2_pokedex_text_registry_test.lua diff --git a/tests/gen2_pokedex_text_registry_test.lua b/tests/gen2_pokedex_text_registry_test.lua new file mode 100644 index 00000000..604b5322 --- /dev/null +++ b/tests/gen2_pokedex_text_registry_test.lua @@ -0,0 +1,91 @@ +-- The #DEX screen (src/ui/gen2/PokedexMenu.lua) reads its KIND label and +-- description pages from data.gen2Pokedex.entries, a table loaded straight +-- from disk before mods:load runs -- a separate table from data.pokemon, +-- the `pokemon` registry's own merge target +-- (mod.content.pokemon:patch(id, { dexEntry = ... })). Without a projection +-- step, a translation mod's #DEX text validates against the registry and +-- never reaches the screen. src/core/gen2/PokedexText.lua is that +-- projection, called once after the merge (src/core/Game2.lua). ROM-free: +-- luajit tests/gen2_pokedex_text_registry_test.lua +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 pokedex text registry") +local check, eq = S.check, S.eq + +local PokedexText = require("src.core.gen2.PokedexText") + +-- A patched species (CYNDAQUIL, kind/text/text2 all overridden), one left +-- alone (TOTODILE, no dexEntry at all in data.pokemon -- a mod that never +-- touched it), and one gen2Pokedex has no matching data.pokemon row for +-- (UNOWN, e.g. a form gen2Pokedex tracks that the pokemon registry does not). +do + local data = { + pokemon = { + CYNDAQUIL = { name = "CYNDAQUIL", dexEntry = { + kind = "SOURIS DE FEU", text = "Page un traduite.", + text2 = "Page deux traduite.", + } }, + TOTODILE = { name = "TOTODILE" }, + }, + gen2Pokedex = { entries = { + CYNDAQUIL = { id = "CYNDAQUIL", dex = 155, kind = "FIRE MOUSE", + height = 108, weight = 170, + text = "It is timid, and always curls itself up in a ball.", + text2 = "If attacked, it flares up its back for protection." }, + TOTODILE = { id = "TOTODILE", dex = 158, kind = "BIG JAW", + height = 200, weight = 200, text = "English page one.", + text2 = "English page two." }, + UNOWN = { id = "UNOWN", dex = 201, kind = "SYMBOL", + height = 50, weight = 50, text = "English only." }, + } }, + } + + local touched = PokedexText.apply(data) + eq(touched, 1, "only the species a mod actually patched are touched") + + local cyndaquil = data.gen2Pokedex.entries.CYNDAQUIL + eq(cyndaquil.kind, "SOURIS DE FEU", "kind reaches the #DEX entry") + eq(cyndaquil.text, "Page un traduite.", "page one reaches the #DEX entry") + eq(cyndaquil.text2, "Page deux traduite.", "page two reaches the #DEX entry") + eq(cyndaquil.dex, 155, "dex number is untouched -- it is not translatable text") + eq(cyndaquil.height, 108, "height is untouched -- game state, not prose") + eq(cyndaquil.weight, 170, "weight is untouched -- game state, not prose") + + local totodile = data.gen2Pokedex.entries.TOTODILE + eq(totodile.kind, "BIG JAW", "a species with no dexEntry patch stays in English") + eq(totodile.text, "English page one.", "unpatched page one is untouched") + + local unown = data.gen2Pokedex.entries.UNOWN + eq(unown.kind, "SYMBOL", + "a #DEX entry with no data.pokemon counterpart at all is left alone") +end + +-- A patch that only sets `kind` (species_kinds without species_dex_text +-- shipped, or vice versa) must not blank out the fields it did not touch. +do + local data = { + pokemon = { ABRA = { name = "ABRA", dexEntry = { kind = "PSY" } } }, + gen2Pokedex = { entries = { + ABRA = { id = "ABRA", dex = 63, kind = "PSI", + text = "English text.", text2 = "English text two." }, + } }, + } + PokedexText.apply(data) + local abra = data.gen2Pokedex.entries.ABRA + eq(abra.kind, "PSY", "kind alone is applied") + eq(abra.text, "English text.", "text is left alone when the patch omits it") + eq(abra.text2, "English text two.", "text2 is left alone when the patch omits it") +end + +-- Missing tables at every level answer 0 rather than raising -- a Gen 1 boot, +-- or a Gold boot with no mods loaded, never calls this with a shaped table. +do + eq(PokedexText.apply(nil), 0, "nil data does not raise") + eq(PokedexText.apply({}), 0, "empty data does not raise") + eq(PokedexText.apply({ gen2Pokedex = { entries = {} } }), 0, + "no data.pokemon at all does not raise") +end + +check(true, "PokedexText.apply covers the projection this fix adds") + +S.finish()