mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-01 00:27:20 -05:00
chore: merge settled probe findings
This commit is contained in:
commit
7e3bc4cf0f
16 files changed
+330
-27
No files matched your search
@@ -560,3 +560,55 @@ content:
|
||||
- sha1: 003685f698160f1cc79ca0bc00091f30ccb681db
|
||||
stage: game
|
||||
shows: Rez asking to format the unformatted memory card in slot 1
|
||||
- name: "Lunar - Silver Star Story (Japan)"
|
||||
catalog: redump
|
||||
sha1: aee4e96d37132c53c6405c68e11787a6bc75c972
|
||||
references:
|
||||
"Beetle Saturn":
|
||||
recorded_from: 2026-10-28-90ae07f141fe
|
||||
frames:
|
||||
- sha1: 5edec5180d1c04dc0ead1e5fbbc7d6d53cc23fdb
|
||||
stage: bios
|
||||
shows: the SEGA SATURN logo of the Japanese BIOS v1.01
|
||||
- sha1: dcd45679fcd31a423d0e54690e89b52f417d8728
|
||||
stage: bios
|
||||
shows: SEGA, produced by or under license from Sega Enterprises
|
||||
- sha1: ae83d3e3ba167fb1c2e59175faf042e4e483b1cd
|
||||
stage: game
|
||||
shows: the Kadokawa Shoten logo
|
||||
- sha1: 55c544650f06ff9f4a165ea06ac6e534ab0a00a1
|
||||
stage: game
|
||||
shows: the Game Arts logo on white
|
||||
- sha1: 78865212bfe9d9a946f1ec4985092ccec6d01b67
|
||||
stage: game
|
||||
shows: the JAM logo on white
|
||||
- sha1: af869e868d94e8b4c551be5570ade580f5c15ce6
|
||||
stage: game
|
||||
shows: the Lunar Silver Star Story title over the planet
|
||||
- sha1: cb64c728de69873915f0bbb3f95ce06dbe305d10
|
||||
stage: game
|
||||
shows: the Lunar Silver Star Story title over the planet
|
||||
"Yabause":
|
||||
recorded_from: 2026-10-28-5d299098fb23
|
||||
frames:
|
||||
- sha1: 1f1ddd5e434a82b54be476ac95b6bfe7925a92b5
|
||||
stage: bios
|
||||
shows: the SEGA SATURN logo of the Japanese BIOS v1.00
|
||||
- sha1: 1bdd0d3a315fc85bf0ac2e74be512ccf711ee9aa
|
||||
stage: bios
|
||||
shows: SEGA, produced by or under license from Sega Enterprises
|
||||
- sha1: af1cac6b29a68a9dab27bd8ee26c7e543f39cd03
|
||||
stage: game
|
||||
shows: the Kadokawa Shoten logo
|
||||
- sha1: fa94920ad89884eeb11286f982b19e0b93a622af
|
||||
stage: game
|
||||
shows: the Game Arts logo on white
|
||||
- sha1: 25df8806f67e4cc34d4e5584600218b2131c930c
|
||||
stage: game
|
||||
shows: the JAM logo on white
|
||||
- sha1: 3077677e616d76f56330c57701e0e6f0e87b5a17
|
||||
stage: game
|
||||
shows: the Lunar Silver Star Story title over the planet
|
||||
- sha1: e49f6dbd8bc19f53383699c622c43595a3816538
|
||||
stage: game
|
||||
shows: the Lunar Silver Star Story title over the planet
|
||||
@@ -6,12 +6,17 @@ systems:
|
||||
sega-saturn:
|
||||
romfetch: saturn
|
||||
content:
|
||||
- name: "Lunar - Silver Star Story Complete (Japan)"
|
||||
- name: "Lunar - Silver Star Story (Japan)"
|
||||
catalog: redump
|
||||
reason: >-
|
||||
A Japanese disc. Every Saturn core needs a BIOS image to start a disc,
|
||||
so the run shows whether the BIOS the pack put in the folder is one
|
||||
the core reads, under the name it looks for.
|
||||
the core reads, under the name it looks for. It reaches its title on
|
||||
Beetle Saturn and Yabause with the RetroArch pack's BIOS (records
|
||||
2026-10-28-6b5b55d3480f, 2026-10-28-9270d1928be7). The Complete
|
||||
edition is not used: it needs the MPEG card, which a core without
|
||||
MPEG decoding never gets past (Yabause stops on a black screen after
|
||||
the logos).
|
||||
region: japan
|
||||
load: cue
|
||||
frames: 3600
|
||||
|
||||
@@ -235,6 +235,25 @@ class RuleTable(unittest.TestCase):
|
||||
self.assertIsNone(rules.rule_validation(run(rules.UNKNOWN), None, NONE_BOOTS, PRESENT,
|
||||
{"name": "b"}))
|
||||
|
||||
def test_a_warned_check_lets_a_wrong_file_run(self) -> None:
|
||||
"""Beetle PSX logs a wrong SHA1 and boots the file (libretro.c:853-860),
|
||||
PCSX ReARMed refuses an image without the kernel's first instruction
|
||||
or "PS compatible" (frontend/libretro.c:3646-3651)."""
|
||||
refused = run(rules.BIOS_ERROR)
|
||||
used = run(rules.HANG)
|
||||
warned = {"name": "b", "validation": ["sha1"], "on_mismatch": "warn"}
|
||||
self.assertEqual(rules.rule_validation(used, used, NONE_BOOTS, PRESENT, warned).rule,
|
||||
"validation_agrees")
|
||||
by_check = {"name": "b", "validation": ["size", "md5"], "on_mismatch": {"md5": "warn"}}
|
||||
self.assertEqual(rules.rule_validation(used, refused, NONE_BOOTS, PRESENT, by_check).rule,
|
||||
"validation_agrees")
|
||||
self.assertEqual(rules.rule_validation(used, None, NONE_BOOTS, PRESENT,
|
||||
{"name": "b", "validation": ["sha1"]}).rule,
|
||||
"validation_contradicted")
|
||||
signature = {"name": "b", "validation": ["size", "signature"]}
|
||||
self.assertEqual(rules.rule_validation(refused, None, NONE_BOOTS, PRESENT, signature).rule,
|
||||
"validation_agrees")
|
||||
|
||||
def test_path_and_alias(self) -> None:
|
||||
self.assertIsNone(rules.rule_path(self.ENTRY, "bios.bin", rules.Opened("bios.bin", self.RID)))
|
||||
moved = rules.rule_path(self.ENTRY, "bios.bin", rules.Opened("sys/bios.bin", self.RID))
|
||||
@@ -922,6 +941,53 @@ class Findings(Workspace):
|
||||
for line in mr.read_campaign(self.root, name):
|
||||
self.assertEqual(list(Draft202012Validator(schema).iter_errors(line)), [], name)
|
||||
|
||||
def contradicted(self) -> rules.Verdict:
|
||||
return rules.rule_validation(rules.Run(rules.HANG, self.RID, "zeros"), None,
|
||||
self.none(rules.BOOTS), self.present(),
|
||||
{**self.entry(), "validation": ["md5"]})
|
||||
|
||||
def test_a_review_applies_through_the_profile_editor(self) -> None:
|
||||
self.c.settle("fake", self.content, self.core, 0, self.entry(), [self.contradicted()])
|
||||
key = self.lines()[-1]["key"]
|
||||
with self.assertRaises(ValueError):
|
||||
campaign.review_finding(self.root, key, "applied", " ")
|
||||
line = campaign.review_finding(self.root, key, "applied", "the core logs the md5 (x.c:1)",
|
||||
{"on_mismatch": "warn"})
|
||||
self.assertEqual((line["status"], line["reason"]), ("applied", "the core logs the md5 (x.c:1)"))
|
||||
entry = self.entry()
|
||||
self.assertEqual(entry["on_mismatch"], "warn")
|
||||
self.assertEqual(entry["evidence"], {"validation": [self.RID]})
|
||||
text = self.profile.read_text()
|
||||
self.assertLess(text.index("validation: [size]"), text.index("on_mismatch"))
|
||||
self.assertEqual(campaign.open_findings(self.root), [])
|
||||
with self.assertRaises(ValueError):
|
||||
campaign.review_finding(self.root, key, "rejected", "again")
|
||||
try:
|
||||
from jsonschema import Draft202012Validator
|
||||
except ImportError:
|
||||
self.skipTest("jsonschema is a tooling dependency")
|
||||
schema = json.loads((REPO_ROOT / "schemas" / "campaign-finding.schema.json").read_text())
|
||||
for found in self.lines():
|
||||
self.assertEqual(list(Draft202012Validator(schema).iter_errors(found)), [])
|
||||
|
||||
def test_a_rejected_finding_stays_closed_on_the_same_run(self) -> None:
|
||||
verdict = self.contradicted()
|
||||
self.c.settle("fake", self.content, self.core, 0, self.entry(), [verdict])
|
||||
key = self.lines()[-1]["key"]
|
||||
with self.assertRaises(ValueError):
|
||||
campaign.review_finding(self.root, key, "rejected", "kept", {"required": False})
|
||||
out = io.StringIO()
|
||||
with contextlib.redirect_stdout(out), unittest.mock.patch.object(campaign.Paths, "default",
|
||||
return_value=self.paths):
|
||||
self.assertEqual(campaign.main(["review", key, "--status", "rejected",
|
||||
"--reason", "the md5 is checked (x.c:2)"]), 0)
|
||||
before = self.profile.read_text()
|
||||
later = rules.Verdict(verdict.rule, verdict.field, verdict.value, verdict.statement,
|
||||
("2026-10-28-000000000000",))
|
||||
self.c.settle("fake", self.content, self.core, 0, self.entry(), [later])
|
||||
self.assertEqual([line["status"] for line in self.lines()], ["open", "rejected"])
|
||||
self.assertEqual(self.profile.read_text(), before)
|
||||
|
||||
def test_the_batch_commit_plan(self) -> None:
|
||||
verdicts = rules.rule_need(self.none(rules.BOOTS), self.present(), self.entry())
|
||||
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)
|
||||
|
||||
Reference in new issue
Block a user