test-ecs-core
Kiểm tra chức năng cốt lõi của ECS (đăng ký hệ thống, thành phần, đồng bộ Transform, tạm dừng/bước/tiếp tục, bật/tắt hệ thống, khám phá thực thể, ảnh chụp nhanh) so với poke…
npx skills add https://github.com/facebook/immersive-web-sdk --skill test-ecs-coreECS Core Test
Run 8 test suites covering ECS system registration, component schemas, Transform sync, pause/step/resume, system toggle, entity discovery, snapshot/diff, and stability.
Configuration:
- EXAMPLE_DIR:
$IWSDK_REPO_ROOT/examples/poke
Tool calls: every tool call is npx @iwsdk/cli <subcommand> [--input-json '<JSON>'] [--timeout <ms>], run from inside the example workspace (cwd $EXAMPLE_DIR). The CLI auto-discovers the IWSDK app root from cwd, so no path tricks are required. Run npx @iwsdk/cli mcp inspect from the example to discover available tools and their CLI subcommands.
<JSON>is a JSON object string. Omit--input-jsonif no arguments are needed.- Output is JSON on stdout:
{ok, workspaceRoot, operation, result}. Parse it to check assertions. - Use
--timeout 20000for operations that may take longer (reload, xr enter, screenshot).
IMPORTANT: Run each Bash command one at a time. Parse the JSON output and verify assertions before moving to the next command. Do NOT chain multiple CLI commands together.
IMPORTANT: When the instructions say "wait N seconds", use sleep N as a separate Bash command.
Step 1: Install Dependencies
cd $IWSDK_REPO_ROOT/examples/poke && npm run fresh:install
Wait for this to complete before proceeding.
Step 2: Start Dev Server
Start the dev server as a background task using the Bash tool's run_in_background: true parameter:
cd $IWSDK_REPO_ROOT/examples/poke && npm run dev
IMPORTANT: This command MUST be run with run_in_background: true on the Bash tool — do NOT append & to the command itself.
Once the background task is launched, poll the output for Vite's ready message (up to 60s). You can also run npx @iwsdk/cli dev status from the example directory until state.running becomes true. You do not need to extract or manage the port yourself; subsequent commands resolve the active runtime through the CLI automatically.
If the server fails to start within 60 seconds, report FAIL for all suites and skip to Step 5.
Step 3: Verify Connectivity
npx @iwsdk/cli ecs systems 2>/dev/null
This must return JSON with a list of systems. If it fails:
- Check the dev server output for errors
- Try killing and restarting the server (Step 2)
- If it still fails, report FAIL for all suites and skip to Step 5
Step 4: Run Test Suites
Pre-test Setup
Run these commands in order:
-
Record the test start time immediately before reloading:
node -p 'Date.now()'Save the output as
<test-start-ms>. -
npx @iwsdk/cli browser reload --timeout 20000 2>/dev/nullThen:sleep 3 -
npx @iwsdk/cli xr enter --timeout 20000 2>/dev/nullThen:sleep 2 -
npx @iwsdk/cli browser logs --input-json '{"since":<test-start-ms>,"level":["error","warn"]}' 2>/dev/nullAssert: result should be empty or have no errors/warnings
Suite 1: System Registration
Test 1.1: List All Systems
npx @iwsdk/cli ecs systems 2>/dev/null
Assert these framework systems are present with correct priorities:
| System | Priority |
|---|---|
LocomotionSystem | -5 |
InputSystem | -4 |
GrabSystem | -3 |
TransformSystem | 0 |
VisibilitySystem | 0 |
EnvironmentSystem | 0 |
LevelSystem | 0 |
AudioSystem | 0 |
PanelUISystem | -3.8 |
Also verify entity counts:
- InputSystem:
rayInteractables >= 1,pokeInteractables >= 1 - TransformSystem:
transform >= 5 - LevelSystem:
levelEntities >= 4
Suite 2: Component Registration
Test 2.1: List All Components
npx @iwsdk/cli ecs components 2>/dev/null
Assert these components are present:
Transformwith fields:position(Vec3),orientation(Vec4),scale(Vec3),parent(Entity)Visibilitywith field:isVisible(Boolean, default: true)LevelRoot(no fields — marker)LevelTagwith field:id(String)PanelUIwith field:config(String); this is the legacy raw-URL adapterAudioSourcewith fields:src(FilePath),volume(Float32)
Test 2.2: Transform Default Values From the ecs_list_components output, verify Transform field defaults:
positiondefault:[NaN, NaN, NaN]orientationdefault:[NaN, NaN, NaN, NaN]scaledefault:[NaN, NaN, NaN]
Suite 3: Transform Sync (ECS <-> Object3D)
Test 3.1: Modify Transform Position
-
Find an entity with LevelTag:
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelTag"]}' 2>/dev/nullPick the first entity's
entityIndex. -
Get the scene hierarchy to find the entity's Object3D UUID:
npx @iwsdk/cli scene runtime-hierarchy --input-json '{"maxDepth":3}' 2>/dev/nullFind the node matching the entity index.
-
Get initial transform:
npx @iwsdk/cli scene transform --input-json '{"uuid":"<UUID>"}' 2>/dev/null -
Set position via ECS:
npx @iwsdk/cli ecs set-component --input-json '{"entityIndex":<N>,"componentId":"Transform","field":"position","value":"[0, 2, -1]"}' 2>/dev/null -
Verify Object3D moved:
npx @iwsdk/cli scene transform --input-json '{"uuid":"<UUID>"}' 2>/dev/nullAssert:
localPositionmatches[0, 2, -1](within tolerance of 0.01).
Suite 4: ECS Pause / Step / Resume
Test 4.1: Pause
npx @iwsdk/cli ecs pause 2>/dev/null
Assert: paused === true, systemCount >= 12
Test 4.2: Step
npx @iwsdk/cli ecs step --input-json '{"count":5}' 2>/dev/null
Assert: framesAdvanced === 5
Test 4.3: Resume
npx @iwsdk/cli ecs resume 2>/dev/null
Assert: paused === false
Suite 5: System Toggle
Test 5.1: Pause a System
npx @iwsdk/cli ecs toggle-system --input-json '{"name":"GrabSystem","paused":true}' 2>/dev/null
Assert: isPaused === true
Test 5.2: Resume a System
npx @iwsdk/cli ecs toggle-system --input-json '{"name":"GrabSystem","paused":false}' 2>/dev/null
Assert: isPaused === false
Suite 6: Entity Discovery
Test 6.1: Find by Component
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelRoot"]}' 2>/dev/null
Assert: exactly 1 entity
npx @iwsdk/cli ecs find --input-json '{"withComponents":["Transform"]}' 2>/dev/null
Assert: returns entities (count >= 5)
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelTag"]}' 2>/dev/null
Assert: returns entities (count >= 4)
Test 6.2: Find by Name Pattern
npx @iwsdk/cli ecs find --input-json '{"namePattern":"LevelRoot"}' 2>/dev/null
Assert: matches entity named "LevelRoot"
Test 6.3: Exclude Components
npx @iwsdk/cli ecs find --input-json '{"withComponents":["Transform"],"withoutComponents":["LevelTag"]}' 2>/dev/null
Assert: returns only persistent entities (fewer than the full Transform set)
Suite 7: Snapshot & Diff
Test 7.1: Snapshot
npx @iwsdk/cli ecs snapshot --input-json '{"label":"baseline"}' 2>/dev/null
Assert: entityCount >= 5, componentCount >= 20
Test 7.2: Modify and Diff
-
Find an entity with LevelTag:
npx @iwsdk/cli ecs find --input-json '{"withComponents":["LevelTag"]}' 2>/dev/null -
Set its position:
npx @iwsdk/cli ecs set-component --input-json '{"entityIndex":<N>,"componentId":"Transform","field":"position","value":"[1, 1, 1]"}' 2>/dev/null -
Take second snapshot:
npx @iwsdk/cli ecs snapshot --input-json '{"label":"modified"}' 2>/dev/null -
Diff:
npx @iwsdk/cli ecs diff --input-json '{"from":"baseline","to":"modified"}' 2>/dev/nullAssert: diff shows Transform.position changed to
[1, 1, 1]
Suite 8: Stability
npx @iwsdk/cli browser logs --input-json '{"since":<test-start-ms>,"count":30,"level":["error","warn"]}' 2>/dev/null
Assert: No application-level errors or warnings. Pre-existing 404 resource errors from page load are acceptable.
Step 5: Cleanup & Results
Kill the dev server:
cd $IWSDK_REPO_ROOT/examples/poke && npx @iwsdk/cli dev down
Output a summary table:
| Suite | Result |
|--------------------------|-----------|
| 1. System Registration | PASS/FAIL |
| 2. Component Registration| PASS/FAIL |
| 3. Transform Sync | PASS/FAIL |
| 4. Pause/Step/Resume | PASS/FAIL |
| 5. System Toggle | PASS/FAIL |
| 6. Entity Discovery | PASS/FAIL |
| 7. Snapshot & Diff | PASS/FAIL |
| 8. Stability | PASS/FAIL |
If any suite fails, include which assertion failed and actual vs expected values.
Recovery
If at any point a transient error occurs (server crash, WebSocket timeout, connection refused, etc.) that is NOT caused by a source code bug:
- Stop the dev server:
cd $IWSDK_REPO_ROOT/examples/poke && npx @iwsdk/cli dev down - Restart: re-run Step 2 to start a fresh dev server
- Re-run the Pre-test Setup (reload, accept session)
- Retry the failed suite
Only give up after one retry attempt per suite. If the same suite fails twice, mark it FAIL and continue to the next suite.
Known Issues & Workarounds
Transform NaN defaults
Transform fields default to [NaN, NaN, NaN] — by design. NaN sentinel means "don't overwrite existing Object3D value".
UUIDs change on reload
Three.js Object3D UUIDs regenerate on page reload. Always call npx @iwsdk/cli scene runtime-hierarchy after reload.
ecs_step timeout
npx @iwsdk/cli ecs step has a 5-second timeout per step. If render loop is inactive, steps may fail.
Entity indices change on reload
Never cache entity indices across reloads. Always re-discover via npx @iwsdk/cli ecs find.
Console log noise
Some warnings (e.g., TLS self-signed cert) are expected and should be ignored. Only check for application-level errors/warnings.