mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-16 16:33:27 -05:00
129 lines
5.4 KiB
Python
129 lines
5.4 KiB
Python
"""An export starts from the platform's own file, not from what we add to it.
|
|
|
|
load_platform_config folds _shared.yml groups into a platform for the pack,
|
|
the RomM scraper repeats tg16's firmware under turbografx-cd, and the
|
|
libretro scraper adds files it traced in the cores' source. None of them is
|
|
in the platform's file. The export counted them kept and wrote them into
|
|
libretro's System.dat (N88EXT0-3.ROM) as if libretro declared them.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(REPO_ROOT / "scripts"))
|
|
|
|
import common # noqa: E402
|
|
from export_native import load_inputs # noqa: E402
|
|
|
|
|
|
class TheNativeLayerIsThePlatformsOwn(unittest.TestCase):
|
|
def setUp(self):
|
|
common._platform_config_cache.clear()
|
|
common._shared_yml_cache.clear()
|
|
self.addCleanup(common._platform_config_cache.clear)
|
|
self.addCleanup(common._shared_yml_cache.clear)
|
|
|
|
def test_shared_and_mirrored_entries_are_left_out(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
platforms = Path(tmp)
|
|
(platforms / "_shared.yml").write_text(
|
|
"shared_groups:\n quasi88:\n"
|
|
" - name: N88EXT0.ROM\n destination: quasi88/N88EXT0.ROM\n"
|
|
)
|
|
(platforms / "demo.yml").write_text(
|
|
"platform: Demo\nsystems:\n"
|
|
" nec-pc-88:\n includes: [quasi88]\n files:\n"
|
|
" - name: n88.rom\n destination: quasi88/n88.rom\n"
|
|
" tg16:\n files:\n"
|
|
" - name: syscard3.pce\n destination: tg16/syscard3.pce\n"
|
|
" - name: syscard3.pce\n destination: turbografx-cd/syscard3.pce\n"
|
|
" mirror_of: tg16\n"
|
|
" nintendo-gamecube:\n files:\n"
|
|
" - name: dsp_rom.bin\n destination: dolphin-emu/Sys/GC/dsp_rom.bin\n"
|
|
" curated: true\n"
|
|
)
|
|
pack_view = common.load_platform_config("demo", str(platforms))
|
|
_truth, native = load_inputs("demo", platforms, str(platforms))
|
|
|
|
self.assertEqual(
|
|
[f["name"] for f in pack_view["systems"]["nec-pc-88"]["files"]],
|
|
["n88.rom", "N88EXT0.ROM"],
|
|
)
|
|
self.assertEqual(
|
|
[f["name"] for f in native["systems"]["nec-pc-88"]["files"]], ["n88.rom"]
|
|
)
|
|
self.assertEqual(
|
|
[f["destination"] for f in native["systems"]["tg16"]["files"]],
|
|
["tg16/syscard3.pce"],
|
|
)
|
|
self.assertEqual(native["systems"]["nintendo-gamecube"]["files"], [])
|
|
|
|
|
|
class TheTruthDiffReadsTheSameLayer(unittest.TestCase):
|
|
"""diff_truth credited libretro with the files our scraper adds.
|
|
|
|
Compared against the pack view, RetroArch's curated DSP ROMs, fonts and
|
|
DSi files counted as declared by System.dat: 1008 missing instead of
|
|
1016, while the export of the same input added them as missing.
|
|
"""
|
|
|
|
def test_a_curated_file_is_missing_from_the_platform(self):
|
|
import json # noqa: PLC0415
|
|
import subprocess # noqa: PLC0415
|
|
|
|
with tempfile.TemporaryDirectory(dir=str(REPO_ROOT / "tmp")) as tmp:
|
|
root = Path(tmp)
|
|
(root / "demo.yml").write_text(
|
|
"platform: Demo\nsystems:\n"
|
|
" nintendo-gamecube:\n files:\n"
|
|
" - name: dsp_rom.bin\n destination: dolphin-emu/Sys/GC/dsp_rom.bin\n"
|
|
" curated: true\n"
|
|
" - name: IPL.bin\n destination: dolphin-emu/Sys/GC/USA/IPL.bin\n"
|
|
)
|
|
truth = root / "truth"
|
|
truth.mkdir()
|
|
(truth / "demo.yml").write_text(
|
|
"systems:\n nintendo-gamecube:\n files:\n"
|
|
" - name: dsp_rom.bin\n _cores: [dolphin]\n"
|
|
" - name: IPL.bin\n _cores: [dolphin]\n"
|
|
)
|
|
proc = subprocess.run(
|
|
[sys.executable, "scripts/diff_truth.py", "--platform", "demo", "--json",
|
|
"--platforms-dir", str(root), "--truth-dir", str(truth)],
|
|
capture_output=True, text=True, cwd=str(REPO_ROOT), timeout=300, check=False,
|
|
)
|
|
self.assertEqual(proc.returncode, 0, proc.stderr)
|
|
(report,) = json.loads(proc.stdout)
|
|
missing = [
|
|
entry["name"]
|
|
for system in report["divergences"].values()
|
|
for entry in system.get("missing", [])
|
|
]
|
|
self.assertEqual(missing, ["dsp_rom.bin"])
|
|
|
|
def test_every_truth_diff_caller_reads_the_native_layer(self):
|
|
"""The site's platform-vs-source table answers the same question."""
|
|
import re # noqa: PLC0415
|
|
|
|
for path in sorted((REPO_ROOT / "scripts").glob("*.py")):
|
|
text = path.read_text(encoding="utf-8")
|
|
for match in re.finditer(
|
|
r"(?<!def )diff_platform_truth\(\s*[^,()]+,\s*(native_layer\(|\w+)", text
|
|
):
|
|
scraped = match.group(1)
|
|
with self.subTest(path=path.name):
|
|
self.assertTrue(
|
|
scraped == "native_layer("
|
|
or re.search(rf"\b{scraped} = native_layer\(", text),
|
|
f"{path.name}: diff_platform_truth reads {scraped}, the pack view",
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|