Part of #2798.
Objective
Three deliverables in one lot, all closing the same gap (0 iOS registry/deep-link guard tests today, vs. Android's guard suite inside its 284 @Test):
(a) Register the orphaned test file. samples/ios-demo/SceneViewDemo/Services/SketchfabAssetResolver+Tests.swift is confirmed orphaned from samples/ios-demo/SceneViewDemo.xcodeproj/project.pbxproj — grep -c "SketchfabAssetResolver+Tests" project.pbxproj returns 0 (vs. 4 for the properly-wired SketchfabService+Tests.swift and AppStoreUpdaterTests.swift). It carries 17 test methods across 2 XCTestCase classes (SampleAssetsTests: 11 methods, SketchfabAssetResolverTests: 6 methods) that have never compiled or run. Add it to the test target's PBXSourcesBuildPhase (and PBXFileReference/PBXBuildFile entries) in the pbxproj.
(b) Guard-test suite. Mirror the intent of Android's registry-guard tests (DemoRegistryIntegrityTest, samples/android-demo/src/testDebug/java/io/github/sceneview/demo/DemoHostRoutableTest.kt) in XCTest: id uniqueness, kebab-case format, every id in allowedIds is actually routable, every alias resolves to a real target. Use the repo's existing #if DEBUG in-target test pattern.
(c) parity-manifest.yml + CI check. A committed manifest (id → expected iOS status: working / stub / android-only + one-line reason) and a new check-demo-id-parity.sh, wired into ci.yml → repo-hygiene (ubuntu runner, blocking, zero macOS cost) — diffs Android's 52 canonical ids against iOS's registry + the manifest and fails if either drifts out of sync.
Files
samples/ios-demo/SceneViewDemo.xcodeproj/project.pbxproj — register the orphaned test file
samples/ios-demo/SceneViewDemo/Services/SketchfabAssetResolver+Tests.swift (17 tests, currently dead)
- New:
samples/ios-demo/SceneViewDemoTests/DemoRegistryGuardTests.swift (or similar — mirrors Android's guard-test intent)
- New:
parity-manifest.yml (repo root or samples/ios-demo/ — implementer's call, document the choice)
- New:
.claude/scripts/check-demo-id-parity.sh
.github/workflows/ci.yml — wire the new script into the repo-hygiene job
Dependencies
- Depends on L0.2 — the guard suite tests the generated
allowedIds/destination(for:) surface; writing it against the old hand-maintained registry would mean rewriting it again next PR.
- Blocks nothing directly, but is a prerequisite in spirit for every subsequent porting PR (Phase 2+) — it's what makes the
#2769 drift class structurally impossible going forward.
Done criteria (measurable)
Part of #2798.
Objective
Three deliverables in one lot, all closing the same gap (0 iOS registry/deep-link guard tests today, vs. Android's guard suite inside its 284
@Test):(a) Register the orphaned test file.
samples/ios-demo/SceneViewDemo/Services/SketchfabAssetResolver+Tests.swiftis confirmed orphaned fromsamples/ios-demo/SceneViewDemo.xcodeproj/project.pbxproj—grep -c "SketchfabAssetResolver+Tests" project.pbxprojreturns 0 (vs. 4 for the properly-wiredSketchfabService+Tests.swiftandAppStoreUpdaterTests.swift). It carries 17 test methods across 2XCTestCaseclasses (SampleAssetsTests: 11 methods,SketchfabAssetResolverTests: 6 methods) that have never compiled or run. Add it to the test target'sPBXSourcesBuildPhase(andPBXFileReference/PBXBuildFileentries) in the pbxproj.(b) Guard-test suite. Mirror the intent of Android's registry-guard tests (
DemoRegistryIntegrityTest,samples/android-demo/src/testDebug/java/io/github/sceneview/demo/DemoHostRoutableTest.kt) in XCTest: id uniqueness, kebab-case format, every id inallowedIdsis actually routable, every alias resolves to a real target. Use the repo's existing#if DEBUGin-target test pattern.(c)
parity-manifest.yml+ CI check. A committed manifest (id → expected iOS status: working / stub / android-only + one-line reason) and a newcheck-demo-id-parity.sh, wired intoci.yml→repo-hygiene(ubuntu runner, blocking, zero macOS cost) — diffs Android's 52 canonical ids against iOS's registry + the manifest and fails if either drifts out of sync.Files
samples/ios-demo/SceneViewDemo.xcodeproj/project.pbxproj— register the orphaned test filesamples/ios-demo/SceneViewDemo/Services/SketchfabAssetResolver+Tests.swift(17 tests, currently dead)samples/ios-demo/SceneViewDemoTests/DemoRegistryGuardTests.swift(or similar — mirrors Android's guard-test intent)parity-manifest.yml(repo root orsamples/ios-demo/— implementer's call, document the choice).claude/scripts/check-demo-id-parity.sh.github/workflows/ci.yml— wire the new script into therepo-hygienejobDependencies
allowedIds/destination(for:)surface; writing it against the old hand-maintained registry would mean rewriting it again next PR.#2769drift class structurally impossible going forward.Done criteria (measurable)
SketchfabAssetResolver+Tests.swift's 17 test methods run and pass inxcodebuild testcheck-demo-id-parity.shexits non-zero when a demo is added to Android'sGeneratedDemos.allwithout a corresponding iOS registry entry or manifest line (verify with a throwaway local repro, not just code review)parity-manifest.ymlhas one entry per Android canonical id (52 rows) with a status + reason for every non-working entryci.yml→repo-hygieneis red on a deliberately-introduced drift, green otherwise — confirm both directions