Testing Guide
This guide covers the testing strategy for dart_monty, which ensures
consistent behavior across both native (FFI) and web (WASM) platforms.
Running Tests
The simplest way to run all tests is to use the standard Dart test runner.
VM Tests
These are fast unit tests that run in the Dart VM. They cover core logic, the bridge, extensions, and any components that can be tested with mocks.
# Run all VM-based unit and integration tests
dart test
Browser Tests
To validate the WASM backend, run the tests on the chrome platform. This
will automatically build and serve the necessary files to run in headless Chrome.
# Run all tests, including browser-based WASM tests
dart test -p chrome
Test Categories
- Build WASM:
cd native && cargo build --release --target wasm32-wasip1 - Compile Runner:
dart compile js test/wasm/integration/python_ladder_runner.dart -o test/wasm/integration/web/ladder_runner.dart.js - Copy Assets: Copy
dart_monty_core_bridge.js,dart_monty_core_worker.js, and.wasmfiles to the integration web directory. -
Serve: Use a server that provides COOP/COEP headers (required for
SharedArrayBuffer). -
Unit Tests (
/test): Fast, focused tests that use mocks to isolate components. - Integration Tests (
/test/integration): Tests that use the real native library (.dylib/.so) or WASM module to verify end-to-end behavior for a specific platform. - Python Ladder Fixtures (
/test/fixtures): A shared suite of JSON-based test cases that define expected Python behavior. These are the foundation of our cross-platform parity strategy.
Cross-Platform Parity: Oracle-Based Testing
Both the native FFI and web WASM paths are verified to produce identical
results via JSON test fixtures in test/fixtures/python_ladder/. The
tool/test_cross_path_parity.sh script runs both runners and diffs their
output.
To guarantee that dart_monty behaves identically to the upstream reference implementation, we use an oracle-based testing model.
- The Oracle: The
pydantic/montyPython library serves as the ground-truth "oracle." - Fixture Generation: A script (
tool/generate_ladder_fixtures.py) runs a comprehensive suite of Python snippets (the "Python Ladder") against thepydantic/montyoracle. It records the precise outputs (values, stdout, errors) as JSON files. - Validation: These JSON files become our test fixtures. The
dart_monty_coretest suite executes the same Python snippets on both the FFI and WASM backends. - Assertion: The tests pass only if the output from our implementations exactly matches the pre-recorded results from the oracle.
This rigorous process ensures that dart_monty is a faithful and reliable implementation of the pydantic/monty behavior on every platform.
Running dart test -p chrome executes this entire validation suite automatically.
Manual Browser Testing
To test in a real browser, use the Python-based COOP/COEP server:
# Start the COOP/COEP server
python3 -c "
import http.server, functools
class H(http.server.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header('Cross-Origin-Opener-Policy', 'same-origin')
self.send_header('Cross-Origin-Embedder-Policy', 'require-corp')
super().end_headers()
handler = functools.partial(H, directory='web')
http.server.HTTPServer(('127.0.0.1', 8099), handler).serve_forever()
"