"""A platform page shows each row the hash its own declaration carries.
The page joined verify's details to the platform YAML by file name alone,
the last declaration winning: MiSTer declares boot.rom 23 times with 21
distinct MD5s, and every boot.rom row showed the same one, so a user
checking a dump against the page was told the wrong hash.
"""
from __future__ import annotations
import sys
import unittest
from unittest import mock
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import siterender # noqa: E402
from generate_site import _render_platform_systems # noqa: E402
A, B, C = "a" * 32, "b" * 32, "c" * 32
class EachRowItsDeclaration(unittest.TestCase):
def test_same_name_in_two_systems_and_twice_in_one(self):
config_files = {
("psx", "boot.rom"): [{"name": "boot.rom", "md5": A}],
("saturn", "boot.rom"): [
{"name": "boot.rom", "md5": B},
{"name": "boot.rom", "md5": C},
],
}
by_system = {
"psx": [{"name": "boot.rom", "status": "ok", "system": "psx"}],
"saturn": [
{"name": "boot.rom", "status": "ok", "system": "saturn"},
{"name": "boot.rom", "status": "ok", "system": "saturn"},
],
}
names = {"psx": "Sony PlayStation", "saturn": "Sega Saturn"}
with mock.patch.dict(siterender.SYSTEM_NAMES, names):
text = "\n".join(_render_platform_systems(by_system, config_files, {}))
psx, saturn = text.split("saturn", 1)[0], text.split("saturn", 1)[1]
self.assertIn(A, psx)
self.assertNotIn(B, psx)
self.assertLess(saturn.index(B), saturn.index(C))
self.assertNotIn(A, saturn)
class AnUntestedRowNamesBothHashes(unittest.TestCase):
"""The gaps page said "declared hash contradicted by the local file" for
RetroDECK's dsifirmware.bin and named neither the dump RetroDECK asks for
nor the one the collection holds."""
def test_declared_and_held(self):
import generate_site as gs
path = "bios/Nintendo/Nintendo DS/dsifirmware.bin"
declared, held = "1" * 64, "2" * 64
config = {"systems": {"nintendo-ds": {"files": [
{"name": "dsifirmware.bin", "sha256": declared}]}}}
detail = {"name": "dsifirmware.bin", "system": "nintendo-ds"}
problem = {
"platform": "RetroDECK", "name": "dsifirmware.bin", "status": "untested",
"required": True, "reason": "declared hash contradicted by the local file",
"declared": gs._declared_hashes(config, detail), "path": path,
}
db = {"files": {"f" * 40: {"path": path, "sha256": held}}}
table = "\n".join(gs._render_problem_files([problem], db=db))
row = next(line for line in table.splitlines() if "dsifirmware" in line)
# Cut to 12 characters in the cell, the whole value in its title.
self.assertIn(f'sha256 {declared[:12]}', row)
self.assertIn(f'sha256 {held[:12]}', row)
self.assertIn(f"`{path}`", row)
if __name__ == "__main__":
unittest.main()