diff --git a/data/v2/build.py b/data/v2/build.py index 1f28d5a42..c0edf01bf 100644 --- a/data/v2/build.py +++ b/data/v2/build.py @@ -494,37 +494,37 @@ def _load_resource_images() -> set[str]: "front_default": ("pokemon/versions/generation-vi/icons/", "png"), "front_female": ("pokemon/versions/generation-vi/icons/female/", "png"), }, - "omegaruby-alphasapphire": { + "omega-ruby-alpha-sapphire": { "front_default": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/", "png", ), "front_female": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/female/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/female/", "png", ), "front_shiny": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/shiny/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/shiny/", "png", ), "front_shiny_female": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/shiny/female/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/shiny/female/", "png", ), "back_default": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/back/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/", "png", ), "back_female": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/back/female/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/female/", "png", ), "back_shiny": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/back/shiny/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/shiny/", "png", ), "back_shiny_female": ( - "pokemon/versions/generation-vi/omegaruby-alphasapphire/back/shiny/female/", + "pokemon/versions/generation-vi/omega-ruby-alpha-sapphire/back/shiny/female/", "png", ), }, diff --git a/pokemon_v2/test_models.py b/pokemon_v2/test_models.py index 5b1fed0bd..9a54394d4 100644 --- a/pokemon_v2/test_models.py +++ b/pokemon_v2/test_models.py @@ -1,11 +1,14 @@ import csv import os import re +from unittest import mock from django.conf import settings from django.test import TestCase from typing_extensions import override +from data.v2 import build +from data.v2.build import POKEMON_SPRITE_CONFIG, _pokemon_form_sprite_lookup from pokemon_v2.models import * @@ -228,3 +231,38 @@ def test_identifier_pattern_examples(self): self.VALID_IDENTIFIER_PATTERN.match(identifier), f"{identifier} should be invalid but was accepted", ) + + +class PokemonSpriteConfigTestCase(TestCase): + def test_generation_vi_sprite_group_keys_and_paths(self): + # keys are version-group names and each group's sprites live in a folder of the + # same name (https://github.com/PokeAPI/pokeapi/issues/1684) + gen_vi = POKEMON_SPRITE_CONFIG["versions"]["generation-vi"] + + self.assertEqual(set(gen_vi), {"icons", "omega-ruby-alpha-sapphire", "x-y"}) + for group, sprites in gen_vi.items(): + for path, _extension in sprites.values(): + self.assertTrue( + path.startswith(f"pokemon/versions/generation-vi/{group}/"), + f"{group} path {path} is not under the {group}/ sprites folder", + ) + + # https://github.com/PokeAPI/pokeapi/issues/1687: unown-a's front sprite is stored as + # 201.png, not 201-a.png, so default forms must fall back to the bare pokemon id + def test_form_sprite_lookup_falls_back_to_pokemon_id_for_default_forms(self): + # pokemon_forms.csv columns: id, identifier, form_identifier, pokemon_id, introduced_in, is_default + unown_a = ["201", "unown-a", "a", "201", "3", "1"] + unown_b = ["10001", "unown-b", "b", "201", "3", "0"] + images = {"pokemon/201.png", "pokemon/back/201-a.png", "pokemon/back/201.png"} + + with mock.patch.object(build, "RESOURCE_IMAGES", images): + unown_a_lookup = _pokemon_form_sprite_lookup(unown_a) + unown_b_lookup = _pokemon_form_sprite_lookup(unown_b) + + self.assertEqual(unown_a_lookup("pokemon/", "png"), build.MEDIA_DIR.format(file_name="pokemon/201.png")) + # a form-specific sprite still takes precedence over the fallback + self.assertEqual( + unown_a_lookup("pokemon/back/", "png"), build.MEDIA_DIR.format(file_name="pokemon/back/201-a.png") + ) + # non-default forms never borrow the base pokemon's sprite + self.assertIsNone(unown_b_lookup("pokemon/", "png"))