All docs
Engine Docs Synced doc Engine source of truth

Testing Splitframe

Boundary checks, import smoke coverage, and standalone engine verification.

Generated from slicecore/splitframe View source doc

Note: This page is generated from the slicecore/splitframe engine repository. Edit the source document there and let automation sync it into splitframe-io.

Unit Tests

pytest -q -n auto

-n auto (pytest-xdist) runs the suite on all cores and cuts the full-suite wall time by more than half. Drop it (plain pytest -q tests/test_foo.py) when debugging a single file — worker startup costs about a second, and -s/--pdb only work without xdist.

The unit test suite now includes:

  • runtime profile policy coverage
  • cooked-content bundle loading and hash validation
  • cook-pipeline deterministic no-op and dependency-rebuild coverage
  • headless cooked gameplay-content integration coverage across strings, themes, biome metadata, and particle presets
  • script plugin lifecycle and failure propagation
  • headless engine startup, scene lifecycle, resize, and quit integration
  • native tooling smoke and artifact-manifest coverage
  • bounded real renderer validation JSON/Markdown/PNG review artifact coverage in CI
  • engine-owned native startup-manifest coverage
  • engine-owned native startup override precedence coverage
  • headless examples/simple_game scene-flow coverage on a cook-pipeline-generated runtime manifest

Content Validation

python -m splitframe.content.validation --root data --strict

Native Smoke

python -m scripts.native.native_backend_smoke --allow-missing-extension --json

The supported host-path proof is the GameEngine lane:

python -m scripts.native.native_game_engine_runtime_smoke --allow-missing-extension --json
python -m scripts.native.native_simple_game_smoke --allow-missing-extension --json

Lower-level native facade and backend-selection smokes remain important, but they are contract coverage underneath the preferred GameEngine startup flow.

To validate a compiled native module instead of only the facade contract, use two distinct build lanes rather than treating every compiled module as equivalent.

Low-level facade/runtime contract lane:

cmake -S native -B native/build-ci-smoke-lowlevel \
  -DCMAKE_BUILD_TYPE=Release \
  -DSPLITFRAME_NATIVE_ENABLE_IMGUI=OFF \
  -DSPLITFRAME_NATIVE_USE_GLFW=OFF \
  -DSPLITFRAME_NATIVE_USE_VULKAN_BOOTSTRAP=OFF
cmake --build native/build-ci-smoke-lowlevel --config Release -j2
python -m scripts.native.native_backend_smoke --module-dir native/build-ci-smoke-lowlevel --json
python -m scripts.native.native_renderer_runtime_smoke --module-dir native/build-ci-smoke-lowlevel --json
python -m scripts.native.native_runtime_env_smoke --module-dir native/build-ci-smoke-lowlevel --json
python -m scripts.native.native_feature_tier_smoke --module-dir native/build-ci-smoke-lowlevel --json
python -m scripts.native.native_renderer_config_smoke --module-dir native/build-ci-smoke-lowlevel --json
python -m scripts.native.native_renderer_submission_smoke --module-dir native/build-ci-smoke-lowlevel --json

Host-path GameEngine / RenderContext lane:

cmake -S native -B native/build-ci-smoke-host \
  -DCMAKE_BUILD_TYPE=Release \
  -DSPLITFRAME_NATIVE_ENABLE_IMGUI=ON \
  -DSPLITFRAME_NATIVE_USE_GLFW=ON \
  -DSPLITFRAME_NATIVE_USE_VULKAN_BOOTSTRAP=ON
cmake --build native/build-ci-smoke-host --config Release -j2
python -m scripts.native.native_engine_bridge_smoke --module-dir native/build-ci-smoke-host --json
python -m scripts.native.native_game_engine_runtime_smoke --module-dir native/build-ci-smoke-host --json
python -m scripts.native.native_simple_game_smoke --module-dir native/build-ci-smoke-host --json

On headless Linux, wrap the host-path smoke commands with xvfb-run -a so the bootstrap-capable native frontend has a display server to bind against.

Boundary Audit

bash scripts/audit_splitframe_boundaries.sh .

Import Smoke

python -c "import splitframe, splitframe_api, splitframe_native_renderer"