mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-24 12:49:03 -05:00
siterender.system_name reads the heading of the console section the id spells, then SYSTEM_NAMES, and raises for an id in neither. The emulator intro and the picker titles read it instead of the folder a system's files were voted onto.
121 lines
4.8 KiB
Python
121 lines
4.8 KiB
Python
"""One display name per system id (round 2, package P0).
|
|
|
|
An emulator page listed the folders a system's files were voted onto:
|
|
nintendo-gba read "Nintendo Game Boy", camplynx "Arcade", and MAME
|
|
"emulated FBNeo". siterender.system_name names a system from the console
|
|
section that is its own, then from SYSTEM_NAMES, and raises otherwise.
|
|
database.json carries no system id: its files reach a page through their
|
|
console folders, so the ids to name are the platforms' and the profiles'.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(REPO_ROOT / "scripts"))
|
|
|
|
import siterender # noqa: E402
|
|
from common import ( # noqa: E402
|
|
list_registered_platforms,
|
|
load_emulator_profiles,
|
|
load_platform_config,
|
|
)
|
|
from generate_site import _group_by_manufacturer # noqa: E402
|
|
|
|
|
|
def _profile_system_ids(profiles: dict[str, dict]) -> set[str]:
|
|
ids: set[str] = set()
|
|
for profile in profiles.values():
|
|
ids.update(str(sys_id) for sys_id in profile.get("systems") or [])
|
|
for entry in profile.get("files") or []:
|
|
if not isinstance(entry, dict):
|
|
continue
|
|
if entry.get("system"):
|
|
ids.add(str(entry["system"]))
|
|
ids.update(str(sys_id) for sys_id in entry.get("systems") or [])
|
|
return ids
|
|
|
|
|
|
class SystemNames(unittest.TestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
with open(REPO_ROOT / "database.json", encoding="utf-8") as handle:
|
|
db = json.load(handle)
|
|
cls.manufacturers = _group_by_manufacturer(db)
|
|
cls.profiles = load_emulator_profiles(
|
|
str(REPO_ROOT / "emulators"), skip_aliases=False)
|
|
siterender.set_console_sections(
|
|
cls.manufacturers, siterender.program_names(cls.profiles))
|
|
platforms_dir = str(REPO_ROOT / "platforms")
|
|
cls.platform_ids = {
|
|
sys_id
|
|
for name in list_registered_platforms(platforms_dir, include_archived=True)
|
|
for sys_id in load_platform_config(name, platforms_dir).get("systems", {})
|
|
}
|
|
cls.profile_ids = _profile_system_ids(cls.profiles)
|
|
|
|
def _all_ids(self) -> set[str]:
|
|
return self.platform_ids | self.profile_ids
|
|
|
|
def test_every_system_id_has_a_name(self) -> None:
|
|
unnamed = []
|
|
for sys_id in sorted(self._all_ids()):
|
|
try:
|
|
name = siterender.system_name(sys_id)
|
|
except KeyError:
|
|
unnamed.append(sys_id)
|
|
continue
|
|
self.assertTrue(name.strip(), sys_id)
|
|
self.assertEqual(unnamed, [], "add these to siterender.SYSTEM_NAMES")
|
|
|
|
def test_no_name_is_a_manufacturer_page_or_an_emulator(self) -> None:
|
|
taken = {name.casefold() for name in self.manufacturers}
|
|
taken |= {name.casefold() for name in siterender.program_names(self.profiles)}
|
|
clashes = sorted(
|
|
(sys_id, siterender.system_name(sys_id))
|
|
for sys_id in self._all_ids()
|
|
if siterender.system_name(sys_id).casefold() in taken
|
|
)
|
|
self.assertEqual(clashes, [])
|
|
|
|
def test_table_entries_are_reached(self) -> None:
|
|
"""A table entry an own section shadows is never read, and an entry
|
|
no platform or profile names is a leftover."""
|
|
shadowed = sorted(
|
|
sys_id for sys_id in siterender.SYSTEM_NAMES
|
|
if siterender._own_section(sys_id) is not None
|
|
)
|
|
self.assertEqual(shadowed, [])
|
|
unused = sorted(set(siterender.SYSTEM_NAMES) - self._all_ids())
|
|
self.assertEqual(unused, [])
|
|
|
|
def test_names_that_read_a_folder_vote(self) -> None:
|
|
self.assertEqual(siterender.system_name("nintendo-gba"), "Nintendo Game Boy Advance")
|
|
self.assertEqual(siterender.system_name("camplynx"), "Camputers Lynx")
|
|
self.assertEqual(siterender.system_name("atari-lynx"), "Atari Lynx")
|
|
self.assertEqual(siterender.system_name("arcade"), "Arcade games")
|
|
self.assertEqual(siterender.system_name("sega-naomi"), "Sega NAOMI")
|
|
|
|
def test_own_section_names_from_its_heading(self) -> None:
|
|
self.assertEqual(siterender.system_name("nintendo-snes"), "Nintendo SNES")
|
|
self.assertEqual(siterender.system_name("sony-playstation"), "Sony PlayStation")
|
|
|
|
def test_an_unknown_id_raises(self) -> None:
|
|
with self.assertRaises(KeyError):
|
|
siterender.system_name("no-such-system-anywhere")
|
|
|
|
def test_mame_names_systems_not_emulators(self) -> None:
|
|
names = {siterender.system_name(s) for s in self.profiles["mame"].get("systems") or []}
|
|
self.assertNotIn("FBNeo", names)
|
|
self.assertNotIn("Arcade", names)
|
|
self.assertFalse(names & siterender.program_names(self.profiles))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|