From 6faeb4a103e412b095b29bac26aa74f85ecb7398 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 18 Aug 2026 12:09:41 +0200 Subject: [PATCH] test: make prerequisite lanes fail honestly --- docs/release-gate.md | 21 +++- .../2026-08-18-r3-test-truth-ledger.md | 97 ++++++++++++++----- .../Credentials/AppCredentialResolverTests.cs | 2 +- .../ChargenPreviewControllerTests.cs | 20 ++-- .../ChargenPreviewEntityBuilderTests.cs | 26 ++--- .../Rendering/CornerFloodReplayTests.cs | 12 +-- .../Rendering/FramePacingControllerTests.cs | 2 +- .../Rendering/HouseExitWalkReplayTests.cs | 10 +- .../Issue113DrawingBspFilterTests.cs | 4 +- .../Issue113MeetingHallFloodTests.cs | 2 +- .../Issue120ReciprocalPingPongTests.cs | 4 +- .../Issue124LookInSeedRegionTests.cs | 4 +- .../Rendering/Issue130DoorwayStripTests.cs | 4 +- .../Rendering/Issue131SetupProbeTests.cs | 4 +- .../Issue176177FacilityHubFloodReplayTests.cs | 10 +- .../Issue177StairDescentCameraFloodTests.cs | 14 +-- .../Rendering/Issue181VisFlapReplayTests.cs | 4 +- .../Issue181WallPressEquilibriumTests.cs | 2 +- .../Issue95DungeonFloodDiagnosticTests.cs | 2 +- .../LinuxMonotonicFramePacingWaiterTests.cs | 4 +- .../Rendering/PortalTunnelAssetTests.cs | 5 +- .../RetailParticleGeometryClassifierTests.cs | 11 ++- .../Rendering/RetailSelectionAssetTests.cs | 4 +- .../Streaming/LandblockBuildFactoryTests.cs | 7 +- .../AcDream.App.Tests/UI/IconComposerTests.cs | 6 +- .../UI/Layout/CharacterLayoutImportProbe.cs | 6 +- .../ChatIndicatorButtonLiveMountProbeTests.cs | 5 +- .../UI/Layout/ChatOptionsDatDefaultsTests.cs | 4 +- .../UI/Layout/FaPanelSlotProbeTests.cs | 5 +- .../UI/Layout/InventoryFrameImportProbe.cs | 6 +- .../Layout/ItemAppraisalTextFormatterTests.cs | 2 +- .../UI/Layout/ItemListCellTemplateTests.cs | 8 +- .../KeyboardConfigLiveMountProbeTests.cs | 7 +- .../UI/Layout/MapHousePanelSlotProbeTests.cs | 5 +- .../Layout/OptionsPanelLiveMountProbeTests.cs | 15 +-- .../UI/Layout/PaperdollClickMapTests.cs | 2 +- .../UI/Layout/PaperdollSlotBackgroundTests.cs | 2 +- .../UI/Layout/PowerbarLayoutProbeTests.cs | 15 +-- .../UI/Layout/RetailLayoutFixtureGenerator.cs | 1 + .../Layout/SocialPanelLiveMountProbeTests.cs | 7 +- .../UI/Layout/SpellbookRowStyleTests.cs | 4 +- .../UI/RetailCursorCatalogTests.cs | 4 +- .../UI/SpewBoxLayoutDumpDiagnostic.cs | 2 +- .../UI/UiDatFontBorderPixelTests.cs | 4 +- .../UI/UiRenderContextAlphaTests.cs | 4 +- .../LiveEntityPresentationControllerTests.cs | 4 +- .../World/RecallTeleportAnimationTests.cs | 4 +- .../BakeDeterminismTests.cs | 6 +- ...5StaticSpherePopulationMeasurementTests.cs | 2 +- .../ChargenAppearanceCatalogColorTests.cs | 12 +-- ...argenAppearanceCatalogInstalledDatTests.cs | 4 +- .../ChargenTableReaderInstalledDatTests.cs | 18 ++-- .../InstalledPreparedCollisionCatalogTests.cs | 4 +- ...InstalledSetupBspPrimitiveDispatchTests.cs | 4 +- ...nstalledSetupCollisionReachabilityTests.cs | 2 +- ...ue334NeftetFormationCellMembershipTests.cs | 2 +- .../PakEquivalenceTests.cs | 2 +- .../SolidColorTextureCacheTests.cs | 4 +- .../RetailSpellMetadataProjectorTests.cs | 4 +- .../Vfx/RetailDatLoaderTests.cs | 2 +- .../LiveHandshakeTests.cs | 6 +- .../EnvCellSoundEmitterInventoryTests.cs | 6 +- .../Audio/UiSoundTableResolutionTests.cs | 2 +- .../CottageDoorwayCharacterizationTests.cs | 8 +- .../Conformance/DatConcurrencyStressTests.cs | 4 +- .../DungeonLandblockDatProbeTests.cs | 2 +- .../FindCellListConformanceTests.cs | 6 +- .../HoltburgTorchFalloffProbeTests.cs | 2 +- .../Issue107SpawnDiagnosticTests.cs | 8 +- .../Conformance/Issue112MembershipTests.cs | 16 +-- .../Issue113DoorVanishDiagnosticTests.cs | 10 +- .../Issue113PhantomStairsDumpTests.cs | 14 +-- .../Conformance/Issue119TowerDumpTests.cs | 4 +- .../Issue119UpNullGfxObjDumpTests.cs | 4 +- .../StipplingSurfaceEquivalenceTests.cs | 2 +- .../ThresholdDivergenceDiagnosticTests.cs | 4 +- .../ThresholdPortalCrossingReplayTests.cs | 4 +- .../RetailActionIdentityRoundTripTests.cs | 2 +- .../Input/RetailActionMapReaderTests.cs | 2 +- ...Ap157SortingSphereFloodMeasurementTests.cs | 2 +- .../BoxIntersectsCellBspDifferentialTests.cs | 2 +- .../Physics/CameraCornerSealReplayTests.cs | 6 +- .../CellTransitFindTransitCellsBoxTests.cs | 2 +- .../Physics/CellTransitTests.cs | 4 +- .../Physics/DoorBugTrajectoryReplayTests.cs | 20 ++-- .../Physics/DoorCollisionApparatusTests.cs | 12 +-- .../Physics/DoorSetupGfxObjInspectionTests.cs | 6 +- .../Physics/FlatBspQueryDifferentialTests.cs | 2 +- .../Physics/FlatCollisionInstalledDatTests.cs | 4 +- .../HumanoidMotionTableRootMotionTests.cs | 6 +- .../Issue108CellarAscentViewerReplayTests.cs | 6 +- .../Issue137CorridorSeamInspectionTests.cs | 14 +-- .../Issue137CorridorSeamReplayTests.cs | 10 +- .../Issue147ArwicBuildingsDumpTests.cs | 2 +- .../Issue175HubDoorPoseInspectionTests.cs | 4 +- .../Physics/Issue176177SeamTransitLagTests.cs | 2 +- ...ue180CorridorSweepHysteresisReplayTests.cs | 2 +- ...186ConnectorCellGeometryInspectionTests.cs | 4 +- ...188FadingDoorMotionTableInspectionTests.cs | 2 +- ...sue337NeftetRockGeometryInspectionTests.cs | 8 +- .../Physics/MotionCommandCatalogDatTests.cs | 8 +- ...RestrictionObjPrevalenceInspectionTests.cs | 2 +- .../Issue176177DungeonSeamInspectionTests.cs | 16 +-- ...NetworkFountainRoomLightInspectionTests.cs | 6 +- .../Terrain/TerrainModernConformanceTests.cs | 2 +- .../HeadlessCredentialResolverTests.cs | 2 +- .../LauncherProcessSupervisorTests.cs | 10 +- .../LauncherExecutableSetTests.cs | 4 +- .../Profiles/LauncherProfileHardeningTests.cs | 2 +- .../Profiles/LauncherProfileStoreTests.cs | 4 +- .../Status/StatusFileTailerTests.cs | 2 +- .../Updates/ClientVersionStoreTests.cs | 2 +- tools/audit-test-inventory.ps1 | 11 +++ 113 files changed, 424 insertions(+), 336 deletions(-) diff --git a/docs/release-gate.md b/docs/release-gate.md index 473a3e5d..a75421e6 100644 --- a/docs/release-gate.md +++ b/docs/release-gate.md @@ -100,7 +100,22 @@ generator (the former chat/radar-only generators were redundant): $env:ACDREAM_REGENERATE_UI_FIXTURES = '1' $env:ACDREAM_DAT_DIR = 'C:\path\to\Asherons Call' dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release ` - --filter 'Lane=Manual' + --filter 'Lane=Manual&ManualTask=FixtureGeneration' +``` + +The retained live-DAT probes are manual evidence, not InstalledDat regression +contracts. Run each opt-in family independently so a probe command can never +regenerate fixtures as a side effect: + +```powershell +$env:ACDREAM_DAT_DIR = 'C:\path\to\Asherons Call' +$env:ACDREAM_PROBE_LIVE_MOUNT = '1' +dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release ` + --filter 'Lane=Manual&ManualTask=LiveMountProbe' + +$env:ACDREAM_PROBE_POWERBAR = '1' +dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release ` + --filter 'Lane=Manual&ManualTask=PowerbarProbe' ``` Known failures (`Status=KnownFailure`) are never part of a green release total. @@ -114,9 +129,9 @@ investigation output, and several methods require installed DATs: ```powershell dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release ` - --filter 'Purpose=Diagnostic' + --filter 'Purpose=Diagnostic&Lane!=Manual' dotnet test tests/AcDream.Core.Tests/AcDream.Core.Tests.csproj -c Release ` - --filter 'Purpose=Diagnostic' + --filter 'Purpose=Diagnostic&Lane!=Manual' ``` Operating-system contracts are likewise explicit. Run `Lane=Windows` on a diff --git a/docs/reviews/2026-08-18-r3-test-truth-ledger.md b/docs/reviews/2026-08-18-r3-test-truth-ledger.md index 45b7161f..8394e952 100644 --- a/docs/reviews/2026-08-18-r3-test-truth-ledger.md +++ b/docs/reviews/2026-08-18-r3-test-truth-ledger.md @@ -38,27 +38,27 @@ pwsh ./tools/audit-test-inventory.ps1 The generated JSON lives under ignored `artifacts/test-audit/`; it is not a second 6.8 MB checked-in source of truth. The script and this reviewed ledger are durable, while paths and line numbers regenerate after every batch. The -inventory at commit `8f490240` reports: +inventory refreshed for Batch G reports: | Syntax signal | Current count | |---|---:| | Tracked/parsed C# test files | 1,256 / 1,256 | -| Attributed test methods (not expanded theory cases) | 11,455 | -| Methods containing at least one empty `return;` | 399 | -| Empty-return sites | 426 | -| Prerequisite-return candidates | 282 | -| Mechanical output-only candidates | 47 | -| Methods directly using `Thread.Sleep` / `Task.Delay` | 20 / 23 | +| Attributed test methods (not expanded theory cases) | 11,450 | +| Methods containing at least one empty `return;` | 138 | +| Empty-return sites | 143 | +| Direct / same-file-helper prerequisite-return candidates | 2 / 1 | +| Mechanical output-only candidates | 2 | +| Reviewed diagnostic methods | 51 | +| Methods directly using `Thread.Sleep` / `Task.Delay` | 15 / 23 | | Methods directly reading environment variables | 47 | | Methods directly reading `.cs` source text | 63 | -The 282 prerequisite-return count is intentionally a review candidate set, not -a claim that all 399 methods are broken. It comprises 109 App, 125 Core, 29 -Content, 12 Launcher.Core, three Core.Net, three Bake, and one Headless method. -The classifier includes external-asset, opt-in, and platform gates; behavioral -early exits inside callback tests remain outside that candidate set. Every -candidate still requires source inspection because `Directory.Exists`, for -example, can also be the behavior under test. +The three remaining prerequisite-return candidates are all reviewed branch +false positives: the two Windows/Linux factory assertions and the launcher's +cross-platform directory-link helper. Every true prerequisite return found by +the inventory now fails explicitly inside its selected non-hermetic lane. The +remaining 143 empty returns are behavioral control flow, callback exits, or +the three platform branches; they are not missing-prerequisite passes. The output-only classifier follows same-file helper calls, but it cannot decide whether an assertion merely establishes probe setup. The reviewed diagnostic @@ -95,17 +95,16 @@ Installed-DAT skip distribution: | `TooltipLiveDatTests` | 7 | | `UiButtonCorpusSweepTests` | 3 | -There are also 11 source sites that throw `SkipException.ForSkip` conditionally. -They are not part of the current 77 because their prerequisites happened to be -available on the R2 gate machine. R3 must retain their per-test reason and -assign them to the installed-DAT, prepared-package, system-font, or other -explicit prerequisite lane; a future machine may report them as additional -skips. +The 11 source sites that conditionally threw `SkipException.ForSkip` were not +part of the R2 77 because their prerequisites happened to be available on that +machine. Batch G preserves their reasons but replaces the misleading dynamic- +skip exception with explicit lane-prerequisite failures. No static skip or +`SkipException.ForSkip` remains in current test source. The lane vocabulary is deliberately orthogonal: - `Lane` states the execution environment (`InstalledDat`, `PreparedPackage`, - `Live`, or `Manual`); + `Live`, `Manual`, `Windows`, `Linux`, or `SystemFont`); - `Purpose=Diagnostic` marks output/investigation apparatus that cannot add to the contract-test pass count; and - `Status=KnownFailure` keeps a named executable oracle visible without making @@ -127,7 +126,7 @@ identifiable in the lane report. | T-004 warning mismatches | resolved in R2 | Clean rebuild is zero-warning with repository-wide warnings-as-errors. | | T-005 unreachable panel stack | requires production reachability proof | Do not delete 52 meaningful tests until the dead presentation surface and any supported plugin compatibility promise are verified together. | | T-006 misleading installed-DAT reason | resolved in batch B | Shared opt-in is now `ACDREAM_RUN_INSTALLED_DAT_TESTS=1` (legacy switch retained), the reason names the lane, and all nine owners carry `Lane=InstalledDat`. | -| T-007 271 silent passing gates | lane classification complete in batch D; body cleanup active | Of 282 current candidates, 280 are true prerequisite gates and now have an explicit lane. The two unlaned methods are reviewed false positives that assert the current Windows/Linux branch before returning. Empty-return removal remains, lane by lane. | +| T-007 271 silent passing gates | resolved in batch G | All 280 directly found gates plus three later-reconciled sites now fail explicitly when their selected lane lacks its prerequisite. The only three syntax candidates left are reviewed cross-platform branch false positives. | | T-008 incapable-of-failing diagnostics | batch A plus diagnostic lane work | Delete the literal wiring smoke test; repair the GPU contract tautology; later re-home output-only apparatus. | | T-009 wall-clock double-click tests | resolved in batch E | Four sleeps were replaced by a deterministic test clock behind an internal factory overload. The production factory still reads `Environment.TickCount64` exactly as before. | | T-010 two useless cases | high-confidence cleanup batch A | Delete `SmokeTest.TestProject_IsWired` and `ChaseCameraTests.ImplementsICamera`; compilation already proves both claims. | @@ -370,3 +369,57 @@ warnings/errors, the refreshed inventory reports two explicit known-failure methods and 15 remaining direct `Thread.Sleep` methods, and the no-retry hermetic gate passed 14,391/14,391 with zero skips or failures. The one-pass reduction is exactly #321 leaving the release lane. + +## Batch G honest prerequisite lanes + +Batch G removes every true silent prerequisite pass found by the direct and +same-file-helper inventory. Across 101 test files, 283 lane-owned `return;` +sites now report a prerequisite failure when that lane was explicitly +selected: 261 installed-DAT, ten Linux, seven Windows, three Live, and two +prepared-package methods. Seventeen platform guards throw +`PlatformNotSupportedException`; the remaining gates use lane-specific +assertion failures. Production behavior and every contract assertion after the +guard are unchanged. + +The eleven conditional `SkipException.ForSkip` sites now use explicit +prerequisite failures as well. Their asset, package, or font reason is retained, +but a selected lane can no longer look green by dynamically skipping the +contract. The refreshed syntax inventory finds zero true silent-prerequisite +candidates. Its three remaining candidates are the reviewed Windows/Linux +branch returns recorded in Batch E. + +The focused installed-DAT run also exposed a taxonomy error rather than a +product failure: 19 interactive layout methods need a retail DAT directory but +are operator-driven probes, not automated DAT contracts. They now live under +`Lane=Manual`, divided into `ManualTask=LiveMountProbe` (13) and +`ManualTask=PowerbarProbe` (6). The comprehensive existing generator is +separately named `ManualTask=FixtureGeneration`, so selecting a probe cannot +rewrite committed fixtures. Current attributed-method lane ownership is: + +| Lane | Methods | +|---|---:| +| `InstalledDat` | 317 | +| `PreparedPackage` | 2 | +| `Live` | 3 | +| `Manual` | 20 | +| `Windows` | 7 | +| `Linux` | 10 | +| `SystemFont` | 2 | + +Focused verification before the complete gate: + +- Release build of all 44 maintained projects: 0 warnings, 0 errors; +- installed-DAT contracts: 311/311 passed (App 150, Bake 3, Content 28, + Core 130); +- prepared-package contracts: 2/2 passed against the validated local package; +- Windows contracts: 7/7 passed; system-font contracts: 2/2 passed; +- manual live-mount probes: 13/13 passed; manual powerbar probes: 6/6 passed; +- a Linux contract selected on Windows failed with the explicit wrong-host + reason; and +- a Live contract selected without opt-in failed with the explicit + `ACDREAM_LIVE=1`/reachable-server prerequisite reason. + +The fixture-generation task was intentionally not executed: its documented +purpose is to rewrite fixture files, while this R3 batch is review/test-only. +The no-retry complete hermetic Release gate passed 14,391/14,391 with zero +skips or failures across all 12 test assemblies. diff --git a/tests/AcDream.App.Tests/Credentials/AppCredentialResolverTests.cs b/tests/AcDream.App.Tests/Credentials/AppCredentialResolverTests.cs index 144a93c3..5c3077c2 100644 --- a/tests/AcDream.App.Tests/Credentials/AppCredentialResolverTests.cs +++ b/tests/AcDream.App.Tests/Credentials/AppCredentialResolverTests.cs @@ -135,7 +135,7 @@ public sealed class AppCredentialResolverTests public void LinuxRejectsGroupOrOtherCredentialPermissions() { if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); string path = Path.Combine( Path.GetTempPath(), diff --git a/tests/AcDream.App.Tests/Rendering/ChargenPreviewControllerTests.cs b/tests/AcDream.App.Tests/Rendering/ChargenPreviewControllerTests.cs index 2af34e64..95363d8a 100644 --- a/tests/AcDream.App.Tests/Rendering/ChargenPreviewControllerTests.cs +++ b/tests/AcDream.App.Tests/Rendering/ChargenPreviewControllerTests.cs @@ -49,7 +49,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_SameSelectionTwice_IsANoOpSecondTime() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -72,7 +72,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_HeritageChange_ResetsCameraToTheNewHeritagesDefaultEye() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -119,7 +119,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_AppearanceOnlyChange_LeavesTheCameraUntouched() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -147,7 +147,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_PreservesZoomState_AcrossAnAppearanceOnlyChange() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -178,7 +178,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_ThenRender_SeedsTheEntityHeadingToTheRetailDefault180Degrees() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -215,7 +215,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_HeritageWithEnvironmentSetupId_SetsANonNullBackdrop() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -250,7 +250,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_HeritageWithNoEnvironmentSetupId_LeavesTheBackdropAbsent() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -292,7 +292,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_HeritageChange_SwapsTheBackdropEntity() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -345,7 +345,7 @@ public sealed class ChargenPreviewControllerTests public void Rebuild_AppearanceOnlyChange_DoesNotRebuildTheBackdrop() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { @@ -371,7 +371,7 @@ public sealed class ChargenPreviewControllerTests public void Render_WhilePageInvisible_SkipsRenderAndTexturePublication() { if (!TryOpen(out DatCollection? dats, out DatCollectionAdapter? adapter)) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using (dats) using (adapter) { diff --git a/tests/AcDream.App.Tests/Rendering/ChargenPreviewEntityBuilderTests.cs b/tests/AcDream.App.Tests/Rendering/ChargenPreviewEntityBuilderTests.cs index 4cd35d74..07e7f459 100644 --- a/tests/AcDream.App.Tests/Rendering/ChargenPreviewEntityBuilderTests.cs +++ b/tests/AcDream.App.Tests/Rendering/ChargenPreviewEntityBuilderTests.cs @@ -30,7 +30,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuild_AluvianMaleDefaultSelection_ProducesANonEmptyStaticPoseEntity() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -88,7 +88,7 @@ public sealed class ChargenPreviewEntityBuilderTests ChargenPreviewEntityBuilder.SummaryPreviewBackdropRenderId); string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -122,7 +122,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuild_UnknownSetupId_ReturnsNull() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -146,7 +146,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuild_OlthoiHeritage_ResolvesADifferentRestPoseDidThanStandardHeritages() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -187,7 +187,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildAnimated_AluvianMaleDefaultSelection_ResolvesARealIdleCycle() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -233,7 +233,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildAnimated_UnknownSetupId_ReturnsNull() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -275,7 +275,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void OlthoiFamily_SharedIdleRestEnumKey_ResolvesToARealInstalledDid(uint sharedEnumKey) { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -298,7 +298,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildAnimated_OlthoiHeritage_ResolvesARealIdleAnimationToo() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -338,7 +338,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildBackdrop_AluvianHeritage_ResolvesANonEmptyMesh() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -377,7 +377,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildBackdrop_ExplicitRenderId_StampsThatIdOnTheEntity() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -406,7 +406,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildBackdrop_UnsetEnvironmentSetupId_ReturnsNull() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -420,7 +420,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildBackdrop_UnknownSetupId_ReturnsNull() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -441,7 +441,7 @@ public sealed class ChargenPreviewEntityBuilderTests public void TryBuildBackdrop_AllThirteenHeritages_ResolveOrAreReportedByName() { string? datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.App.Tests/Rendering/CornerFloodReplayTests.cs b/tests/AcDream.App.Tests/Rendering/CornerFloodReplayTests.cs index 0abff4e9..5c6be3b6 100644 --- a/tests/AcDream.App.Tests/Rendering/CornerFloodReplayTests.cs +++ b/tests/AcDream.App.Tests/Rendering/CornerFloodReplayTests.cs @@ -202,7 +202,7 @@ public class CornerFloodReplayTests public void Diagnostic_TraceGoodVsGlitchStep() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadBuilding(dats); @@ -271,7 +271,7 @@ public class CornerFloodReplayTests public void CornerSweep_FloodIsCompleteAndMonotone() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadBuilding(dats); @@ -369,7 +369,7 @@ public class CornerFloodReplayTests public void PortalPlaneCrossings_InPlacePropagationConverges() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadBuilding(dats); @@ -440,7 +440,7 @@ public class CornerFloodReplayTests public void InCellDirectionSweep_InPlacePropagationConverges() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadBuilding(dats); @@ -503,7 +503,7 @@ public class CornerFloodReplayTests public void Diagnostic_Hop2Microscope() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadBuilding(dats); @@ -634,7 +634,7 @@ public class CornerFloodReplayTests public void Diagnostic_CornerPress_FloodAcrossDoorwayPlane() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadBuilding(dats); diff --git a/tests/AcDream.App.Tests/Rendering/FramePacingControllerTests.cs b/tests/AcDream.App.Tests/Rendering/FramePacingControllerTests.cs index 7d9eaf5b..2af12d41 100644 --- a/tests/AcDream.App.Tests/Rendering/FramePacingControllerTests.cs +++ b/tests/AcDream.App.Tests/Rendering/FramePacingControllerTests.cs @@ -123,7 +123,7 @@ public sealed class FramePacingControllerTests public void Windows_high_resolution_timer_arms_and_disposes_its_handle() { if (!OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134)) - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); using var timer = WindowsHighResolutionFramePacingWaiter.Create(); timer.Wait(1, System.Diagnostics.Stopwatch.Frequency); diff --git a/tests/AcDream.App.Tests/Rendering/HouseExitWalkReplayTests.cs b/tests/AcDream.App.Tests/Rendering/HouseExitWalkReplayTests.cs index e16970a3..5cef3074 100644 --- a/tests/AcDream.App.Tests/Rendering/HouseExitWalkReplayTests.cs +++ b/tests/AcDream.App.Tests/Rendering/HouseExitWalkReplayTests.cs @@ -372,7 +372,7 @@ public class HouseExitWalkReplayTests public void ExitWalk_PlayerStaysConeVisible_EveryStep() { var steps = RunExitWalk(); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var failures = steps.FindAll(s => !s.ConeVisible); if (failures.Count > 0) @@ -394,7 +394,7 @@ public class HouseExitWalkReplayTests public void ExitWalk_PlayerSurvivesSealDepth_WhenConeVisible() { var steps = RunExitWalk(); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var applicable = steps.FindAll(s => s.DepthCheckApplies); _out.WriteLine($"depth check applies on {applicable.Count}/{steps.Count} steps"); @@ -420,7 +420,7 @@ public class HouseExitWalkReplayTests public void ExitWalk_StraddlingPlayerDrawsInOutsideStage() { var steps = RunExitWalk(); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var straddling = steps.FindAll(s => s.RootCellId != 0u && MathF.Abs(s.CenterS) < PlayerSphereRadius); @@ -440,7 +440,7 @@ public class HouseExitWalkReplayTests public void Diagnostic_ExitWalk_PerStepTable() { var steps = RunExitWalk(); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); DumpSteps(steps); // transition summary int firstOutPlayer = steps.FindIndex(s => s.CenterS > 0f); @@ -460,7 +460,7 @@ public class HouseExitWalkReplayTests public void Diagnostic_StaleRootWindow_EyeJustOutside() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = CornerFloodReplayTests.LoadBuilding(dats); diff --git a/tests/AcDream.App.Tests/Rendering/Issue113DrawingBspFilterTests.cs b/tests/AcDream.App.Tests/Rendering/Issue113DrawingBspFilterTests.cs index 5cabba02..10a165e1 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue113DrawingBspFilterTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue113DrawingBspFilterTests.cs @@ -40,7 +40,7 @@ public class Issue113DrawingBspFilterTests public void MeetingHall_OrphanStairPolys_AreExcludedFromDrawSet() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var hall = dats.Get(0x010014C3u)!; @@ -60,7 +60,7 @@ public class Issue113DrawingBspFilterTests public void HillCottage_OrphanPolys_AreExcludedFromDrawSet() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cottage = dats.Get(0x01000827u)!; diff --git a/tests/AcDream.App.Tests/Rendering/Issue113MeetingHallFloodTests.cs b/tests/AcDream.App.Tests/Rendering/Issue113MeetingHallFloodTests.cs index 7b379aba..1abe9e82 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue113MeetingHallFloodTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue113MeetingHallFloodTests.cs @@ -181,7 +181,7 @@ public class Issue113MeetingHallFloodTests public void WestApproach_HallCellSlices_HaveUsableClip() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadHall(dats); diff --git a/tests/AcDream.App.Tests/Rendering/Issue120ReciprocalPingPongTests.cs b/tests/AcDream.App.Tests/Rendering/Issue120ReciprocalPingPongTests.cs index 403f08a5..c8e2d16a 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue120ReciprocalPingPongTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue120ReciprocalPingPongTests.cs @@ -79,7 +79,7 @@ public class Issue120ReciprocalPingPongTests public void CapturedPingPongSites_Converge(uint landblock, uint lowA, uint lowB, float ex, float ey, float ez) { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadAllInteriorCells(dats, landblock); @@ -136,7 +136,7 @@ public class Issue120ReciprocalPingPongTests { _ = ex; _ = ey; _ = ez; // geometric variant derives its own eyes var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = LoadAllInteriorCells(dats, landblock); diff --git a/tests/AcDream.App.Tests/Rendering/Issue124LookInSeedRegionTests.cs b/tests/AcDream.App.Tests/Rendering/Issue124LookInSeedRegionTests.cs index 775a8b9f..3d2fc822 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue124LookInSeedRegionTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue124LookInSeedRegionTests.cs @@ -89,7 +89,7 @@ public class Issue124LookInSeedRegionTests public void SeedRegion_ContainingAperture_Floods_DisjointRegion_DoesNot() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (cells, exitCell, exitIdx, centroid, outward) = LoadFixture(dats); LoadedCell? Lookup(uint id) => cells.TryGetValue(id, out var c) ? c : null; @@ -138,7 +138,7 @@ public class Issue124LookInSeedRegionTests // interior-root gather pass ALL nearby buildings including the // viewer's own without special-casing. var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (cells, exitCell, _, centroid, outward) = LoadFixture(dats); LoadedCell? Lookup(uint id) => cells.TryGetValue(id, out var c) ? c : null; diff --git a/tests/AcDream.App.Tests/Rendering/Issue130DoorwayStripTests.cs b/tests/AcDream.App.Tests/Rendering/Issue130DoorwayStripTests.cs index 4c643f8b..bddea864 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue130DoorwayStripTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue130DoorwayStripTests.cs @@ -60,7 +60,7 @@ public class Issue130DoorwayStripTests public void Diagnostic_ExitDoorTopEdge_GateVsAperture() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = CornerFloodReplayTests.LoadBuilding(dats); @@ -213,7 +213,7 @@ public class Issue130DoorwayStripTests public void UnliftedGate_LeavesTheStripAtTheDrawnTopEdge() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = CornerFloodReplayTests.LoadBuilding(dats); diff --git a/tests/AcDream.App.Tests/Rendering/Issue131SetupProbeTests.cs b/tests/AcDream.App.Tests/Rendering/Issue131SetupProbeTests.cs index 7f6b7ccb..6a544e6d 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue131SetupProbeTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue131SetupProbeTests.cs @@ -30,7 +30,7 @@ public class Issue131SetupProbeTests public void Diagnostic_LookInFlood_AdmitsHallPorchFromCottage() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, 0xA9B40000u); @@ -68,7 +68,7 @@ public class Issue131SetupProbeTests public void Diagnostic_DumpOutstageCandidateSetups() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); uint[] candidates = diff --git a/tests/AcDream.App.Tests/Rendering/Issue176177FacilityHubFloodReplayTests.cs b/tests/AcDream.App.Tests/Rendering/Issue176177FacilityHubFloodReplayTests.cs index 6307eecd..573ec736 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue176177FacilityHubFloodReplayTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue176177FacilityHubFloodReplayTests.cs @@ -68,7 +68,7 @@ public class Issue176177FacilityHubFloodReplayTests public void ScenarioA_StairApproach_AdmissionsFromCorridor() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); Assert.True(cells.ContainsKey(FacilityHub | 0x0178u), "0x0178 not loaded"); @@ -103,7 +103,7 @@ public class Issue176177FacilityHubFloodReplayTests public void Diagnostic_ScenarioB_StairDescent_RampCellRetention() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); @@ -146,7 +146,7 @@ public class Issue176177FacilityHubFloodReplayTests public void Diagnostic_ScenarioC_CorridorSeamGazeSweep_Bistability() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); @@ -222,7 +222,7 @@ public class Issue176177FacilityHubFloodReplayTests uint rootLow, uint forwardLow, float planeX, float eyeZ) { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); @@ -247,7 +247,7 @@ public class Issue176177FacilityHubFloodReplayTests public void Diagnostic_ScenarioD_CorridorWalk_PerStepChurn() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); diff --git a/tests/AcDream.App.Tests/Rendering/Issue177StairDescentCameraFloodTests.cs b/tests/AcDream.App.Tests/Rendering/Issue177StairDescentCameraFloodTests.cs index 357f5a96..6262ee7f 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue177StairDescentCameraFloodTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue177StairDescentCameraFloodTests.cs @@ -110,7 +110,7 @@ public class Issue177StairDescentCameraFloodTests public void Diagnostic_StairCellComposition_ShellVsStatics() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint low in new uint[] { 0x01C8, 0x01C4, 0x01C9, 0x0210, 0x020E, 0x01C1, 0x01C0 }) @@ -172,7 +172,7 @@ public class Issue177StairDescentCameraFloodTests public void Diagnostic_RealStaircase_FineYawZoomSweep_FindKnifeEdge() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var renderCells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); var engine = BuildHubEngine(dats); @@ -235,7 +235,7 @@ public class Issue177StairDescentCameraFloodTests public void Diagnostic_FloodDepthFrom015E_VsRetail26() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var renderCells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); var engine = BuildHubEngine(dats); @@ -296,7 +296,7 @@ public class Issue177StairDescentCameraFloodTests public void EdgeOnCeilingPortal_DropsUpperCell_OffPlaneReadmits() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); Func lookup = id => cells.TryGetValue(id, out var c) ? c : null; @@ -357,7 +357,7 @@ public class Issue177StairDescentCameraFloodTests public void Diagnostic_StaircaseSweep_EyeClearanceFromCeilingPortal() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var renderCells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); var engine = BuildHubEngine(dats); @@ -404,7 +404,7 @@ public class Issue177StairDescentCameraFloodTests public void Diagnostic_ParkedYawZoomSweep_StairAdmission(float px, uint pcell, string label) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var renderCells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); var engine = BuildHubEngine(dats); @@ -461,7 +461,7 @@ public class Issue177StairDescentCameraFloodTests public void Diagnostic_Descent_RealCameraSweep_StairCellRetention() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var renderCells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); diff --git a/tests/AcDream.App.Tests/Rendering/Issue181VisFlapReplayTests.cs b/tests/AcDream.App.Tests/Rendering/Issue181VisFlapReplayTests.cs index d6e4efec..3796659b 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue181VisFlapReplayTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue181VisFlapReplayTests.cs @@ -61,7 +61,7 @@ public class Issue181VisFlapReplayTests public void Diagnostic_FlappingCellViewRegion_SliverOrLarge() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); uint flapper = FacilityHub | 0x0181u; @@ -120,7 +120,7 @@ public class Issue181VisFlapReplayTests public void Diagnostic_SubMillimeterEyePerturbation_MustNotChangeAdmission() { var datDir = CornerFloodReplayTests.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cells = Issue120ReciprocalPingPongTests.LoadAllInteriorCells(dats, FacilityHub); Assert.True(cells.ContainsKey(LiveRoot), "live root 0x0142 not loaded"); diff --git a/tests/AcDream.App.Tests/Rendering/Issue181WallPressEquilibriumTests.cs b/tests/AcDream.App.Tests/Rendering/Issue181WallPressEquilibriumTests.cs index 5f5fee5b..54506c2d 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue181WallPressEquilibriumTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue181WallPressEquilibriumTests.cs @@ -82,7 +82,7 @@ public class Issue181WallPressEquilibriumTests public void Diagnostic_WallPressedCamera_EyeWanderAndViewerCellStability() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (engine, _) = BuildCorridorEngine(dats); diff --git a/tests/AcDream.App.Tests/Rendering/Issue95DungeonFloodDiagnosticTests.cs b/tests/AcDream.App.Tests/Rendering/Issue95DungeonFloodDiagnosticTests.cs index a1bce2f9..fabbc753 100644 --- a/tests/AcDream.App.Tests/Rendering/Issue95DungeonFloodDiagnosticTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Issue95DungeonFloodDiagnosticTests.cs @@ -52,7 +52,7 @@ public class Issue95DungeonFloodDiagnosticTests _out.WriteLine("SKIP: dat dir did not resolve (ACDREAM_DAT_DIR unset and " + "%USERPROFILE%\\Documents\\Asheron's Call absent). No numbers measured."); // Diagnostic test: do not hard-fail when dats are absent (matches sibling harnesses). - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } _out.WriteLine($"dat dir resolved: {datDir}"); diff --git a/tests/AcDream.App.Tests/Rendering/LinuxMonotonicFramePacingWaiterTests.cs b/tests/AcDream.App.Tests/Rendering/LinuxMonotonicFramePacingWaiterTests.cs index e62336fd..51c5d5c3 100644 --- a/tests/AcDream.App.Tests/Rendering/LinuxMonotonicFramePacingWaiterTests.cs +++ b/tests/AcDream.App.Tests/Rendering/LinuxMonotonicFramePacingWaiterTests.cs @@ -52,7 +52,7 @@ public sealed class LinuxMonotonicFramePacingWaiterTests public void LinuxWaitBlocksUntilRequestedMonotonicDeadline() { if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); LinuxMonotonicFramePacingWaiter waiter = LinuxMonotonicFramePacingWaiter.Create(); @@ -75,7 +75,7 @@ public sealed class LinuxMonotonicFramePacingWaiterTests public void LinuxWaiterRejectsUseAfterDisposal() { if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); LinuxMonotonicFramePacingWaiter waiter = LinuxMonotonicFramePacingWaiter.Create(); diff --git a/tests/AcDream.App.Tests/Rendering/PortalTunnelAssetTests.cs b/tests/AcDream.App.Tests/Rendering/PortalTunnelAssetTests.cs index a913d15d..47f548bb 100644 --- a/tests/AcDream.App.Tests/Rendering/PortalTunnelAssetTests.cs +++ b/tests/AcDream.App.Tests/Rendering/PortalTunnelAssetTests.cs @@ -7,7 +7,6 @@ using DatReaderWriter; using DatReaderWriter.DBObjs; using DatReaderWriter.Enums; using DatReaderWriter.Options; -using Xunit.Sdk; namespace AcDream.App.Tests.Rendering; @@ -57,8 +56,8 @@ public sealed class PortalTunnelAssetTests { string? datDir = ResolveDatDir(); if (datDir is null) - throw SkipException.ForSkip( - "Installed client_portal.dat is required for the portal-space asset gate."); + throw new InvalidOperationException( + "Lane=InstalledDat requires client_portal.dat for the portal-space asset gate; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); uint setupDid = RetailDataIdResolver.Resolve( diff --git a/tests/AcDream.App.Tests/Rendering/RetailParticleGeometryClassifierTests.cs b/tests/AcDream.App.Tests/Rendering/RetailParticleGeometryClassifierTests.cs index 0a1f7421..ccd80358 100644 --- a/tests/AcDream.App.Tests/Rendering/RetailParticleGeometryClassifierTests.cs +++ b/tests/AcDream.App.Tests/Rendering/RetailParticleGeometryClassifierTests.cs @@ -8,7 +8,6 @@ using DatReaderWriter.DBObjs; using DatReaderWriter.Enums; using DatReaderWriter.Options; using DatReaderWriter.Types; -using Xunit.Sdk; namespace AcDream.App.Tests.Rendering; @@ -211,8 +210,8 @@ public sealed class RetailParticleGeometryClassifierTests { string? datDir = ResolveDatDir(); if (datDir is null) - throw SkipException.ForSkip( - "Installed client_portal.dat is required for the Armor Self asset-chain gate."); + throw new InvalidOperationException( + "Lane=InstalledDat requires client_portal.dat for the Armor Self asset-chain gate; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var tableResolver = new PhysicsScriptTableResolver( @@ -270,7 +269,8 @@ public sealed class RetailParticleGeometryClassifierTests { string? datDir = ResolveDatDir(); if (datDir is null) - throw SkipException.ForSkip("Installed client_portal.dat is required."); + throw new InvalidOperationException( + "Lane=InstalledDat requires client_portal.dat; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var resolver = new PhysicsScriptTableResolver(id => dats.Get(id)); @@ -285,7 +285,8 @@ public sealed class RetailParticleGeometryClassifierTests { string? datDir = ResolveDatDir(); if (datDir is null) - throw SkipException.ForSkip("Installed client_portal.dat is required."); + throw new InvalidOperationException( + "Lane=InstalledDat requires client_portal.dat; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var emitters = new EmitterDescRegistry(dats); diff --git a/tests/AcDream.App.Tests/Rendering/RetailSelectionAssetTests.cs b/tests/AcDream.App.Tests/Rendering/RetailSelectionAssetTests.cs index 8be5c77e..98b4a3a2 100644 --- a/tests/AcDream.App.Tests/Rendering/RetailSelectionAssetTests.cs +++ b/tests/AcDream.App.Tests/Rendering/RetailSelectionAssetTests.cs @@ -8,7 +8,6 @@ using AcDream.Core.Selection; using DatReaderWriter; using DatReaderWriter.DBObjs; using DatReaderWriter.Options; -using Xunit.Sdk; using SysEnv = System.Environment; namespace AcDream.App.Tests.Rendering; @@ -116,6 +115,7 @@ public sealed class RetailSelectionAssetTests if (File.Exists(Path.Combine(conventional, "client_portal.dat"))) return conventional; - throw SkipException.ForSkip("Installed client_portal.dat is required."); + throw new InvalidOperationException( + "Lane=InstalledDat requires client_portal.dat; see docs/release-gate.md."); } } diff --git a/tests/AcDream.App.Tests/Streaming/LandblockBuildFactoryTests.cs b/tests/AcDream.App.Tests/Streaming/LandblockBuildFactoryTests.cs index bbd67b22..17a7e2ed 100644 --- a/tests/AcDream.App.Tests/Streaming/LandblockBuildFactoryTests.cs +++ b/tests/AcDream.App.Tests/Streaming/LandblockBuildFactoryTests.cs @@ -8,7 +8,6 @@ using AcDream.Core.World; using DatReaderWriter; using DatReaderWriter.DBObjs; using DatReaderWriter.Types; -using Xunit.Sdk; namespace AcDream.App.Tests.Streaming; @@ -348,7 +347,8 @@ public sealed class LandblockBuildFactoryTests { string? datDirectory = ResolveDatDirectory(); if (datDirectory is null) - throw SkipException.ForSkip("Installed retail DATs are required."); + throw new InvalidOperationException( + "Lane=PreparedPackage requires installed retail DATs; see docs/release-gate.md."); using var dat = new BoundedTestDatCollection(datDirectory); var bounded = (IDatReaderWriter)dat; @@ -358,7 +358,8 @@ public sealed class LandblockBuildFactoryTests Assert.True(heights.Length >= 256); string? pakPath = ResolvePreparedPackagePath(datDirectory); if (pakPath is null) - throw SkipException.ForSkip("Installed acdream.pak is required."); + throw new InvalidOperationException( + "Lane=PreparedPackage requires a validated acdream.pak; see docs/release-gate.md."); using var prepared = new PakPreparedAssetSource(pakPath, bounded); var factory = new LandblockBuildFactory( bounded, diff --git a/tests/AcDream.App.Tests/UI/IconComposerTests.cs b/tests/AcDream.App.Tests/UI/IconComposerTests.cs index 619b91eb..4b2f6a67 100644 --- a/tests/AcDream.App.Tests/UI/IconComposerTests.cs +++ b/tests/AcDream.App.Tests/UI/IconComposerTests.cs @@ -80,7 +80,7 @@ public class IconComposerTests { var datDir = ResolveDatDir(); if (datDir is null) - return; // dats absent (CI) — skip cleanly + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip cleanly using var dats = new DatCollection(datDir, DatAccessType.Read); // TextureCache is not needed for the resolve path; pass a null-safe stub @@ -108,7 +108,7 @@ public class IconComposerTests public void ResolveEffectDid_goldenValues_matchDat() { var datDir = ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip cleanly + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip cleanly using var dats = new DatCollection(datDir, DatAccessType.Read); var composer = new IconComposer(dats, null!); @@ -134,7 +134,7 @@ public class IconComposerTests public void TryGetEffectTile_noEffectBlack_magicalTextured() { var datDir = ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip cleanly + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip cleanly using var dats = new DatCollection(datDir, DatAccessType.Read); var composer = new IconComposer(dats, null!); diff --git a/tests/AcDream.App.Tests/UI/Layout/CharacterLayoutImportProbe.cs b/tests/AcDream.App.Tests/UI/Layout/CharacterLayoutImportProbe.cs index 352098b0..b73f6936 100644 --- a/tests/AcDream.App.Tests/UI/Layout/CharacterLayoutImportProbe.cs +++ b/tests/AcDream.App.Tests/UI/Layout/CharacterLayoutImportProbe.cs @@ -28,7 +28,7 @@ public sealed class CharacterLayoutImportProbe public void Selected_attribute_shows_raise_buttons_on_visible_footer_state() { var datDir = DatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var layout = LayoutImporter.Import(dats, CharacterLayout, _ => (1u, 30, 26), null); @@ -59,7 +59,7 @@ public sealed class CharacterLayoutImportProbe public void Close_button_resolves_and_invokes_controller_close_callback() { var datDir = DatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var layout = LayoutImporter.Import(dats, CharacterLayout, _ => (1u, 30, 26), null); @@ -81,7 +81,7 @@ public sealed class CharacterLayoutImportProbe public void Footer_title_exposes_retail_append_text_palette() { string? datDir = DatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); ImportedLayout? layout = LayoutImporter.Import( diff --git a/tests/AcDream.App.Tests/UI/Layout/ChatIndicatorButtonLiveMountProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/ChatIndicatorButtonLiveMountProbeTests.cs index 1fbc6e1f..52d3dbdf 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ChatIndicatorButtonLiveMountProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ChatIndicatorButtonLiveMountProbeTests.cs @@ -54,14 +54,15 @@ namespace AcDream.App.Tests.UI.Layout; /// see its own class doc) are unaffected. /// /// -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "LiveMountProbe")] public sealed class ChatIndicatorButtonLiveMountProbeTests { [Fact] public void IndicatorButtons_ResolveNormalStateAtRest_ThroughTheLiveImportPath() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/ChatOptionsDatDefaultsTests.cs b/tests/AcDream.App.Tests/UI/Layout/ChatOptionsDatDefaultsTests.cs index e28b9693..a1ed8cb4 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ChatOptionsDatDefaultsTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ChatOptionsDatDefaultsTests.cs @@ -1,7 +1,6 @@ using AcDream.App.UI.Layout; using DatReaderWriter; using DatReaderWriter.Options; -using Xunit.Sdk; using SysEnv = System.Environment; namespace AcDream.App.Tests.UI.Layout; @@ -53,6 +52,7 @@ public sealed class ChatOptionsDatDefaultsTests if (File.Exists(Path.Combine(conventional, "client_portal.dat"))) return conventional; - throw SkipException.ForSkip("Installed client_portal.dat is required."); + throw new InvalidOperationException( + "Lane=InstalledDat requires client_portal.dat; see docs/release-gate.md."); } } diff --git a/tests/AcDream.App.Tests/UI/Layout/FaPanelSlotProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/FaPanelSlotProbeTests.cs index 5a8e0520..a4059171 100644 --- a/tests/AcDream.App.Tests/UI/Layout/FaPanelSlotProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/FaPanelSlotProbeTests.cs @@ -15,14 +15,15 @@ namespace AcDream.App.Tests.UI.Layout; /// and 0x10000263 (swear-allegiance button). Env-gated like the other probes. /// [Trait("Purpose", "Diagnostic")] -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "LiveMountProbe")] public sealed class FaPanelSlotProbeTests { [Fact] public void ProbePanelSlotTable() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/InventoryFrameImportProbe.cs b/tests/AcDream.App.Tests/UI/Layout/InventoryFrameImportProbe.cs index 3925141e..ae205d9c 100644 --- a/tests/AcDream.App.Tests/UI/Layout/InventoryFrameImportProbe.cs +++ b/tests/AcDream.App.Tests/UI/Layout/InventoryFrameImportProbe.cs @@ -41,7 +41,7 @@ public class InventoryFrameImportProbe public void Paperdoll_equip_slots_resolve_to_item_lists() { var datDir = DatDir(); - if (datDir is null) return; // CI: no live dat — skip + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI: no live dat — skip using var dats = new DatCollection(datDir, DatAccessType.Read); var layout = LayoutImporter.Import(dats, Frame, _ => (0u, 0, 0), null); @@ -61,7 +61,7 @@ public class InventoryFrameImportProbe public void Mounted_panels_sit_in_front_of_the_backdrop() { var datDir = DatDir(); - if (datDir is null) return; // CI: no live dat — skip (this is a smoke test) + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI: no live dat — skip (this is a smoke test) using var dats = new DatCollection(datDir, DatAccessType.Read); var layout = LayoutImporter.Import(dats, Frame, _ => (0u, 0, 0), null); @@ -93,7 +93,7 @@ public class InventoryFrameImportProbe public void Close_button_resolves_and_invokes_controller_close_callback() { var datDir = DatDir(); - if (datDir is null) return; // CI: no live dat - skip + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI: no live dat - skip using var dats = new DatCollection(datDir, DatAccessType.Read); var layout = LayoutImporter.Import(dats, Frame, _ => (0u, 0, 0), null); diff --git a/tests/AcDream.App.Tests/UI/Layout/ItemAppraisalTextFormatterTests.cs b/tests/AcDream.App.Tests/UI/Layout/ItemAppraisalTextFormatterTests.cs index e4d66bd5..d34bb6a2 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ItemAppraisalTextFormatterTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ItemAppraisalTextFormatterTests.cs @@ -754,7 +754,7 @@ public sealed class ItemAppraisalTextFormatterTests { string? datDirectory = ResolveDatDirectory(); if (datDirectory is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new AcDream.App.Tests.BoundedTestDatCollection(datDirectory); diff --git a/tests/AcDream.App.Tests/UI/Layout/ItemListCellTemplateTests.cs b/tests/AcDream.App.Tests/UI/Layout/ItemListCellTemplateTests.cs index f4facea0..33238fcf 100644 --- a/tests/AcDream.App.Tests/UI/Layout/ItemListCellTemplateTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/ItemListCellTemplateTests.cs @@ -39,7 +39,7 @@ public class ItemListCellTemplateTests public void Inventory_lists_resolve_a_real_nongeneric_empty_sprite() { var datDir = DatDir(); - if (datDir is null) return; // CI: no live dat — skip (smoke test) + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI: no live dat — skip (smoke test) using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -62,7 +62,7 @@ public class ItemListCellTemplateTests public void Inventory_lists_resolve_the_pinned_retail_sprites() { var datDir = DatDir(); - if (datDir is null) return; // CI: no live dat — skip + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI: no live dat — skip using var dats = new DatCollection(datDir, DatAccessType.Read); // Pinned from the live dat + the 2026-06-22 visual gate. Contents = the 32x32 prototype's @@ -78,7 +78,7 @@ public class ItemListCellTemplateTests public void Spell_favorite_list_resolves_its_cross_layout_pinned_empty_sprite() { var datDir = DatDir(); - if (datDir is null) return; // CI: no live dat — skip + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI: no live dat — skip using var dats = new DatCollection(datDir, DatAccessType.Read); ElementInfo infos = Assert.IsType( @@ -98,7 +98,7 @@ public class ItemListCellTemplateTests public void Shared_UIItem_resolves_all_ten_cooldown_overlays() { var datDir = DatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); ItemCooldownAssets? assets = ItemCooldownAssets.TryLoad(dats); diff --git a/tests/AcDream.App.Tests/UI/Layout/KeyboardConfigLiveMountProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/KeyboardConfigLiveMountProbeTests.cs index 2ba9e7da..430e2114 100644 --- a/tests/AcDream.App.Tests/UI/Layout/KeyboardConfigLiveMountProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/KeyboardConfigLiveMountProbeTests.cs @@ -16,14 +16,15 @@ namespace AcDream.App.Tests.UI.Layout; /// rect + caption evidence for each observation. Env-gated like the other /// live probes so CI/dat-less runs skip it. /// -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "LiveMountProbe")] public sealed class KeyboardConfigLiveMountProbeTests { [Fact] public void ProbeKeyboardLiveMount() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -159,7 +160,7 @@ public sealed class KeyboardConfigLiveMountProbeTests public void ProbeKeyboardFontsAndKeyNameStrings() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/MapHousePanelSlotProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/MapHousePanelSlotProbeTests.cs index 18b02e1e..dff18296 100644 --- a/tests/AcDream.App.Tests/UI/Layout/MapHousePanelSlotProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/MapHousePanelSlotProbeTests.cs @@ -26,7 +26,8 @@ namespace AcDream.App.Tests.UI.Layout; /// /// [Trait("Purpose", "Diagnostic")] -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "LiveMountProbe")] public sealed class MapHousePanelSlotProbeTests { private const uint HostLayoutId = 0x2100006Eu; @@ -48,7 +49,7 @@ public sealed class MapHousePanelSlotProbeTests public void ProbeMapHousePanelSlot() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/OptionsPanelLiveMountProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/OptionsPanelLiveMountProbeTests.cs index 7fca9a45..3a6ca908 100644 --- a/tests/AcDream.App.Tests/UI/Layout/OptionsPanelLiveMountProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/OptionsPanelLiveMountProbeTests.cs @@ -16,7 +16,8 @@ namespace AcDream.App.Tests.UI.Layout; /// page controller actually resolves. Env-gated like the fixture /// generator so CI/dat-less runs skip it. /// -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "LiveMountProbe")] public sealed class OptionsPanelLiveMountProbeTests { [Fact] @@ -24,7 +25,7 @@ public sealed class OptionsPanelLiveMountProbeTests public void ProbeLiveMountShapes() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -99,7 +100,7 @@ public sealed class OptionsPanelLiveMountProbeTests public void ProbeConfigMenuChrome() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -176,7 +177,7 @@ public sealed class OptionsPanelLiveMountProbeTests public void ProbeConfigMenuPopupChrome() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -320,7 +321,7 @@ public sealed class OptionsPanelLiveMountProbeTests public void ProbeMenuPopupSizingAndTextStyle() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -452,7 +453,7 @@ public sealed class OptionsPanelLiveMountProbeTests public void ProbeChatOpacityCaptions() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -486,7 +487,7 @@ public sealed class OptionsPanelLiveMountProbeTests public void ProbeFilterLabelHome() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/PaperdollClickMapTests.cs b/tests/AcDream.App.Tests/UI/Layout/PaperdollClickMapTests.cs index e9c85a2c..bd94630f 100644 --- a/tests/AcDream.App.Tests/UI/Layout/PaperdollClickMapTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/PaperdollClickMapTests.cs @@ -53,7 +53,7 @@ public sealed class PaperdollClickMapTests Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Documents", "Asheron's Call"); - if (!Directory.Exists(datDir)) return; + if (!Directory.Exists(datDir)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); PaperdollClickMap map = Assert.IsType(PaperdollClickMap.Load(dats)); diff --git a/tests/AcDream.App.Tests/UI/Layout/PaperdollSlotBackgroundTests.cs b/tests/AcDream.App.Tests/UI/Layout/PaperdollSlotBackgroundTests.cs index 90999c0c..31b2a9cd 100644 --- a/tests/AcDream.App.Tests/UI/Layout/PaperdollSlotBackgroundTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/PaperdollSlotBackgroundTests.cs @@ -53,7 +53,7 @@ public class PaperdollSlotBackgroundTests string datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Documents", "Asheron's Call"); - if (!Directory.Exists(datDir)) return; + if (!Directory.Exists(datDir)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); IReadOnlyDictionary actual = PaperdollSlotBackgrounds.ResolveEmptySprites(dats); diff --git a/tests/AcDream.App.Tests/UI/Layout/PowerbarLayoutProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/PowerbarLayoutProbeTests.cs index 22ede98e..a7dc15f9 100644 --- a/tests/AcDream.App.Tests/UI/Layout/PowerbarLayoutProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/PowerbarLayoutProbeTests.cs @@ -15,7 +15,8 @@ namespace AcDream.App.Tests.UI.Layout; /// INSTALLED DAT, so the "Height"/"Power"/"Accuracy" fix binds exactly what /// retail authors instead of guessing. /// -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "PowerbarProbe")] public sealed class PowerbarLayoutProbeTests { [Fact] @@ -23,7 +24,7 @@ public sealed class PowerbarLayoutProbeTests public void ProbePowerbarAuthoredStrings() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1") - return; + Assert.Fail("Lane=Manual powerbar probe requires ACDREAM_PROBE_POWERBAR=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -44,7 +45,7 @@ public sealed class PowerbarLayoutProbeTests public void ProbeFriendsRowTemplate() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1") - return; + Assert.Fail("Lane=Manual powerbar probe requires ACDREAM_PROBE_POWERBAR=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -81,7 +82,7 @@ public sealed class PowerbarLayoutProbeTests public void ProbeSecureTradeLayout() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1") - return; + Assert.Fail("Lane=Manual powerbar probe requires ACDREAM_PROBE_POWERBAR=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -114,7 +115,7 @@ public sealed class PowerbarLayoutProbeTests public void ProbeTotalItemsTemplate() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1") - return; + Assert.Fail("Lane=Manual powerbar probe requires ACDREAM_PROBE_POWERBAR=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -153,7 +154,7 @@ public sealed class PowerbarLayoutProbeTests public void ProbeUiItemCatalog() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1") - return; + Assert.Fail("Lane=Manual powerbar probe requires ACDREAM_PROBE_POWERBAR=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -176,7 +177,7 @@ public sealed class PowerbarLayoutProbeTests public void ProbeCharacterSelectRowTemplate() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_POWERBAR") != "1") - return; + Assert.Fail("Lane=Manual powerbar probe requires ACDREAM_PROBE_POWERBAR=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs b/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs index 9505993a..be251a59 100644 --- a/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs +++ b/tests/AcDream.App.Tests/UI/Layout/RetailLayoutFixtureGenerator.cs @@ -13,6 +13,7 @@ namespace AcDream.App.Tests.UI.Layout; /// normal test runs deterministic and dat-independent. /// [Trait("Lane", "Manual")] +[Trait("ManualTask", "FixtureGeneration")] public sealed class RetailLayoutFixtureGenerator { private static readonly (uint Id, string FileName)[] Layouts = diff --git a/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs b/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs index 2fe07b29..b39fdec3 100644 --- a/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/SocialPanelLiveMountProbeTests.cs @@ -18,14 +18,15 @@ namespace AcDream.App.Tests.UI.Layout; /// its button→page pairing + default entry can be recorded — coordinator /// addendum, docs/research/2026-08-11-fa-panel-structure.md §10. /// -[Trait("Lane", "InstalledDat")] +[Trait("Lane", "Manual")] +[Trait("ManualTask", "LiveMountProbe")] public sealed class SocialPanelLiveMountProbeTests { [Fact] public void ProbeLiveMountShapes() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( @@ -488,7 +489,7 @@ public sealed class SocialPanelLiveMountProbeTests public void ProbeSocialClickRouting() { if (Environment.GetEnvironmentVariable("ACDREAM_PROBE_LIVE_MOUNT") != "1") - return; + Assert.Fail("Lane=Manual live-mount probe requires ACDREAM_PROBE_LIVE_MOUNT=1."); var datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine( diff --git a/tests/AcDream.App.Tests/UI/Layout/SpellbookRowStyleTests.cs b/tests/AcDream.App.Tests/UI/Layout/SpellbookRowStyleTests.cs index 60cf82e7..a4bf4898 100644 --- a/tests/AcDream.App.Tests/UI/Layout/SpellbookRowStyleTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/SpellbookRowStyleTests.cs @@ -13,7 +13,7 @@ public sealed class SpellbookRowStyleTests string datDir = System.Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile), "Documents", "Asheron's Call"); - if (!Directory.Exists(datDir)) return; + if (!Directory.Exists(datDir)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); SpellbookRowStyle style = Assert.IsType( @@ -37,7 +37,7 @@ public sealed class SpellbookRowStyleTests string datDir = System.Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile), "Documents", "Asheron's Call"); - if (!Directory.Exists(datDir)) return; + if (!Directory.Exists(datDir)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); ElementInfo root = Assert.IsType(LayoutImporter.ImportInfos( diff --git a/tests/AcDream.App.Tests/UI/RetailCursorCatalogTests.cs b/tests/AcDream.App.Tests/UI/RetailCursorCatalogTests.cs index ea6aad85..ef61afd6 100644 --- a/tests/AcDream.App.Tests/UI/RetailCursorCatalogTests.cs +++ b/tests/AcDream.App.Tests/UI/RetailCursorCatalogTests.cs @@ -29,7 +29,7 @@ public sealed class RetailCursorCatalogTests { string? datDir = ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); CursorFeedbackKind[] kinds = @@ -88,7 +88,7 @@ public sealed class RetailCursorCatalogTests { string? datDir = ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var resolver = new RetailCursorResolver(dats, new object()); diff --git a/tests/AcDream.App.Tests/UI/SpewBoxLayoutDumpDiagnostic.cs b/tests/AcDream.App.Tests/UI/SpewBoxLayoutDumpDiagnostic.cs index 3d575f65..e7850039 100644 --- a/tests/AcDream.App.Tests/UI/SpewBoxLayoutDumpDiagnostic.cs +++ b/tests/AcDream.App.Tests/UI/SpewBoxLayoutDumpDiagnostic.cs @@ -106,7 +106,7 @@ public sealed class SpewBoxLayoutDumpDiagnostic if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.App.Tests/UI/UiDatFontBorderPixelTests.cs b/tests/AcDream.App.Tests/UI/UiDatFontBorderPixelTests.cs index 01588929..2614f17d 100644 --- a/tests/AcDream.App.Tests/UI/UiDatFontBorderPixelTests.cs +++ b/tests/AcDream.App.Tests/UI/UiDatFontBorderPixelTests.cs @@ -40,7 +40,7 @@ public sealed class UiDatFontBorderPixelTests { string? datDir = ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); Assert.True(dats.TryGet(fontId, out Font? font), $"Font 0x{fontId:X8} not found"); @@ -60,7 +60,7 @@ public sealed class UiDatFontBorderPixelTests // correlation. Sweep the documented populated range (0x40000000-0x40000032). string? datDir = ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); int checkedCount = 0; diff --git a/tests/AcDream.App.Tests/UI/UiRenderContextAlphaTests.cs b/tests/AcDream.App.Tests/UI/UiRenderContextAlphaTests.cs index aed10073..add4ecaa 100644 --- a/tests/AcDream.App.Tests/UI/UiRenderContextAlphaTests.cs +++ b/tests/AcDream.App.Tests/UI/UiRenderContextAlphaTests.cs @@ -5,7 +5,6 @@ using AcDream.App.Rendering.Gpu; using AcDream.App.Tests.Rendering.Gpu; using AcDream.App.UI; using DatReaderWriter.Types; -using Xunit.Sdk; namespace AcDream.App.Tests.UI; @@ -96,7 +95,8 @@ public sealed class UiRenderContextAlphaTests { byte[]? ttf = BitmapFont.TryLoadSystemMonospaceFont(); if (ttf is null) - throw SkipException.ForSkip("No system TTF font found for BitmapFont construction."); + throw new InvalidOperationException( + "Lane=SystemFont requires a host system TTF font; see docs/release-gate.md."); return new BitmapFont(device, ttf, pixelHeight: 16f); } diff --git a/tests/AcDream.App.Tests/World/LiveEntityPresentationControllerTests.cs b/tests/AcDream.App.Tests/World/LiveEntityPresentationControllerTests.cs index 9256b77b..f2f43b12 100644 --- a/tests/AcDream.App.Tests/World/LiveEntityPresentationControllerTests.cs +++ b/tests/AcDream.App.Tests/World/LiveEntityPresentationControllerTests.cs @@ -10,7 +10,6 @@ using AcDream.Runtime.Entities; using DatReaderWriter; using DatReaderWriter.DBObjs; using DatReaderWriter.Options; -using Xunit.Sdk; namespace AcDream.App.Tests.World; @@ -155,7 +154,8 @@ public sealed class LiveEntityPresentationControllerTests const uint magicPortal = 0x40000038u; string datDir = @"C:\Turbine\Asheron's Call"; if (!File.Exists(Path.Combine(datDir, "client_portal.dat"))) - throw SkipException.ForSkip("Installed retail DATs are required."); + throw new InvalidOperationException( + "Lane=InstalledDat requires installed retail DATs; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); Setup setup = Assert.IsType(dats.Get(humanSetup)); diff --git a/tests/AcDream.App.Tests/World/RecallTeleportAnimationTests.cs b/tests/AcDream.App.Tests/World/RecallTeleportAnimationTests.cs index afc65343..367c2c9b 100644 --- a/tests/AcDream.App.Tests/World/RecallTeleportAnimationTests.cs +++ b/tests/AcDream.App.Tests/World/RecallTeleportAnimationTests.cs @@ -12,7 +12,6 @@ using DatReaderWriter; using DatReaderWriter.DBObjs; using DatReaderWriter.Options; using DatReaderWriter.Types; -using Xunit.Sdk; namespace AcDream.App.Tests.World; @@ -190,7 +189,8 @@ public sealed class RecallTeleportAnimationTests { string datDir = @"C:\Turbine\Asheron's Call"; if (!File.Exists(Path.Combine(datDir, "client_portal.dat"))) - throw SkipException.ForSkip("Installed retail DATs are required."); + throw new InvalidOperationException( + "Lane=InstalledDat requires installed retail DATs; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); Setup setup = Assert.IsType(dats.Get(HumanSetup)); diff --git a/tests/AcDream.Bake.Tests/BakeDeterminismTests.cs b/tests/AcDream.Bake.Tests/BakeDeterminismTests.cs index 39f2659f..cb747abe 100644 --- a/tests/AcDream.Bake.Tests/BakeDeterminismTests.cs +++ b/tests/AcDream.Bake.Tests/BakeDeterminismTests.cs @@ -47,7 +47,7 @@ public sealed class BakeDeterminismTests : IDisposable { [Fact] public void Bake_SameIdSet_DifferentThreadCounts_ByteIdenticalPaks() { var datDir = ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip, matching suite convention + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip, matching suite convention // Small mixed fixture: GfxObjs (incl. the #119 tricky ids), Setups // (door setup carries emitters -> exercises the side-staged preload @@ -119,7 +119,7 @@ public sealed class BakeDeterminismTests : IDisposable { [Fact] public void Bake_RealDuplicateCells_ShareOneBlobAcrossLandblocksAndThreads() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // Full-bake discovery fixture: these eight cells span multiple // landblocks but have the same complete environment/structure/surface @@ -201,7 +201,7 @@ public sealed class BakeDeterminismTests : IDisposable { { string? datDir = ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); string destination = NewTempPakPath(); byte[] lastGood = [0x41, 0x43, 0x50, 0x4B, 1, 2, 3, 4]; diff --git a/tests/AcDream.Content.Tests/Ap155StaticSpherePopulationMeasurementTests.cs b/tests/AcDream.Content.Tests/Ap155StaticSpherePopulationMeasurementTests.cs index 935f9248..5348178b 100644 --- a/tests/AcDream.Content.Tests/Ap155StaticSpherePopulationMeasurementTests.cs +++ b/tests/AcDream.Content.Tests/Ap155StaticSpherePopulationMeasurementTests.cs @@ -33,7 +33,7 @@ public sealed class Ap155StaticSpherePopulationMeasurementTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogColorTests.cs b/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogColorTests.cs index 447d923b..0206e02c 100644 --- a/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogColorTests.cs +++ b/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogColorTests.cs @@ -66,7 +66,7 @@ public sealed class ChargenAppearanceCatalogColorTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -94,7 +94,7 @@ public sealed class ChargenAppearanceCatalogColorTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -120,7 +120,7 @@ public sealed class ChargenAppearanceCatalogColorTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -149,7 +149,7 @@ public sealed class ChargenAppearanceCatalogColorTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -183,7 +183,7 @@ public sealed class ChargenAppearanceCatalogColorTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -216,7 +216,7 @@ public sealed class ChargenAppearanceCatalogColorTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogInstalledDatTests.cs b/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogInstalledDatTests.cs index 0c66b5ac..425a487c 100644 --- a/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogInstalledDatTests.cs +++ b/tests/AcDream.Content.Tests/CharGen/ChargenAppearanceCatalogInstalledDatTests.cs @@ -78,7 +78,7 @@ public sealed class ChargenAppearanceCatalogInstalledDatTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -177,7 +177,7 @@ public sealed class ChargenAppearanceCatalogInstalledDatTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Content.Tests/CharGen/ChargenTableReaderInstalledDatTests.cs b/tests/AcDream.Content.Tests/CharGen/ChargenTableReaderInstalledDatTests.cs index cab1bd8f..15fb2f9f 100644 --- a/tests/AcDream.Content.Tests/CharGen/ChargenTableReaderInstalledDatTests.cs +++ b/tests/AcDream.Content.Tests/CharGen/ChargenTableReaderInstalledDatTests.cs @@ -33,7 +33,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -53,7 +53,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -85,7 +85,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -125,7 +125,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -165,7 +165,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -195,7 +195,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -238,7 +238,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -298,7 +298,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -352,7 +352,7 @@ public sealed class ChargenTableReaderInstalledDatTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Content.Tests/InstalledPreparedCollisionCatalogTests.cs b/tests/AcDream.Content.Tests/InstalledPreparedCollisionCatalogTests.cs index 8fcb9963..a3008275 100644 --- a/tests/AcDream.Content.Tests/InstalledPreparedCollisionCatalogTests.cs +++ b/tests/AcDream.Content.Tests/InstalledPreparedCollisionCatalogTests.cs @@ -12,11 +12,11 @@ public sealed class InstalledPreparedCollisionCatalogTests { string? datDir = ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=PreparedPackage requires installed retail DATs and a validated acdream.pak; see docs/release-gate.md."); string packagePath = Path.Combine(datDir, "acdream.pak"); if (!File.Exists(packagePath)) - return; + Assert.Fail("Lane=PreparedPackage requires installed retail DATs and a validated acdream.pak; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.Content.Tests/InstalledSetupBspPrimitiveDispatchTests.cs b/tests/AcDream.Content.Tests/InstalledSetupBspPrimitiveDispatchTests.cs index f7d96d5b..d6c98389 100644 --- a/tests/AcDream.Content.Tests/InstalledSetupBspPrimitiveDispatchTests.cs +++ b/tests/AcDream.Content.Tests/InstalledSetupBspPrimitiveDispatchTests.cs @@ -61,7 +61,7 @@ public sealed class InstalledSetupBspPrimitiveDispatchTests { string? datDir = ContentConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -240,7 +240,7 @@ public sealed class InstalledSetupBspPrimitiveDispatchTests { string? datDir = ContentConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Content.Tests/InstalledSetupCollisionReachabilityTests.cs b/tests/AcDream.Content.Tests/InstalledSetupCollisionReachabilityTests.cs index 4a2f1686..01b729e4 100644 --- a/tests/AcDream.Content.Tests/InstalledSetupCollisionReachabilityTests.cs +++ b/tests/AcDream.Content.Tests/InstalledSetupCollisionReachabilityTests.cs @@ -35,7 +35,7 @@ public sealed class InstalledSetupCollisionReachabilityTests { string? datDir = ContentConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Content.Tests/Issue334NeftetFormationCellMembershipTests.cs b/tests/AcDream.Content.Tests/Issue334NeftetFormationCellMembershipTests.cs index 1c5a115c..e2af55e9 100644 --- a/tests/AcDream.Content.Tests/Issue334NeftetFormationCellMembershipTests.cs +++ b/tests/AcDream.Content.Tests/Issue334NeftetFormationCellMembershipTests.cs @@ -60,7 +60,7 @@ public sealed class Issue334NeftetFormationCellMembershipTests { string? datDir = ContentConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); Assert.True( diff --git a/tests/AcDream.Content.Tests/PakEquivalenceTests.cs b/tests/AcDream.Content.Tests/PakEquivalenceTests.cs index 905b2c24..b0245220 100644 --- a/tests/AcDream.Content.Tests/PakEquivalenceTests.cs +++ b/tests/AcDream.Content.Tests/PakEquivalenceTests.cs @@ -40,7 +40,7 @@ public sealed class PakEquivalenceTests { [Fact] public void LiveExtraction_MatchesPakRoundTrip_OnFixtureIdSet() { var datDir = ContentConformanceDats.ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip, matching suite convention + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip, matching suite convention using var dats = new DatCollection(datDir, DatAccessType.Read); // The unified AcDream.Content.DatCollectionAdapter — same class the diff --git a/tests/AcDream.Content.Tests/SolidColorTextureCacheTests.cs b/tests/AcDream.Content.Tests/SolidColorTextureCacheTests.cs index f8281cc8..d71aad0c 100644 --- a/tests/AcDream.Content.Tests/SolidColorTextureCacheTests.cs +++ b/tests/AcDream.Content.Tests/SolidColorTextureCacheTests.cs @@ -22,7 +22,7 @@ public sealed class SolidColorTextureCacheTests { [Fact] public void GetOrCreateSolidColorTexture_SameColor_ReturnsSameSharedArray() { var datDir = ContentConformanceDats.ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip, matching suite convention + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip, matching suite convention using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); @@ -46,7 +46,7 @@ public sealed class SolidColorTextureCacheTests { [Fact] public void GetOrCreateSolidColorTexture_DifferentColors_ReturnDistinctArrays() { var datDir = ContentConformanceDats.ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip, matching suite convention + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip, matching suite convention using var dats = new DatCollection(datDir, DatAccessType.Read); using var adapter = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.Content.Tests/Spells/RetailSpellMetadataProjectorTests.cs b/tests/AcDream.Content.Tests/Spells/RetailSpellMetadataProjectorTests.cs index 2a8517a5..549853d5 100644 --- a/tests/AcDream.Content.Tests/Spells/RetailSpellMetadataProjectorTests.cs +++ b/tests/AcDream.Content.Tests/Spells/RetailSpellMetadataProjectorTests.cs @@ -78,7 +78,7 @@ public sealed class RetailSpellMetadataProjectorTests { string? datDir = ResolveDatDir(); string? csvPath = ResolveRepoFile("docs", "research", "data", "spells.csv"); - if (datDir is null || csvPath is null) return; + if (datDir is null || csvPath is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var rawDats = new DatCollection(datDir, DatAccessType.Read); using var dats = new DatCollectionAdapter(rawDats); @@ -107,7 +107,7 @@ public sealed class RetailSpellMetadataProjectorTests { string? datDir = ResolveDatDir(); string? csvPath = ResolveRepoFile("docs", "research", "data", "spells.csv"); - if (datDir is null || csvPath is null) return; + if (datDir is null || csvPath is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var rawDats = new DatCollection(datDir, DatAccessType.Read); using var dats = new DatCollectionAdapter(rawDats); diff --git a/tests/AcDream.Content.Tests/Vfx/RetailDatLoaderTests.cs b/tests/AcDream.Content.Tests/Vfx/RetailDatLoaderTests.cs index 3abf1950..88704309 100644 --- a/tests/AcDream.Content.Tests/Vfx/RetailDatLoaderTests.cs +++ b/tests/AcDream.Content.Tests/Vfx/RetailDatLoaderTests.cs @@ -437,7 +437,7 @@ public sealed class RetailDatLoaderTests { string? datDir = ResolveDatDirectory(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); using var boundedDats = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.Core.Net.Tests/LiveHandshakeTests.cs b/tests/AcDream.Core.Net.Tests/LiveHandshakeTests.cs index f60caf53..4dfb7295 100644 --- a/tests/AcDream.Core.Net.Tests/LiveHandshakeTests.cs +++ b/tests/AcDream.Core.Net.Tests/LiveHandshakeTests.cs @@ -36,7 +36,7 @@ public class LiveHandshakeTests public void Live_LoginRequest_ReceivesConnectRequestFromServer() { if (Environment.GetEnvironmentVariable("ACDREAM_LIVE") != "1") - return; // skipped — not a failure + Assert.Fail("Lane=Live requires ACDREAM_LIVE=1 and a reachable configured server."); // skipped — not a failure var host = Environment.GetEnvironmentVariable("ACDREAM_TEST_HOST") ?? "127.0.0.1"; var portStr = Environment.GetEnvironmentVariable("ACDREAM_TEST_PORT") ?? "9000"; @@ -113,7 +113,7 @@ public class LiveHandshakeTests public void Live_FullThreeWayHandshake_ReachesConnectedState() { if (Environment.GetEnvironmentVariable("ACDREAM_LIVE") != "1") - return; + Assert.Fail("Lane=Live requires ACDREAM_LIVE=1 and a reachable configured server."); var host = Environment.GetEnvironmentVariable("ACDREAM_TEST_HOST") ?? "127.0.0.1"; var portStr = Environment.GetEnvironmentVariable("ACDREAM_TEST_PORT") ?? "9000"; @@ -263,7 +263,7 @@ public class LiveHandshakeTests public void Live_CharacterEnterWorld_ReceivesCreateObjectFlood() { if (Environment.GetEnvironmentVariable("ACDREAM_LIVE") != "1") - return; + Assert.Fail("Lane=Live requires ACDREAM_LIVE=1 and a reachable configured server."); var host = Environment.GetEnvironmentVariable("ACDREAM_TEST_HOST") ?? "127.0.0.1"; var portStr = Environment.GetEnvironmentVariable("ACDREAM_TEST_PORT") ?? "9000"; diff --git a/tests/AcDream.Core.Tests/Audio/EnvCellSoundEmitterInventoryTests.cs b/tests/AcDream.Core.Tests/Audio/EnvCellSoundEmitterInventoryTests.cs index c0ccf4da..e9f30136 100644 --- a/tests/AcDream.Core.Tests/Audio/EnvCellSoundEmitterInventoryTests.cs +++ b/tests/AcDream.Core.Tests/Audio/EnvCellSoundEmitterInventoryTests.cs @@ -50,7 +50,7 @@ public sealed class EnvCellSoundEmitterInventoryTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(new DatCollectionOptions { @@ -133,7 +133,7 @@ public sealed class EnvCellSoundEmitterInventoryTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(new DatCollectionOptions { @@ -191,7 +191,7 @@ public sealed class EnvCellSoundEmitterInventoryTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(new DatCollectionOptions { diff --git a/tests/AcDream.Core.Tests/Audio/UiSoundTableResolutionTests.cs b/tests/AcDream.Core.Tests/Audio/UiSoundTableResolutionTests.cs index 11e62d90..b77ed5b8 100644 --- a/tests/AcDream.Core.Tests/Audio/UiSoundTableResolutionTests.cs +++ b/tests/AcDream.Core.Tests/Audio/UiSoundTableResolutionTests.cs @@ -72,7 +72,7 @@ public sealed class UiSoundTableResolutionTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; // dats absent (CI) — nothing to resolve + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — nothing to resolve using var dats = new DatCollection(new DatCollectionOptions { diff --git a/tests/AcDream.Core.Tests/Conformance/CottageDoorwayCharacterizationTests.cs b/tests/AcDream.Core.Tests/Conformance/CottageDoorwayCharacterizationTests.cs index 7d6d4f39..f67ed09a 100644 --- a/tests/AcDream.Core.Tests/Conformance/CottageDoorwayCharacterizationTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/CottageDoorwayCharacterizationTests.cs @@ -26,7 +26,7 @@ public class CottageDoorwayCharacterizationTests public void Characterize_CottageNeighborhood_PrintStructure() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -71,7 +71,7 @@ public class CottageDoorwayCharacterizationTests public void Characterize_Doorway_FindInteriorPoints() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (var id in new[] { Vestibule0170, Room0171 }) @@ -114,7 +114,7 @@ public class CottageDoorwayCharacterizationTests public void Doorway_Topology_IsPinned() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = new PhysicsDataCache(); @@ -140,7 +140,7 @@ public class CottageDoorwayCharacterizationTests public void Doorway_InteriorPoints_ArePinned() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = new PhysicsDataCache(); diff --git a/tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests.cs b/tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests.cs index c0b0966a..e41f7fd7 100644 --- a/tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests.cs @@ -55,7 +55,7 @@ public class DatConcurrencyStressTests public void ConcurrentRawReads_MatchSingleThreadedGolden() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip, matching suite convention + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip, matching suite convention using var dats = new DatCollection(datDir, DatAccessType.Read); var refs = BuildIdSet(dats); @@ -83,7 +83,7 @@ public class DatConcurrencyStressTests public void ConcurrentTypedReads_MatchSingleThreadedGolden() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; // dats absent (CI) — skip + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // dats absent (CI) — skip // FileCachingStrategy.Never: every TryGet re-reads + re-unpacks from disk, // matching the worst-case production path and keeping the hammer honest diff --git a/tests/AcDream.Core.Tests/Conformance/DungeonLandblockDatProbeTests.cs b/tests/AcDream.Core.Tests/Conformance/DungeonLandblockDatProbeTests.cs index 0ceeebd5..80d09d90 100644 --- a/tests/AcDream.Core.Tests/Conformance/DungeonLandblockDatProbeTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/DungeonLandblockDatProbeTests.cs @@ -27,7 +27,7 @@ public sealed class DungeonLandblockDatProbeTests public void Probe_Dungeon0125_vs_Holtburg_A9B4() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint lb in new uint[] { 0x0125u, 0xA9B4u }) diff --git a/tests/AcDream.Core.Tests/Conformance/FindCellListConformanceTests.cs b/tests/AcDream.Core.Tests/Conformance/FindCellListConformanceTests.cs index 88e8a366..fe4e03aa 100644 --- a/tests/AcDream.Core.Tests/Conformance/FindCellListConformanceTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/FindCellListConformanceTests.cs @@ -34,7 +34,7 @@ public class FindCellListConformanceTests public void FindCellList_DeepInsideRoom0171_Returns0171() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadThresholdBuilding(dats); @@ -52,7 +52,7 @@ public class FindCellListConformanceTests public void FindCellList_DeepInsideVestibule0170_Returns0170() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadThresholdBuilding(dats); @@ -76,7 +76,7 @@ public class FindCellListConformanceTests public void FindCellList_InVestibule_SeededFromRoom_Returns0170() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadThresholdBuilding(dats); diff --git a/tests/AcDream.Core.Tests/Conformance/HoltburgTorchFalloffProbeTests.cs b/tests/AcDream.Core.Tests/Conformance/HoltburgTorchFalloffProbeTests.cs index 9ce2922a..68faf394 100644 --- a/tests/AcDream.Core.Tests/Conformance/HoltburgTorchFalloffProbeTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/HoltburgTorchFalloffProbeTests.cs @@ -31,7 +31,7 @@ public sealed class HoltburgTorchFalloffProbeTests public void Dump_Holtburg_StaticLight_Falloffs() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); // The meeting hall sits in the Holtburg town landblocks. Sweep a small diff --git a/tests/AcDream.Core.Tests/Conformance/Issue107SpawnDiagnosticTests.cs b/tests/AcDream.Core.Tests/Conformance/Issue107SpawnDiagnosticTests.cs index bf9f3e7a..8b6596fe 100644 --- a/tests/AcDream.Core.Tests/Conformance/Issue107SpawnDiagnosticTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/Issue107SpawnDiagnosticTests.cs @@ -44,7 +44,7 @@ public sealed class Issue107SpawnDiagnosticTests public void SpawnPosition_IsInside0171_NotInside0162_PickRecoversFromGoodSeed() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = new PhysicsDataCache(); @@ -91,7 +91,7 @@ public sealed class Issue107SpawnDiagnosticTests public void SeenOutside_IsPopulated_ForGroundFloorInteriors() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = new PhysicsDataCache(); @@ -123,7 +123,7 @@ public sealed class Issue107SpawnDiagnosticTests // mid-population "any cell present" disambiguator, since removed) — // this test pins the hydrated-path correctness. var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = new PhysicsDataCache(); for (uint low = 0x0100; low <= 0x01FF; low++) @@ -145,7 +145,7 @@ public sealed class Issue107SpawnDiagnosticTests public void PoisonedClaim_IsADifferentBuilding_55mAway() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var claim = dats.Get(PoisonedClaim); diff --git a/tests/AcDream.Core.Tests/Conformance/Issue112MembershipTests.cs b/tests/AcDream.Core.Tests/Conformance/Issue112MembershipTests.cs index 6d728430..2f3c95ac 100644 --- a/tests/AcDream.Core.Tests/Conformance/Issue112MembershipTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/Issue112MembershipTests.cs @@ -48,7 +48,7 @@ public sealed class Issue112MembershipTests public void A9B3CottageGap_AtDoorway_StraddlesExitPlane_DemotesRetailFaithfully() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); @@ -76,7 +76,7 @@ public sealed class Issue112MembershipTests public void A9B3Cottage_GapBeyondStraddleDistance_KeepsCurrCell_RetailGate() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); @@ -98,7 +98,7 @@ public sealed class Issue112MembershipTests public void FindTransitCellsSphere_ExitPortalStraddleGate_MatchesRetail() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); @@ -177,7 +177,7 @@ public sealed class Issue112MembershipTests // interior (the transparent cottage), promoting only on touching a // portal-adjacent cell's own volume (the captured late 0x102 flip). var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); RegisterBuildings(dats, cache, 0xA9B30000u); @@ -201,7 +201,7 @@ public sealed class Issue112MembershipTests // absorbing outdoor-deep-inside state the user sat in (transparent // cottage until randomly touching a portal-adjacent room). var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); RegisterBuildings(dats, cache, 0xA9B30000u); @@ -233,7 +233,7 @@ public sealed class Issue112MembershipTests // evolving pick, and which landcells had buildings. Names the first // step where retail would promote vs where ours does. var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); RegisterBuildings(dats, cache, 0xA9B30000u); @@ -278,7 +278,7 @@ public sealed class Issue112MembershipTests // is the only container). The transparency at THIS exact spot is a // RENDER question (outdoor root at a doorway), not membership. var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B30000u); RegisterBuildings(dats, cache, 0xA9B30000u); @@ -293,7 +293,7 @@ public sealed class Issue112MembershipTests public void ThresholdCottage_AdjacentClaim_LaterallyRecovers_ViaStabGraph() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = LoadLandblockInteriors(dats, 0xA9B40000u); diff --git a/tests/AcDream.Core.Tests/Conformance/Issue113DoorVanishDiagnosticTests.cs b/tests/AcDream.Core.Tests/Conformance/Issue113DoorVanishDiagnosticTests.cs index c14b3d02..6ffd3b24 100644 --- a/tests/AcDream.Core.Tests/Conformance/Issue113DoorVanishDiagnosticTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/Issue113DoorVanishDiagnosticTests.cs @@ -33,7 +33,7 @@ public sealed class Issue113DoorVanishDiagnosticTests public void DumpDoorSetup_DrawingBspCoverage() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var setup = dats.Get(DoorSetupId); @@ -75,7 +75,7 @@ public sealed class Issue113DoorVanishDiagnosticTests public void DumpHoltburgBuildings_OrphanGeometry() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var modelIds = new SortedSet(); @@ -197,7 +197,7 @@ public sealed class Issue113DoorVanishDiagnosticTests public void Diagnostic_ReplicateProductionEmission_OnPortalFills() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint mid in new uint[] { 0x010014C3u, 0x01000827u }) @@ -244,7 +244,7 @@ public sealed class Issue113DoorVanishDiagnosticTests public void DumpPortalFillSurfaceTypes() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint mid in new uint[] { 0x010014C3u, 0x01000827u, 0x0100082Eu, 0x01000C17u }) @@ -290,7 +290,7 @@ public sealed class Issue113DoorVanishDiagnosticTests public void DumpControls_HallAndCottage() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); DumpGfxObjBspCoverage(dats, 0x010014C3u); // meeting hall shell diff --git a/tests/AcDream.Core.Tests/Conformance/Issue113PhantomStairsDumpTests.cs b/tests/AcDream.Core.Tests/Conformance/Issue113PhantomStairsDumpTests.cs index 1d44bc9a..3b6226f4 100644 --- a/tests/AcDream.Core.Tests/Conformance/Issue113PhantomStairsDumpTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/Issue113PhantomStairsDumpTests.cs @@ -42,7 +42,7 @@ public sealed class Issue113PhantomStairsDumpTests public void DumpA9B3_Buildings_And_InteriorCells() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var lbi = dats.Get(Landblock | 0xFFFEu); @@ -199,7 +199,7 @@ public sealed class Issue113PhantomStairsDumpTests public void DumpA9B3_Statics_OutdoorStabs_And_ShellModel() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var lbi = dats.Get(Landblock | 0xFFFEu); @@ -292,7 +292,7 @@ public sealed class Issue113PhantomStairsDumpTests public void Dump_Cell104_ExteriorPortalPlane_Vs_GapPoint() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint low in new uint[] { 0x0104, 0x0102, 0x0105, 0x0100 }) @@ -345,7 +345,7 @@ public sealed class Issue113PhantomStairsDumpTests public void DumpAAB3_Buildings_And_StairScan() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); const uint lb = 0xAAB30000u; @@ -444,7 +444,7 @@ public sealed class Issue113PhantomStairsDumpTests public void DumpAAB3_Watchtower_DoorAlignment_And_RampFaces() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); const uint lb = 0xAAB30000u; @@ -565,7 +565,7 @@ public sealed class Issue113PhantomStairsDumpTests public void DumpAAB3_Watchtower_TopDownMap() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); const uint lb = 0xAAB30000u; @@ -686,7 +686,7 @@ public sealed class Issue113PhantomStairsDumpTests public void DumpHallModel_PolyFlagHistogram() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint mid in new uint[] { 0x010014C3u, 0x01000827u }) diff --git a/tests/AcDream.Core.Tests/Conformance/Issue119TowerDumpTests.cs b/tests/AcDream.Core.Tests/Conformance/Issue119TowerDumpTests.cs index c8f09929..89e2d5cd 100644 --- a/tests/AcDream.Core.Tests/Conformance/Issue119TowerDumpTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/Issue119TowerDumpTests.cs @@ -38,7 +38,7 @@ public sealed class Issue119TowerDumpTests public void DumpTowerCellNeighbourhood() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var lbi = dats.Get(Landblock | 0xFFFEu); @@ -149,7 +149,7 @@ public sealed class Issue119TowerDumpTests public void DumpTowerStairSetups(uint setupId) { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); Assert.True(dats.Portal.TryGet(setupId, out var setup) && setup is not null, diff --git a/tests/AcDream.Core.Tests/Conformance/Issue119UpNullGfxObjDumpTests.cs b/tests/AcDream.Core.Tests/Conformance/Issue119UpNullGfxObjDumpTests.cs index 51a23fc3..949d1d03 100644 --- a/tests/AcDream.Core.Tests/Conformance/Issue119UpNullGfxObjDumpTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/Issue119UpNullGfxObjDumpTests.cs @@ -36,7 +36,7 @@ public sealed class Issue119UpNullGfxObjDumpTests public void DumpUpNullGfxObj(uint id) { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); Assert.True(dats.Portal.TryGet(id, out var gfx) && gfx is not null, @@ -101,7 +101,7 @@ public sealed class Issue119UpNullGfxObjDumpTests public void ShellModel_NoTexturedPolyIsDropped(uint id) { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); Assert.True(dats.Portal.TryGet(id, out var gfx) && gfx is not null, diff --git a/tests/AcDream.Core.Tests/Conformance/StipplingSurfaceEquivalenceTests.cs b/tests/AcDream.Core.Tests/Conformance/StipplingSurfaceEquivalenceTests.cs index ccb5362a..fdf94e28 100644 --- a/tests/AcDream.Core.Tests/Conformance/StipplingSurfaceEquivalenceTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/StipplingSurfaceEquivalenceTests.cs @@ -49,7 +49,7 @@ public sealed class StipplingSurfaceEquivalenceTests public void NoPosStippling_Equals_UntexturedSurface_OnBuildingsAndCells() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); return; } + if (datDir is null) { _out.WriteLine("dats unavailable — skipped"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); int polysChecked = 0; diff --git a/tests/AcDream.Core.Tests/Conformance/ThresholdDivergenceDiagnosticTests.cs b/tests/AcDream.Core.Tests/Conformance/ThresholdDivergenceDiagnosticTests.cs index 3b415fd4..8416f982 100644 --- a/tests/AcDream.Core.Tests/Conformance/ThresholdDivergenceDiagnosticTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/ThresholdDivergenceDiagnosticTests.cs @@ -24,9 +24,9 @@ public class ThresholdDivergenceDiagnosticTests public void Diagnose_ThresholdTransitions() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } var fixturePath = System.IO.Path.Combine(ConformanceDats.FixturesDir, "find-cell-list-threshold.log"); - if (!System.IO.File.Exists(fixturePath)) { _out.WriteLine("SKIP: capture pending"); return; } + if (!System.IO.File.Exists(fixturePath)) { _out.WriteLine("SKIP: capture pending"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var cache = new PhysicsDataCache(); diff --git a/tests/AcDream.Core.Tests/Conformance/ThresholdPortalCrossingReplayTests.cs b/tests/AcDream.Core.Tests/Conformance/ThresholdPortalCrossingReplayTests.cs index 6bca27a4..2a452f23 100644 --- a/tests/AcDream.Core.Tests/Conformance/ThresholdPortalCrossingReplayTests.cs +++ b/tests/AcDream.Core.Tests/Conformance/ThresholdPortalCrossingReplayTests.cs @@ -108,9 +108,9 @@ public class ThresholdPortalCrossingReplayTests public void ProductionPath_IndoorCrossings_MatchRetail() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } var fixturePath = Path.Combine(ConformanceDats.FixturesDir, "find-cell-list-threshold.log"); - if (!File.Exists(fixturePath)) { _out.WriteLine("SKIP: capture pending"); return; } + if (!File.Exists(fixturePath)) { _out.WriteLine("SKIP: capture pending"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (engine, _) = BuildBuildingEngine(dats); diff --git a/tests/AcDream.Core.Tests/Input/RetailActionIdentityRoundTripTests.cs b/tests/AcDream.Core.Tests/Input/RetailActionIdentityRoundTripTests.cs index 0d01a329..8ae3fe69 100644 --- a/tests/AcDream.Core.Tests/Input/RetailActionIdentityRoundTripTests.cs +++ b/tests/AcDream.Core.Tests/Input/RetailActionIdentityRoundTripTests.cs @@ -91,7 +91,7 @@ public sealed class RetailActionIdentityRoundTripTests public void MappedActions_DatUnionDefaultBindings_MatchRetailDefaults() { string? datDir = Conformance.ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir); var source = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.Core.Tests/Input/RetailActionMapReaderTests.cs b/tests/AcDream.Core.Tests/Input/RetailActionMapReaderTests.cs index 7bb93d7f..11832831 100644 --- a/tests/AcDream.Core.Tests/Input/RetailActionMapReaderTests.cs +++ b/tests/AcDream.Core.Tests/Input/RetailActionMapReaderTests.cs @@ -211,7 +211,7 @@ public sealed class RetailActionMapReader_LiveDatTests public void Read_AgainstInstalledDats_MatchesPinnedShape() { string? datDir = Conformance.ConformanceDats.ResolveDatDir(); - if (datDir is null) return; // CI / no local install — skip cleanly. + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI / no local install — skip cleanly. using var dats = new DatCollection(datDir); var source = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.Core.Tests/Physics/Ap157SortingSphereFloodMeasurementTests.cs b/tests/AcDream.Core.Tests/Physics/Ap157SortingSphereFloodMeasurementTests.cs index 6cbc4d09..7f7d2f59 100644 --- a/tests/AcDream.Core.Tests/Physics/Ap157SortingSphereFloodMeasurementTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Ap157SortingSphereFloodMeasurementTests.cs @@ -76,7 +76,7 @@ public sealed class Ap157SortingSphereFloodMeasurementTests if (datDir is null) { Console.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/BoxIntersectsCellBspDifferentialTests.cs b/tests/AcDream.Core.Tests/Physics/BoxIntersectsCellBspDifferentialTests.cs index 7666abfd..8f7d1ea7 100644 --- a/tests/AcDream.Core.Tests/Physics/BoxIntersectsCellBspDifferentialTests.cs +++ b/tests/AcDream.Core.Tests/Physics/BoxIntersectsCellBspDifferentialTests.cs @@ -194,7 +194,7 @@ public sealed class BoxIntersectsCellBspDifferentialTests { string? datDirectory = ConformanceDats.ResolveDatDir(); if (datDirectory is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDirectory, DatAccessType.Read); var random = new Random(0x4230_5820); diff --git a/tests/AcDream.Core.Tests/Physics/CameraCornerSealReplayTests.cs b/tests/AcDream.Core.Tests/Physics/CameraCornerSealReplayTests.cs index 4676ac78..30f846b5 100644 --- a/tests/AcDream.Core.Tests/Physics/CameraCornerSealReplayTests.cs +++ b/tests/AcDream.Core.Tests/Physics/CameraCornerSealReplayTests.cs @@ -134,7 +134,7 @@ public class CameraCornerSealReplayTests public void Diagnostic_DispatchTrace_LeakPath_vs_Controls() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (engine, cache, envCells) = BuildBuildingEngine(dats); @@ -258,7 +258,7 @@ public class CameraCornerSealReplayTests public void ViewerSweep_ThroughOpenings_PassesWithoutCollision() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (engine, _, _) = BuildBuildingEngine(dats); @@ -297,7 +297,7 @@ public class CameraCornerSealReplayTests public void HoltburgCottageExit_ViewerSweep_AdvancesFromAlcoveToOutdoor() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var graphCache = new PhysicsDataCache(); diff --git a/tests/AcDream.Core.Tests/Physics/CellTransitFindTransitCellsBoxTests.cs b/tests/AcDream.Core.Tests/Physics/CellTransitFindTransitCellsBoxTests.cs index ad7e0671..6556e3cc 100644 --- a/tests/AcDream.Core.Tests/Physics/CellTransitFindTransitCellsBoxTests.cs +++ b/tests/AcDream.Core.Tests/Physics/CellTransitFindTransitCellsBoxTests.cs @@ -268,7 +268,7 @@ public sealed class CellTransitFindTransitCellsBoxTests { string? datDirectory = ConformanceDats.ResolveDatDir(); if (datDirectory is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDirectory, DatAccessType.Read); var cache = new PhysicsDataCache(); diff --git a/tests/AcDream.Core.Tests/Physics/CellTransitTests.cs b/tests/AcDream.Core.Tests/Physics/CellTransitTests.cs index ce198da1..b5d54c79 100644 --- a/tests/AcDream.Core.Tests/Physics/CellTransitTests.cs +++ b/tests/AcDream.Core.Tests/Physics/CellTransitTests.cs @@ -35,7 +35,7 @@ public class CellTransitTests public void DeepInteriorSphere_NoStraddle_AddsNoOutdoorCells() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // Hydrate the cells in the portal chain. // 0xA9B4013F — deep interior cell (the old over-penetration tick) @@ -72,7 +72,7 @@ public class CellTransitTests public void AlcoveSphere_StraddlesExitPortal_ReachesDoorOutdoorCell() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // The alcove cell 0xA9B40150 IS the cell with the exit portal, and // at this captured position the foot sphere straddles its plane diff --git a/tests/AcDream.Core.Tests/Physics/DoorBugTrajectoryReplayTests.cs b/tests/AcDream.Core.Tests/Physics/DoorBugTrajectoryReplayTests.cs index 208324fe..25eebc6b 100644 --- a/tests/AcDream.Core.Tests/Physics/DoorBugTrajectoryReplayTests.cs +++ b/tests/AcDream.Core.Tests/Physics/DoorBugTrajectoryReplayTests.cs @@ -86,7 +86,7 @@ public class DoorBugTrajectoryReplayTests public void LiveCompare_DoorOffCenterWalkthrough_Tick13558() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // BR-7 / A6.P4 (2026-06-11) — FLIPPED from match-the-capture to // assert-the-fix. The capture IS the #99 bug (live walked through: @@ -122,7 +122,7 @@ public class DoorBugTrajectoryReplayTests public void LiveCompare_DoorBlocksFromOutside_Tick22760() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // BR-7 / A6.P4 (2026-06-11) — narrowed from full-capture match to // the blocking invariant. The capture (the WORKING outdoor side) @@ -165,7 +165,7 @@ public class DoorBugTrajectoryReplayTests public void Diagnostic_Tick22760_DumpEngineInternals() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); PhysicsDiagnostics.ProbeResolveEnabled = true; PhysicsDiagnostics.ProbeBuildingEnabled = true; @@ -218,7 +218,7 @@ public class DoorBugTrajectoryReplayTests public void Diagnostic_Tick13558_DumpEngineInternals() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); PhysicsDiagnostics.ProbeResolveEnabled = true; PhysicsDiagnostics.ProbeBuildingEnabled = true; @@ -280,7 +280,7 @@ public class DoorBugTrajectoryReplayTests public void FindTransitCellsSphere_IndoorExitPortal_AddsOutsideForCapturedSpherePos() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // ── 1. Hydrate cell 0xA9B40150 from the real dat ──────────── using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -481,7 +481,7 @@ public class DoorBugTrajectoryReplayTests public void InsideOut_Tick3254_WithCottageWalls_ShouldBlock() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var (engine, cache) = BuildFaithfulDoorEngine(datDir); @@ -553,7 +553,7 @@ public class DoorBugTrajectoryReplayTests public void CornerSlide_AlcoveEastToCottageNorth_ShouldBlock() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var (engine, cache) = BuildFaithfulDoorEngine(datDir); @@ -781,7 +781,7 @@ public class DoorBugTrajectoryReplayTests public void Geometric_DoorSlabAtSphereHeight_OverlapsInZ() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); DatReaderWriter.Types.Frame partFrame; float slabLocalZMin = float.MaxValue; @@ -833,7 +833,7 @@ public class DoorBugTrajectoryReplayTests public void Directional_OutsideIn_SouthApproach_BlocksAtSlabSouthFace() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var (engine, _) = BuildFaithfulDoorEngine(datDir); @@ -861,7 +861,7 @@ public class DoorBugTrajectoryReplayTests public void Directional_InsideOut_NorthApproach_BlocksAtSlabNorthFace() { var datDir = ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var (engine, _) = BuildFaithfulDoorEngine(datDir); diff --git a/tests/AcDream.Core.Tests/Physics/DoorCollisionApparatusTests.cs b/tests/AcDream.Core.Tests/Physics/DoorCollisionApparatusTests.cs index 95561d0c..1271285f 100644 --- a/tests/AcDream.Core.Tests/Physics/DoorCollisionApparatusTests.cs +++ b/tests/AcDream.Core.Tests/Physics/DoorCollisionApparatusTests.cs @@ -68,7 +68,7 @@ public class DoorCollisionApparatusTests [Fact] public void Apparatus_DeadCenter_FrontApproach_BlocksOnBSP() { - if (!TryBuildScenario(out var ctx)) return; + if (!TryBuildScenario(out var ctx)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // Door at world (12, 12, 0). The frame's BSP slab extends // entity-local Y∈[-0.009, 0.252] (poly Y range plus frame[0] offset). @@ -109,7 +109,7 @@ public class DoorCollisionApparatusTests [Fact] public void Apparatus_SingleLargeTickJump_DeadCenter_StillBlocksOnBSP() { - if (!TryBuildScenario(out var ctx)) return; + if (!TryBuildScenario(out var ctx)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var start = new Vector3(12f, 11f, 0.5f); // The full 20-tick × 0.10 m approach in ONE resolve call. @@ -145,7 +145,7 @@ public class DoorCollisionApparatusTests [Fact] public void Apparatus_50cmOffCenter_FrontApproach_BlocksOnBSP() { - if (!TryBuildScenario(out var ctx)) return; + if (!TryBuildScenario(out var ctx)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // Same setup, but start 0.5 m off-center in X. Slab X range // is approximately [11.05, 12.97] (frame[0].X offset = -0.006). @@ -175,7 +175,7 @@ public class DoorCollisionApparatusTests [Fact] public void Apparatus_DeadCenter_BackApproach_BlocksOnBSP() { - if (!TryBuildScenario(out var ctx)) return; + if (!TryBuildScenario(out var ctx)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // Start past the door at Y=13, walk back toward -Y. var start = new Vector3(12f, 13f, 0.5f); @@ -205,7 +205,7 @@ public class DoorCollisionApparatusTests [Fact] public void Apparatus_DiagnosticDump_FrontApproach() { - if (!TryBuildScenario(out var ctx)) return; + if (!TryBuildScenario(out var ctx)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); PhysicsDiagnostics.ProbeResolveEnabled = true; PhysicsDiagnostics.ProbeBuildingEnabled = true; @@ -263,7 +263,7 @@ public class DoorCollisionApparatusTests [Fact] public void Apparatus_Grounded_50cmOffCenter_FrontApproach_Blocks() { - if (!TryBuildScenario(out var ctx)) return; + if (!TryBuildScenario(out var ctx)) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); PhysicsDiagnostics.ProbeResolveEnabled = true; PhysicsDiagnostics.ProbeBuildingEnabled = true; diff --git a/tests/AcDream.Core.Tests/Physics/DoorSetupGfxObjInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/DoorSetupGfxObjInspectionTests.cs index b59e20d9..a3d57bbb 100644 --- a/tests/AcDream.Core.Tests/Physics/DoorSetupGfxObjInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/DoorSetupGfxObjInspectionTests.cs @@ -49,7 +49,7 @@ public class DoorSetupGfxObjInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -247,7 +247,7 @@ public class DoorSetupGfxObjInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -282,7 +282,7 @@ public class DoorSetupGfxObjInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/FlatBspQueryDifferentialTests.cs b/tests/AcDream.Core.Tests/Physics/FlatBspQueryDifferentialTests.cs index 26a9d2f6..1234166c 100644 --- a/tests/AcDream.Core.Tests/Physics/FlatBspQueryDifferentialTests.cs +++ b/tests/AcDream.Core.Tests/Physics/FlatBspQueryDifferentialTests.cs @@ -417,7 +417,7 @@ public sealed class FlatBspQueryDifferentialTests { string? datDirectory = ConformanceDats.ResolveDatDir(); if (datDirectory is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDirectory, DatAccessType.Read); var random = new Random(0x4934_4253); diff --git a/tests/AcDream.Core.Tests/Physics/FlatCollisionInstalledDatTests.cs b/tests/AcDream.Core.Tests/Physics/FlatCollisionInstalledDatTests.cs index 9265d142..9c192765 100644 --- a/tests/AcDream.Core.Tests/Physics/FlatCollisionInstalledDatTests.cs +++ b/tests/AcDream.Core.Tests/Physics/FlatCollisionInstalledDatTests.cs @@ -24,7 +24,7 @@ public sealed class FlatCollisionInstalledDatTests if (datDir is null) { _output.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -118,7 +118,7 @@ public sealed class FlatCollisionInstalledDatTests if (datDir is null) { _output.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/HumanoidMotionTableRootMotionTests.cs b/tests/AcDream.Core.Tests/Physics/HumanoidMotionTableRootMotionTests.cs index 256aee0d..9fdc5ba5 100644 --- a/tests/AcDream.Core.Tests/Physics/HumanoidMotionTableRootMotionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/HumanoidMotionTableRootMotionTests.cs @@ -34,7 +34,7 @@ public sealed class HumanoidMotionTableRootMotionTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); MotionTable table = Assert.IsType(dats.Get(HumanoidMotionTable)); @@ -49,7 +49,7 @@ public sealed class HumanoidMotionTableRootMotionTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); using var boundedDats = new DatCollectionAdapter(dats); @@ -85,7 +85,7 @@ public sealed class HumanoidMotionTableRootMotionTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); MotionTable table = Assert.IsType(dats.Get(HumanoidMotionTable)); diff --git a/tests/AcDream.Core.Tests/Physics/Issue108CellarAscentViewerReplayTests.cs b/tests/AcDream.Core.Tests/Physics/Issue108CellarAscentViewerReplayTests.cs index 8bdf42ad..5ccc40eb 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue108CellarAscentViewerReplayTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue108CellarAscentViewerReplayTests.cs @@ -284,7 +284,7 @@ public class Issue108CellarAscentViewerReplayTests public void Diagnostic_CellarAscent_PerStepTable() { var steps = RunAscent(BoomDistance, pathLagMeters: 0f); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); uint lastPlayer = 0; uint lastViewer = 0xFFFFFFFFu; var lastBranch = (ViewerBranch)(-1); int suspicious = 0; @@ -309,7 +309,7 @@ public class Issue108CellarAscentViewerReplayTests foreach (float lag in new[] { 0f, 0.30f }) { var steps = RunAscent(dist, lag); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); int grass = steps.FindAll(s => s.EyeBelowGrade && s.ViewerOutdoorOrNull).Count; int okFalse = steps.FindAll(s => !s.Viewer.Sweep.Ok).Count; int fb = steps.FindAll(s => s.Viewer.Branch != ViewerBranch.Sweep).Count; @@ -330,7 +330,7 @@ public class Issue108CellarAscentViewerReplayTests public void CellarAscent_ViewerStaysInterior_WhileEyeBelowGrade() { var steps = RunAscent(BoomDistance, pathLagMeters: 0f); - if (steps is null) return; + if (steps is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); var failures = steps.FindAll(s => s.EyeBelowGrade && s.ViewerOutdoorOrNull); if (failures.Count > 0) diff --git a/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamInspectionTests.cs index 1fb4d502..df9e8768 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamInspectionTests.cs @@ -40,7 +40,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -116,7 +116,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -196,7 +196,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -228,7 +228,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -290,7 +290,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -394,7 +394,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -475,7 +475,7 @@ public class Issue137CorridorSeamInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamReplayTests.cs b/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamReplayTests.cs index 8c91fda5..d680e168 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamReplayTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue137CorridorSeamReplayTests.cs @@ -176,7 +176,7 @@ public class Issue137CorridorSeamReplayTests if (datDir is null) { _out.WriteLine("SKIP: dat directory not found"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -265,7 +265,7 @@ public class Issue137CorridorSeamReplayTests if (datDir is null) { _out.WriteLine("SKIP: dat directory not found"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -361,7 +361,7 @@ public class Issue137CorridorSeamReplayTests if (datDir is null) { _out.WriteLine("SKIP: dat directory not found"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -422,7 +422,7 @@ public class Issue137CorridorSeamReplayTests if (datDir is null) { _out.WriteLine("SKIP: dat directory not found"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -452,7 +452,7 @@ public class Issue137CorridorSeamReplayTests if (datDir is null) { _out.WriteLine("SKIP: dat directory not found"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/Issue147ArwicBuildingsDumpTests.cs b/tests/AcDream.Core.Tests/Physics/Issue147ArwicBuildingsDumpTests.cs index 793bb47e..4e9d2cf0 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue147ArwicBuildingsDumpTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue147ArwicBuildingsDumpTests.cs @@ -29,7 +29,7 @@ public sealed class Issue147ArwicBuildingsDumpTests var datDir = Env.GetEnvironmentVariable("ACDREAM_DAT_DIR") ?? Path.Combine(Env.GetFolderPath(Env.SpecialFolder.UserProfile), "Documents", "Asheron's Call"); - if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: no dats at {datDir}"); return; } + if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: no dats at {datDir}"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var info = dats.Get(0xC6A9FFFEu); // Arwic landblock info diff --git a/tests/AcDream.Core.Tests/Physics/Issue175HubDoorPoseInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/Issue175HubDoorPoseInspectionTests.cs index 7d772ebe..75caeb73 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue175HubDoorPoseInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue175HubDoorPoseInspectionTests.cs @@ -48,7 +48,7 @@ public class Issue175HubDoorPoseInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -171,7 +171,7 @@ public class Issue175HubDoorPoseInspectionTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/Issue176177SeamTransitLagTests.cs b/tests/AcDream.Core.Tests/Physics/Issue176177SeamTransitLagTests.cs index 61e1daad..8425f3d9 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue176177SeamTransitLagTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue176177SeamTransitLagTests.cs @@ -110,7 +110,7 @@ public class Issue176177SeamTransitLagTests public void RunAcrossSeam_CellFlipPosition(int direction) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var engine = BuildEngine(dats); var body = GroundedBody(); diff --git a/tests/AcDream.Core.Tests/Physics/Issue180CorridorSweepHysteresisReplayTests.cs b/tests/AcDream.Core.Tests/Physics/Issue180CorridorSweepHysteresisReplayTests.cs index 12423967..60431640 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue180CorridorSweepHysteresisReplayTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue180CorridorSweepHysteresisReplayTests.cs @@ -103,7 +103,7 @@ public class Issue180CorridorSweepHysteresisReplayTests public void ClippedStop_IsTheContactPoint_NotAStepBoundary() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; } + if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var (engine, _) = BuildCorridorEngine(dats); diff --git a/tests/AcDream.Core.Tests/Physics/Issue186ConnectorCellGeometryInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/Issue186ConnectorCellGeometryInspectionTests.cs index 66f12691..abf65427 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue186ConnectorCellGeometryInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue186ConnectorCellGeometryInspectionTests.cs @@ -38,7 +38,7 @@ public class Issue186ConnectorCellGeometryInspectionTests public void Dump_ConnectorCells_ShellAndCollision() { var datDir = DatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); foreach (uint cellId in new[] { 0xF6820116u, 0xF6820117u, 0xF6820118u }) @@ -95,7 +95,7 @@ public class Issue186ConnectorCellGeometryInspectionTests public void PortalSide_CentroidVsDatBit_AtGreyEye() { var datDir = DatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); // Live grey-pose eye (fresh HEAD capture + retail cdb trace both ~here). diff --git a/tests/AcDream.Core.Tests/Physics/Issue188FadingDoorMotionTableInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/Issue188FadingDoorMotionTableInspectionTests.cs index e3c0d176..4b9efd8c 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue188FadingDoorMotionTableInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue188FadingDoorMotionTableInspectionTests.cs @@ -78,7 +78,7 @@ public class Issue188FadingDoorMotionTableInspectionTests public void Dump_PedestalWeakSpot_MotionTable_HookContents() { var datDir = DatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); const uint MotionTableId = 0x090000F9u; // live-captured from the Pedestal Weak Spot entity diff --git a/tests/AcDream.Core.Tests/Physics/Issue337NeftetRockGeometryInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/Issue337NeftetRockGeometryInspectionTests.cs index f19c168c..3a220d36 100644 --- a/tests/AcDream.Core.Tests/Physics/Issue337NeftetRockGeometryInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/Issue337NeftetRockGeometryInspectionTests.cs @@ -77,7 +77,7 @@ public sealed class Issue337NeftetRockGeometryInspectionTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -402,7 +402,7 @@ public sealed class Issue337NeftetRockGeometryInspectionTests if (datDir is null) { _out.WriteLine("SKIP: installed retail DAT directory is unavailable."); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -554,7 +554,7 @@ public sealed class Issue337NeftetRockGeometryInspectionTests public void TheBspQueryReturnsAHitAtThePositionTheClientFellThrough() { string? datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; // CI without dats — the sibling dumps skip too. + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // CI without dats — the sibling dumps skip too. using var dats = new DatCollection(datDir, DatAccessType.Read); var info = dats.Get((Landblock & 0xFFFF0000u) | 0xFFFEu); @@ -627,7 +627,7 @@ public sealed class Issue337NeftetRockGeometryInspectionTests public void TheOldBroadphaseMeasuredToTheOriginAndSoRejectedGeometryItStoodOn() { string? datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); var info = dats.Get((Landblock & 0xFFFF0000u) | 0xFFFEu); diff --git a/tests/AcDream.Core.Tests/Physics/MotionCommandCatalogDatTests.cs b/tests/AcDream.Core.Tests/Physics/MotionCommandCatalogDatTests.cs index 80e7d728..c26ab922 100644 --- a/tests/AcDream.Core.Tests/Physics/MotionCommandCatalogDatTests.cs +++ b/tests/AcDream.Core.Tests/Physics/MotionCommandCatalogDatTests.cs @@ -75,7 +75,7 @@ public class MotionCommandCatalogDatTests public void AceShiftedRecallCommands_ExistInLocalMotionTables() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -87,7 +87,7 @@ public class MotionCommandCatalogDatTests public void TwoThousandThirteenLifestoneAndHouseRecall_AlsoExist() { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -106,7 +106,7 @@ public class MotionCommandCatalogDatTests public void AceOnlyCommands_ExistOnlyUnderShiftedIds(uint aceFullCommand) { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); @@ -121,7 +121,7 @@ public class MotionCommandCatalogDatTests public void TwoThousandThirteenOnlyValues_HaveZeroLinkHits(uint retail2013FullCommand) { var datDir = ConformanceDats.ResolveDatDir(); - if (datDir is null) return; + if (datDir is null) Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Physics/RestrictionObjPrevalenceInspectionTests.cs b/tests/AcDream.Core.Tests/Physics/RestrictionObjPrevalenceInspectionTests.cs index 0198c18b..51cf66df 100644 --- a/tests/AcDream.Core.Tests/Physics/RestrictionObjPrevalenceInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Physics/RestrictionObjPrevalenceInspectionTests.cs @@ -31,7 +31,7 @@ public sealed class RestrictionObjPrevalenceInspectionTests { string? datDir = ConformanceDats.ResolveDatDir(); if (datDir is null) - return; // installed dats absent (CI) — skip cleanly + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); // installed dats absent (CI) — skip cleanly using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Core.Tests/Rendering/Issue176177DungeonSeamInspectionTests.cs b/tests/AcDream.Core.Tests/Rendering/Issue176177DungeonSeamInspectionTests.cs index 7c109789..40e0011d 100644 --- a/tests/AcDream.Core.Tests/Rendering/Issue176177DungeonSeamInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Rendering/Issue176177DungeonSeamInspectionTests.cs @@ -99,7 +99,7 @@ public class Issue176177DungeonSeamInspectionTests public void PortalPolys_SurfaceAndDrawVerdict_Dump(uint cellId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var loaded = LoadCell(dats, cellId); @@ -182,7 +182,7 @@ public class Issue176177DungeonSeamInspectionTests public void ReciprocalPortalPolys_CoincidenceAndDrawVerdict(uint cellA, uint cellB) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var la = LoadCell(dats, cellA); @@ -249,7 +249,7 @@ public class Issue176177DungeonSeamInspectionTests public void Diagnostic_CorridorNeighborhood_CoplanarOverlappingDrawnPolyPairs() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); // Seed cells around the screenshot location (the 016E/017A seam) + @@ -342,7 +342,7 @@ public class Issue176177DungeonSeamInspectionTests public void FloorSurface_DecodedAlphaHistogram(uint surfaceId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var surface = dats.Get(surfaceId); @@ -476,7 +476,7 @@ public class Issue176177DungeonSeamInspectionTests public void Diagnostic_UnderHall_DrawnPolys_SurfaceColors(uint cellId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var loaded = LoadCell(dats, cellId); @@ -519,7 +519,7 @@ public class Issue176177DungeonSeamInspectionTests uint cellAId, uint cellBId, float planeX, float y, float z) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var la = LoadCell(dats, cellAId); @@ -568,7 +568,7 @@ public class Issue176177DungeonSeamInspectionTests public void StairTransit_GeometryOwnerAndPortalOrientation(uint cellId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var loaded = LoadCell(dats, cellId); @@ -642,7 +642,7 @@ public class Issue176177DungeonSeamInspectionTests public void CellVertexNormals_SmoothOrFaceted_Dump(uint cellId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var loaded = LoadCell(dats, cellId); diff --git a/tests/AcDream.Core.Tests/Rendering/Issue93TownNetworkFountainRoomLightInspectionTests.cs b/tests/AcDream.Core.Tests/Rendering/Issue93TownNetworkFountainRoomLightInspectionTests.cs index 784efdf8..0c2cd0ae 100644 --- a/tests/AcDream.Core.Tests/Rendering/Issue93TownNetworkFountainRoomLightInspectionTests.cs +++ b/tests/AcDream.Core.Tests/Rendering/Issue93TownNetworkFountainRoomLightInspectionTests.cs @@ -55,7 +55,7 @@ public class Issue93TownNetworkFountainRoomLightInspectionTests public void StaticObjects_SetupLightsCount_Dump(uint cellId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); var envCell = dats.Get(cellId); @@ -101,7 +101,7 @@ public class Issue93TownNetworkFountainRoomLightInspectionTests public void CeilingFixtureSetup_MeshFlattenSurvivorCount_Dump() { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var boundedDats = new DatCollectionAdapter(dats); @@ -166,7 +166,7 @@ public class Issue93TownNetworkFountainRoomLightInspectionTests public void FountainAndCandleSetup_DefaultScriptAndMeshSurvivorCount_Dump(uint setupId) { var datDir = ResolveDatDir(); - if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); return; } + if (datDir is null) { _out.WriteLine("SKIP: no dat dir"); Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); using var boundedDats = new DatCollectionAdapter(dats); diff --git a/tests/AcDream.Core.Tests/Terrain/TerrainModernConformanceTests.cs b/tests/AcDream.Core.Tests/Terrain/TerrainModernConformanceTests.cs index c4deed3d..7d8e57b9 100644 --- a/tests/AcDream.Core.Tests/Terrain/TerrainModernConformanceTests.cs +++ b/tests/AcDream.Core.Tests/Terrain/TerrainModernConformanceTests.cs @@ -54,7 +54,7 @@ public class TerrainModernConformanceTests if (!Directory.Exists(datDir)) { _out.WriteLine($"SKIP: dat directory not found at {datDir}"); - return; + Assert.Fail("Lane=InstalledDat requires an installed retail DAT directory; see docs/release-gate.md."); } using var dats = new DatCollection(datDir, DatAccessType.Read); diff --git a/tests/AcDream.Headless.Tests/HeadlessCredentialResolverTests.cs b/tests/AcDream.Headless.Tests/HeadlessCredentialResolverTests.cs index 97258dd0..2122cd83 100644 --- a/tests/AcDream.Headless.Tests/HeadlessCredentialResolverTests.cs +++ b/tests/AcDream.Headless.Tests/HeadlessCredentialResolverTests.cs @@ -126,7 +126,7 @@ public sealed class HeadlessCredentialResolverTests public void LinuxRejectsGroupOrOtherCredentialPermissions() { if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); string path = Path.Combine( Path.GetTempPath(), diff --git a/tests/AcDream.Launcher.Core.Tests/Launching/LauncherProcessSupervisorTests.cs b/tests/AcDream.Launcher.Core.Tests/Launching/LauncherProcessSupervisorTests.cs index f4409444..15dea560 100644 --- a/tests/AcDream.Launcher.Core.Tests/Launching/LauncherProcessSupervisorTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Launching/LauncherProcessSupervisorTests.cs @@ -14,7 +14,7 @@ public sealed class LauncherProcessSupervisorTests { if (!OperatingSystem.IsWindows()) { - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); } var factory = new SystemChildProcessFactory(); @@ -162,7 +162,7 @@ public sealed class LauncherProcessSupervisorTests // exit code, so ExitCode == 0 is a hermetic proof the graceful // path is what actually stopped the child. if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); string readyMarker = Path.Combine( Path.GetTempPath(), "acdream-la3-sigint-" + Guid.NewGuid().ToString("N")); @@ -228,7 +228,7 @@ public sealed class LauncherProcessSupervisorTests { if (!OperatingSystem.IsWindows()) { - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); } string root = Path.Combine( @@ -324,7 +324,7 @@ public sealed class LauncherProcessSupervisorTests { if (!OperatingSystem.IsWindows()) { - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); } string root = Path.Combine( @@ -671,7 +671,7 @@ public sealed class LauncherProcessSupervisorTests // on a background thread. This proves that path end to end too. if (!OperatingSystem.IsWindows()) { - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); } string root = Path.Combine( diff --git a/tests/AcDream.Launcher.Core.Tests/Orchestration/LauncherExecutableSetTests.cs b/tests/AcDream.Launcher.Core.Tests/Orchestration/LauncherExecutableSetTests.cs index 03e5adc6..6f2ae178 100644 --- a/tests/AcDream.Launcher.Core.Tests/Orchestration/LauncherExecutableSetTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Orchestration/LauncherExecutableSetTests.cs @@ -83,7 +83,7 @@ public sealed class LauncherExecutableSetTests : IDisposable { if (!OperatingSystem.IsLinux()) { - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); } Directory.CreateDirectory(_root); @@ -124,7 +124,7 @@ public sealed class LauncherExecutableSetTests : IDisposable { if (!OperatingSystem.IsWindows()) { - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); } var set = new LauncherExecutableSet( diff --git a/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileHardeningTests.cs b/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileHardeningTests.cs index 7994bdeb..05c647ac 100644 --- a/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileHardeningTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileHardeningTests.cs @@ -133,7 +133,7 @@ public sealed class LauncherProfileHardeningTests : IDisposable { if (!OperatingSystem.IsLinux()) { - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); } File.WriteAllText(_filePath, """{"version":1,"servers":[]}"""); diff --git a/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileStoreTests.cs b/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileStoreTests.cs index 72eab62c..5e314038 100644 --- a/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileStoreTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Profiles/LauncherProfileStoreTests.cs @@ -326,7 +326,7 @@ public sealed class LauncherProfileStoreTests : IDisposable // OperatingSystem.IsLinux() early-return pattern (e.g. // HeadlessCredentialResolverTests.LinuxRejectsGroupOrOtherCredentialPermissions). if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); var store = new LauncherProfileStore(_filePath); store.Load(); @@ -370,7 +370,7 @@ public sealed class LauncherProfileStoreTests : IDisposable // serialization or post-create chmod can occur. This replaces the // old timing-only poller, which could miss the vulnerable window. if (!OperatingSystem.IsLinux()) - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); string tempPath = _filePath + ".tmp"; using FileStream stream = LauncherProfileStore.CreateCredentialTempFile(tempPath); diff --git a/tests/AcDream.Launcher.Core.Tests/Status/StatusFileTailerTests.cs b/tests/AcDream.Launcher.Core.Tests/Status/StatusFileTailerTests.cs index 5e3b31bd..e895e4a0 100644 --- a/tests/AcDream.Launcher.Core.Tests/Status/StatusFileTailerTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Status/StatusFileTailerTests.cs @@ -171,7 +171,7 @@ public sealed class StatusFileTailerTests : IDisposable // reproducible there — the fix itself is platform-agnostic, only // this particular deterministic trigger is Windows-only.) if (!OperatingSystem.IsWindows()) - return; + throw new PlatformNotSupportedException("Lane=Windows requires a Windows host."); AppendShared(Line("started", "s1")); using var exclusiveHandle = new FileStream( diff --git a/tests/AcDream.Launcher.Core.Tests/Updates/ClientVersionStoreTests.cs b/tests/AcDream.Launcher.Core.Tests/Updates/ClientVersionStoreTests.cs index 9b9322c1..8f0824a5 100644 --- a/tests/AcDream.Launcher.Core.Tests/Updates/ClientVersionStoreTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Updates/ClientVersionStoreTests.cs @@ -183,7 +183,7 @@ public sealed class ClientVersionStoreTests : IDisposable { if (!OperatingSystem.IsLinux()) { - return; + throw new PlatformNotSupportedException("Lane=Linux requires a native Linux host."); } var store = new ClientVersionStore(_paths); diff --git a/tools/audit-test-inventory.ps1 b/tools/audit-test-inventory.ps1 index c53ef498..61648097 100644 --- a/tools/audit-test-inventory.ps1 +++ b/tools/audit-test-inventory.ps1 @@ -440,6 +440,17 @@ $summary = [ordered]@{ $_.Traits -contains 'Lane, SystemFont' }).Count } + ManualTaskMethods = [ordered]@{ + FixtureGeneration = @($orderedRecords | Where-Object { + $_.Traits -contains 'ManualTask, FixtureGeneration' + }).Count + LiveMountProbe = @($orderedRecords | Where-Object { + $_.Traits -contains 'ManualTask, LiveMountProbe' + }).Count + PowerbarProbe = @($orderedRecords | Where-Object { + $_.Traits -contains 'ManualTask, PowerbarProbe' + }).Count + } ThreadSleepMethods = @($orderedRecords | Where-Object { $_.HasThreadSleep }).Count TaskDelayMethods = @($orderedRecords | Where-Object { $_.HasTaskDelay }).Count DirectEnvironmentVariableMethods = @($orderedRecords | Where-Object {