Initial commit

This commit is contained in:
2026-10-09 02:48:24 +02:00
commit e05d973a8d
133 changed files with 101507 additions and 0 deletions

77
tests/test_catalog.py Normal file
View File

@@ -0,0 +1,77 @@
"""Catalog: classification rules, naming, character labels, search; the shipped CSVs."""
import csv
import os
import pytest
from ackit import classify
from ackit.catalog import Catalog, read_csv, load_characters
from ackit.game import Game
from ackit.paths import catalog_dir
@pytest.mark.parametrize("name,group,category", [
("Speech_TAPE_JOKER_1_4", "Speech", "Interview tapes"),
("Speech_CINEMATIC_CH1_CATWOMAN_SAVED_9", "Speech", "Cinematics"),
("Speech_PRED_THUG1_FULL_Nervous_112", "Speech", "Predator chatter"),
("CHR_RadioScanner_12", "Speech", "Radio & TV"),
("AMB_Steel_B3", "Ambience", "Ambience"),
("Music_393BC53A", "Music", "Music"),
("6C151539_1", "Unknown", "Unknown"),
])
def test_classify(name, group, category):
assert classify.classify(name) == (group, category)
def test_pack_media_are_music():
assert classify.classify("003CB311", pack="Music") == ("Music", "Music")
assert classify.classify("X", pack="Music_PDLC")[1] == "Music (DLC)"
def test_infer_characters():
assert classify.infer_characters("Speech_TAPE_MADHATTER_5_10") == ["Hugo Strange", "Mad Hatter"]
assert "TYGER guard" in classify.infer_characters("Speech_PRED_TYGER2_Generic_7")
assert classify.infer_characters("Speech_COMBAT_BARKS_BANE_Hit_batman_3")[:2] == ["Bane", "Batman"]
def test_synthetic_catalog_names_and_search(synth_game):
root, _ = synth_game
cat = Catalog(Game(root), ["INT", "SFX"])
names = {s.name for s in cat.sounds}
assert {"CHR_RadioScanner_1", "CHR_RadioScanner_2", "CHR_RadioScanner_3", "Music_393BC53A"} <= names
s = cat.resolve("CHR_RadioScanner#2")
assert s.target.endswith(":1") and cat.resolve("chr_radioscanner_2.wav") is s
assert cat.resolve(s.key) is s
assert [x.name for x in cat.search("radio scanner 3")] == ["CHR_RadioScanner_3"]
with pytest.raises(LookupError) as e:
cat.resolve("CHR_RadioScaner_2")
assert "did you mean" in str(e.value)
def test_characters_csv_covers_user_lists():
chars = load_characters()
assert len(chars) > 3000
src = os.path.join(catalog_dir(), "source", "ita", "Joker.txt")
first = open(src).readline().strip()[:-4]
assert "Joker" in chars[first.lower()]
def test_shipped_csvs_are_consistent():
for f in os.listdir(catalog_dir()):
if f.endswith(".csv") and f != "characters.csv":
rows = read_csv(os.path.join(catalog_dir(), f))
keys = {r.key for r in rows}
assert len(keys) == len(rows), f
assert all(r.group in classify.GROUPS for r in rows)
assert all(len(r.sha1) == 16 for r in rows)
hdr = next(csv.reader(open(os.path.join(catalog_dir(), "ITA.csv"), encoding="utf-8")))
assert hdr[:3] == ["archive", "target", "name"]
@pytest.mark.game
def test_real_game_uses_shipped_catalog(real_game_dir):
g = Game(real_game_dir)
cat = Catalog(g, ["ITA", "SFX"])
assert len(cat.sounds) == 10816 + 651
s = cat.resolve("Speech_TAPE_JOKER_1_4")
assert s.category == "Interview tapes" and s.size == 44985