diff --git a/Sources/UntoldEngine/Profiling/FrameMetricsCollector.swift b/Sources/UntoldEngine/Profiling/FrameMetricsCollector.swift index d3fa00a05..b12827eaa 100644 --- a/Sources/UntoldEngine/Profiling/FrameMetricsCollector.swift +++ b/Sources/UntoldEngine/Profiling/FrameMetricsCollector.swift @@ -10,7 +10,8 @@ import Foundation -final class FrameMetricsCollector { +/// All mutable state is guarded by `lock`, so the class is safe to share across threads. +final class FrameMetricsCollector: @unchecked Sendable { private let capacity: Int private var samples: [Double] private var writeIndex: Int diff --git a/Tests/UntoldEngineRenderTests/AssetLoadingGateRenderingTests.swift b/Tests/UntoldEngineRenderTests/AssetLoadingGateRenderingTests.swift index 41b52ca82..e05ff1807 100644 --- a/Tests/UntoldEngineRenderTests/AssetLoadingGateRenderingTests.swift +++ b/Tests/UntoldEngineRenderTests/AssetLoadingGateRenderingTests.swift @@ -36,6 +36,13 @@ final class AssetLoadingGateRenderingTests: BaseRenderSetup { } } + /// Mirrors the `if !loading { ... }` gate in `executeXRSystemPass`. Routed through a + /// function (rather than inlining `!loading` on a local literal) so the compiler can't + /// prove either branch unreachable and flag it as dead code. + private func xrSystemPassRenderPrepWouldExecute(loading: Bool) -> Bool { + !loading + } + // MARK: - Test 1: Verify render prep is skipped when AssetLoadingGate.shared.isLoadingAny is true func testUpdateRenderingSystem_SkipsRenderPrepWhenLoadingGateIsActive() { @@ -143,10 +150,7 @@ final class AssetLoadingGateRenderingTests: BaseRenderSetup { // This verifies the condition that guards render prep execution // The actual functions (performFrustumCulling, executeGaussianDepth, executeBitonicSort) // should NOT be called when loading is true - var renderPrepExecuted = false - if !loading { - renderPrepExecuted = true - } + let renderPrepExecuted = xrSystemPassRenderPrepWouldExecute(loading: loading) XCTAssertFalse(renderPrepExecuted, "Render prep should not execute when loading is true") } @@ -175,7 +179,7 @@ final class AssetLoadingGateRenderingTests: BaseRenderSetup { // When: We apply the executeXRSystemPass logic: // `if !loading { visibleEntityIds = tripleVisibleEntities.snapshotForRead(frame: cullFrameIndex) }` - if !loading { + if xrSystemPassRenderPrepWouldExecute(loading: loading) { visibleEntityIds = tripleVisibleEntities.snapshotForRead(frame: cullFrameIndex) } @@ -302,7 +306,7 @@ final class AssetLoadingGateRenderingTests: BaseRenderSetup { // During loading: visibleEntityIds should NOT update var loading = AssetLoadingGate.shared.isLoadingAny - var previousVisibleIds = visibleEntityIds + let previousVisibleIds = visibleEntityIds if !loading { visibleEntityIds = tripleVisibleEntities.snapshotForRead(frame: cullFrameIndex) } diff --git a/Tests/UntoldEngineRenderTests/AsyncMeshLoadingTest.swift b/Tests/UntoldEngineRenderTests/AsyncMeshLoadingTest.swift index b929ca6dd..9ec2b7df2 100644 --- a/Tests/UntoldEngineRenderTests/AsyncMeshLoadingTest.swift +++ b/Tests/UntoldEngineRenderTests/AsyncMeshLoadingTest.swift @@ -208,16 +208,12 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { // When: Start loading and track progress let loadingCompleteExpectation = XCTestExpectation(description: "Loading completed") - // Track that loading was started at some point during the async operation - var loadingWasStarted = false - // Poll rapidly to catch loading state (loading may complete very quickly) let monitorTask = Task { for _ in 0 ..< 500 { // Check for up to 0.5 seconds if Task.isCancelled { break } let isLoading = await AssetLoadingState.shared.isLoading(entityId: entityId) if isLoading { - loadingWasStarted = true break } try? await Task.sleep(nanoseconds: 1_000_000) // 1ms @@ -243,9 +239,6 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { let progressAfter = await AssetLoadingState.shared.getProgress(for: entityId) XCTAssertNil(progressAfter, "Progress should be cleared after completion") - - // Note: loadingWasStarted may be false if loading completed before monitoring could detect it - // This is expected behavior with very fast loading - the important thing is that completion works } func testAsyncLoading_tracksMultipleEntitiesSimultaneously() async { @@ -297,7 +290,6 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { setEntityName(entityId: entityId, name: "PhaseEntity") var loadingPhaseDetected = false - var registeringPhaseDetected = false // When: Load and monitor phase transitions with rapid polling let monitorTask = Task { @@ -308,7 +300,7 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { case .loading: loadingPhaseDetected = true case .registering: - registeringPhaseDetected = true + break } } try? await Task.sleep(nanoseconds: 1_000_000) // 1ms @@ -400,27 +392,10 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { let entityId = createEntity() setEntityName(entityId: entityId, name: "VisibilityEntity") - var wasHiddenDuringLoad = false - // When: Monitor visibility during loading let monitorTask = Task { for _ in 0 ..< 50 { if Task.isCancelled { break } - if let renderComp = scene.get(component: RenderComponent.self, for: entityId) { - if !renderComp.isVisible { - wasHiddenDuringLoad = true - } - } - // Also check children - if let sceneGraph = scene.get(component: ScenegraphComponent.self, for: entityId) { - for childId in sceneGraph.children { - if let childRenderComp = scene.get(component: RenderComponent.self, for: childId) { - if !childRenderComp.isVisible { - wasHiddenDuringLoad = true - } - } - } - } try? await Task.sleep(nanoseconds: 50_000_000) // 0.05s } } @@ -582,7 +557,6 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { // When: Load with asset name filter let expectation = XCTestExpectation(description: "Filtered load") - var loadSuccess = false // Note: This requires knowing the internal asset name structure of stadium.usdz // For this test, we'll use a generic approach @@ -591,8 +565,7 @@ final class AsyncMeshLoadingTest: BaseRenderSetup { filename: "stadium", withExtension: "untold", assetName: "stadium" // Using the file name as asset name - ) { success in - loadSuccess = success + ) { _ in expectation.fulfill() } diff --git a/Tests/UntoldEngineRenderTests/DeviceRadixSortTest.swift b/Tests/UntoldEngineRenderTests/DeviceRadixSortTest.swift index 1a70d7465..506909b8c 100644 --- a/Tests/UntoldEngineRenderTests/DeviceRadixSortTest.swift +++ b/Tests/UntoldEngineRenderTests/DeviceRadixSortTest.swift @@ -224,7 +224,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { else { XCTFail("Buffer allocation failed"); return } zeroBuffer(histBuf) - var numElems = UInt32(n) + let numElems = UInt32(n) var passIndex = UInt32(0) dispatch(pipeline, threadCount: n) { enc in @@ -262,7 +262,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { else { XCTFail("Buffer allocation failed"); return } zeroBuffer(histBuf) - var numElems = UInt32(kRadixBuckets) + let numElems = UInt32(kRadixBuckets) var passIndex = UInt32(0) dispatch(pipeline, threadCount: kRadixBuckets) { enc in @@ -295,7 +295,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { else { XCTFail("Buffer allocation failed"); return } zeroBuffer(histBuf) - var numElems = UInt32(1) + let numElems = UInt32(1) var passIndex = UInt32(0) dispatch(pipeline, threadCount: 1) { enc in @@ -331,7 +331,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { let histBuf = makeBuffer(count: kRadixBuckets, type: UInt32.self) else { XCTFail("Buffer allocation failed"); return } - var numElems = UInt32(n) + let numElems = UInt32(n) for pass in 0 ..< 4 { zeroBuffer(histBuf) @@ -366,7 +366,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { let histBuf = makeBuffer(count: kRadixBuckets, type: UInt32.self) else { XCTFail("Buffer allocation failed"); return } - var numElems = UInt32(n) + let numElems = UInt32(n) for pass in 0 ..< 4 { zeroBuffer(histBuf) @@ -580,7 +580,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { else { XCTFail("Buffer allocation failed"); return } zeroBuffer(zeroBuf) - var numElems = UInt32(n) + let numElems = UInt32(n) var passIndex = UInt32(0) dispatch(pipeline, threadCount: n) { enc in @@ -626,7 +626,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { else { XCTFail("Buffer allocation failed"); return } zeroBuffer(zeroBuf) - var numElems = UInt32(n) + let numElems = UInt32(n) var passIndex = UInt32(0) dispatch(pipeline, threadCount: n) { enc in @@ -674,7 +674,7 @@ final class DeviceRadixSortTest: BaseRenderSetup { else { XCTFail("Buffer allocation failed"); return } zeroBuffer(zeroBuf) - var numElems = UInt32(n) + let numElems = UInt32(n) var passIndex = UInt32(0) dispatch(pipeline, threadCount: n) { enc in diff --git a/Tests/UntoldEngineRenderTests/EmissiveShadingTests.swift b/Tests/UntoldEngineRenderTests/EmissiveShadingTests.swift index 7937cdd60..0dd6d8dfc 100644 --- a/Tests/UntoldEngineRenderTests/EmissiveShadingTests.swift +++ b/Tests/UntoldEngineRenderTests/EmissiveShadingTests.swift @@ -102,8 +102,8 @@ final class EmissiveShadingTests: MaterialShadingTestCase { let without = MDLMaterial(name: "wall", scatteringFunction: MDLPhysicallyPlausibleScatteringFunction()) let textureLoader = TextureLoader(device: renderInfo.device) - let sign = Material(mdlMaterial: withTexture, textureLoader: textureLoader, name: "sign") - let wall = Material(mdlMaterial: without, textureLoader: textureLoader, name: "wall") + let sign = Material(mdlMaterial: withTexture, textureLoader: textureLoader) + let wall = Material(mdlMaterial: without, textureLoader: textureLoader) XCTAssertTrue(sign.hasEmissiveMap) XCTAssertEqual(sign.emissiveValue, simd_float3(1, 1, 1)) diff --git a/Tests/UntoldEngineRenderTests/EnvironmentAssetRebakeTests.swift b/Tests/UntoldEngineRenderTests/EnvironmentAssetRebakeTests.swift index 33b811cbc..12dfe98ea 100644 --- a/Tests/UntoldEngineRenderTests/EnvironmentAssetRebakeTests.swift +++ b/Tests/UntoldEngineRenderTests/EnvironmentAssetRebakeTests.swift @@ -19,11 +19,11 @@ final class EnvironmentAssetRebakeTests: BaseRenderSetup { private var customDirectory: URL? - override func tearDown() { + override func tearDown() async throws { if let customDirectory { try? FileManager.default.removeItem(at: customDirectory) } - super.tearDown() + try await super.tearDown() } func testViewportRebakeKeepsEnvironmentLoadedFromCustomDirectory() throws { diff --git a/Tests/UntoldEngineRenderTests/RenderGraphBuilderTest.swift b/Tests/UntoldEngineRenderTests/RenderGraphBuilderTest.swift index ff01dbfe5..4b29257e5 100644 --- a/Tests/UntoldEngineRenderTests/RenderGraphBuilderTest.swift +++ b/Tests/UntoldEngineRenderTests/RenderGraphBuilderTest.swift @@ -3495,7 +3495,7 @@ final class RenderGraphBuilderTest: BaseRenderSetup { func assertTopologicalConstraints( order: [String], constraints: [(before: String, after: String)], - file: StaticString = #file, + file: StaticString = #filePath, line: UInt = #line ) { for (before, after) in constraints { diff --git a/Tests/UntoldEngineRenderTests/SceneSerializerTest.swift b/Tests/UntoldEngineRenderTests/SceneSerializerTest.swift index 107766f4c..90730d200 100644 --- a/Tests/UntoldEngineRenderTests/SceneSerializerTest.swift +++ b/Tests/UntoldEngineRenderTests/SceneSerializerTest.swift @@ -306,7 +306,6 @@ final class SceneSerializerTests: BaseRenderSetup { XCTAssertEqual(getEntityName(entityId: children[2]), "new_child_name") let originalSceneData = serializeScene() - let serializedAuthoredCount = originalSceneData.entities.count let tempDir = FileManager.default.temporaryDirectory let sceneURL = tempDir.appendingPathComponent("base_scene_roundtrip.json") diff --git a/Tests/UntoldEngineRenderTests/StaticBatchingTest.swift b/Tests/UntoldEngineRenderTests/StaticBatchingTest.swift index d0586fe96..1489fad95 100644 --- a/Tests/UntoldEngineRenderTests/StaticBatchingTest.swift +++ b/Tests/UntoldEngineRenderTests/StaticBatchingTest.swift @@ -152,8 +152,8 @@ final class StaticBatchingTest: BaseRenderSetup { func testGenerateBatchesWithNoStaticEntities() { // Given: No entities marked as static - let entity1 = createEntity() - let entity2 = createEntity() + _ = createEntity() + _ = createEntity() // When: Generate batches generateBatches() diff --git a/Tests/UntoldEngineRenderTests/TransparencyTests.swift b/Tests/UntoldEngineRenderTests/TransparencyTests.swift index d929c7f16..1970a4a1c 100644 --- a/Tests/UntoldEngineRenderTests/TransparencyTests.swift +++ b/Tests/UntoldEngineRenderTests/TransparencyTests.swift @@ -31,7 +31,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaMode", semantic: .userDefined, string: "blend")) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .blend, "Explicit 'blend' string should decode to .blend") } @@ -41,7 +41,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaMode", semantic: .userDefined, string: "mask")) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .mask, "Explicit 'mask' string should decode to .mask") } @@ -51,7 +51,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaMode", semantic: .userDefined, string: "opaque")) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .opaque, "Explicit 'opaque' string should decode to .opaque") } @@ -61,7 +61,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "transparencyMode", semantic: .userDefined, string: "transparent")) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .blend, "transparencyMode='transparent' should decode to .blend") } @@ -71,7 +71,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaMode", semantic: .userDefined, string: "cutout")) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .mask, "Explicit 'cutout' string should decode to .mask") } @@ -89,9 +89,9 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { let textureLoader = TextureLoader(device: renderInfo.device) - let matOpaque = Material(mdlMaterial: mdlMaterialOpaque, textureLoader: textureLoader, name: "test") - let matMask = Material(mdlMaterial: mdlMaterialMask, textureLoader: textureLoader, name: "test") - let matBlend = Material(mdlMaterial: mdlMaterialBlend, textureLoader: textureLoader, name: "test") + let matOpaque = Material(mdlMaterial: mdlMaterialOpaque, textureLoader: textureLoader) + let matMask = Material(mdlMaterial: mdlMaterialMask, textureLoader: textureLoader) + let matBlend = Material(mdlMaterial: mdlMaterialBlend, textureLoader: textureLoader) XCTAssertEqual(matOpaque.alphaMode, .opaque, "Scalar 0.0 should decode to .opaque") XCTAssertEqual(matMask.alphaMode, .mask, "Scalar 1.0 should decode to .mask") @@ -107,7 +107,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "baseColor", semantic: .baseColor, color: color)) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .blend, "Base color with alpha < 1.0 should infer .blend when no explicit alphaMode is set") @@ -118,7 +118,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "opacity", semantic: .opacity, float: 0.7)) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .blend, "Opacity < 1.0 should infer .blend when no explicit alphaMode is set") @@ -130,7 +130,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { // Base color without explicit alpha (float3 path returns hasExplicitAlpha=false) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaMode, .opaque, "Material with no transparency signals should default to .opaque") @@ -144,7 +144,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaCutoff", semantic: .userDefined, float: 2.5)) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaCutoff, 1.0, accuracy: 0.0001, "alphaCutoff above 1.0 should be clamped to 1.0") @@ -156,7 +156,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaCutoff", semantic: .userDefined, float: -0.5)) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaCutoff, 0.0, accuracy: 0.0001, "alphaCutoff below 0.0 should be clamped to 0.0") @@ -168,7 +168,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { mdlMaterial.setProperty(MDLMaterialProperty(name: "alphaCutoff", semantic: .userDefined, float: 0.3)) let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaCutoff, 0.3, accuracy: 0.0001, "alphaCutoff within [0,1] should be preserved as-is") @@ -180,7 +180,7 @@ final class MaterialAlphaDecodingTests: BaseRenderSetup { // No alphaCutoff property let textureLoader = TextureLoader(device: renderInfo.device) - let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader, name: "test") + let material = Material(mdlMaterial: mdlMaterial, textureLoader: textureLoader) XCTAssertEqual(material.alphaCutoff, 0.5, accuracy: 0.0001, "alphaCutoff should default to 0.5 when not explicitly provided") diff --git a/Tests/UntoldEngineRenderTests/UntoldPackRenderTests.swift b/Tests/UntoldEngineRenderTests/UntoldPackRenderTests.swift index 8f286e850..1dcd272c1 100644 --- a/Tests/UntoldEngineRenderTests/UntoldPackRenderTests.swift +++ b/Tests/UntoldEngineRenderTests/UntoldPackRenderTests.swift @@ -9,6 +9,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. import Foundation +@preconcurrency import Metal import simd @testable import UntoldEngine import XCTest @@ -110,7 +111,7 @@ final class UntoldPackRenderTests: BaseRenderSetup { } await fulfillment(of: [expectation], timeout: 10.0) let scenegraph = try XCTUnwrap(scene.get(component: ScenegraphComponent.self, for: rootId)) - return Dictionary(uniqueKeysWithValues: scenegraph.children.map { (getEntityName(entityId: $0) ?? "", $0) }) + return Dictionary(uniqueKeysWithValues: scenegraph.children.map { (getEntityName(entityId: $0), $0) }) } /// A model of a pack is created spatial and placed with the transform calls, which @@ -281,7 +282,9 @@ final class UntoldPackRenderTests: BaseRenderSetup { let key = LoadedTextureCache.key(url: tempRoot.appendingPathComponent("atlas.png"), isSRGB: true) let loads = Counter() let made = try makeTexture() - let results = UnsafeMutablePointer?>.allocate(capacity: 8) + // Each iteration of concurrentPerform below writes to a distinct index, so + // concurrent access is safe despite the pointee not being Sendable. + nonisolated(unsafe) let results = UnsafeMutablePointer?>.allocate(capacity: 8) results.initialize(repeating: nil, count: 8) defer { results.deallocate() } diff --git a/Tests/UntoldEngineRenderTests/UpdateARRenderingSystemTest.swift b/Tests/UntoldEngineRenderTests/UpdateARRenderingSystemTest.swift index 0d2ffb2e8..58091d9c3 100644 --- a/Tests/UntoldEngineRenderTests/UpdateARRenderingSystemTest.swift +++ b/Tests/UntoldEngineRenderTests/UpdateARRenderingSystemTest.swift @@ -305,7 +305,7 @@ final class UpdateARRenderingSystemTest: BaseRenderSetup { func assertTopologicalConstraints( order: [String], constraints: [(before: String, after: String)], - file: StaticString = #file, + file: StaticString = #filePath, line: UInt = #line ) { for (before, after) in constraints { diff --git a/Tests/UntoldEngineRenderTests/UpdateRenderingSystemTest.swift b/Tests/UntoldEngineRenderTests/UpdateRenderingSystemTest.swift index 963522cc9..b0ad0860b 100644 --- a/Tests/UntoldEngineRenderTests/UpdateRenderingSystemTest.swift +++ b/Tests/UntoldEngineRenderTests/UpdateRenderingSystemTest.swift @@ -470,7 +470,7 @@ final class UpdateRenderingSystemTest: BaseRenderSetup { func assertTopologicalConstraints( order: [String], constraints: [(before: String, after: String)], - file: StaticString = #file, + file: StaticString = #filePath, line: UInt = #line ) { for (before, after) in constraints { diff --git a/Tests/UntoldEngineRenderTests/UpdateXRRenderingSystemTest.swift b/Tests/UntoldEngineRenderTests/UpdateXRRenderingSystemTest.swift index c78d1c647..a5f40f0c8 100644 --- a/Tests/UntoldEngineRenderTests/UpdateXRRenderingSystemTest.swift +++ b/Tests/UntoldEngineRenderTests/UpdateXRRenderingSystemTest.swift @@ -275,7 +275,7 @@ final class UpdateXRRenderingSystemTest: BaseRenderSetup { func assertTopologicalConstraints( order: [String], constraints: [(before: String, after: String)], - file: StaticString = #file, + file: StaticString = #filePath, line: UInt = #line ) { for (before, after) in constraints { diff --git a/Tests/UntoldEngineRenderTests/UpdateiOSRenderingSystemTest.swift b/Tests/UntoldEngineRenderTests/UpdateiOSRenderingSystemTest.swift index 68e33a60e..ad34337a2 100644 --- a/Tests/UntoldEngineRenderTests/UpdateiOSRenderingSystemTest.swift +++ b/Tests/UntoldEngineRenderTests/UpdateiOSRenderingSystemTest.swift @@ -249,7 +249,7 @@ final class UpdateiOSRenderingSystemTest: BaseRenderSetup { func assertTopologicalConstraints( order: [String], constraints: [(before: String, after: String)], - file: StaticString = #file, + file: StaticString = #filePath, line: UInt = #line ) { for (before, after) in constraints { diff --git a/Tests/UntoldEngineTests/DistanceTrackingTests.swift b/Tests/UntoldEngineTests/DistanceTrackingTests.swift index 785e36723..5de0ac54f 100644 --- a/Tests/UntoldEngineTests/DistanceTrackingTests.swift +++ b/Tests/UntoldEngineTests/DistanceTrackingTests.swift @@ -50,7 +50,7 @@ final class DistanceTrackingTests: XCTestCase { // MARK: - Fix 5: Distance Tracking Tests func testPickedEntityDistanceInitialValue() { - var state = XRSpatialInputState() + let state = XRSpatialInputState() XCTAssertEqual( state.pickedEntityDistance, Float.infinity, diff --git a/Tests/UntoldEngineTests/EntityCapacityTests.swift b/Tests/UntoldEngineTests/EntityCapacityTests.swift index 0f13076fd..621a17be1 100644 --- a/Tests/UntoldEngineTests/EntityCapacityTests.swift +++ b/Tests/UntoldEngineTests/EntityCapacityTests.swift @@ -64,7 +64,7 @@ final class EntityCapacityTests: XCTestCase { for _ in 0 ..< ComponentPool.chunkCapacity * 2 { let entityId = createEntity() - scene.assign(to: entityId, component: CapacityTestComponent.self) + _ = scene.assign(to: entityId, component: CapacityTestComponent.self) } XCTAssertEqual(snapshot.get(component: CapacityTestComponent.self, for: first)?.value, 42) diff --git a/Tests/UntoldEngineTests/MLDeformerTests.swift b/Tests/UntoldEngineTests/MLDeformerTests.swift index 6576a3924..fbcda83d0 100644 --- a/Tests/UntoldEngineTests/MLDeformerTests.swift +++ b/Tests/UntoldEngineTests/MLDeformerTests.swift @@ -177,7 +177,7 @@ final class MLDeformerTests: XCTestCase { ) // Sleeve: 12 rings × 16 around the upper arm axis (x from 0.02 to 0.28 at y = 1), radius 0.05. - var vertexWriter = UntoldBinaryWriter() + let vertexWriter = UntoldBinaryWriter() var jointIndexData = Data() var jointWeightData = Data() var vertexCount = 0 diff --git a/Tests/UntoldEngineTests/MeshUniformBufferTests.swift b/Tests/UntoldEngineTests/MeshUniformBufferTests.swift index 6ed15f0d7..a6d4b80bc 100644 --- a/Tests/UntoldEngineTests/MeshUniformBufferTests.swift +++ b/Tests/UntoldEngineTests/MeshUniformBufferTests.swift @@ -113,11 +113,3 @@ final class MeshUniformBufferTests: XCTestCase { "Uniforms struct must fit within the 4 KB setVertexBytes limit") } } - -// MARK: - Helper Extensions for Matrix Operations - -extension simd_float4x4: @retroactive Equatable { - public static func == (lhs: simd_float4x4, rhs: simd_float4x4) -> Bool { - lhs.columns == rhs.columns - } -} diff --git a/Tests/UntoldEngineTests/PhysicsEventsTests.swift b/Tests/UntoldEngineTests/PhysicsEventsTests.swift index 0f780480e..e191b8776 100644 --- a/Tests/UntoldEngineTests/PhysicsEventsTests.swift +++ b/Tests/UntoldEngineTests/PhysicsEventsTests.swift @@ -79,14 +79,14 @@ final class PhysicsEventsTests: XCTestCase { USCSystem.shared.initialize() } - override func tearDown() { + override func tearDown() async throws { for subscription in subscriptions { subscription.cancel() } subscriptions.removeAll() gameMode = false PhysicsBackendRegistry.shared.resetForTesting() - super.tearDown() + try await super.tearDown() } private func makeContext() -> EngineExtensionUpdateContext { diff --git a/Tests/UntoldEngineTests/SceneRootTransformTests.swift b/Tests/UntoldEngineTests/SceneRootTransformTests.swift index 15f499806..407f74a58 100644 --- a/Tests/UntoldEngineTests/SceneRootTransformTests.swift +++ b/Tests/UntoldEngineTests/SceneRootTransformTests.swift @@ -263,7 +263,7 @@ final class SceneRootTransformTests: XCTestCase { // MARK: - Helpers private func assertMatricesEqual(_ a: simd_float4x4, _ b: simd_float4x4, - accuracy: Float = 1e-4, file: StaticString = #file, line: UInt = #line) + accuracy: Float = 1e-4, file: StaticString = #filePath, line: UInt = #line) { for col in 0 ..< 4 { for row in 0 ..< 4 { diff --git a/Tests/UntoldEngineTests/USCCameraScriptTests.swift b/Tests/UntoldEngineTests/USCCameraScriptTests.swift index c13aef431..c44e74c67 100644 --- a/Tests/UntoldEngineTests/USCCameraScriptTests.swift +++ b/Tests/UntoldEngineTests/USCCameraScriptTests.swift @@ -78,7 +78,6 @@ final class USCCameraScriptTests: XCTestCase { // Different from default so we can see a change let eye = simd_float3(1.0, 2.0, 3.0) let target = simd_float3(0.0, 0.0, 0.0) - let up = simd_float3.up let script = buildScript(name: "cameraLookAtScript") { s in s.onUpdate()