PlayMode and EditMode tests for the OneJS runtime. Run via Unity Test Runner (Window > General > Test Runner).
Tests/
├── OneJS.Tests.asmdef # PlayMode test assembly
├── QuickJSPlaymodeTests.cs # Core QuickJS functionality
├── QuickJSFastPathPlaymodeTests.cs
├── QuickJSZeroAllocTests.cs # Zero-allocation interop tests
├── QuickJSUIBridgePlaymodeTests.cs
├── UIToolkitJSPlaymodeTests.cs
├── QuickJSStabilityTests.cs
├── QuickJSNetworkTests.cs
├── QuickJSStorageTests.cs
├── QuickJSURLTests.cs
├── QuickJSBase64Tests.cs
├── QuickJSBootstrapScopeTests.cs # Global-scope contract: polyfill guards + IIFE non-leakage (WebGL host-page safety)
├── GPUBridgePlaymodeTests.cs
├── GPUBridgeJSPlaymodeTests.cs
├── ProcNoisePlaymodeTests.cs # Procedural noise tests
├── ProcTexturePlaymodeTests.cs # Procedural texture tests
├── JSRunnerPlaymodeTests.cs # JSRunner MonoBehaviour tests
├── JSPadPlaymodeTests.cs # JSPad MonoBehaviour tests
├── CartridgeUtilsPlaymodeTests.cs # Cartridge injection and platform defines
├── Editor/ # EditMode tests
│ ├── OneJS.Tests.Editor.asmdef
│ ├── JSRunnerBuildProcessorTests.cs
│ ├── CartridgeUtilsTests.cs
│ ├── PremadeCartridgeTests.cs # Validates the shipped Premade/ cartridge assets
│ └── BuildValidationTests.cs
├── BuildValidation/ # Standalone build testing
│ ├── BuildValidationRunner.cs
│ └── README.md
├── Fixtures/ # Test fixtures (no GUIDs!)
│ ├── README.md
│ └── Resources/
│ ├── SimpleScript.txt
│ ├── UICreation.txt
│ └── EventTest.txt
└── Resources/
└── TestShaders/
- Open Unity Test Runner:
Window > General > Test Runner - Select
PlayModeorEditModetab - Click
Run Allor select specific tests
| File | Type | Purpose |
|---|---|---|
QuickJSPlaymodeTests.cs |
PlayMode | Core eval, static calls, constructors, generics, async, array marshaling |
QuickJSFastPathPlaymodeTests.cs |
PlayMode | Zero-allocation property access, method calls |
QuickJSZeroAllocTests.cs |
PlayMode | Zero-allocation GPU bindings, property ID caching |
QuickJSUIBridgePlaymodeTests.cs |
PlayMode | Event delegation, scheduling, Promises |
UIToolkitJSPlaymodeTests.cs |
PlayMode | React component rendering |
QuickJSStabilityTests.cs |
PlayMode | Handle monitoring, task queue, exceptions |
JSRunnerPlaymodeTests.cs |
PlayMode | JSRunner scaffolding, init, reload, globals |
JSPadPlaymodeTests.cs |
PlayMode | JSPad temp dirs, build state, execution |
GPUBridgePlaymodeTests.cs |
PlayMode | GPU compute shaders, buffers, dispatch |
GPUBridgeJSPlaymodeTests.cs |
PlayMode | GPU operations from JavaScript |
ProcNoisePlaymodeTests.cs |
PlayMode | Procedural noise generation (Perlin, Value, FBM) |
ProcTexturePlaymodeTests.cs |
PlayMode | Procedural texture generation (checkerboard, gradient) |
CartridgeUtilsPlaymodeTests.cs |
PlayMode | Cartridge global injection, platform defines, __cart() API |
CartridgeUtilsTests.cs |
EditMode | String escaping, path calculation, file extraction, stylesheets |
PremadeCartridgeTests.cs |
EditMode | The shipped Assets/Singtaa/Premade/ cartridge assets: metadata completeness, path-safe slugs, unique identities, resolvable payloads, extraction round-trip |
ShaderFXTests.cs |
PlayMode | ShaderFX render-target lifecycle against real layout, uniform marshalling, ramp/texture caching |
JSRunnerBuildProcessorTests.cs |
EditMode | Asset copying, namespace detection |
BuildValidationTests.cs |
EditMode | Full build + run validation (slow) |
- Scaffolding: Working directory creation, default files
- Initialization: UIDocument/PanelSettings auto-creation
- Execution: Entry file execution, globals injection
- Reload: Hot reload, UI clearing, state preservation
- Temp Directory: Instance ID generation, config file creation
- Source Code: Index.tsx writing, content preservation
- Build State: State transitions, output detection
- Execution: Script execution, stop/cleanup
- String Escaping: JS string literal escaping for special characters
- Path Calculation: Cartridge path resolution with/without namespaces
- File Extraction: Folder creation,
.d.tsgeneration, overwrite behavior, return value - Stylesheet Application: USS stylesheet application to root elements
- Cartridge Globals (PlayMode):
__cart()function, plain-object injection with individual object entries as properties, platform defines
- File Copying: Recursive copy, content preservation
- Asset Detection:
@namespace/folder detection - Scoped Packages:
@scope/packagehandling - Deduplication: Multiple JSRunner handling
Tests and documentation for the zero-allocation interop system:
- Binding Registration: Basic zero-arg, multi-arg, and return-value bindings
- Specialized GPU Bindings: BindGpuSetFloatById, BindGpuSetVectorById, BindGpuDispatch
- Property ID Caching: Shader.PropertyToID pattern for zero-alloc shader uniforms
- GPUBridge Integration: GetZeroAllocBindingIds, SetFloatById, ID-based setters
- JavaScript Integration: Accessing binding IDs and PropertyToID from JS
- Performance: InvokeCallbackNoAlloc overhead, per-frame GPU update simulation
The test file also serves as comprehensive documentation with examples.
Tests for automatic JS → C# array conversion:
- TypedArray to C# array:
Float32Array→float[],Int32Array→int[] - JS array to float/int array:
[1, 2, 3]→int[]orfloat[] - Object arrays to Vector3[]:
[{ x, y, z }, ...]→Vector3[] - Tuple arrays to Vector3[]:
[[x, y, z], ...]→Vector3[] - Color arrays:
[{ r, g, b, a }, ...]or[[r,g,b,a], ...]→Color[] - String arrays:
["a", "b"]→string[] - Empty arrays: Typed vs untyped behavior
- Large arrays: Performance with 1000+ elements
- End-to-End: Builds player, runs, validates output
- Marked
[Explicit]due to 30-60 second runtime
Test fixtures are stored as .txt files in Fixtures/Resources/ to avoid GUID dependencies.
// Load fixture
var fixture = Resources.Load<TextAsset>("SimpleScript");
var code = fixture.text;Available fixtures:
SimpleScript.txt: Basic execution validationUICreation.txt: CS proxy and UI element creationEventTest.txt: Event registration and dispatch
[UnityTest]
public IEnumerator MyTest_Condition_ExpectedResult() {
// Arrange
CreateJSRunner("console.log('test');");
// Act
yield return null; // Wait for Start()
yield return null; // Extra frame for initialization
// Assert
Assert.IsTrue(_runner.IsRunning);
}const string TestScript = @"
globalThis.__result = 'success';
";
CreateJSRunner(TestScript);var fixture = Resources.Load<TextAsset>("UICreation");
CreateJSRunner(fixture.text);LogAssert.Expect(LogType.Warning, new Regex(@"pattern"));
LogAssert.Expect(LogType.Error, "exact message");- No GUIDs: All fixtures are named files, not Unity asset references
- Temp Directories: Tests use
Temp/to avoid project pollution - Frame Yields: UIDocument requires frame delays for initialization
- Proper Cleanup: Always dispose bridge, destroy GameObjects, clear handles
- Inline Code: Prefer
const stringfor simple test scripts
To run BuildValidationTests:
- Create
BuildValidation/BuildValidationScene.unity - Add
BuildValidationRunnercomponent to a GameObject - Configure a JSRunner in the scene
- Add scene to Build Settings
- Run test from EditMode tab (marked Explicit)
See BuildValidation/README.md for details.