test: classify prerequisite lanes and own Avalonia sessions

This commit is contained in:
Erik 2026-08-18 11:30:47 +02:00
parent c1a905004a
commit 3684e7b5e7
113 changed files with 273 additions and 22 deletions

View file

@ -12,9 +12,9 @@ The command verifies that `AcDream.slnx` contains every `.csproj` under `src/`,
then discovers and runs every hermetic test in every default test assembly once then discovers and runs every hermetic test in every default test assembly once
in a fresh Release process. It does not retry failures. Tests carrying an in a fresh Release process. It does not retry failures. Tests carrying an
explicit non-hermetic `Lane` trait (`InstalledDat`, `PreparedPackage`, `Live`, explicit non-hermetic `Lane` trait (`InstalledDat`, `PreparedPackage`, `Live`,
or `Manual`), `Purpose=Diagnostic`, or `Status=KnownFailure` are excluded from `Manual`, `Windows`, `Linux`, or `SystemFont`), `Purpose=Diagnostic`, or
the hermetic total and run through their owned lane instead. The graph currently `Status=KnownFailure` are excluded from the hermetic total and run through
contains 44 projects, their owned lane instead. The graph currently contains 44 projects,
including all 13 maintained .NET tools; data-dependent tools are built but are including all 13 maintained .NET tools; data-dependent tools are built but are
not executed as tests. not executed as tests.
@ -79,8 +79,18 @@ Installed-DAT tests require an explicit opt-in and a retail DAT directory:
```powershell ```powershell
$env:ACDREAM_RUN_INSTALLED_DAT_TESTS = '1' $env:ACDREAM_RUN_INSTALLED_DAT_TESTS = '1'
$env:ACDREAM_DAT_DIR = 'C:\path\to\Asherons Call' $env:ACDREAM_DAT_DIR = 'C:\path\to\Asherons Call'
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release ` pwsh ./tools/run-release-gate.ps1 -SkipRestore -SkipBuild `
--filter 'Lane=InstalledDat&Status!=KnownFailure&Purpose!=Diagnostic' -TestFilter 'Lane=InstalledDat&Status!=KnownFailure&Purpose!=Diagnostic'
```
The prepared-package lane additionally requires a validated `acdream.pak`
beside the DATs or at `ACDREAM_PAK_PATH`:
```powershell
$env:ACDREAM_DAT_DIR = 'C:\path\to\Asherons Call'
$env:ACDREAM_PAK_PATH = 'C:\path\to\acdream.pak'
pwsh ./tools/run-release-gate.ps1 -SkipRestore -SkipBuild `
-TestFilter 'Lane=PreparedPackage&Status!=KnownFailure&Purpose!=Diagnostic'
``` ```
Regenerate all committed UI fixtures through the one comprehensive manual Regenerate all committed UI fixtures through the one comprehensive manual
@ -109,6 +119,14 @@ dotnet test tests/AcDream.Core.Tests/AcDream.Core.Tests.csproj -c Release `
--filter 'Purpose=Diagnostic' --filter 'Purpose=Diagnostic'
``` ```
Operating-system contracts are likewise explicit. Run `Lane=Windows` on a
Windows host and `Lane=Linux` on a native Linux host; a lane is not portable
evidence when executed on the other operating system.
`Lane=SystemFont` exercises the BitmapFont path against a host-provided TTF.
It is separate because the supported runtime can legitimately have none of the
well-known development fonts installed.
## Updating dependencies ## Updating dependencies
Do not edit lock files by hand. To make an intentional dependency change: Do not edit lock files by hand. To make an intentional dependency change:

View file

@ -127,7 +127,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-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-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-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 | active; current candidate set generated | Current syntax has 282 prerequisite-return candidates across seven projects. Inspect/classify from the generated manifest; the count changed with source growth and includes platform gates, so do not mechanically rewrite all 282. | | 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-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-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 | open | Introduce a behavior-preserving injectable monotonic clock and deterministic fake time. | | T-009 wall-clock double-click tests | open | Introduce a behavior-preserving injectable monotonic clock and deterministic fake time. |
| T-010 two useless cases | high-confidence cleanup batch A | Delete `SmokeTest.TestProject_IsWired` and `ChaseCameraTests.ImplementsICamera`; compilation already proves both claims. | | T-010 two useless cases | high-confidence cleanup batch A | Delete `SmokeTest.TestProject_IsWired` and `ChaseCameraTests.ImplementsICamera`; compilation already proves both claims. |
@ -137,7 +137,7 @@ identifiable in the lane report.
| T-014 seven load-sensitive tests | active; first mechanism reproduced | `PortalProjectionTests.ClipToRegion_FrameOwnedStore_ReusesExactResultArray` reported 6,904 B only while three App test hosts ran concurrently, then passed in an isolated run. Preserve both observations and remove ambient process-allocation sensitivity rather than loosening the zero-allocation oracle. | | T-014 seven load-sensitive tests | active; first mechanism reproduced | `PortalProjectionTests.ClipToRegion_FrameOwnedStore_ReusesExactResultArray` reported 6,904 B only while three App test hosts ran concurrently, then passed in an isolated run. Preserve both observations and remove ambient process-allocation sensitivity rather than loosening the zero-allocation oracle. |
| T-015 four non-prerequisite skips | resolved in batches A/B | PVS scaffold deleted with rationale preserved; redundant chat/radar generators deleted in favor of the comprehensive Manual lane; tower oracle is `Status=KnownFailure`. | | T-015 four non-prerequisite skips | resolved in batches A/B | PVS scaffold deleted with rationale preserved; redundant chat/radar generators deleted in favor of the comprehensive Manual lane; tower oracle is `Status=KnownFailure`. |
| T-016 historical test taxonomy | open | Rename/re-home only after each test's durable owner and oracle are established. | | T-016 historical test taxonomy | open | Rename/re-home only after each test's durable owner and oracle are established. |
| T-017 Avalonia ownership | resolved in R2 | All seven editor variants now execute in one owned application session; 11 focused passes plus the complete gate. | | T-017 Avalonia ownership | reopened and closed in batch D | The full gate exposed the same compositor ownership class between six newer `MainWindowViewTests` facts. Their six named assertion phases now run in one owned Avalonia application session; 25 fresh-process stress iterations and the complete gate pass. |
| T-018 stderr observer race | resolved in R2 | Live reader shares writes/deletes; 25 focused repetitions plus the complete gate. | | T-018 stderr observer race | resolved in R2 | Live reader shares writes/deletes; 25 focused repetitions plus the complete gate. |
## Preserved rationale for removals in batch A ## Preserved rationale for removals in batch A
@ -251,3 +251,62 @@ An attempted parallel App/Core build collided on the shared
`AcDream.Plugin.Abstractions` intermediate DLL. The repository gate serializes `AcDream.Plugin.Abstractions` intermediate DLL. The repository gate serializes
projects, so the authoritative verification is the two isolated clean builds projects, so the authoritative verification is the two isolated clean builds
above; no code or assertion was changed in response to that tooling collision. above; no code or assertion was changed in response to that tooling collision.
## Batch D prerequisite lanes and Avalonia ownership
The reviewed prerequisite map classifies every true candidate without deleting
its existing guard:
| Lane | Attributed methods | Prerequisite |
|---|---:|---|
| `InstalledDat` | 336 | Installed retail DAT directory; includes the 73 custom installed-DAT facts and whole DAT-backed investigation classes. |
| `PreparedPackage` | 2 | Installed DATs plus validated `acdream.pak`. |
| `Live` | 3 | Explicit live handshake opt-in and reachable service. |
| `Manual` | 1 | Explicit fixture-regeneration opt-in. |
| `Windows` | 7 | Windows-only filesystem/process/timer behavior. |
| `Linux` | 10 | Linux permission/signal/monotonic-clock behavior. |
| `SystemFont` | 2 | A host system TTF available to the BitmapFont path. |
Class-level traits legitimately cover some additional methods that share the
same fixture owner, so the 336 installed-DAT method count is larger than the
280 syntax candidates. The only candidate methods without a lane are
`GraphicalHostPlatformServicesTests.CurrentPlatformOwnsPathsPacingAndNativeClosure`
and
`LinuxMonotonicFramePacingWaiterTests.PlatformFactorySelectsCurrentOperatingSystem`.
Both are hermetic cross-platform branch tests: on Windows or Linux they assert
the matching branch and return only after the assertion. They are not silent
prerequisite passes.
The 11 conditional `SkipException.ForSkip` source sites are also reconciled.
They serve 12 test methods: installed-DAT asset contracts, one prepared-package
contract, and two system-font contracts. xUnit v2 reports that exception shape
as a failure rather than a dynamic skip, but the owning lanes now keep them out
of the hermetic total. A later body-cleanup batch will replace the misleading
skip wording/exception with explicit prerequisite failure or discovery-time
lane behavior.
The first complete Batch D gate correctly failed in Launcher cleanup after
14,396 passes: the six `MainWindowViewTests` Avalonia facts could start and
destroy isolated thread-affine compositors on different xUnit workers. The
assertion bodies were preserved as six named private phases under one
`CompiledMarkupAndEveryModalFocusPathRunInOneOwnedAvaloniaSession` fact. The
focused two-case class then passed in 25 consecutive fresh processes (50/50
results), and the same full-gate context passed.
Batch D verification:
- complete 44-project Release build: 0 warnings, 0 errors;
- final syntax manifest: 11,450 attributed methods, 51 diagnostics, one known
failure, 282 prerequisite-return candidates, and only the two reviewed
cross-platform false positives unlaned;
- complete hermetic Release gate: 14,392 passed / 0 skipped / 0 failed across
all 12 test assemblies in 131.518 seconds; and
- Launcher view stress: 25 fresh processes, 2/2 cases per process, no cleanup
or ownership failures.
The 350-pass reduction from the clean R2 headline is exactly explained: batch A
netted minus one case; batch B removed six non-hermetic passes; batch C removed
68 newly classified diagnostic cases; batch D removed 270 prerequisite-lane
passes; and consolidating the six Avalonia sessions into one removed five case
IDs without removing any assertion phase. All 77 former default skips are also
accounted for by the PVS deletion and batch-B lane/deletion decisions.

View file

@ -131,6 +131,7 @@ public sealed class AppCredentialResolverTests
} }
[Fact] [Fact]
[Trait("Lane", "Linux")]
public void LinuxRejectsGroupOrOtherCredentialPermissions() public void LinuxRejectsGroupOrOtherCredentialPermissions()
{ {
if (!OperatingSystem.IsLinux()) if (!OperatingSystem.IsLinux())

View file

@ -20,6 +20,7 @@ namespace AcDream.App.Tests.Rendering;
/// is resolving Setup/GfxObj/Surface/Animation dat data that /// is resolving Setup/GfxObj/Surface/Animation dat data that
/// <see cref="DollEntityBuilder"/> receives pre-resolved). /// <see cref="DollEntityBuilder"/> receives pre-resolved).
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenPreviewEntityBuilderTests public sealed class ChargenPreviewEntityBuilderTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -198,6 +198,7 @@ public class CornerFloodReplayTests
/// exact gate that flips. /// exact gate that flips.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Diagnostic_TraceGoodVsGlitchStep() public void Diagnostic_TraceGoodVsGlitchStep()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -266,6 +267,7 @@ public class CornerFloodReplayTests
/// transition background strobe). Guards the ApplyReciprocalClip pipeline. /// transition background strobe). Guards the ApplyReciprocalClip pipeline.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void CornerSweep_FloodIsCompleteAndMonotone() public void CornerSweep_FloodIsCompleteAndMonotone()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -363,6 +365,7 @@ public class CornerFloodReplayTests
/// the tripwire count stays 0. /// the tripwire count stays 0.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void PortalPlaneCrossings_InPlacePropagationConverges() public void PortalPlaneCrossings_InPlacePropagationConverges()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -433,6 +436,7 @@ public class CornerFloodReplayTests
/// stays 0 across every Build. /// stays 0 across every Build.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InCellDirectionSweep_InPlacePropagationConverges() public void InCellDirectionSweep_InPlacePropagationConverges()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -495,6 +499,7 @@ public class CornerFloodReplayTests
/// the collapsing intersection. /// the collapsing intersection.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Diagnostic_Hop2Microscope() public void Diagnostic_Hop2Microscope()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -625,6 +630,7 @@ public class CornerFloodReplayTests
/// 0171/0173 — the screen area where the player stands then shows background. /// 0171/0173 — the screen area where the player stands then shows background.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Diagnostic_CornerPress_FloodAcrossDoorwayPlane() public void Diagnostic_CornerPress_FloodAcrossDoorwayPlane()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();

View file

@ -119,6 +119,7 @@ public sealed class FramePacingControllerTests
} }
[Fact] [Fact]
[Trait("Lane", "Windows")]
public void Windows_high_resolution_timer_arms_and_disposes_its_handle() public void Windows_high_resolution_timer_arms_and_disposes_its_handle()
{ {
if (!OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134)) if (!OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134))

View file

@ -49,6 +49,7 @@ namespace AcDream.App.Tests.Rendering;
/// OutsideView ⇒ outdoor dynamics trivially cone-pass). /// OutsideView ⇒ outdoor dynamics trivially cone-pass).
/// </summary> /// </summary>
[Collection(CameraDiagnosticsCollection.Name)] [Collection(CameraDiagnosticsCollection.Name)]
[Trait("Lane", "InstalledDat")]
public class HouseExitWalkReplayTests public class HouseExitWalkReplayTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -19,6 +19,7 @@ namespace AcDream.App.Tests.Rendering;
/// iterated the dictionary and drew the "phantom staircase". These pins hold /// iterated the dictionary and drew the "phantom staircase". These pins hold
/// ObjectMeshManager.CollectDrawingBspPolygonIds to the dat facts. /// ObjectMeshManager.CollectDrawingBspPolygonIds to the dat facts.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue113DrawingBspFilterTests public class Issue113DrawingBspFilterTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -29,6 +29,7 @@ namespace AcDream.App.Tests.Rendering;
/// production assembler from the user's click-time viewpoint and pins which /// production assembler from the user's click-time viewpoint and pins which
/// hall cells draw and with what clip. /// hall cells draw and with what clip.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue113MeetingHallFloodTests public class Issue113MeetingHallFloodTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -34,6 +34,7 @@ namespace AcDream.App.Tests.Rendering;
/// contained polygons, which makes union growth strictly area-increasing and /// contained polygons, which makes union growth strictly area-increasing and
/// the flood convergent regardless of clip-numerics drift. /// the flood convergent regardless of clip-numerics drift.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue120ReciprocalPingPongTests public class Issue120ReciprocalPingPongTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -18,6 +18,7 @@ namespace AcDream.App.Tests.Rendering;
/// seedRegion parameter — the port of that installed-view clip — against the /// seedRegion parameter — the port of that installed-view clip — against the
/// real Holtburg corner-building door. /// real Holtburg corner-building door.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue124LookInSeedRegionTests public class Issue124LookInSeedRegionTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -38,6 +38,7 @@ namespace AcDream.App.Tests.Rendering;
/// cut). Fixed by the conservative NdcScissorRect bound; the assertions below /// cut). Fixed by the conservative NdcScissorRect bound; the assertions below
/// pin both properties. /// pin both properties.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue130DoorwayStripTests public class Issue130DoorwayStripTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -15,6 +15,7 @@ namespace AcDream.App.Tests.Rendering;
/// translucent swirl; lamp posts / creatures / signs identify by part shape. /// translucent swirl; lamp posts / creatures / signs identify by part shape.
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public class Issue131SetupProbeTests public class Issue131SetupProbeTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -33,6 +33,7 @@ namespace AcDream.App.Tests.Rendering;
/// D. #176 walk — eye tracks down the corridor across two seams, gaze /// D. #176 walk — eye tracks down the corridor across two seams, gaze
/// locked +X: per-step admitted-set diffs (drop-for-one-step churn). /// locked +X: per-step admitted-set diffs (drop-for-one-step churn).
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue176177FacilityHubFloodReplayTests public class Issue176177FacilityHubFloodReplayTests
{ {
private const uint FacilityHub = 0x8A020000u; private const uint FacilityHub = 0x8A020000u;

View file

@ -32,6 +32,7 @@ namespace AcDream.App.Tests.Rendering;
/// admitted, the flood is exonerated and the artifact lives downstream. /// admitted, the flood is exonerated and the artifact lives downstream.
/// </summary> /// </summary>
[Collection(CameraDiagnosticsCollection.Name)] [Collection(CameraDiagnosticsCollection.Name)]
[Trait("Lane", "InstalledDat")]
public class Issue177StairDescentCameraFloodTests public class Issue177StairDescentCameraFloodTests
{ {
private const uint FacilityHub = 0x8A020000u; private const uint FacilityHub = 0x8A020000u;

View file

@ -22,6 +22,7 @@ namespace AcDream.App.Tests.Rendering;
/// axis; ANY admitted-set difference at sub-mm perturbation is the #181 /// axis; ANY admitted-set difference at sub-mm perturbation is the #181
/// instability, and the symmetric difference names the flapping cell. /// instability, and the symmetric difference names the flapping cell.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue181VisFlapReplayTests public class Issue181VisFlapReplayTests
{ {
private const uint FacilityHub = 0x8A020000u; private const uint FacilityHub = 0x8A020000u;

View file

@ -33,6 +33,7 @@ namespace AcDream.App.Tests.Rendering;
/// </summary> /// </summary>
[Collection(CameraDiagnosticsCollection.Name)] [Collection(CameraDiagnosticsCollection.Name)]
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public class Issue181WallPressEquilibriumTests public class Issue181WallPressEquilibriumTests
{ {
private const uint FacilityHubLandblock = 0x8A020000u; private const uint FacilityHubLandblock = 0x8A020000u;

View file

@ -25,6 +25,7 @@ namespace AcDream.App.Tests.Rendering;
/// root's stab_list size (<see cref="LoadedCell.VisibleCells"/>), plus how many visited cells /// root's stab_list size (<see cref="LoadedCell.VisibleCells"/>), plus how many visited cells
/// cross landblocks. The single assertion just guarantees the test ran; the VALUE is the output. /// cross landblocks. The single assertion just guarantees the test ran; the VALUE is the output.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue95DungeonFloodDiagnosticTests public class Issue95DungeonFloodDiagnosticTests
{ {
private const uint TownNetwork = 0x00070000u; private const uint TownNetwork = 0x00070000u;

View file

@ -48,6 +48,7 @@ public sealed class LinuxMonotonicFramePacingWaiterTests
} }
[Fact] [Fact]
[Trait("Lane", "Linux")]
public void LinuxWaitBlocksUntilRequestedMonotonicDeadline() public void LinuxWaitBlocksUntilRequestedMonotonicDeadline()
{ {
if (!OperatingSystem.IsLinux()) if (!OperatingSystem.IsLinux())
@ -70,6 +71,7 @@ public sealed class LinuxMonotonicFramePacingWaiterTests
} }
[Fact] [Fact]
[Trait("Lane", "Linux")]
public void LinuxWaiterRejectsUseAfterDisposal() public void LinuxWaiterRejectsUseAfterDisposal()
{ {
if (!OperatingSystem.IsLinux()) if (!OperatingSystem.IsLinux())

View file

@ -52,6 +52,7 @@ public sealed class PortalTunnelAssetTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_ResolvesRetailPortalSetupAndAnimation() public void InstalledDat_ResolvesRetailPortalSetupAndAnimation()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();

View file

@ -206,6 +206,7 @@ public sealed class RetailParticleGeometryClassifierTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledArmorSelfShieldPieces_areModeOneMeshesWithAuthoredApexFaces() public void InstalledArmorSelfShieldPieces_areModeOneMeshesWithAuthoredApexFaces()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();
@ -264,6 +265,7 @@ public sealed class RetailParticleGeometryClassifierTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledHumanEffectTable_MapsPortalVisibilityScripts() public void InstalledHumanEffectTable_MapsPortalVisibilityScripts()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();
@ -278,6 +280,7 @@ public sealed class RetailParticleGeometryClassifierTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledAerlintheSwarmEmitter_UsesItsHardwareGfxDegradeDistance() public void InstalledAerlintheSwarmEmitter_UsesItsHardwareGfxDegradeDistance()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();

View file

@ -16,6 +16,7 @@ namespace AcDream.App.Tests.Rendering;
public sealed class RetailSelectionAssetTests public sealed class RetailSelectionAssetTests
{ {
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_ResolvesAllTwelveVividTargetImages() public void InstalledDat_ResolvesAllTwelveVividTargetImages()
{ {
string datDir = ResolveDatDir(); string datDir = ResolveDatDir();
@ -58,6 +59,7 @@ public sealed class RetailSelectionAssetTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void DoorSelectionGeometry_UsesDrawingBspRootSphereAndDatPolygonOrder() public void DoorSelectionGeometry_UsesDrawingBspRootSphereAndDatPolygonOrder()
{ {
const uint doorGfxObjId = 0x010044B5u; const uint doorGfxObjId = 0x010044B5u;

View file

@ -318,6 +318,7 @@ public sealed class LandblockBuildFactoryTests
} }
[Fact] [Fact]
[Trait("Lane", "PreparedPackage")]
public void InstalledDatNearBuild_IsDeterministicAndClosesEntityPhysicsPayload() public void InstalledDatNearBuild_IsDeterministicAndClosesEntityPhysicsPayload()
{ {
string? datDirectory = ResolveDatDirectory(); string? datDirectory = ResolveDatDirectory();

View file

@ -75,6 +75,7 @@ public class IconComposerTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void ResolveUnderlayDid_goldenValues_matchDat() public void ResolveUnderlayDid_goldenValues_matchDat()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -103,6 +104,7 @@ public class IconComposerTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void ResolveEffectDid_goldenValues_matchDat() public void ResolveEffectDid_goldenValues_matchDat()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -128,6 +130,7 @@ public class IconComposerTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void TryGetEffectTile_noEffectBlack_magicalTextured() public void TryGetEffectTile_noEffectBlack_magicalTextured()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();

View file

@ -11,6 +11,7 @@ using Xunit;
namespace AcDream.App.Tests.UI.Layout; namespace AcDream.App.Tests.UI.Layout;
[Trait("Lane", "InstalledDat")]
public sealed class CharacterLayoutImportProbe public sealed class CharacterLayoutImportProbe
{ {
private const uint CharacterLayout = 0x2100002Eu; private const uint CharacterLayout = 0x2100002Eu;

View file

@ -54,6 +54,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// see its own class doc) are unaffected. /// see its own class doc) are unaffected.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChatIndicatorButtonLiveMountProbeTests public sealed class ChatIndicatorButtonLiveMountProbeTests
{ {
[Fact] [Fact]

View file

@ -16,6 +16,7 @@ namespace AcDream.App.Tests.UI.Layout;
public sealed class ChatOptionsDatDefaultsTests public sealed class ChatOptionsDatDefaultsTests
{ {
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_ResolvesTheByteVerifiedSliderDefaults() public void InstalledDat_ResolvesTheByteVerifiedSliderDefaults()
{ {
string datDir = ResolveDatDir(); string datDir = ResolveDatDir();

View file

@ -15,6 +15,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// and 0x10000263 (swear-allegiance button). Env-gated like the other probes. /// and 0x10000263 (swear-allegiance button). Env-gated like the other probes.
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class FaPanelSlotProbeTests public sealed class FaPanelSlotProbeTests
{ {
[Fact] [Fact]

View file

@ -18,6 +18,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// backdrop (ZLevel 100 → ≈ 1,000,000), and the backdrop washed out the panels' captions, /// backdrop (ZLevel 100 → ≈ 1,000,000), and the backdrop washed out the panels' captions,
/// burden meter, and item cells. Skips when the live dat directory is absent (CI). /// burden meter, and item cells. Skips when the live dat directory is absent (CI).
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class InventoryFrameImportProbe public class InventoryFrameImportProbe
{ {
private const uint Frame = 0x21000023u; private const uint Frame = 0x21000023u;

View file

@ -749,6 +749,7 @@ public sealed class ItemAppraisalTextFormatterTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void EndOfRetailDatNameResolver_LoadsMaterialAndCreatureNames() public void EndOfRetailDatNameResolver_LoadsMaterialAndCreatureNames()
{ {
string? datDirectory = ResolveDatDirectory(); string? datDirectory = ResolveDatDirectory();

View file

@ -15,6 +15,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// square 0x060074CF. Also PRINTS the resolved ids — the "pin the exact asset" record. /// square 0x060074CF. Also PRINTS the resolved ids — the "pin the exact asset" record.
/// Skips when the live dat directory is absent (CI). /// Skips when the live dat directory is absent (CI).
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class ItemListCellTemplateTests public class ItemListCellTemplateTests
{ {
private const uint Generic = 0x060074CFu; // generic toolbar-shortcut empty square (the bug) private const uint Generic = 0x060074CFu; // generic toolbar-shortcut empty square (the bug)

View file

@ -16,6 +16,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// rect + caption evidence for each observation. Env-gated like the other /// rect + caption evidence for each observation. Env-gated like the other
/// live probes so CI/dat-less runs skip it. /// live probes so CI/dat-less runs skip it.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class KeyboardConfigLiveMountProbeTests public sealed class KeyboardConfigLiveMountProbeTests
{ {
[Fact] [Fact]

View file

@ -26,6 +26,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class MapHousePanelSlotProbeTests public sealed class MapHousePanelSlotProbeTests
{ {
private const uint HostLayoutId = 0x2100006Eu; private const uint HostLayoutId = 0x2100006Eu;

View file

@ -16,6 +16,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// page controller actually resolves. Env-gated like the fixture /// page controller actually resolves. Env-gated like the fixture
/// generator so CI/dat-less runs skip it. /// generator so CI/dat-less runs skip it.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class OptionsPanelLiveMountProbeTests public sealed class OptionsPanelLiveMountProbeTests
{ {
[Fact] [Fact]

View file

@ -45,6 +45,7 @@ public sealed class PaperdollClickMapTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void LiveDat_resolvesRetailClickMapAndAllNineBodyRegions() public void LiveDat_resolvesRetailClickMapAndAllNineBodyRegions()
{ {
string datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") string datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR")

View file

@ -47,6 +47,7 @@ public class PaperdollSlotBackgroundTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Live_dat_resolves_all_pinned_retail_backgrounds() public void Live_dat_resolves_all_pinned_retail_backgrounds()
{ {
string datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR") string datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR")

View file

@ -15,6 +15,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// INSTALLED DAT, so the "Height"/"Power"/"Accuracy" fix binds exactly what /// INSTALLED DAT, so the "Height"/"Power"/"Accuracy" fix binds exactly what
/// retail authors instead of guessing. /// retail authors instead of guessing.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class PowerbarLayoutProbeTests public sealed class PowerbarLayoutProbeTests
{ {
[Fact] [Fact]

View file

@ -18,6 +18,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// its button→page pairing + default entry can be recorded — coordinator /// its button→page pairing + default entry can be recorded — coordinator
/// addendum, docs/research/2026-08-11-fa-panel-structure.md §10. /// addendum, docs/research/2026-08-11-fa-panel-structure.md §10.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class SocialPanelLiveMountProbeTests public sealed class SocialPanelLiveMountProbeTests
{ {
[Fact] [Fact]

View file

@ -4,6 +4,7 @@ using DatReaderWriter.Options;
namespace AcDream.App.Tests.UI.Layout; namespace AcDream.App.Tests.UI.Layout;
[Trait("Lane", "InstalledDat")]
public sealed class SpellbookRowStyleTests public sealed class SpellbookRowStyleTests
{ {
[Fact] [Fact]

View file

@ -24,6 +24,7 @@ public sealed class RetailCursorCatalogTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void WindowControlCursorSpecs_resolveGoldenDatSurfaces() public void WindowControlCursorSpecs_resolveGoldenDatSurfaces()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();
@ -82,6 +83,7 @@ public sealed class RetailCursorCatalogTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void ReachableGlobalCursorSpecs_resolveGoldenDatSurfaces() public void ReachableGlobalCursorSpecs_resolveGoldenDatSurfaces()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();

View file

@ -76,6 +76,7 @@ namespace AcDream.App.Tests.UI;
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class SpewBoxLayoutDumpDiagnostic public sealed class SpewBoxLayoutDumpDiagnostic
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -35,6 +35,7 @@ public sealed class UiDatFontBorderPixelTests
[InlineData(0x40000001u, 4u, 4u)] // 18px bold serif — SpewBox face (round 4) [InlineData(0x40000001u, 4u, 4u)] // 18px bold serif — SpewBox face (round 4)
[InlineData(0x40000002u, 3u, 3u)] // 14px bold serif [InlineData(0x40000002u, 3u, 3u)] // 14px bold serif
[InlineData(0x40000025u, 3u, 3u)] // 11px — the pre-round-4 SpewBox placeholder face [InlineData(0x40000025u, 3u, 3u)] // 11px — the pre-round-4 SpewBox placeholder face
[Trait("Lane", "InstalledDat")]
public void RealDatFont_HasExpectedBorderPixels(uint fontId, uint expectedHorizontal, uint expectedVertical) public void RealDatFont_HasExpectedBorderPixels(uint fontId, uint expectedHorizontal, uint expectedVertical)
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();
@ -49,6 +50,7 @@ public sealed class UiDatFontBorderPixelTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void RealDatFont_EveryFontWithABackgroundAtlas_HasANonZeroBorder() public void RealDatFont_EveryFontWithABackgroundAtlas_HasANonZeroBorder()
{ {
// docs/research/2026-08-10-retail-ui-text-style.md §1.2: "every font that // docs/research/2026-08-10-retail-ui-text-style.md §1.2: "every font that

View file

@ -237,6 +237,7 @@ public sealed class UiRenderContextAlphaTests
// -- DrawString (BitmapFont path): the same alpha chokepoint, guarded --- // -- DrawString (BitmapFont path): the same alpha chokepoint, guarded ---
[Fact] [Fact]
[Trait("Lane", "SystemFont")]
public void FullOpacity_DrawString_BitmapFontPath_MatchesRequestedAlpha_Identity() public void FullOpacity_DrawString_BitmapFontPath_MatchesRequestedAlpha_Identity()
{ {
// CH6c review NIT: DrawStringDat (retail dat-font glyphs) had its own // CH6c review NIT: DrawStringDat (retail dat-font glyphs) had its own
@ -258,6 +259,7 @@ public sealed class UiRenderContextAlphaTests
} }
[Fact] [Fact]
[Trait("Lane", "SystemFont")]
public void HalfOpacityWindow_MultipliesBitmapFontGlyphAlpha() public void HalfOpacityWindow_MultipliesBitmapFontGlyphAlpha()
{ {
var device = new RecordingGpuDevice(); var device = new RecordingGpuDevice();

View file

@ -145,6 +145,7 @@ public sealed class LiveEntityPresentationControllerTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void SpellRecall_HiddenAndUnHide_RetireMagicTimelineThroughController() public void SpellRecall_HiddenAndUnHide_RetireMagicTimelineThroughController()
{ {
const uint humanSetup = 0x02000001u; const uint humanSetup = 0x02000001u;

View file

@ -185,6 +185,7 @@ public sealed class RecallTeleportAnimationTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledRecall_HiddenEnterWorldPublishesFinishedCyclicPoseWithoutAdvancingTime() public void InstalledRecall_HiddenEnterWorldPublishesFinishedCyclicPoseWithoutAdvancingTime()
{ {
string datDir = @"C:\Turbine\Asheron's Call"; string datDir = @"C:\Turbine\Asheron's Call";

View file

@ -15,6 +15,7 @@ namespace AcDream.Bake.Tests;
/// are absent (CI), same convention as /// are absent (CI), same convention as
/// tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests. /// tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class BakeDeterminismTests : IDisposable { public sealed class BakeDeterminismTests : IDisposable {
private readonly List<string> _tempFiles = new(); private readonly List<string> _tempFiles = new();

View file

@ -23,6 +23,7 @@ namespace AcDream.Content.Tests;
/// of the 3,605 "sphere-only, no cylinder" Setups the reachability sweep /// of the 3,605 "sphere-only, no cylinder" Setups the reachability sweep
/// already counted fall into exactly that trap. /// already counted fall into exactly that trap.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Ap155StaticSpherePopulationMeasurementTests public sealed class Ap155StaticSpherePopulationMeasurementTests
{ {
[Fact] [Fact]

View file

@ -22,6 +22,7 @@ namespace AcDream.Content.Tests.CharGen;
/// <c>ChargenAppearanceCatalogInstalledDatTests</c>): returns green with a /// <c>ChargenAppearanceCatalogInstalledDatTests</c>): returns green with a
/// console SKIP note when no installed dat directory is configured.</para> /// console SKIP note when no installed dat directory is configured.</para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenAppearanceCatalogColorTests public sealed class ChargenAppearanceCatalogColorTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -28,6 +28,7 @@ namespace AcDream.Content.Tests.CharGen;
/// consistent with the rest of the suite rather than introducing a new /// consistent with the rest of the suite rather than introducing a new
/// convention.</para> /// convention.</para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenAppearanceCatalogInstalledDatTests public sealed class ChargenAppearanceCatalogInstalledDatTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -14,6 +14,7 @@ namespace AcDream.Content.Tests.CharGen;
/// cleanly (with a console note) when no DAT directory is configured, /// cleanly (with a console note) when no DAT directory is configured,
/// matching e.g. <c>PakEquivalenceTests</c> / <c>RetailDatLoaderTests</c>. /// matching e.g. <c>PakEquivalenceTests</c> / <c>RetailDatLoaderTests</c>.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenTableReaderInstalledDatTests public sealed class ChargenTableReaderInstalledDatTests
{ {
// ACE ACE.Entity.Enum.HeritageGroup — the four heritages CC1's spec // ACE ACE.Entity.Enum.HeritageGroup — the four heritages CC1's spec

View file

@ -4,6 +4,7 @@ using DatReaderWriter.Options;
namespace AcDream.Content.Tests; namespace AcDream.Content.Tests;
[Trait("Lane", "PreparedPackage")]
public sealed class InstalledPreparedCollisionCatalogTests public sealed class InstalledPreparedCollisionCatalogTests
{ {
[Fact] [Fact]

View file

@ -33,6 +33,7 @@ namespace AcDream.Content.Tests;
/// predicate used here. /// predicate used here.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class InstalledSetupBspPrimitiveDispatchTests public sealed class InstalledSetupBspPrimitiveDispatchTests
{ {
// EXTERNAL constants. The four bucket controls are the ones already // EXTERNAL constants. The four bucket controls are the ones already

View file

@ -12,6 +12,7 @@ namespace AcDream.Content.Tests;
/// asserts no such Setup exists, so the deletion cannot remove collision from /// asserts no such Setup exists, so the deletion cannot remove collision from
/// any real object. /// any real object.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class InstalledSetupCollisionReachabilityTests public sealed class InstalledSetupCollisionReachabilityTests
{ {
// Positive controls. These are EXTERNAL constants, measured on 2026-08-06 // Positive controls. These are EXTERNAL constants, measured on 2026-08-06

View file

@ -42,6 +42,7 @@ namespace AcDream.Content.Tests;
/// columns 0..4 on both axes. /// columns 0..4 on both axes.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue334NeftetFormationCellMembershipTests public sealed class Issue334NeftetFormationCellMembershipTests
{ {
private const uint NeftetLandblock = 0x87640000u; private const uint NeftetLandblock = 0x87640000u;

View file

@ -20,6 +20,7 @@ namespace AcDream.Content.Tests;
/// Skips cleanly when the real dats are absent (CI), matching /// Skips cleanly when the real dats are absent (CI), matching
/// DatConcurrencyStressTests' convention. /// DatConcurrencyStressTests' convention.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class PakEquivalenceTests { public sealed class PakEquivalenceTests {
// Known-tricky GfxObj ids reused from existing conformance fixtures: // Known-tricky GfxObj ids reused from existing conformance fixtures:
// 0x010002B4 / 0x010008A8 — #119 "[up-null] upload returned null" dump // 0x010002B4 / 0x010008A8 — #119 "[up-null] upload returned null" dump

View file

@ -17,6 +17,7 @@ namespace AcDream.Content.Tests;
/// construct (its ctor builds a RetailPhysicsScriptLoader from dats.Portal). /// construct (its ctor builds a RetailPhysicsScriptLoader from dats.Portal).
/// Skips cleanly when dats are absent, matching ContentConformanceDats convention. /// Skips cleanly when dats are absent, matching ContentConformanceDats convention.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class SolidColorTextureCacheTests { public sealed class SolidColorTextureCacheTests {
[Fact] [Fact]
public void GetOrCreateSolidColorTexture_SameColor_ReturnsSameSharedArray() { public void GetOrCreateSolidColorTexture_SameColor_ReturnsSameSharedArray() {

View file

@ -73,6 +73,7 @@ public sealed class RetailSpellMetadataProjectorTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Load_EndOfRetailDat_ResolvesEveryLateLearnedSpellMissingFromCsv() public void Load_EndOfRetailDat_ResolvesEveryLateLearnedSpellMissingFromCsv()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();
@ -101,6 +102,7 @@ public sealed class RetailSpellMetadataProjectorTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Load_EndOfRetailDat_UsesRetailFormulaTargetsInsteadOfLegacyExportMasks() public void Load_EndOfRetailDat_UsesRetailFormulaTargetsInsteadOfLegacyExportMasks()
{ {
string? datDir = ResolveDatDir(); string? datDir = ResolveDatDir();

View file

@ -432,6 +432,7 @@ public sealed class RetailDatLoaderTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledBlockingScripts_ParseThroughRetailShape_WhenDatsAvailable() public void InstalledBlockingScripts_ParseThroughRetailShape_WhenDatsAvailable()
{ {
string? datDir = ResolveDatDirectory(); string? datDir = ResolveDatDirectory();

View file

@ -29,6 +29,7 @@ namespace AcDream.Core.Net.Tests;
/// the env-var setup are distinguishable from server errors. /// the env-var setup are distinguishable from server errors.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "Live")]
public class LiveHandshakeTests public class LiveHandshakeTests
{ {
[Fact] [Fact]

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Audio;
/// absent. /// absent.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class EnvCellSoundEmitterInventoryTests public sealed class EnvCellSoundEmitterInventoryTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Audio;
/// installed-dat test in this suite. /// installed-dat test in this suite.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class UiSoundTableResolutionTests public sealed class UiSoundTableResolutionTests
{ {
/// <summary> /// <summary>

View file

@ -15,6 +15,7 @@ namespace AcDream.Core.Tests.Conformance;
/// not the master plan's loose "0031↔0170↔0171". The cottage cellar is the /// not the master plan's loose "0031↔0170↔0171". The cottage cellar is the
/// 0x014x range (#98 fixtures); the doorway room/vestibule is in 0x017x. /// 0x014x range (#98 fixtures); the doorway room/vestibule is in 0x017x.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class CottageDoorwayCharacterizationTests public class CottageDoorwayCharacterizationTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -39,6 +39,7 @@ namespace AcDream.Core.Tests.Conformance;
/// (e.g. dispose-during-read at teardown) or layers above the dat reader. /// (e.g. dispose-during-read at teardown) or layers above the dat reader.
/// </summary> /// </summary>
[Trait("Category", "Conformance")] [Trait("Category", "Conformance")]
[Trait("Lane", "InstalledDat")]
public class DatConcurrencyStressTests public class DatConcurrencyStressTests
{ {
private const int HammerThreads = 8; private const int HammerThreads = 8;

View file

@ -17,6 +17,7 @@ namespace AcDream.Core.Tests.Conformance;
/// LandBlockInfo + EnvCells? Output-only — no assertions. /// LandBlockInfo + EnvCells? Output-only — no assertions.
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class DungeonLandblockDatProbeTests public sealed class DungeonLandblockDatProbeTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -30,6 +30,7 @@ public class FindCellListConformanceTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void FindCellList_DeepInsideRoom0171_Returns0171() public void FindCellList_DeepInsideRoom0171_Returns0171()
{ {
var datDir = ConformanceDats.ResolveDatDir(); var datDir = ConformanceDats.ResolveDatDir();
@ -47,6 +48,7 @@ public class FindCellListConformanceTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void FindCellList_DeepInsideVestibule0170_Returns0170() public void FindCellList_DeepInsideVestibule0170_Returns0170()
{ {
var datDir = ConformanceDats.ResolveDatDir(); var datDir = ConformanceDats.ResolveDatDir();
@ -70,6 +72,7 @@ public class FindCellListConformanceTests
/// property P1 must preserve. /// property P1 must preserve.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void FindCellList_InVestibule_SeededFromRoom_Returns0170() public void FindCellList_InVestibule_SeededFromRoom_Returns0170()
{ {
var datDir = ConformanceDats.ResolveDatDir(); var datDir = ConformanceDats.ResolveDatDir();

View file

@ -21,6 +21,7 @@ namespace AcDream.Core.Tests.Conformance;
/// separately in the decomp). Output-only — no assertions; read the log. /// separately in the decomp). Output-only — no assertions; read the log.
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class HoltburgTorchFalloffProbeTests public sealed class HoltburgTorchFalloffProbeTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -27,6 +27,7 @@ namespace AcDream.Core.Tests.Conformance;
/// find_visible_child_cell also cannot recover a cross-building claim and /// find_visible_child_cell also cannot recover a cross-building claim and
/// falls to seen_outside → adjust_to_outside, acclient :280037). /// falls to seen_outside → adjust_to_outside, acclient :280037).
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue107SpawnDiagnosticTests public sealed class Issue107SpawnDiagnosticTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -19,6 +19,7 @@ namespace AcDream.Core.Tests.Conformance;
/// (pc:308788-308825). These tests pin the replacement semantics against the /// (pc:308788-308825). These tests pin the replacement semantics against the
/// real dats. /// real dats.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue112MembershipTests public sealed class Issue112MembershipTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -21,6 +21,7 @@ namespace AcDream.Core.Tests.Conformance;
/// carry polygon references in properties the walk missed (portal-type /// carry polygon references in properties the walk missed (portal-type
/// nodes / leaf subclasses)? Pure diagnostic — no production code. /// nodes / leaf subclasses)? Pure diagnostic — no production code.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue113DoorVanishDiagnosticTests public sealed class Issue113DoorVanishDiagnosticTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -24,6 +24,7 @@ namespace AcDream.Core.Tests.Conformance;
/// interior cell's Position + world AABB + SeenOutside flag + stair signature /// interior cell's Position + world AABB + SeenOutside flag + stair signature
/// (distinct horizontal-face heights), and containment of the two key points. /// (distinct horizontal-face heights), and containment of the two key points.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue113PhantomStairsDumpTests public sealed class Issue113PhantomStairsDumpTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -24,6 +24,7 @@ namespace AcDream.Core.Tests.Conformance;
/// static object (id + position) — the barrel candidate and the stair /// static object (id + position) — the barrel candidate and the stair
/// owners read directly off the output. /// owners read directly off the output.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue119TowerDumpTests public sealed class Issue119TowerDumpTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -23,6 +23,7 @@ namespace AcDream.Core.Tests.Conformance;
/// ObjectMeshManager in MP1a) /// ObjectMeshManager in MP1a)
/// so the zeroing gate reads directly off the output. /// so the zeroing gate reads directly off the output.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue119UpNullGfxObjDumpTests public sealed class Issue119UpNullGfxObjDumpTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -30,6 +30,7 @@ namespace AcDream.Core.Tests.Conformance;
/// Violations of (b) on PLAIN OBJECT GfxObjs are allowed — retail's bypass /// Violations of (b) on PLAIN OBJECT GfxObjs are allowed — retail's bypass
/// draws solid batches for non-building/non-cell meshes, and so do we. /// draws solid batches for non-building/non-cell meshes, and so do we.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class StipplingSurfaceEquivalenceTests public sealed class StipplingSurfaceEquivalenceTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -14,6 +14,7 @@ namespace AcDream.Core.Tests.Conformance;
/// (real pick-criterion divergence vs a test/sphere artifact). /// (real pick-criterion divergence vs a test/sphere artifact).
/// </summary> /// </summary>
[Trait("Purpose", "Diagnostic")] [Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public class ThresholdDivergenceDiagnosticTests public class ThresholdDivergenceDiagnosticTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -27,6 +27,7 @@ namespace AcDream.Core.Tests.Conformance;
/// building-cell cache. The outdoor-involving segments (0031↔0170) need the landcell + /// building-cell cache. The outdoor-involving segments (0031↔0170) need the landcell +
/// building portal and are a follow-up. /// building portal and are a follow-up.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class ThresholdPortalCrossingReplayTests public class ThresholdPortalCrossingReplayTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -54,6 +54,7 @@ namespace AcDream.Core.Tests.Input;
/// here. Reported, not silently resolved either way.</description></item> /// here. Reported, not silently resolved either way.</description></item>
/// </list> /// </list>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class RetailActionIdentityRoundTripTests public sealed class RetailActionIdentityRoundTripTests
{ {
/// <summary>Actions with a citation-backed, pre-existing reason their DAT-union /// <summary>Actions with a citation-backed, pre-existing reason their DAT-union

View file

@ -204,6 +204,7 @@ public sealed class RetailActionMapReaderTests
/// <summary>Live-DAT conformance: pins the exact shape of the installed /// <summary>Live-DAT conformance: pins the exact shape of the installed
/// <c>client_portal.dat</c>/<c>client_local_English.dat</c> ActionMap + /// <c>client_portal.dat</c>/<c>client_local_English.dat</c> ActionMap +
/// MasterInputMap objects. Skips cleanly when the dats are unavailable.</summary> /// MasterInputMap objects. Skips cleanly when the dats are unavailable.</summary>
[Trait("Lane", "InstalledDat")]
public sealed class RetailActionMapReader_LiveDatTests public sealed class RetailActionMapReader_LiveDatTests
{ {
[Fact] [Fact]

View file

@ -59,6 +59,7 @@ namespace AcDream.Core.Tests.Physics;
/// the flood-sphere list, not a subset or approximation of it. /// the flood-sphere list, not a subset or approximation of it.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Ap157SortingSphereFloodMeasurementTests public sealed class Ap157SortingSphereFloodMeasurementTests
{ {
/// <summary>Arbitrary non-zero landblock id — only its prefix matters for /// <summary>Arbitrary non-zero landblock id — only its prefix matters for

View file

@ -189,6 +189,7 @@ public sealed class BoxIntersectsCellBspDifferentialTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_RandomizedBoxSweepOverEnvCellContainmentBsps_HasZeroMismatch() public void InstalledDat_RandomizedBoxSweepOverEnvCellContainmentBsps_HasZeroMismatch()
{ {
string? datDirectory = ConformanceDats.ResolveDatDir(); string? datDirectory = ConformanceDats.ResolveDatDir();

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Physics;
/// L20104 / L20224 / L20386 (door-exit) + L23035 / L81340 / L87958 (corner press); /// L20104 / L20224 / L20386 (door-exit) + L23035 / L81340 / L87958 (corner press);
/// pivot = player + (0,0,1.5) per RetailChaseCamera.PivotHeight. /// pivot = player + (0,0,1.5) per RetailChaseCamera.PivotHeight.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class CameraCornerSealReplayTests public class CameraCornerSealReplayTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -263,6 +263,7 @@ public sealed class CellTransitFindTransitCellsBoxTests
/// for the exact counts from this run. /// for the exact counts from this run.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_RandomizedPartSweepNearRealPortals_PostFixMembershipIsSubsetOfPreFix() public void InstalledDat_RandomizedPartSweepNearRealPortals_PostFixMembershipIsSubsetOfPreFix()
{ {
string? datDirectory = ConformanceDats.ResolveDatDir(); string? datDirectory = ConformanceDats.ResolveDatDir();

View file

@ -28,6 +28,7 @@ namespace AcDream.Core.Tests.Physics;
/// semantics on real Holtburg dat geometry. /// semantics on real Holtburg dat geometry.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class CellTransitTests public class CellTransitTests
{ {
[Fact] [Fact]

View file

@ -82,6 +82,7 @@ public class DoorBugTrajectoryReplayTests
/// door's outdoor cell when production's doesn't. /// door's outdoor cell when production's doesn't.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void LiveCompare_DoorOffCenterWalkthrough_Tick13558() public void LiveCompare_DoorOffCenterWalkthrough_Tick13558()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -117,6 +118,7 @@ public class DoorBugTrajectoryReplayTests
/// registration itself is wrong. /// registration itself is wrong.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void LiveCompare_DoorBlocksFromOutside_Tick22760() public void LiveCompare_DoorBlocksFromOutside_Tick22760()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -159,6 +161,7 @@ public class DoorBugTrajectoryReplayTests
/// hard-stopped with cn=(0,0,1). Always passes; read the console dump. /// hard-stopped with cn=(0,0,1). Always passes; read the console dump.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Diagnostic_Tick22760_DumpEngineInternals() public void Diagnostic_Tick22760_DumpEngineInternals()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -211,6 +214,7 @@ public class DoorBugTrajectoryReplayTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Diagnostic_Tick13558_DumpEngineInternals() public void Diagnostic_Tick13558_DumpEngineInternals()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -272,6 +276,7 @@ public class DoorBugTrajectoryReplayTests
/// portal traversal IS the bug. /// portal traversal IS the bug.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void FindTransitCellsSphere_IndoorExitPortal_AddsOutsideForCapturedSpherePos() public void FindTransitCellsSphere_IndoorExitPortal_AddsOutsideForCapturedSpherePos()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -472,6 +477,7 @@ public class DoorBugTrajectoryReplayTests
/// </para> /// </para>
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InsideOut_Tick3254_WithCottageWalls_ShouldBlock() public void InsideOut_Tick3254_WithCottageWalls_ShouldBlock()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -543,6 +549,7 @@ public class DoorBugTrajectoryReplayTests
/// (133.5, 17.10) to end up at X > 133.5 Y > 17.10, bug reproduced. /// (133.5, 17.10) to end up at X > 133.5 Y > 17.10, bug reproduced.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void CornerSlide_AlcoveEastToCottageNorth_ShouldBlock() public void CornerSlide_AlcoveEastToCottageNorth_ShouldBlock()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -770,6 +777,7 @@ public class DoorBugTrajectoryReplayTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Geometric_DoorSlabAtSphereHeight_OverlapsInZ() public void Geometric_DoorSlabAtSphereHeight_OverlapsInZ()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -821,6 +829,7 @@ public class DoorBugTrajectoryReplayTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Directional_OutsideIn_SouthApproach_BlocksAtSlabSouthFace() public void Directional_OutsideIn_SouthApproach_BlocksAtSlabSouthFace()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();
@ -848,6 +857,7 @@ public class DoorBugTrajectoryReplayTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Directional_InsideOut_NorthApproach_BlocksAtSlabNorthFace() public void Directional_InsideOut_NorthApproach_BlocksAtSlabNorthFace()
{ {
var datDir = ResolveDatDir(); var datDir = ResolveDatDir();

View file

@ -40,6 +40,7 @@ namespace AcDream.Core.Tests.Physics;
/// CI stays green. Local developer machines always have it. /// CI stays green. Local developer machines always have it.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class DoorCollisionApparatusTests public class DoorCollisionApparatusTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -26,6 +26,7 @@ namespace AcDream.Core.Tests.Physics;
/// keeps CI green. Local developer runs always have it. /// keeps CI green. Local developer runs always have it.
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class DoorSetupGfxObjInspectionTests public class DoorSetupGfxObjInspectionTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -412,6 +412,7 @@ public sealed class FlatBspQueryDifferentialTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_LargeRandomizedSweep_HasZeroBitMismatch() public void InstalledDat_LargeRandomizedSweep_HasZeroBitMismatch()
{ {
string? datDirectory = ConformanceDats.ResolveDatDir(); string? datDirectory = ConformanceDats.ResolveDatDir();

View file

@ -9,6 +9,7 @@ using Xunit.Abstractions;
namespace AcDream.Core.Tests.Physics; namespace AcDream.Core.Tests.Physics;
[Trait("Lane", "InstalledDat")]
public sealed class FlatCollisionInstalledDatTests public sealed class FlatCollisionInstalledDatTests
{ {
private readonly ITestOutputHelper _output; private readonly ITestOutputHelper _output;

View file

@ -15,6 +15,7 @@ namespace AcDream.Core.Tests.Physics;
/// The packet-driven remote mover must use these values, not a velocity guessed /// The packet-driven remote mover must use these values, not a velocity guessed
/// from the interpreted command. /// from the interpreted command.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class HumanoidMotionTableRootMotionTests public sealed class HumanoidMotionTableRootMotionTests
{ {
private const uint HumanoidMotionTable = 0x09000001u; private const uint HumanoidMotionTable = 0x09000001u;

View file

@ -66,6 +66,7 @@ namespace AcDream.Core.Tests.Physics;
/// eye projects into the aperture band at y 9.817) paints the doorway. /// eye projects into the aperture band at y 9.817) paints the doorway.
/// These tests stay as the characterization pin for the healthy layer. /// These tests stay as the characterization pin for the healthy layer.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue108CellarAscentViewerReplayTests public class Issue108CellarAscentViewerReplayTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -20,6 +20,7 @@ namespace AcDream.Core.Tests.Physics;
/// (normal ≈ ±X at the portal's local X) — i.e., are portal-sealing polys in /// (normal ≈ ±X at the portal's local X) — i.e., are portal-sealing polys in
/// our collision set where retail filters them? /// our collision set where retail filters them?
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue137CorridorSeamInspectionTests public class Issue137CorridorSeamInspectionTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Physics;
/// running must keep advancing (no absorbing wedge). /// running must keep advancing (no absorbing wedge).
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue137CorridorSeamReplayTests public class Issue137CorridorSeamReplayTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -17,6 +17,7 @@ namespace AcDream.Core.Tests.Physics;
/// (a separate shadow-object collision path). Dat-data-dependent; SKIPs cleanly /// (a separate shadow-object collision path). Dat-data-dependent; SKIPs cleanly
/// without ACDREAM_DAT_DIR / the real dats. /// without ACDREAM_DAT_DIR / the real dats.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue147ArwicBuildingsDumpTests public sealed class Issue147ArwicBuildingsDumpTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -39,6 +39,7 @@ public class Issue175HubDoorPoseInspectionTests
private const uint HubDoorSetupId = 0x02000C9Du; private const uint HubDoorSetupId = 0x02000C9Du;
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void HubDoorSetup_PlacementVsMotionPose_DatInspection() public void HubDoorSetup_PlacementVsMotionPose_DatInspection()
{ {
var datDir = Env.GetEnvironmentVariable("ACDREAM_DAT_DIR") var datDir = Env.GetEnvironmentVariable("ACDREAM_DAT_DIR")
@ -161,6 +162,7 @@ public class Issue175HubDoorPoseInspectionTests
/// NonCombat/Ready) and asserts the derivation actually resolves a pose. /// NonCombat/Ready) and asserts the derivation actually resolves a pose.
/// </summary> /// </summary>
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void MotionTablePose_DefaultState_ResolvesOnRealTable() public void MotionTablePose_DefaultState_ResolvesOnRealTable()
{ {
var datDir = Env.GetEnvironmentVariable("ACDREAM_DAT_DIR") var datDir = Env.GetEnvironmentVariable("ACDREAM_DAT_DIR")

View file

@ -24,6 +24,7 @@ namespace AcDream.Core.Tests.Physics;
/// stair pop). This replay measures OUR resolver's flip point across the /// stair pop). This replay measures OUR resolver's flip point across the
/// x=85 seam in a controlled run. /// x=85 seam in a controlled run.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue176177SeamTransitLagTests public class Issue176177SeamTransitLagTests
{ {
private const uint SeamCellWest = 0x8A02016Eu; // x 75..85 private const uint SeamCellWest = 0x8A02016Eu; // x 75..85

View file

@ -35,6 +35,7 @@ namespace AcDream.Core.Tests.Physics;
/// 3. the clipped eye is the CONSTANT surface-contact point (pre-fix it /// 3. the clipped eye is the CONSTANT surface-contact point (pre-fix it
/// tracked the target one step back: eyeBack = s ~0.27). /// tracked the target one step back: eyeBack = s ~0.27).
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue180CorridorSweepHysteresisReplayTests public class Issue180CorridorSweepHysteresisReplayTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -20,6 +20,7 @@ namespace AcDream.Core.Tests.Physics;
/// bare connector? And does it carry collision geometry (so the camera sweep would /// bare connector? And does it carry collision geometry (so the camera sweep would
/// hard-stop) or none (so the boom coasts to a degenerate spot)? Skips without the dat. /// hard-stop) or none (so the boom coasts to a degenerate spot)? Skips without the dat.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue186ConnectorCellGeometryInspectionTests public class Issue186ConnectorCellGeometryInspectionTests
{ {
private readonly ITestOutputHelper _out; private readonly ITestOutputHelper _out;

View file

@ -74,6 +74,7 @@ public class Issue188FadingDoorMotionTableInspectionTests
} }
[Fact] [Fact]
[Trait("Lane", "InstalledDat")]
public void Dump_PedestalWeakSpot_MotionTable_HookContents() public void Dump_PedestalWeakSpot_MotionTable_HookContents()
{ {
var datDir = DatDir(); var datDir = DatDir();

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Physics;
/// ///
/// Dat-data dependent; SKIPs cleanly without ACDREAM_DAT_DIR. /// Dat-data dependent; SKIPs cleanly without ACDREAM_DAT_DIR.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue337NeftetRockGeometryInspectionTests public sealed class Issue337NeftetRockGeometryInspectionTests
{ {
private const uint Landblock = 0x8766_0000u; private const uint Landblock = 0x8766_0000u;

View file

@ -40,6 +40,7 @@ namespace AcDream.Core.Tests.Physics;
/// present (CI has no local AC install). /// present (CI has no local AC install).
/// </para> /// </para>
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public class MotionCommandCatalogDatTests public class MotionCommandCatalogDatTests
{ {
/// <summary> /// <summary>

View file

@ -18,6 +18,7 @@ namespace AcDream.Core.Tests.Physics;
/// when the installed DATs are absent (CI), following the /// when the installed DATs are absent (CI), following the
/// DoorSetupGfxObjInspectionTests pattern. /// DoorSetupGfxObjInspectionTests pattern.
/// </summary> /// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class RestrictionObjPrevalenceInspectionTests public sealed class RestrictionObjPrevalenceInspectionTests
{ {
private readonly ITestOutputHelper _output; private readonly ITestOutputHelper _output;

Some files were not shown because too many files have changed in this diff Show more