test: classify prerequisite lanes and own Avalonia sessions
This commit is contained in:
parent
c1a905004a
commit
3684e7b5e7
113 changed files with 273 additions and 22 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ public sealed class AppCredentialResolverTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "Linux")]
|
||||
public void LinuxRejectsGroupOrOtherCredentialPermissions()
|
||||
{
|
||||
if (!OperatingSystem.IsLinux())
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public sealed class PortalTunnelAssetTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void InstalledDat_ResolvesRetailPortalSetupAndAnimation()
|
||||
{
|
||||
string? datDir = ResolveDatDir();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -318,6 +318,7 @@ public sealed class LandblockBuildFactoryTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "PreparedPackage")]
|
||||
public void InstalledDatNearBuild_IsDeterministicAndClosesEntityPhysicsPayload()
|
||||
{
|
||||
string? datDirectory = ResolveDatDirectory();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ using Xunit;
|
|||
|
||||
namespace AcDream.App.Tests.UI.Layout;
|
||||
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public sealed class CharacterLayoutImportProbe
|
||||
{
|
||||
private const uint CharacterLayout = 0x2100002Eu;
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -749,6 +749,7 @@ public sealed class ItemAppraisalTextFormatterTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void EndOfRetailDatNameResolver_LoadsMaterialAndCreatureNames()
|
||||
{
|
||||
string? datDirectory = ResolveDatDirectory();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ public sealed class PaperdollClickMapTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void LiveDat_resolvesRetailClickMapAndAllNineBodyRegions()
|
||||
{
|
||||
string datDir = Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR")
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ using DatReaderWriter.Options;
|
|||
|
||||
namespace AcDream.App.Tests.UI.Layout;
|
||||
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public sealed class SpellbookRowStyleTests
|
||||
{
|
||||
[Fact]
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@ public sealed class LiveEntityPresentationControllerTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void SpellRecall_HiddenAndUnHide_RetireMagicTimelineThroughController()
|
||||
{
|
||||
const uint humanSetup = 0x02000001u;
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@ public sealed class RecallTeleportAnimationTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void InstalledRecall_HiddenEnterWorldPublishesFinishedCyclicPoseWithoutAdvancingTime()
|
||||
{
|
||||
string datDir = @"C:\Turbine\Asheron's Call";
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ using DatReaderWriter.Options;
|
|||
|
||||
namespace AcDream.Content.Tests;
|
||||
|
||||
[Trait("Lane", "PreparedPackage")]
|
||||
public sealed class InstalledPreparedCollisionCatalogTests
|
||||
{
|
||||
[Fact]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -432,6 +432,7 @@ public sealed class RetailDatLoaderTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void InstalledBlockingScripts_ParseThroughRetailShape_WhenDatsAvailable()
|
||||
{
|
||||
string? datDir = ResolveDatDirectory();
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ namespace AcDream.Core.Tests.Audio;
|
|||
/// absent.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public sealed class EnvCellSoundEmitterInventoryTests
|
||||
{
|
||||
private readonly ITestOutputHelper _out;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ public sealed class BoxIntersectsCellBspDifferentialTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void InstalledDat_RandomizedBoxSweepOverEnvCellContainmentBsps_HasZeroMismatch()
|
||||
{
|
||||
string? datDirectory = ConformanceDats.ResolveDatDir();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ namespace AcDream.Core.Tests.Physics;
|
|||
/// semantics on real Holtburg dat geometry.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public class CellTransitTests
|
||||
{
|
||||
[Fact]
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -412,6 +412,7 @@ public sealed class FlatBspQueryDifferentialTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void InstalledDat_LargeRandomizedSweep_HasZeroBitMismatch()
|
||||
{
|
||||
string? datDirectory = ConformanceDats.ResolveDatDir();
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ using Xunit.Abstractions;
|
|||
|
||||
namespace AcDream.Core.Tests.Physics;
|
||||
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public sealed class FlatCollisionInstalledDatTests
|
||||
{
|
||||
private readonly ITestOutputHelper _output;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ namespace AcDream.Core.Tests.Physics;
|
|||
/// eye projects into the aperture band at y 9.8–17) 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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ public class Issue188FadingDoorMotionTableInspectionTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Lane", "InstalledDat")]
|
||||
public void Dump_PedestalWeakSpot_MotionTable_HookContents()
|
||||
{
|
||||
var datDir = DatDir();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue