mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-21 11:19:11 -05:00
Profiles, the wiki, comments, docstrings, command output and schema descriptions carried em-dashes, clause-joining semicolons, unicode arrows, box-drawing banners and check-mark glyphs. Each sentence was rewritten rather than having its character swapped. Hashes, paths, source_ref values and every cited file:line are unchanged, which a comparison of each parsed profile against the previous revision confirms. validate_pr comments now say PASS and FAIL in words, and source_ref values in a profile's structured blocks render as code. test_prose_style fails if any of these comes back, in tracked files or in the generated site.
129 lines
4.9 KiB
Python
129 lines
4.9 KiB
Python
"""A MAME romset ref must name the line declaring its own set.
|
|
|
|
profile_sync follows content, so a drifted ref still anchors wherever the
|
|
cited text went. That is drift detection working, and it cannot answer the
|
|
only question a MAME ref asks: does this line declare this set. Asking it
|
|
found nineteen stale refs in one driver where profile_sync had flagged five.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(ROOT / "scripts"))
|
|
|
|
import mame_ref_audit
|
|
from mame_ref_audit import declares
|
|
|
|
|
|
DRIVER = [
|
|
"// a driver file",
|
|
"CONS( 2000, ekara, 0, 0, m, i, s, init, \"Takara\", \"e-kara\", F )",
|
|
"CONS( 2002, ekarag, ekara, 0, m, i, s, init, \"Takara\", \"e-kara DE\", F )",
|
|
"/* Naomi */ GAME( 1998, naomi, 0, n, n, s, init, ROT0, \"Sega\", \"Naomi\", F )",
|
|
"ROM_START( soundbox )",
|
|
]
|
|
|
|
PROFILE = """emulator: Test
|
|
source: "https://github.com/libretro/mame"
|
|
source_commit: "pinsha"
|
|
files:
|
|
- name: ekara.zip
|
|
category: bios_zip
|
|
source_ref: "src/mame/tvgames/xavix.cpp:99"
|
|
- name: ekarag.zip
|
|
category: bios_zip
|
|
source_ref: "src/mame/tvgames/xavix.cpp:3"
|
|
- name: soundbox.zip
|
|
category: bios_zip
|
|
source_ref: "src/mame/sega/segaai.cpp:1"
|
|
"""
|
|
|
|
|
|
class TestDeclares(unittest.TestCase):
|
|
def test_the_set_name_is_argument_one(self):
|
|
self.assertTrue(declares(DRIVER[1], "ekara"))
|
|
|
|
def test_a_clone_naming_it_as_parent_is_not_a_declaration(self):
|
|
"""ekara is the parent field of ekarag, and most of a driver looks so."""
|
|
self.assertFalse(declares(DRIVER[2], "ekara"))
|
|
self.assertTrue(declares(DRIVER[2], "ekarag"))
|
|
|
|
def test_a_declaration_behind_a_comment_still_counts(self):
|
|
self.assertTrue(declares(DRIVER[3], "naomi"))
|
|
|
|
def test_a_rom_start_is_not_a_machine_declaration(self):
|
|
self.assertFalse(declares(DRIVER[4], "soundbox"))
|
|
|
|
|
|
class TestAudit(unittest.TestCase):
|
|
def setUp(self):
|
|
self.tmp = tempfile.TemporaryDirectory()
|
|
self.dir = self.tmp.name
|
|
Path(self.dir, "p.yml").write_text(PROFILE, encoding="utf-8")
|
|
self._fetch = mame_ref_audit.upstream.fetch_file
|
|
mame_ref_audit.upstream.fetch_file = (
|
|
lambda repo, sha, path, cache, offline=False:
|
|
DRIVER if path.endswith("xavix.cpp") else ["ROM_START( soundbox )"]
|
|
)
|
|
|
|
def tearDown(self):
|
|
mame_ref_audit.upstream.fetch_file = self._fetch
|
|
self.tmp.cleanup()
|
|
|
|
def test_a_ref_pointing_elsewhere_is_reported_with_its_declaration(self):
|
|
findings, agreed, unjudged = mame_ref_audit.audit("p", self.dir, ".c", False)
|
|
self.assertEqual(agreed, 1, "ekarag cites its own line")
|
|
self.assertEqual([f.set_name for f in findings], ["ekara"])
|
|
self.assertEqual(findings[0].cited, 99)
|
|
self.assertEqual(findings[0].declared, 2)
|
|
|
|
def test_a_set_no_machine_declares_is_left_unjudged(self):
|
|
"""A device archive takes its DEFINE_DEVICE_TYPE shortname."""
|
|
_, _, unjudged = mame_ref_audit.audit("p", self.dir, ".c", False)
|
|
self.assertEqual(unjudged, 1)
|
|
|
|
def test_rewrite_moves_only_the_entry_that_owns_the_ref(self):
|
|
findings, _, _ = mame_ref_audit.audit("p", self.dir, ".c", False)
|
|
self.assertEqual(mame_ref_audit.rewrite("p", self.dir, findings), 1)
|
|
text = Path(self.dir, "p.yml").read_text(encoding="utf-8")
|
|
self.assertIn('source_ref: "src/mame/tvgames/xavix.cpp:2"', text)
|
|
self.assertIn(
|
|
'source_ref: "src/mame/tvgames/xavix.cpp:3"', text,
|
|
"ekarag's own ref must be untouched",
|
|
)
|
|
|
|
def test_a_corrected_profile_reports_nothing(self):
|
|
findings, _, _ = mame_ref_audit.audit("p", self.dir, ".c", False)
|
|
mame_ref_audit.rewrite("p", self.dir, findings)
|
|
again, agreed, _ = mame_ref_audit.audit("p", self.dir, ".c", False)
|
|
self.assertEqual(again, [])
|
|
self.assertEqual(agreed, 2)
|
|
|
|
|
|
class TestCorpusStaysCorrect(unittest.TestCase):
|
|
"""The committed profiles agree with their pinned drivers.
|
|
|
|
Offline, so it reads the fetch cache: skipped where that is cold rather
|
|
than turning a network absence into a failure.
|
|
"""
|
|
|
|
def test_every_mame_family_ref_names_its_own_set(self):
|
|
cache = ROOT / mame_ref_audit.upstream.CACHE_DIR
|
|
if not cache.is_dir():
|
|
self.skipTest("no upstream cache")
|
|
for name in ("mame", "mamearcade", "mamemess", "groovymame"):
|
|
with self.subTest(emulator=name):
|
|
findings, agreed, _ = mame_ref_audit.audit(
|
|
name, str(ROOT / "emulators"), str(cache), True
|
|
)
|
|
if not agreed and not findings:
|
|
self.skipTest(f"{name}: driver sources not cached")
|
|
self.assertEqual(
|
|
[f.set_name for f in findings], [],
|
|
f"{name} has refs that do not declare their own set",
|
|
)
|