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
in a fresh Release process. It does not retry failures. Tests carrying an
explicit non-hermetic `Lane` trait (`InstalledDat`, `PreparedPackage`, `Live`,
or `Manual`), `Purpose=Diagnostic`, or `Status=KnownFailure` are excluded from
the hermetic total and run through their owned lane instead. The graph currently
contains 44 projects,
`Manual`, `Windows`, `Linux`, or `SystemFont`), `Purpose=Diagnostic`, or
`Status=KnownFailure` are excluded from the hermetic total and run through
their owned lane instead. The graph currently contains 44 projects,
including all 13 maintained .NET tools; data-dependent tools are built but are
not executed as tests.
@ -79,8 +79,18 @@ Installed-DAT tests require an explicit opt-in and a retail DAT directory:
```powershell
$env:ACDREAM_RUN_INSTALLED_DAT_TESTS = '1'
$env:ACDREAM_DAT_DIR = 'C:\path\to\Asherons Call'
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release `
--filter 'Lane=InstalledDat&Status!=KnownFailure&Purpose!=Diagnostic'
pwsh ./tools/run-release-gate.ps1 -SkipRestore -SkipBuild `
-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
@ -109,6 +119,14 @@ dotnet test tests/AcDream.Core.Tests/AcDream.Core.Tests.csproj -c Release `
--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
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-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 | 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-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. |
@ -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-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-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. |
## 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
projects, so the authoritative verification is the two isolated clean builds
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]
[Trait("Lane", "Linux")]
public void LinuxRejectsGroupOrOtherCredentialPermissions()
{
if (!OperatingSystem.IsLinux())

View file

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

View file

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

View file

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

View file

@ -49,6 +49,7 @@ namespace AcDream.App.Tests.Rendering;
/// OutsideView ⇒ outdoor dynamics trivially cone-pass).
/// </summary>
[Collection(CameraDiagnosticsCollection.Name)]
[Trait("Lane", "InstalledDat")]
public class HouseExitWalkReplayTests
{
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
/// ObjectMeshManager.CollectDrawingBspPolygonIds to the dat facts.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue113DrawingBspFilterTests
{
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
/// hall cells draw and with what clip.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue113MeetingHallFloodTests
{
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
/// the flood convergent regardless of clip-numerics drift.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue120ReciprocalPingPongTests
{
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
/// real Holtburg corner-building door.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue124LookInSeedRegionTests
{
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
/// pin both properties.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue130DoorwayStripTests
{
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.
/// </summary>
[Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public class Issue131SetupProbeTests
{
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
/// locked +X: per-step admitted-set diffs (drop-for-one-step churn).
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue176177FacilityHubFloodReplayTests
{
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.
/// </summary>
[Collection(CameraDiagnosticsCollection.Name)]
[Trait("Lane", "InstalledDat")]
public class Issue177StairDescentCameraFloodTests
{
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
/// instability, and the symmetric difference names the flapping cell.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue181VisFlapReplayTests
{
private const uint FacilityHub = 0x8A020000u;

View file

@ -33,6 +33,7 @@ namespace AcDream.App.Tests.Rendering;
/// </summary>
[Collection(CameraDiagnosticsCollection.Name)]
[Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public class Issue181WallPressEquilibriumTests
{
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
/// cross landblocks. The single assertion just guarantees the test ran; the VALUE is the output.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue95DungeonFloodDiagnosticTests
{
private const uint TownNetwork = 0x00070000u;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -16,6 +16,7 @@ namespace AcDream.App.Tests.UI.Layout;
public sealed class ChatOptionsDatDefaultsTests
{
[Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_ResolvesTheByteVerifiedSliderDefaults()
{
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.
/// </summary>
[Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class FaPanelSlotProbeTests
{
[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,
/// burden meter, and item cells. Skips when the live dat directory is absent (CI).
/// </summary>
[Trait("Lane", "InstalledDat")]
public class InventoryFrameImportProbe
{
private const uint Frame = 0x21000023u;

View file

@ -749,6 +749,7 @@ public sealed class ItemAppraisalTextFormatterTests
}
[Fact]
[Trait("Lane", "InstalledDat")]
public void EndOfRetailDatNameResolver_LoadsMaterialAndCreatureNames()
{
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.
/// Skips when the live dat directory is absent (CI).
/// </summary>
[Trait("Lane", "InstalledDat")]
public class ItemListCellTemplateTests
{
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
/// live probes so CI/dat-less runs skip it.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class KeyboardConfigLiveMountProbeTests
{
[Fact]

View file

@ -26,6 +26,7 @@ namespace AcDream.App.Tests.UI.Layout;
/// </para>
/// </summary>
[Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class MapHousePanelSlotProbeTests
{
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
/// generator so CI/dat-less runs skip it.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class OptionsPanelLiveMountProbeTests
{
[Fact]

View file

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

View file

@ -47,6 +47,7 @@ public class PaperdollSlotBackgroundTests
}
[Fact]
[Trait("Lane", "InstalledDat")]
public void Live_dat_resolves_all_pinned_retail_backgrounds()
{
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
/// retail authors instead of guessing.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class PowerbarLayoutProbeTests
{
[Fact]

View file

@ -18,6 +18,7 @@ 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.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class SocialPanelLiveMountProbeTests
{
[Fact]

View file

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

View file

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

View file

@ -76,6 +76,7 @@ namespace AcDream.App.Tests.UI;
/// </para>
/// </summary>
[Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class SpewBoxLayoutDumpDiagnostic
{
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(0x40000002u, 3u, 3u)] // 14px bold serif
[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)
{
string? datDir = ResolveDatDir();
@ -49,6 +50,7 @@ public sealed class UiDatFontBorderPixelTests
}
[Fact]
[Trait("Lane", "InstalledDat")]
public void RealDatFont_EveryFontWithABackgroundAtlas_HasANonZeroBorder()
{
// 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 ---
[Fact]
[Trait("Lane", "SystemFont")]
public void FullOpacity_DrawString_BitmapFontPath_MatchesRequestedAlpha_Identity()
{
// CH6c review NIT: DrawStringDat (retail dat-font glyphs) had its own
@ -258,6 +259,7 @@ public sealed class UiRenderContextAlphaTests
}
[Fact]
[Trait("Lane", "SystemFont")]
public void HalfOpacityWindow_MultipliesBitmapFontGlyphAlpha()
{
var device = new RecordingGpuDevice();

View file

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

View file

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

View file

@ -15,6 +15,7 @@ namespace AcDream.Bake.Tests;
/// are absent (CI), same convention as
/// tests/AcDream.Core.Tests/Conformance/DatConcurrencyStressTests.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class BakeDeterminismTests : IDisposable {
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
/// already counted fall into exactly that trap.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Ap155StaticSpherePopulationMeasurementTests
{
[Fact]

View file

@ -22,6 +22,7 @@ namespace AcDream.Content.Tests.CharGen;
/// <c>ChargenAppearanceCatalogInstalledDatTests</c>): returns green with a
/// console SKIP note when no installed dat directory is configured.</para>
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenAppearanceCatalogColorTests
{
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
/// convention.</para>
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenAppearanceCatalogInstalledDatTests
{
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,
/// matching e.g. <c>PakEquivalenceTests</c> / <c>RetailDatLoaderTests</c>.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class ChargenTableReaderInstalledDatTests
{
// ACE ACE.Entity.Enum.HeritageGroup — the four heritages CC1's spec

View file

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

View file

@ -33,6 +33,7 @@ namespace AcDream.Content.Tests;
/// predicate used here.
/// </para>
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class InstalledSetupBspPrimitiveDispatchTests
{
// 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
/// any real object.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class InstalledSetupCollisionReachabilityTests
{
// 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.
/// </para>
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue334NeftetFormationCellMembershipTests
{
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
/// DatConcurrencyStressTests' convention.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class PakEquivalenceTests {
// Known-tricky GfxObj ids reused from existing conformance fixtures:
// 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).
/// Skips cleanly when dats are absent, matching ContentConformanceDats convention.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class SolidColorTextureCacheTests {
[Fact]
public void GetOrCreateSolidColorTexture_SameColor_ReturnsSameSharedArray() {

View file

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

View file

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

View file

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

View file

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

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Audio;
/// installed-dat test in this suite.
/// </para>
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class UiSoundTableResolutionTests
{
/// <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
/// 0x014x range (#98 fixtures); the doorway room/vestibule is in 0x017x.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class CottageDoorwayCharacterizationTests
{
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.
/// </summary>
[Trait("Category", "Conformance")]
[Trait("Lane", "InstalledDat")]
public class DatConcurrencyStressTests
{
private const int HammerThreads = 8;

View file

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

View file

@ -30,6 +30,7 @@ public class FindCellListConformanceTests
}
[Fact]
[Trait("Lane", "InstalledDat")]
public void FindCellList_DeepInsideRoom0171_Returns0171()
{
var datDir = ConformanceDats.ResolveDatDir();
@ -47,6 +48,7 @@ public class FindCellListConformanceTests
}
[Fact]
[Trait("Lane", "InstalledDat")]
public void FindCellList_DeepInsideVestibule0170_Returns0170()
{
var datDir = ConformanceDats.ResolveDatDir();
@ -70,6 +72,7 @@ public class FindCellListConformanceTests
/// property P1 must preserve.
/// </summary>
[Fact]
[Trait("Lane", "InstalledDat")]
public void FindCellList_InVestibule_SeededFromRoom_Returns0170()
{
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.
/// </summary>
[Trait("Purpose", "Diagnostic")]
[Trait("Lane", "InstalledDat")]
public sealed class HoltburgTorchFalloffProbeTests
{
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
/// falls to seen_outside → adjust_to_outside, acclient :280037).
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue107SpawnDiagnosticTests
{
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
/// real dats.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue112MembershipTests
{
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
/// nodes / leaf subclasses)? Pure diagnostic — no production code.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue113DoorVanishDiagnosticTests
{
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
/// (distinct horizontal-face heights), and containment of the two key points.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue113PhantomStairsDumpTests
{
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
/// owners read directly off the output.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue119TowerDumpTests
{
private readonly ITestOutputHelper _out;

View file

@ -23,6 +23,7 @@ namespace AcDream.Core.Tests.Conformance;
/// ObjectMeshManager in MP1a)
/// so the zeroing gate reads directly off the output.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue119UpNullGfxObjDumpTests
{
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
/// draws solid batches for non-building/non-cell meshes, and so do we.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class StipplingSurfaceEquivalenceTests
{
private readonly ITestOutputHelper _out;

View file

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

View file

@ -54,6 +54,7 @@ namespace AcDream.Core.Tests.Input;
/// here. Reported, not silently resolved either way.</description></item>
/// </list>
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class RetailActionIdentityRoundTripTests
{
/// <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
/// <c>client_portal.dat</c>/<c>client_local_English.dat</c> ActionMap +
/// MasterInputMap objects. Skips cleanly when the dats are unavailable.</summary>
[Trait("Lane", "InstalledDat")]
public sealed class RetailActionMapReader_LiveDatTests
{
[Fact]

View file

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

View file

@ -189,6 +189,7 @@ public sealed class BoxIntersectsCellBspDifferentialTests
}
[Fact]
[Trait("Lane", "InstalledDat")]
public void InstalledDat_RandomizedBoxSweepOverEnvCellContainmentBsps_HasZeroMismatch()
{
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);
/// pivot = player + (0,0,1.5) per RetailChaseCamera.PivotHeight.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class CameraCornerSealReplayTests
{
private readonly ITestOutputHelper _out;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -9,6 +9,7 @@ using Xunit.Abstractions;
namespace AcDream.Core.Tests.Physics;
[Trait("Lane", "InstalledDat")]
public sealed class FlatCollisionInstalledDatTests
{
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
/// from the interpreted command.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class HumanoidMotionTableRootMotionTests
{
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.
/// These tests stay as the characterization pin for the healthy layer.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue108CellarAscentViewerReplayTests
{
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
/// our collision set where retail filters them?
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue137CorridorSeamInspectionTests
{
private readonly ITestOutputHelper _out;

View file

@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Physics;
/// running must keep advancing (no absorbing wedge).
/// </para>
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue137CorridorSeamReplayTests
{
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
/// without ACDREAM_DAT_DIR / the real dats.
/// </summary>
[Trait("Lane", "InstalledDat")]
public sealed class Issue147ArwicBuildingsDumpTests
{
private readonly ITestOutputHelper _out;

View file

@ -39,6 +39,7 @@ public class Issue175HubDoorPoseInspectionTests
private const uint HubDoorSetupId = 0x02000C9Du;
[Fact]
[Trait("Lane", "InstalledDat")]
public void HubDoorSetup_PlacementVsMotionPose_DatInspection()
{
var datDir = Env.GetEnvironmentVariable("ACDREAM_DAT_DIR")
@ -161,6 +162,7 @@ public class Issue175HubDoorPoseInspectionTests
/// NonCombat/Ready) and asserts the derivation actually resolves a pose.
/// </summary>
[Fact]
[Trait("Lane", "InstalledDat")]
public void MotionTablePose_DefaultState_ResolvesOnRealTable()
{
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
/// x=85 seam in a controlled run.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue176177SeamTransitLagTests
{
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
/// tracked the target one step back: eyeBack = s ~0.27).
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue180CorridorSweepHysteresisReplayTests
{
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
/// hard-stop) or none (so the boom coasts to a degenerate spot)? Skips without the dat.
/// </summary>
[Trait("Lane", "InstalledDat")]
public class Issue186ConnectorCellGeometryInspectionTests
{
private readonly ITestOutputHelper _out;

View file

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

View file

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

View file

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

View file

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

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