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)
This commit is contained in:
1 parent
a15c912ad0
commit
4fa9a6ab81
13 files changed
+552
-31
No files matched your search
@@ -271,3 +271,13 @@ class OptionsAndFlags(unittest.TestCase):
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
|
||||
class ShaderLoaded(unittest.TestCase):
|
||||
def test_flags(self):
|
||||
ok = ["[Render thread/INFO] [Iris/]: Using shaderpack: MakeUp-UltraFast-9.5f.zip"]
|
||||
bad = ok + ["[Render thread/ERROR] [Iris/]: Failed to compile shaders"]
|
||||
self.assertEqual(bench.shader_flags("off", []), [])
|
||||
self.assertEqual(bench.shader_flags("X.zip", ok), [])
|
||||
self.assertEqual(bench.shader_flags("X.zip", []), ["shader_not_loaded"])
|
||||
self.assertEqual(bench.shader_flags("X.zip", bad), ["shader_not_loaded"])
|
||||
@@ -238,7 +238,69 @@ class Commands(Fixture):
|
||||
|
||||
def test_seconds(self):
|
||||
b3 = matrix.expand(self.m, matrix.block_map(self.m)["B3"])
|
||||
self.assertEqual(matrix.session_seconds(b3[0], 60), 60 + 3 * 45 + 3 * 130)
|
||||
self.assertEqual(matrix.session_seconds(b3[0], 60), 60 + 10 + 3 * 45 + 3 * 130)
|
||||
|
||||
|
||||
class ShaderOptions(Fixture):
|
||||
def b7(self, **extra):
|
||||
d = tomllib.loads(MINI.format(tmp=self.tmp))
|
||||
sess = {"variant": "C1", "plan": "s1,s4", "shader": "Pack.zip",
|
||||
"shader_profile": "low", "tag": "p-low", **extra}
|
||||
d["block"].append({"id": "B7", "rule": "shaders", "sessions": [sess]})
|
||||
return d
|
||||
|
||||
def test_emitted(self):
|
||||
f = self.tmp / "Pack.low.txt"
|
||||
f.write_text("A=1\n")
|
||||
d = self.b7(shader_options=str(f))
|
||||
self.assertEqual(matrix.validate(d, self.out), [])
|
||||
s = matrix.expand(d, matrix.block_map(d)["B7"])[0]
|
||||
argv, miss = matrix.bench_argv(d, s)
|
||||
self.assertEqual(miss, [])
|
||||
self.assertEqual(argv[argv.index("--shader") + 1], "Pack.zip")
|
||||
self.assertEqual(argv[argv.index("--shader-options") + 1], str(f))
|
||||
self.assertIn("--shader-options", matrix.BENCH_SESSION_FLAGS)
|
||||
|
||||
def test_missing_file_and_relative_path(self):
|
||||
d = self.b7(shader_options="shader-profiles/does-not-exist.txt")
|
||||
s = matrix.expand(d, matrix.block_map(d)["B7"])[0]
|
||||
argv, miss = matrix.bench_argv(d, s)
|
||||
self.assertEqual(argv[argv.index("--shader-options") + 1],
|
||||
str(matrix.HERE / "shader-profiles/does-not-exist.txt"))
|
||||
self.assertTrue(any("shader options" in x for x in miss))
|
||||
|
||||
def test_needs_shader(self):
|
||||
d = self.b7(shader_options="x.txt", shader="off")
|
||||
self.assertIn("shader_options needs shader", "\n".join(matrix.validate(d, self.out)))
|
||||
|
||||
def test_spec_hash_tracks_file_content(self):
|
||||
f = self.tmp / "Pack.low.txt"
|
||||
f.write_text("A=1\n")
|
||||
d = self.b7(shader_options=str(f))
|
||||
s = matrix.expand(d, matrix.block_map(d)["B7"])[0]
|
||||
argv, _ = matrix.bench_argv(d, s)
|
||||
h1 = matrix.spec_hash(argv, s)
|
||||
f.write_text("A=2\n")
|
||||
self.assertNotEqual(h1, matrix.spec_hash(argv, s))
|
||||
# sessions without shader_options keep the original hash formula (resume state)
|
||||
b0 = matrix.expand(self.m, matrix.block_map(self.m)["B0"])[0]
|
||||
a0, _ = matrix.bench_argv(self.m, b0)
|
||||
blob = json.dumps({"argv": a0, "manual": False}, sort_keys=True)
|
||||
import hashlib
|
||||
self.assertEqual(matrix.spec_hash(a0, b0),
|
||||
hashlib.sha256(blob.encode()).hexdigest()[:16])
|
||||
|
||||
def test_real_b7_automated(self):
|
||||
m = matrix.load()
|
||||
rows = matrix.expand(m, matrix.block_map(m)["B7"])
|
||||
shaded = [s for s in rows if s["shader"] != "off"]
|
||||
self.assertEqual(len(shaded), 4)
|
||||
for s in rows:
|
||||
self.assertFalse(s.get("manual"), s["label"])
|
||||
for s in shaded:
|
||||
argv, miss = matrix.bench_argv(m, s)
|
||||
self.assertEqual([x for x in miss if "shader options" in x], [], s["label"])
|
||||
self.assertTrue(Path(argv[argv.index("--shader-options") + 1]).is_file())
|
||||
|
||||
|
||||
class Resume(Fixture):
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
"""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()
|
||||
Reference in new issue
Block a user