Files
logan 4fa9a6ab81 feat(bench): automate B7 shader profiles, wire B12b trials, settle 45s
- gen_shader_profiles.py + shader-profiles/: Iris per-pack option files
  resolved from each pack's profile.* lines (Iris has no profile key)
- bench.py: flag rows shader_not_loaded when Iris falls back to vanilla
  rendering (analyze.py treats it as invalid)
- matrix: shader_options session key, trial jar globs pinned to the
  downloaded Modrinth builds, post-join settle 45 s (B0 v1 showed rep 1
  still warming at 10 s)
2026-10-16 23:34:52 -04:00

101 lines
3.8 KiB
Python

"""Offline tests for gen_shader_profiles.py (synthetic packs; no game)."""
import contextlib
import io
import sys
import tempfile
import unittest
import zipfile
from pathlib import Path
HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE.parent))
import gen_shader_profiles as g # noqa: E402
PROPS = (
"# Profiles\r\n"
" profile.BASE = A=1 !B C D:4 \\\r\n"
" E=x\r\n"
"profile.LOW = profile.BASE A=2 !C\r\n"
"profile.TOP = profile.LOW B E=y\r\n"
"screen=<profile> A B\r\n"
"#if A == 1\r\n"
" program.world0/shadow.enabled=false\r\n"
"#endif\r\n"
)
class Parse(unittest.TestCase):
def test_tokens_and_continuation(self):
p = g.parse_profiles(PROPS)
self.assertEqual(sorted(p), ["BASE", "LOW", "TOP"])
self.assertEqual(p["BASE"], ["A=1", "!B", "C", "D:4", "E=x"])
def test_resolve_semantics(self):
p = g.parse_profiles(PROPS)
opts, prog = g.resolve("BASE", p)
self.assertEqual(opts, {"A": "1", "B": "false", "C": "true", "D": "4", "E": "x"})
self.assertEqual(prog, [])
opts, _ = g.resolve("TOP", p) # includes recurse; later tokens win
self.assertEqual(opts, {"D": "4", "A": "2", "C": "false", "B": "true", "E": "y"})
def test_errors(self):
p = {"X": ["profile.Y"], "Y": ["profile.X"]}
with self.assertRaisesRegex(g.ProfileError, "cycle"):
g.resolve("X", p)
with self.assertRaisesRegex(g.ProfileError, "unknown profile"):
g.resolve("NOPE", g.parse_profiles(PROPS))
with self.assertRaisesRegex(g.ProfileError, "conditional"):
g.parse_profiles("#ifdef MC_OS_MAC\nprofile.M = A=1\n#endif\n")
with self.assertRaisesRegex(g.ProfileError, "escaping"):
g.render({"A": "has space"})
def test_programs_collected(self):
_, prog = g.resolve("P", {"P": ["!program.world0/shadow", "A"]})
self.assertEqual(prog, ["world0/shadow"])
class Generate(unittest.TestCase):
def setUp(self):
self.tmp = Path(tempfile.mkdtemp())
self.zip = self.tmp / "Pack_1.0.zip"
with zipfile.ZipFile(self.zip, "w") as z:
z.writestr("shaders/shaders.properties", PROPS)
z.writestr("shaders/lib/settings.glsl",
"#define A 1 // [1 2]\n//#define B\n#define C\nconst int D = 4; // [4 8]\n")
def test_file_and_unknowns(self):
text, n, unknown = g.generate(self.zip, "LOW")
self.assertEqual(n, 5)
self.assertEqual(unknown, ["E"])
body = [ln for ln in text.splitlines() if not ln.startswith("#")]
self.assertEqual(body, ["B=false", "D=4", "E=x", "A=2", "C=false"])
self.assertIn("profile.LOW of Pack_1.0.zip", text)
self.assertEqual(g.out_name("Pack_1.0.zip", "LOW"), "Pack_1.0.LOW.txt")
def test_program_disabling_profile_rejected(self):
z2 = self.tmp / "P2.zip"
with zipfile.ZipFile(z2, "w") as z:
z.writestr("shaders/shaders.properties", "profile.X = !program.composite A\n")
with self.assertRaisesRegex(g.ProfileError, "disables programs"):
g.generate(z2, "X")
def test_cli_write_then_check(self):
out = self.tmp / "out"
args = ["--packs", str(self.tmp), "--out", str(out), "--target", "Pack_1.0.zip:TOP"]
with contextlib.redirect_stdout(io.StringIO()):
self.assertEqual(g.main(args), 0)
self.assertTrue((out / "Pack_1.0.TOP.txt").is_file())
self.assertEqual(g.main(args + ["--check"]), 0)
(out / "Pack_1.0.TOP.txt").write_text("stale\n")
self.assertEqual(g.main(args + ["--check"]), 1)
def test_matrix_targets(self):
t = g.matrix_targets()
self.assertIn(("MakeUp-UltraFast-9.5f.zip", "medium"), t)
self.assertIn(("ComplementaryReimagined_r5.9.3.zip", "LOW"), t)
if __name__ == "__main__":
unittest.main()