Files
EVEngine/scripts/tests/test_zeroerr_discovery.py

116 lines
5.3 KiB
Python

"""Exercise the real CMake discovery script with portable runner fixtures."""
from pathlib import Path
import shlex
import shutil
import subprocess
import sys
import tempfile
import unittest
ROOT = Path(__file__).resolve().parents[2]
DISCOVERY = ROOT / "cmake" / "ZeroErrDiscoverTestsImpl.cmake"
@unittest.skipUnless(shutil.which("cmake"), "CMake is required for discovery tests")
class ZeroerrDiscoveryTests(unittest.TestCase):
def discover(self, entries, listing_format):
with tempfile.TemporaryDirectory(prefix="eve discovery ") as directory:
root = Path(directory)
listing = root / "listing.py"
listing.write_text(
"import sys\n"
f"entries = {entries!r}\n"
"plain = '--list-format=plain' in sys.argv\n"
f"if plain and {listing_format!r} == 'legacy':\n"
" print('legacy runner: no plain listing available')\n"
"else:\n"
" for name, file, line in entries:\n"
" if plain:\n"
" print(f'{name}\\t{file}:{line}')\n"
" else:\n"
" print(f'TEST CASE [{file}:{line}] {name}')\n",
encoding="utf-8",
)
if sys.platform == "win32":
runner = root / "runner.cmd"
runner.write_text(
f'@echo off\n"{sys.executable}" "{listing}" %*\n',
encoding="utf-8",
)
else:
runner = root / "runner"
runner.write_text(
f"#!/bin/sh\nexec {shlex.quote(sys.executable)} "
f'{shlex.quote(str(listing))} "$@"\n',
encoding="utf-8",
)
runner.chmod(0o755)
registry = root / "discovered.cmake"
result = subprocess.run(
[
"cmake",
f"-DZEROERR_EXE={runner.as_posix()}",
f"-DCTEST_FILE={registry.as_posix()}",
f"-DZEROERR_WORKING_DIRECTORY={root.as_posix()}",
"-P",
str(DISCOVERY),
],
capture_output=True,
text=True,
check=False,
timeout=30,
)
generated = registry.read_text(encoding="utf-8") if registry.exists() else None
return result, generated
def test_unique_names_keep_exact_filters_and_opt_in_bundles(self):
entries = [("fluid.first", "fluid.cpp", 10), ("fluid.second", "fluid.cpp", 30),
("fixture.lifecycle", "lifecycle.cpp", 7)]
for listing_format in ("plain", "legacy"):
with self.subTest(listing_format=listing_format):
result, generated = self.discover(entries, listing_format)
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
self.assertEqual(generated.count("add_test("), 5)
for name, _, _ in entries:
self.assertEqual(generated.count(f'add_test("{name}"'), 1)
self.assertIn(f'"--testcase=^{name}$"', generated)
self.assertIn('LABELS "bundle"', generated)
def test_classic_assets_report_skips_and_full_fps_sweep_is_labeled(self):
entries = [("ClassicScenes.perf.maxFps", "ClassicScenes.cpp", 20),
("ClassicScenes.duck.flythroughConfigs", "ClassicScenes.cpp", 40),
("other.case", "other.cpp", 10),
("resourceFormats.image.png", "resource_format_image.cpp", 12)]
result, generated = self.discover(entries, "plain")
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
self.assertIn('"ClassicScenes.perf.maxFps" PROPERTIES LABELS "benchmark"', generated)
self.assertEqual(generated.count('SKIP_REGULAR_EXPRESSION'), 2)
self.assertEqual(generated.count('SKIP_REGULAR_EXPRESSION "ClassicScenes.*: missing"'), 2)
self.assertNotIn('"other.case" PROPERTIES SKIP', generated)
self.assertIn('"resourceFormats.image.png" PROPERTIES FAIL_REGULAR_EXPRESSION', generated)
def test_duplicate_names_report_both_sources_before_registration(self):
for listing_format in ("plain", "legacy"):
for other_file in ("fluid.cpp", "surface.cpp"):
with self.subTest(listing_format=listing_format, other_file=other_file):
result, generated = self.discover(
[("fixture.lifecycle", "fluid.cpp", 10),
("fixture.lifecycle", other_file, 42)], listing_format)
self.assertNotEqual(result.returncode, 0)
self.assertIn("duplicate zeroerr test name 'fixture.lifecycle'", result.stderr)
self.assertIn("fluid.cpp:10", result.stderr)
self.assertIn(f"{other_file}:42", result.stderr)
self.assertIsNone(generated)
def test_empty_listing_cannot_silently_register_zero_tests(self):
result, generated = self.discover([], "plain")
self.assertNotEqual(result.returncode, 0)
self.assertIn("no test cases discovered", result.stderr)
self.assertIsNone(generated)
if __name__ == "__main__":
unittest.main()