mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-06 01:53:56 -06:00
chore: drop review tags from comments
Comments, docstrings and test texts ended on tags that name private review notes no clone holds. The tags go, the facts stay. Test methods named after a finding number are named after what they hold. test_prose_style refuses a tag that comes back. install.py changes in comments only: its pin and the launcher index follow.
This commit is contained in:
1 parent
d38cd58036
commit
964812f977
48 files changed
+808
-872
No files matched your search
+1
-1
@@ -16,7 +16,7 @@
|
||||
# and Invoke-WebRequest throws on a cut transfer before the hash is read:
|
||||
# the site's build rewrites this line there (scripts/sitebootstrap.py).
|
||||
$mismatchAdvice = "The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that."
|
||||
$defaultInstallSha256 = "6e625f7a8c9c3ba095c8240dc3e8482dddd514e438302a576a2f80807e79a547"
|
||||
$defaultInstallSha256 = "137a32f9e9c89dca56e62171c690955692b79ef8636bc8492cd4b68d707c32e2"
|
||||
$maximumInstallerBytes = 2MB
|
||||
$installerExit = 0
|
||||
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
|
||||
|
||||
+225
-259
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -23,7 +23,7 @@ DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/ins
|
||||
# curl or wget stop on a cut transfer before the hash is read: the site's
|
||||
# build rewrites this line there (scripts/sitebootstrap.py).
|
||||
MISMATCH_ADVICE="The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that."
|
||||
DEFAULT_INSTALL_SHA256="6e625f7a8c9c3ba095c8240dc3e8482dddd514e438302a576a2f80807e79a547"
|
||||
DEFAULT_INSTALL_SHA256="137a32f9e9c89dca56e62171c690955692b79ef8636bc8492cd4b68d707c32e2"
|
||||
MAX_INSTALLER_BYTES=2097152
|
||||
|
||||
cleanup() {
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
{
|
||||
"dest": "roms/ports/retrobios/install.py",
|
||||
"repo_path": "install.py",
|
||||
"size": 1079846,
|
||||
"sha256": "6e625f7a8c9c3ba095c8240dc3e8482dddd514e438302a576a2f80807e79a547",
|
||||
"size": 1075087,
|
||||
"sha256": "137a32f9e9c89dca56e62171c690955692b79ef8636bc8492cd4b68d707c32e2",
|
||||
"executable": false
|
||||
},
|
||||
{
|
||||
@@ -71,8 +71,8 @@
|
||||
"muos": {
|
||||
"archive": {
|
||||
"dest": "ARCHIVE/RetroBIOS.muxapp",
|
||||
"size": 1133023,
|
||||
"sha256": "ff64d48ae2d5bd2dcf341917c55da88f8ca7174a2ccbc4e7786b69444da11ff8"
|
||||
"size": 1128264,
|
||||
"sha256": "948ea83c0b7edceac9550b5ed737189084b9bbed1f2e2579ebe5616956703fb6"
|
||||
},
|
||||
"members": [
|
||||
{
|
||||
@@ -92,8 +92,8 @@
|
||||
{
|
||||
"name": "RetroBIOS/install.py",
|
||||
"repo_path": "install.py",
|
||||
"size": 1079846,
|
||||
"sha256": "6e625f7a8c9c3ba095c8240dc3e8482dddd514e438302a576a2f80807e79a547",
|
||||
"size": 1075087,
|
||||
"sha256": "137a32f9e9c89dca56e62171c690955692b79ef8636bc8492cd4b68d707c32e2",
|
||||
"executable": false
|
||||
},
|
||||
{
|
||||
@@ -166,8 +166,8 @@
|
||||
{
|
||||
"dest": ".config/modules/retrobios/install.py",
|
||||
"repo_path": "install.py",
|
||||
"size": 1079846,
|
||||
"sha256": "6e625f7a8c9c3ba095c8240dc3e8482dddd514e438302a576a2f80807e79a547",
|
||||
"size": 1075087,
|
||||
"sha256": "137a32f9e9c89dca56e62171c690955692b79ef8636bc8492cd4b68d707c32e2",
|
||||
"executable": false
|
||||
},
|
||||
{
|
||||
|
||||
@@ -223,8 +223,7 @@ def line_menu() -> str:
|
||||
"""The line menu of a RetroArch run, g then Enter pressed, as install.py
|
||||
prints it for the RetroArch list (install/retroarch.json): the very
|
||||
function line mode runs, its questions answered here. The page carried
|
||||
a copy typed by hand, whose keys and counts drifted from the installer
|
||||
(code_audit_22, owner's note on which-pack)."""
|
||||
a copy typed by hand, whose keys and counts drifted from the installer."""
|
||||
import io # noqa: PLC0415
|
||||
from unittest import mock # noqa: PLC0415
|
||||
|
||||
@@ -290,7 +289,7 @@ class _ListHandler(http.server.SimpleHTTPRequestHandler):
|
||||
class _LoopbackServer(http.server.ThreadingHTTPServer):
|
||||
"""The list server, named by its number: HTTPServer.server_bind looks
|
||||
127.0.0.1 up with socket.getfqdn, a DNS query wherever /etc/hosts does
|
||||
not name it (code_audit_24 P3-12)."""
|
||||
not name it."""
|
||||
|
||||
def server_bind(self) -> None:
|
||||
socketserver.TCPServer.server_bind(self)
|
||||
|
||||
@@ -3943,9 +3943,9 @@ def first_screen_words() -> list[str]:
|
||||
installer = _installer()
|
||||
# The screen it opens first: the setup found, or the list when none
|
||||
# is. Install comes on the next one, Choose systems beside it and named
|
||||
# above on the page (tui_audit_16 P3-10).
|
||||
# above on the page.
|
||||
# Nothing found, the folder comes before Install: which-pack left it
|
||||
# out (tui_audit_17 P3-9).
|
||||
# out.
|
||||
return [f"It asks **{installer.TUI_FOUND_TITLE}** (or **{installer.TUI_CHOOSE_TITLE}** "
|
||||
f"and **{installer.TUI_FOLDER_TITLE}**), then offers **{installer.TUI_INSTALL_ROW}**."]
|
||||
|
||||
@@ -3954,7 +3954,7 @@ def check_pass_line() -> str:
|
||||
"""The pass line of "How to check": the words `--check` prints only when
|
||||
no file is missing or wrong (install.py EVERYTHING_IN_PLACE), read from
|
||||
the installer. Typed here, it kept "All files up to date." after the
|
||||
installer said "Everything is in place." (tui_audit_15 P3-10)."""
|
||||
installer said "Everything is in place."."""
|
||||
return f"All good when it says `{_installer().EVERYTHING_IN_PLACE}`"
|
||||
|
||||
# Under "From your computer": a device with no network installs from the ZIP
|
||||
@@ -9970,7 +9970,7 @@ def _emulator_part_page(
|
||||
for n, (stem, _e) in enumerate(parts, 1)], number - 1),
|
||||
f"# {emu_name} files, part {number} of {len(parts)}",
|
||||
"",
|
||||
# The crumbs end on the emulator, read from parent: (round 5, 7.5).
|
||||
# The crumbs end on the emulator, read from parent:.
|
||||
f"This part holds {_count(len(files), 'entry', 'entries')}, "
|
||||
f"{_code(first)} to {_code(last)}. The other parts: {others}.",
|
||||
"",
|
||||
|
||||
@@ -45,7 +45,7 @@ PIN: dict[str, re.Pattern[str]] = {
|
||||
# What the served copy says of a refused installer. It names a commit's
|
||||
# install.py, which never changes, and both downloaders fail on a short
|
||||
# transfer before the hash is read: neither a cut download nor caches of
|
||||
# two ages explain a mismatch there (code_audit_21 P3-1).
|
||||
# two ages explain a mismatch there.
|
||||
SERVED_ADVICE = ("The file was changed on its way here, most often by a proxy or an "
|
||||
"antivirus that rewrites downloads. Run the command again from another "
|
||||
"network, or with that web protection paused.")
|
||||
@@ -73,7 +73,7 @@ def served_text(name: str, root: Path, commit: str) -> str:
|
||||
advice fitted to that. A pin that is not the SHA-256 of root's
|
||||
install.py stops the build: published, that copy refused every install
|
||||
until the next good deploy, where a failed build keeps the last good
|
||||
pair served (code_audit_21 P3-2)."""
|
||||
pair served."""
|
||||
source, line = SOURCES[name]
|
||||
text = (root / source).read_text(encoding="utf-8")
|
||||
pinned = PIN[name].findall(text)
|
||||
|
||||
@@ -8,7 +8,7 @@ that is down) and written to RETROBIOS_TEST_NETLOG, and the cards and drives
|
||||
mounted under /media, /run/media, /mnt and /Volumes, which read as folders
|
||||
no drive is mounted on. A test module passed on a machine with no network
|
||||
and no card, and failed with an AmberELEC card in the reader, while 261
|
||||
connections to GitHub left the module in a run (code_audit_24 P3-13).
|
||||
connections to GitHub left the module in a run.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -4427,7 +4427,7 @@ class EmulatorPagesStateTheirDataForMachines(unittest.TestCase):
|
||||
{"name": "free.bin"}],
|
||||
})
|
||||
self.assertEqual(data["about"]["codeRepository"], "https://github.com/stenzek/duckstation")
|
||||
# The release the profile describes, never the pin (round 5, 3.5).
|
||||
# The release the profile describes, never the pin.
|
||||
self.assertEqual(data["about"]["version"], "v0.1-12070")
|
||||
self.assertNotIn("description", data["about"])
|
||||
self.assertEqual(data["dateModified"], "2026-03-23")
|
||||
|
||||
@@ -159,12 +159,12 @@ class InstallerOutputExample(unittest.TestCase):
|
||||
"""The run counted 8069 files where its menu counted 3259 BIOS files
|
||||
and 5089 game data files: the parts add up to the total they divide,
|
||||
the sizes within the rounding of their three figures."""
|
||||
# Data files are a third kind, counted beside the two (tui_audit_12 P2-3).
|
||||
# Data files are a third kind, counted beside the two.
|
||||
split = re.search(r"(\d+) BIOS files \(([\d.]+) ([KMG]B)\)(?:,| and) (\d+) game data "
|
||||
r"files \(([\d.]+) ([KMG]B)\)", text)
|
||||
self.assertIsNotNone(split, "a categorized list says its BIOS files and game data")
|
||||
bios, bios_size, bios_unit, games, game_size, game_unit = split.groups()
|
||||
# The data files in the one total, the third kind (code_audit_21 P3-8).
|
||||
# The data files in the one total, the third kind.
|
||||
data = re.search(r"and (\d+) data files \(([\d.]+) ([KMG]B)\)", text)
|
||||
data_count, data_size, data_unit = data.groups() if data else ("0", "0", "KB")
|
||||
self.assertEqual(int(bios) + int(games) + int(data_count), int(count))
|
||||
@@ -176,7 +176,7 @@ class InstallerOutputExample(unittest.TestCase):
|
||||
|
||||
|
||||
class InstallerSamplesSayWhatTheCodePrints(unittest.TestCase):
|
||||
"""code_audit_24 P3-8 to P3-12: samples typed by hand outside the
|
||||
"""Samples typed by hand outside the
|
||||
generated blocks, a sentence on a log read as the terminal's, pages that
|
||||
described the generator as tables alone, and a sandbox that asked DNS."""
|
||||
|
||||
|
||||
@@ -965,7 +965,7 @@ class ThePortMasterPort(unittest.TestCase):
|
||||
self.assertIn("log.txt", device.screen)
|
||||
|
||||
def test_a_quit_chosen_shows_no_message(self):
|
||||
"""code_audit_19 P3-1: a quit chosen exits 2, below 128, and the
|
||||
"""A quit chosen exits 2, below 128, and the
|
||||
first line of tui.err went into a message box waiting for A."""
|
||||
device = self.device()
|
||||
proc = device.run(["bash", self.script], FAKE_QUIT="1", FAKE_CODE="2",
|
||||
|
||||
+9
-11
@@ -35,8 +35,8 @@ _spec.loader.exec_module(install)
|
||||
sys.path.insert(0, str(REPO_ROOT / "tests"))
|
||||
from netguard import module_guard # noqa: E402
|
||||
|
||||
# No connection off the loopback and no card of the host reaches a test
|
||||
# (code_audit_24 P3-13): the module fails at its end otherwise.
|
||||
# No connection off the loopback and no card of the host reaches a test:
|
||||
# the module fails at its end otherwise.
|
||||
setUpModule, tearDownModule = module_guard("test_install")
|
||||
|
||||
|
||||
@@ -1807,7 +1807,7 @@ class TestDetectedPlatformPrompt(unittest.TestCase):
|
||||
self.assertIn("Type a number from 1 to 2, or q to quit.", out)
|
||||
|
||||
def test_enter_takes_the_first_and_there_is_no_all(self):
|
||||
"""tui_audit_9 P3-11: the screen focuses the first and has no All."""
|
||||
"""The screen focuses the first and has no All."""
|
||||
result, out = self._answer("")
|
||||
self.assertEqual(result, [self.PLATFORMS[0]])
|
||||
self.assertNotIn("All", out)
|
||||
@@ -1817,8 +1817,7 @@ class TestManualPlatformPrompt(unittest.TestCase):
|
||||
"""With nothing detected, an interactive run asks instead of exiting.
|
||||
|
||||
Every test runs on no drive and a home of its own: two read the host's
|
||||
drives and home, and failed with a card in the reader (code_audit_23
|
||||
P3-7)."""
|
||||
drives and home, and failed with a card in the reader."""
|
||||
|
||||
def setUp(self):
|
||||
home = Path(_tempdir(self))
|
||||
@@ -1869,7 +1868,7 @@ class TestManualPlatformPrompt(unittest.TestCase):
|
||||
self.assertEqual(chosen, [("lakka", install.DEFAULT_DESTS["lakka"])])
|
||||
|
||||
def test_batocera_on_a_computer_gets_no_default(self):
|
||||
"""tui_audit_8 P2-4: /userdata/bios, a folder only the Batocera
|
||||
"""/userdata/bios, a folder only the Batocera
|
||||
machine has, was offered on a computer, and Enter took it."""
|
||||
answers = iter(["batocera", "", "~/share/bios"])
|
||||
out = io.StringIO()
|
||||
@@ -4204,7 +4203,7 @@ class AQuestionLeftWithCtrlDOrCtrlCIsAStop(unittest.TestCase):
|
||||
[sys.executable, "install.py", "--plain"], cwd=REPO_ROOT, stdin=slave,
|
||||
stdout=slave, stderr=slave,
|
||||
# No request leaves the machine: the standalone emulators' lists
|
||||
# come from the network (code_audit_24 P3-13).
|
||||
# come from the network.
|
||||
env={**os.environ, "HOME": str(home), "RETROBIOS_OS": "linux",
|
||||
"RETROBIOS_INSTALL_OFFLINE": "1"},
|
||||
)
|
||||
@@ -4272,8 +4271,7 @@ class RunsAgainstTheRealLists(unittest.TestCase, _LoopbackRun):
|
||||
lines = [line for line in proc.stdout.splitlines() if line.strip()]
|
||||
self.assertIn("Nothing was written", lines[-1])
|
||||
at = next(index for index, line in enumerate(lines) if line.startswith("Would download"))
|
||||
# One total on the header, the data files among the kinds under it
|
||||
# (code_audit_21 P3-8).
|
||||
# One total on the header, the data files among the kinds under it.
|
||||
self.assertNotIn("data files", lines[at])
|
||||
self.assertIn("data files", lines[at + 1])
|
||||
|
||||
@@ -4321,7 +4319,7 @@ class DestAloneFollowsWhatIsFoundHere(unittest.TestCase):
|
||||
return exc, out.getvalue()
|
||||
|
||||
def test_a_card_system_chosen_checks_the_folder(self):
|
||||
"""code_audit_13 P2-3: the menu offered no card system, and one
|
||||
"""The menu offered no card system, and one
|
||||
chosen now reads --dest as --platform does."""
|
||||
root = Path(_tempdir(self))
|
||||
answers = iter(["Onion", "retroarch"])
|
||||
@@ -5245,7 +5243,7 @@ class EventsDescribeTheRun(unittest.TestCase, _SyntheticTree):
|
||||
# The systems Choose systems lists, before the files are read.
|
||||
{"event": "choices", "platform": "retroarch",
|
||||
"systems": ["sys-a", "sys-b", "other"]},
|
||||
# Nothing set aside before the choice (code_audit_24 P3-3).
|
||||
# Nothing set aside before the choice.
|
||||
{"event": "set_aside", "platform": "retroarch", "dests": []},
|
||||
# a.bin and b.bin are in place: the first read and the last.
|
||||
{"event": "checking", "files_done": 1, "files_total": 2},
|
||||
|
||||
@@ -371,7 +371,7 @@ class RefusedBeforeAnyInstall(unittest.TestCase):
|
||||
(tmp / "cores").mkdir()
|
||||
(tmp / "cores" / "mgba_libretro.so").write_bytes(b"")
|
||||
# Two setups found stop a run without questions before either is
|
||||
# read (code_audit_18 P2-3): the refusal is checked with Batocera
|
||||
# read: the refusal is checked with Batocera
|
||||
# named, and with both found nothing is fetched either.
|
||||
for argv, said in (
|
||||
(["--platform", "batocera", "--dest", str(tmp / "bios")],
|
||||
|
||||
@@ -1210,7 +1210,7 @@ class ADetectedClosedFolderSaysWhereItCameFrom(unittest.TestCase):
|
||||
self.assertIn(f"than the one {self.cfg} names (name another with --dest)", said)
|
||||
|
||||
def test_two_setups_stop_before_either_folder_is_read(self):
|
||||
"""code_audit_18 P2-3: a run without questions installs for one
|
||||
"""A run without questions installs for one
|
||||
setup, so two found stop on what to name before either folder is
|
||||
read, the closed one included."""
|
||||
proc = self.run_detected(True)
|
||||
|
||||
@@ -237,7 +237,7 @@ class CheckNamesWhyAFileIsRefused(Scratch):
|
||||
self.assertIn(f"read by beetle_psx, pcsx_rearmed at {here / 'scph5501.bin'}", out)
|
||||
self.assertIn(f"read by beetle_psx, pcsx_rearmed at {here / 'pcsx' / 'extra.bin'}",
|
||||
out)
|
||||
# Never "opened" of a file that is not there (tui_audit_16 P3-12).
|
||||
# Never "opened" of a file that is not there.
|
||||
self.assertNotIn("opened at", out)
|
||||
|
||||
def test_a_complete_folder_says_nothing_more(self):
|
||||
@@ -476,7 +476,7 @@ class FromPackInstallsOffline(Scratch):
|
||||
self.assertEqual((self.dest / "dolphin-emu" / rel).read_bytes(), data)
|
||||
|
||||
def test_the_data_trees_say_what_they_weigh(self):
|
||||
"""tui_audit_4 P3-10.8: the plan read "and 2636 data files" with no
|
||||
"""The plan read "and 2636 data files" with no
|
||||
size. The data event carries the bytes check's data_missing counts."""
|
||||
tree = {"Sys/GC/font.bin": b"font bytes", "Sys/Wii/setting.txt": b"setting"}
|
||||
listed = manifest()
|
||||
@@ -664,7 +664,7 @@ class OfflineMakesNoRequest(Scratch):
|
||||
self.assertEqual(proc.returncode, 1, proc.stdout + proc.stderr)
|
||||
self.assertEqual((self.dest / "scph5501.bin").read_bytes(), US)
|
||||
self.assertFalse((self.dest / "gba_bios.bin").exists())
|
||||
# Missing, never failed (code_audit_15 P3-1): no FAILED line per file.
|
||||
# Missing, never failed: no FAILED line per file.
|
||||
self.assertIn("3 still missing", proc.stdout + proc.stderr)
|
||||
self.assertNotIn("FAILED", proc.stdout + proc.stderr)
|
||||
self.assertIn("without --offline", proc.stdout + proc.stderr)
|
||||
@@ -785,7 +785,7 @@ class ADryRunOpensOnItsTotals(Scratch):
|
||||
|
||||
|
||||
class OfflineLeavesFilesMissing(Scratch):
|
||||
"""code_audit_13 P1-1, P3-7, P3-8: the files --offline leaves out at a
|
||||
"""The files --offline leaves out at a
|
||||
terminal were counted with a "no" to the size question. Once one file
|
||||
came from this machine, 14,696 missing ended on Done and exit 0."""
|
||||
|
||||
@@ -803,8 +803,7 @@ class OfflineLeavesFilesMissing(Scratch):
|
||||
sources="4 files copied from old, 14696 still missing.")
|
||||
self.assertEqual(code, 1)
|
||||
self.assertNotIn("Done", text)
|
||||
# One count, the sources line as the head, as the screen's result
|
||||
# (tui_audit_15 P3-8).
|
||||
# One count, the sources line as the head, as the screen's result.
|
||||
self.assertIn("Finished with files missing. 4 files copied from old, 14696 still "
|
||||
"missing.", text)
|
||||
self.assertEqual(text.count("14696"), 1)
|
||||
@@ -854,7 +853,7 @@ class OfflineLeavesFilesMissing(Scratch):
|
||||
|
||||
|
||||
class OneOfflineVocabulary(Scratch):
|
||||
"""code_audit_14 P3-1 to P3-4, tui_audit_7 P3-4: --offline said one
|
||||
"""--offline said one
|
||||
thing at a terminal and another without questions, on the screen and
|
||||
under --check."""
|
||||
|
||||
@@ -865,7 +864,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
return old
|
||||
|
||||
def test_a_run_without_questions_says_missing_not_failed(self):
|
||||
"""P3-2: "Finished with errors ... 3 files failed" and "Run the
|
||||
""""Finished with errors ... 3 files failed" and "Run the
|
||||
same command again to retry only those"."""
|
||||
proc = self.run_installer("--offline", "--manifest", str(self.list),
|
||||
"--from", str(self.old()), "--no-input")
|
||||
@@ -879,7 +878,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
self.assertNotIn(said, out)
|
||||
|
||||
def test_nothing_installed_is_said_so(self):
|
||||
"""P3-3: "Finished with files missing. 0 files installed"."""
|
||||
""""Finished with files missing. 0 files installed"."""
|
||||
failures = [("a.bin", install.NOT_WRITABLE), ("b.bin", install.NOT_WRITABLE)]
|
||||
with contextlib.redirect_stdout(io.StringIO()) as out, \
|
||||
self.assertRaises(SystemExit) as stop:
|
||||
@@ -891,7 +890,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
self.assertNotIn("0 files installed", out.getvalue())
|
||||
|
||||
def test_the_command_suggested_keeps_the_offline_setting(self):
|
||||
"""P3-3: sudo does not pass RETROBIOS_INSTALL_OFFLINE on."""
|
||||
"""Sudo does not pass RETROBIOS_INSTALL_OFFLINE on."""
|
||||
import test_install_tui as tui
|
||||
|
||||
args = tui._args(platform="retroarch", declared_only=False, offline=False)
|
||||
@@ -901,7 +900,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
self.assertIn("--offline", hint.command("retroarch", self.dest, elevated=True))
|
||||
|
||||
def test_check_offline_says_what_cannot_come(self):
|
||||
"""P3-4: "Run the same command without --check to fetch them"."""
|
||||
""""Run the same command without --check to fetch them"."""
|
||||
proc = self.run_installer("--check", "--offline", "--manifest", str(self.list))
|
||||
out = proc.stdout + proc.stderr
|
||||
self.assertEqual(proc.returncode, 1, out)
|
||||
@@ -910,7 +909,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
self.assertIn("Copy them from your old card or a folder (--from)", out)
|
||||
|
||||
def test_the_screen_says_missing_not_failed(self):
|
||||
"""P3-2 on the full screen: "Finished with errors, 20 failed"."""
|
||||
"""On the full screen: "Finished with errors, 20 failed"."""
|
||||
import test_install_tui as tui
|
||||
|
||||
reason = f"not fetched: {install.OFFLINE_WORDS}"
|
||||
@@ -928,7 +927,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
self.assertEqual(install.tui_outcome(state)[0], "Nothing installed")
|
||||
|
||||
def test_the_line_menu_copies_from_a_folder(self):
|
||||
"""tui_audit_7 P3-4: no way to a folder, and an install of nothing
|
||||
"""No way to a folder, and an install of nothing
|
||||
offered."""
|
||||
old = self.old()
|
||||
install.LOCAL.reset()
|
||||
@@ -947,7 +946,7 @@ class OneOfflineVocabulary(Scratch):
|
||||
|
||||
|
||||
class AuditFifteenOffline(Scratch):
|
||||
"""code_audit_15 P3-1, P3-5 and tui_audit_8 P3-11: what --offline and a
|
||||
"""What --offline and a
|
||||
pack leave out, and what a folder copied from holds, said as such."""
|
||||
|
||||
def test_yes_offline_counts_the_rest_missing_never_failed(self):
|
||||
|
||||
@@ -390,7 +390,7 @@ class DecliningTheSizePointsAtTheChoice(unittest.TestCase):
|
||||
self.assertNotIn("see --help", out)
|
||||
|
||||
def test_options_given_keep_the_option_advice(self):
|
||||
# The menu is shown with --system too (tui_audit_9 P3-8): Enter keeps it.
|
||||
# The menu is shown with --system too: Enter keeps it.
|
||||
out = self._run(["", "n"], "--system", "sony-playstation")
|
||||
self.assertIn("--system, --core and --region install less", out)
|
||||
|
||||
@@ -677,7 +677,7 @@ class TheOneLinerNarrows(unittest.TestCase):
|
||||
@unittest.skipUnless(shutil.which("script"), "script(1) provides the terminal")
|
||||
def test_the_custom_mode_at_a_terminal(self):
|
||||
"""Typed answers: customise, PlayStation only, US first. Its one
|
||||
core is not asked about (tui_audit_11 P3-10)."""
|
||||
core is not asked about."""
|
||||
with FakeRepository() as repo:
|
||||
command = " ".join(shlex.quote(part) for part in repo.command())
|
||||
proc = subprocess.run(
|
||||
@@ -724,7 +724,7 @@ class TheOneLinerNarrows(unittest.TestCase):
|
||||
def test_q_at_every_menu_stops_on_the_quit_code(self):
|
||||
"""`install.sh && retroarch` started RetroArch after a q, which left
|
||||
with 0. A quit chosen ends on 2, nothing installed, where Ctrl+C and
|
||||
Ctrl+D leave with 130 (code_audit_19 P3-1)."""
|
||||
Ctrl+D leave with 130."""
|
||||
files = [{"dest": "a.bin", "size": 1, "systems": ["nintendo-gba"]}]
|
||||
menus = (
|
||||
lambda: install._choose_platform("Platform:"),
|
||||
@@ -1632,7 +1632,7 @@ class SomethingElseAtADestination(unittest.TestCase):
|
||||
proc = repo.run("--yes")
|
||||
self.assertEqual(proc.returncode, 1, proc.stderr)
|
||||
self.assertNotIn("Traceback", proc.stderr)
|
||||
# Each failure named once, on its FAILED line (tui_audit_17 P3-7).
|
||||
# Each failure named once, on its FAILED line.
|
||||
self.assertIn("FAILED scph5500.bin (a folder sits where this file goes",
|
||||
proc.stdout)
|
||||
self.assertIn("FAILED scph5501.bin (file in place could not be kept aside",
|
||||
|
||||
+461
-511
File diff suppressed because it is too large.
Load diff
@@ -237,6 +237,31 @@ class NoToolingNames(unittest.TestCase):
|
||||
self.assertEqual(offenders, [], "\n".join(offenders[:20]))
|
||||
|
||||
|
||||
class NoReviewTags(unittest.TestCase):
|
||||
"""A comment cites what the code does, never the private review that
|
||||
asked for it. About 650 comments and test texts ended on a tag such as
|
||||
"(tui review 13, P3-8)" written in its short form, which points at notes
|
||||
no clone holds. The pattern is assembled so this file does not match."""
|
||||
|
||||
TAG = re.compile(r"[a-z]+_" + "aud" + r"it_\d+|\(rounds? \d")
|
||||
|
||||
def test_the_pattern_matches_the_short_forms(self):
|
||||
for text in ("tui_" + "aud" + "it_13 P3-8", "(" + "round 5, 6.3)",
|
||||
"code_" + "aud" + "it_24"):
|
||||
with self.subTest(text=text):
|
||||
self.assertRegex(text, self.TAG)
|
||||
self.assertNotRegex("test_" + "aud" + "it_regressions", self.TAG)
|
||||
|
||||
def test_no_tracked_file_carries_one(self):
|
||||
offenders = []
|
||||
for path in _tracked():
|
||||
text = path.read_text(encoding="utf-8", errors="replace")
|
||||
for number, line in enumerate(text.splitlines(), 1):
|
||||
if self.TAG.search(line):
|
||||
offenders.append(f"{path.relative_to(ROOT)}:{number}")
|
||||
self.assertEqual(offenders, [], "\n".join(offenders[:20]))
|
||||
|
||||
|
||||
class ProfilesStateFactsAboutOtherProjects(unittest.TestCase):
|
||||
"""A profile says what another project's file declares and what the code
|
||||
does, never a verdict on that file. Ten notes and comments in ten profiles
|
||||
|
||||
@@ -57,8 +57,7 @@ class ServedCopies(unittest.TestCase):
|
||||
served = sitebootstrap.served_text(name, REPO_ROOT, self.commit).splitlines()
|
||||
self.assertEqual(len(original), len(served))
|
||||
changed = [(a, b) for a, b in zip(original, served) if a != b]
|
||||
# The address, and the advice a refusal gives (code_audit_21
|
||||
# P3-1).
|
||||
# The address, and the advice a refusal gives.
|
||||
self.assertEqual(len(changed), 2, changed)
|
||||
advice = [pair for pair in changed if sitebootstrap.SERVED_ADVICE in pair[1]]
|
||||
self.assertEqual(len(advice), 1, changed)
|
||||
@@ -99,7 +98,7 @@ class ServedCopies(unittest.TestCase):
|
||||
sitebootstrap.served_text(path.name, REPO_ROOT, self.commit))
|
||||
|
||||
def test_the_served_copy_never_blames_a_cut_download_or_caches(self):
|
||||
"""code_audit_21 P3-1: the commit-pinned copy said "cut short, try
|
||||
"""The commit-pinned copy said "cut short, try
|
||||
again" and "waiting five minutes settles that", neither of which can
|
||||
happen to it."""
|
||||
for name in sitebootstrap.SOURCES:
|
||||
@@ -116,7 +115,7 @@ class ServedCopies(unittest.TestCase):
|
||||
self.assertIn("something changed the file", answer)
|
||||
|
||||
def test_a_stale_pin_stops_the_build(self):
|
||||
"""code_audit_21 P3-2: a pin that is not the installer's was served,
|
||||
"""A pin that is not the installer's was served,
|
||||
and refused every install until the next good deploy."""
|
||||
with tempfile.TemporaryDirectory(dir=REPO_ROOT / "tmp" if (REPO_ROOT / "tmp").is_dir()
|
||||
else None) as scratch:
|
||||
|
||||
@@ -365,7 +365,7 @@ class AVariantShowsWhoPinsIt(unittest.TestCase):
|
||||
platforms={"c" * 40: {"batocera", "retrobat"}}, emulators={"a" * 40: {"mame"}})
|
||||
page = generate_site.generate_system_page(
|
||||
"Entex", {"Adventure Vision": [primary, variant]}, consumers)
|
||||
# Another revision of a set sits open beside it (round 5, 6.3).
|
||||
# Another revision of a set sits open beside it.
|
||||
block = page[page.index('id="sha1-' + "c" * 12 + '"'):]
|
||||
self.assertIn("<dt>Collection path</dt><dd><code>bios/Entex/Adventure Vision/"
|
||||
".variants/advision.zip.1c086064</code>", block)
|
||||
|
||||
@@ -203,11 +203,11 @@ class DeepLinksCarryALabel(unittest.TestCase):
|
||||
|
||||
A link right after the question it answers ("Have a file? [Check it]")
|
||||
says it too: there a label read as a broken crumb beside the Reference
|
||||
tab (round 4)."""
|
||||
tab."""
|
||||
|
||||
# Answers a start page sends its reader to on purpose: the arcade
|
||||
# version table opens on one plain sentence, and "Reference:" before
|
||||
# its link read as a broken crumb (round 4, C4 and C9).
|
||||
# its link read as a broken crumb.
|
||||
ANSWERS = ("/retrobios/wiki/technical-faq/#which-mame-version-do-the-arcade-bios-sets-match",)
|
||||
|
||||
def test_start_and_setup_pages(self):
|
||||
|
||||
@@ -86,7 +86,7 @@ class TablesStackWhenBuilt(unittest.TestCase):
|
||||
"short-start": {"labels": ["System", "Runs", "BIOS folder"], "rows": 8, "action": False, "level": "start"},
|
||||
"long-setup": {"labels": ["System", "Files", "Status"], "rows": 97, "action": False, "level": "setup"},
|
||||
"reference": {"labels": ["A", "B", "C"], "rows": 5, "action": False, "level": "reference"},
|
||||
# Four columns do not fit a phone column, on any page (round 3).
|
||||
# Four columns do not fit a phone column, on any page.
|
||||
"wide": {"labels": ["File", "Region", "Required", "Hash"], "rows": 105, "action": False, "level": "reference"},
|
||||
# A hash never breaks: three columns with one overflow a phone (NetherSX2).
|
||||
"hashes": {"labels": ["File", "Required", "Hash"], "rows": 40, "action": False, "level": "reference"},
|
||||
@@ -172,7 +172,7 @@ def _title_block(html: str) -> str:
|
||||
|
||||
class LevelBadgeOnlyWhereItAddsSomething(unittest.TestCase):
|
||||
def test_badge_follows_the_crumb(self):
|
||||
# A tab root: the header tab already says it (round 3, 2.1).
|
||||
# A tab root: the header tab already says it.
|
||||
self.assertNotIn('class="rb-level ', _title_block(_built("platforms")))
|
||||
# Under the "Start here" or "Your setup" crumb the badge repeated it.
|
||||
for page in ("which-pack", "platforms/batocera"):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Emulator pages say what is needed first, in names (round 2, package 7).
|
||||
"""Emulator pages say what is needed first, in names.
|
||||
|
||||
DuckStation's page opened on "It reads 105 files, 3 of them required" and
|
||||
read as "get all three", its three BIOS were cards 12 to 14 under one
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Entry pages and guides (round 2, package 4).
|
||||
"""Entry pages and guides.
|
||||
|
||||
The home page said the command "writes only in your BIOS folder" while
|
||||
install.py writes the entries a manifest files under `root: save` into the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Navigation (round 2, package 3).
|
||||
"""Navigation.
|
||||
|
||||
The 404 page's sidebar read "0 1 2 3 4". A sidebar group label was a link
|
||||
to its first page ("Handhelds and TV boxes" opened AmberELEC), and a crumb
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""One display name per system id (round 2, package P0).
|
||||
"""One display name per system id.
|
||||
|
||||
An emulator page listed the folders a system's files were voted onto:
|
||||
nintendo-gba read "Nintendo Game Boy", camplynx "Arcade", and MAME
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Reference pages (round 2, package 8).
|
||||
"""Reference pages.
|
||||
|
||||
A reference page cites a hash, a source line or a count, and each citation
|
||||
has to hold when an expert checks it: the reader of a pinned dump is the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""System pages and file cards (round 2, package 6).
|
||||
"""System pages and file cards.
|
||||
|
||||
The Sony page opened on LibPS.exe, its card titles read "scph5501.bin
|
||||
permalink" in the site search, the two setup lines of a card were defined
|
||||
@@ -115,7 +115,7 @@ class TheConsoleBiosComesFirst(unittest.TestCase):
|
||||
def test_a_long_list_names_the_first_and_counts_the_rest(self):
|
||||
files = [_file(f"rom{i}.bin", "abcdefgh"[i]) for i in range(8)]
|
||||
# One emulator requires all eight: files each required by another
|
||||
# emulator are other names for one slot (round 5, 6.2).
|
||||
# emulator are other names for one slot.
|
||||
consumers = _consumers({f["sha1"]: [{"required": True}] for f in files})
|
||||
consumers.emulator_files = {"emu": [{"required": True}] * len(files)}
|
||||
consumers.emulator_entries = {f["sha1"]: {"emu": i} for i, f in enumerate(files)}
|
||||
@@ -172,7 +172,7 @@ class TheCardLinesSayWhatTheyMean(unittest.TestCase):
|
||||
|
||||
def test_labels_and_display_names(self):
|
||||
text = "\n".join(self.lines)
|
||||
# Grouped by where the setups put the file (round 4, 6.9).
|
||||
# Grouped by where the setups put the file.
|
||||
self.assertIn("<dt>On the setup's list</dt><dd><code>scph5501.bin</code>: <a href=\"../"
|
||||
"platforms/batocera.md#sony-playstation\">Batocera</a></dd>", text)
|
||||
self.assertIn("<dt>Packed for its emulators by</dt><dd><code>bios/scph5501.bin</code>: "
|
||||
@@ -182,7 +182,7 @@ class TheCardLinesSayWhatTheyMean(unittest.TestCase):
|
||||
|
||||
def test_the_facts_are_out_of_the_search(self):
|
||||
# The setup list made every card's excerpt a run of names and
|
||||
# paths (round 4, V6): the card's title is what the search reads.
|
||||
# paths: the card's title is what the search reads.
|
||||
# The facts shown open are one list, the others one fold, both
|
||||
# out of the search.
|
||||
shown = self.lines[:next(i for i, line in enumerate(self.lines) if line.startswith("<details"))]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Wiki copy and the diagrams module (round 2, package 5).
|
||||
"""Wiki copy and the diagrams module.
|
||||
|
||||
Each class names the finding it holds: a safety line the code contradicted,
|
||||
install commands with no Windows form, a run's end described wrongly, pages
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Emulator pages say what to get, and fit (round 3, package 7).
|
||||
"""Emulator pages say what to get, and fit.
|
||||
|
||||
NetherSX2 counted three interface fonts its app ships among "4 required"
|
||||
files and opened its file list on the project's counts. AetherSX2's summary
|
||||
@@ -91,7 +91,7 @@ class WhatTheAppShipsIsNoFileToGet(unittest.TestCase):
|
||||
summary = self.page[self.page.index("## Files"):]
|
||||
self.assertIn(f"{shipped} more files come with the app.", summary)
|
||||
self.assertIn(": 1 required,", summary)
|
||||
# Found by content: one BIOS of any name, said as steps (round 4).
|
||||
# Found by content: one BIOS of any name, said as steps.
|
||||
self.assertIn("NetherSX2 needs one Sony PlayStation 2 BIOS file, any region.", self.page)
|
||||
|
||||
def test_their_own_section_after_the_others(self):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Entry pages and guides (round 3, package 4).
|
||||
"""Entry pages and guides.
|
||||
|
||||
A handheld owner found no tile for Android, ArkOS, muOS, Onion or spruceOS:
|
||||
the systems sat in a closed note with a path seen from inside the device.
|
||||
@@ -161,7 +161,7 @@ class SetupPagesOfferPartOfThePack(unittest.TestCase):
|
||||
# The screen's own row: the line menu's c is not what the
|
||||
# one-liner opens.
|
||||
self.assertIn("or the command's **Choose systems**.", text)
|
||||
# Never "choose **Choose systems**" (tui_audit_17 P3-9).
|
||||
# Never "choose **Choose systems**".
|
||||
self.assertNotIn("choose **Choose systems**", text)
|
||||
|
||||
def test_the_anchor_exists(self):
|
||||
@@ -271,7 +271,7 @@ class HomeCopy(unittest.TestCase):
|
||||
self.assertIn("- **Yes** for PlayStation 1 and 2, Saturn and Neo Geo.", home)
|
||||
self.assertIn("- **Better with it** for Dreamcast: some games need it.", home)
|
||||
# A question and the link that answers it: no level label, which
|
||||
# read as a broken crumb beside the Reference tab (round 4).
|
||||
# read as a broken crumb beside the Reference tab.
|
||||
self.assertNotIn("Reference:", home.split("\n---\n", 1)[-1])
|
||||
self.assertIn("- Have a file? [Check it]", home)
|
||||
self.assertIn("BIOS missing, even with the file there?", home)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Navigation and search (round 3, package 3).
|
||||
"""Navigation and search.
|
||||
|
||||
"playstation bios" found five setups' lists for the console before its own
|
||||
page: the pages a setup's list moves a console to weighed 1.5, three times a
|
||||
@@ -65,7 +65,7 @@ class MetaFields(unittest.TestCase):
|
||||
body = ('<h3 class="rb-file-title"><code>scph5501.bin</code></h3>'
|
||||
'<h3 class="rb-file-title"><code>a,b.bin</code></h3>')
|
||||
meta = sitestarlight.file_names_meta(body)
|
||||
# Each name as its parts, each part once (round 5, 3.2).
|
||||
# Each name as its parts, each part once.
|
||||
self.assertIn('data-pagefind-meta="files:a b bin scph5501"', meta)
|
||||
self.assertRegex(meta, r"<span [^>]*hidden></span>")
|
||||
|
||||
@@ -94,7 +94,7 @@ class MetaFields(unittest.TestCase):
|
||||
|
||||
class SystemPartsSitUnderTheirMaker(unittest.TestCase):
|
||||
"""The crumbs say where a system part sits, read from its parent: field.
|
||||
The "Part of" line under them said it again (round 5, 6.9)."""
|
||||
The "Part of" line under them said it again."""
|
||||
|
||||
def test_every_part_names_its_maker_as_parent(self) -> None:
|
||||
pages = sorted((DOCS / "systems").glob("*.md"))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Every system id with a section leads to it (rounds 3 and 4, package P0).
|
||||
"""Every system id with a section leads to it.
|
||||
|
||||
260 of 636 system ids linked: a variant (WonderSwan Color, Neo Geo MVS)
|
||||
never matched a heading, twin folders (DS and Nintendo DS) made the exact
|
||||
@@ -112,7 +112,7 @@ class SystemLinks(unittest.TestCase):
|
||||
siterender.set_console_sections(
|
||||
cls.manufacturers, siterender.program_names(profiles))
|
||||
# The system pages give every arcade board a section of its own
|
||||
# (round 4, 6.4) and record it. The built pages are checked by
|
||||
# and record it. The built pages are checked by
|
||||
# the round 4 gate.
|
||||
siterender.reset_console_pages()
|
||||
# The sections as the system pages hold them: each board, the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Reference pages and data (round 3, package 8).
|
||||
"""Reference pages and data.
|
||||
|
||||
The CSV and SQLite dropped zipped_file, so a check built from them judged
|
||||
106 good Batocera files wrong. The manifest a pack installs was nowhere on
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""System pages and file cards (round 3, package 6).
|
||||
"""System pages and file cards.
|
||||
|
||||
The DS section opened on five DSi files, the Game Boy Advance line printed
|
||||
BizHawk's file name where eight setups write another, the Neo Geo section
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Wiki copy (round 3, package 5).
|
||||
"""Wiki copy.
|
||||
|
||||
Each class names the finding it holds: a legal page that opened on case law,
|
||||
no arcade answer where players look, a Dreamcast "yes" the Dreamcast
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Entry pages and guides (round 4, package 4).
|
||||
"""Entry pages and guides.
|
||||
|
||||
Six handheld setups have no ZIP, and three of them offered SSH as root as
|
||||
the only route while their page already named a network folder. Six rows
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Arcade boards and the ids that hold files (round 4, package P0).
|
||||
"""Arcade boards and the ids that hold files.
|
||||
|
||||
The Arcade pages were cut by storage folder, so NAOMI, ZN-1, PGM and the
|
||||
other boards had no section and stayed plain on 987 emulator rows.
|
||||
@@ -139,7 +139,7 @@ class Boards(unittest.TestCase):
|
||||
self.assertTrue(slug)
|
||||
self.assertEqual(slug, toc_slug(name))
|
||||
# The board's page is its section: no heading repeats its
|
||||
# title (round 5, 6.8).
|
||||
# title.
|
||||
self.assertEqual(
|
||||
siterender.console_href(*siterender.system_section(board)),
|
||||
f"systems/arcade-{slug}.md")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Reference pages and data (round 4, package 8).
|
||||
"""Reference pages and data.
|
||||
|
||||
The lookup answered a SHA1 without the setups that list the same file by
|
||||
MD5, the published folder check failed 134 EmuDeck entries a folder EmuDeck
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Search (round 4, package 3).
|
||||
"""Search.
|
||||
|
||||
The search gate listed the queries that missed and no workflow ran it: its
|
||||
browser runner could not even start from the repository root. Console and
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""System pages and file cards (round 4, package 6).
|
||||
"""System pages and file cards.
|
||||
|
||||
The Game Boy, NES and SNES sections said "Start with" a file one core of
|
||||
sixteen requires, under a home page saying they need none. The romset line
|
||||
@@ -167,7 +167,7 @@ class EachArcadeBoardHasASection(unittest.TestCase):
|
||||
"""6.4: the Arcade page was cut by storage folder."""
|
||||
|
||||
def test_each_board_heads_its_page(self) -> None:
|
||||
# The page's title names the board, no h2 says it again (round 5, 6.8).
|
||||
# The page's title names the board, no h2 says it again.
|
||||
for name in BOARDS:
|
||||
slug = toc_slug(name)
|
||||
html = _page(DIST / "systems" / f"arcade-{slug}" / "index.html")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Wiki and release docs (round 4, package 5).
|
||||
"""Wiki and release docs.
|
||||
|
||||
Each class names the finding it holds: an error message a reader types
|
||||
into search and no page that says it, an arcade answer written for
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Emulator pages (round 5, package 7).
|
||||
"""Emulator pages.
|
||||
|
||||
61 profiles cite the folder their app reads its data from (data_root) and
|
||||
no page printed it: AetherSX2's step said "inside the app's own data
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Entry pages, get/ and guides (round 5, package 4).
|
||||
"""Entry pages, get/ and guides.
|
||||
|
||||
The get/ page of a setup with no ZIP printed one command for three
|
||||
systems, with no --dest, so it failed on the computer most readers open
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Reference pages and data (round 5, package 8).
|
||||
"""Reference pages and data.
|
||||
|
||||
The API said Lakka and RetroPie had a release pack while their pages said
|
||||
none, 50 nested manifest fields and the nine omission codes had no
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""System pages and boards (round 5, package 6).
|
||||
"""System pages and boards.
|
||||
|
||||
NAOMI opened on hod2bios.zip, a set 13 of the 19 emulators listing it read
|
||||
for one game. Lines read other names for one file as files to get: "Start
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Wiki (round 5, package 5).
|
||||
"""Wiki.
|
||||
|
||||
Each class names the finding it holds: a "no setup" command that sent
|
||||
macOS and Steam Deck files where RetroArch never reads, a level 0 rule that
|
||||
|
||||
@@ -365,7 +365,7 @@ class TheSearchSkipsLinkLists(unittest.TestCase):
|
||||
for label in ("MD5", "Emulators", "Packed for its emulators by", "On the setup's list"):
|
||||
self.assertIn(f"<dt>{label}</dt>", skipped)
|
||||
self.assertNotIn(f">{label}</dt>", searched)
|
||||
# The card's title is what the search reads (round 4, V6): the setup
|
||||
# The card's title is what the search reads: the setup
|
||||
# list made every excerpt a run of names and paths.
|
||||
self.assertNotIn('<dl class="rb-facts">', searched)
|
||||
|
||||
|
||||
Reference in new issue
Block a user