test: remove exact duplicate coverage

This commit is contained in:
Erik 2026-08-18 12:36:41 +02:00
parent 9c6b143a03
commit 5fa9933636
7 changed files with 133 additions and 32 deletions

View file

@ -43,7 +43,9 @@ inventory refreshed for Batch G reports:
| Syntax signal | Current count |
|---|---:|
| Tracked/parsed C# test files | 1,256 / 1,256 |
| Attributed test methods (not expanded theory cases) | 11,450 |
| Attributed test methods (not expanded theory cases) | 11,447 |
| Exact duplicate-data rows | 0 |
| Reviewed body-equivalent groups / methods | 11 / 27 |
| Methods containing at least one empty `return;` | 138 |
| Empty-return sites | 143 |
| Direct / same-file-helper prerequisite-return candidates | 2 / 1 |
@ -140,6 +142,7 @@ identifiable in the lane report.
| T-017 Avalonia ownership | reopened and closed in batch D | The full gate exposed the same compositor ownership class between six newer `MainWindowViewTests` facts. Their six named assertion phases now run in one owned Avalonia application session; 25 fresh-process stress iterations and the complete gate pass. |
| T-018 stderr observer race | resolved in R2 | Live reader shares writes/deletes; 25 focused repetitions plus the complete gate. |
| T-019 remaining explicit waits | classified in batch H; nine fixed-delay negative oracles need cleanup | Five of the 38 methods are deterministic cancellation stubs, not wall-clock tests. Preserve four intentional real-time contracts and bounded integration polling; replace the nine tests that infer “still blocked” from a fixed delay with observable synchronization state. |
| T-020 exact duplicate bodies/data | resolved in batch K | Four redundant executions were removed. The remaining 11 body-equivalent groups are intentionally split theories with disjoint, meaningfully named datasets; the inventory enforces zero repeated rows within a theory or across body-equivalent theories. |
## Preserved rationale for removals in batch A
@ -538,3 +541,41 @@ Verification before the complete gate:
The no-retry complete hermetic Release gate passed 14,391/14,391 with zero
skips or failures across all 12 test assemblies.
## Batch K duplicate-body and theory-row truth
The inventory now fingerprints every attributed method body and compares
`InlineData` case-sensitively both within a theory and across theories with an
identical body. Case sensitivity prevents legitimate inputs such as `iris` /
`IRIS`, `Sunny` / `SUNNY`, and `0x` / `0X` from being mislabeled as duplicates.
The initial 14 body-equivalent groups contained four redundant executions:
- `VulkanCapabilityReportContractTests.TheReportFileNameIsTheOneTheWorkflowPathNames`
duplicated the report-name assertion in `VulkanCapabilityGateTests` and did
not inspect the workflow it named. The retained fact is now
`TheReportFileNameRemainsStableForDiagnosticsAutomation`.
- `MotionInterpreterDoMotionFamilyTests.StopCompletely_NullPhysicsObj_Returns8`
was byte-equivalent to the more descriptive
`MotionInterpreterTests.StopCompletely_NullPhysicsObj_ReturnsNoPhysicsObject`.
- `CastSpellTests.ParseMagicUpdateSpell_RoundTrip` duplicated the same parser
contract under `GameEventDispatcherTests`, the parser's durable owner.
- retail motion row `(0x0150, 0x10000150u)` appeared in both the recall-command
theory and the generic anchor theory. It remains in the specifically named
recall contract.
The other 11 groups are not useless duplicates. They deliberately reuse a
small assertion body while separating disjoint datasets by meaning: command
resolution, command argument shapes, valid chat tags, retail string escapes,
weenie error-message evidence, help text, invalid chargen ranges, ACE/retail
motion tables, character-option oracle sources, and environment-sound gaps.
Combining those rows would erase useful failure names without reducing the
assertion mechanism.
After cleanup the inventory reports 11,447 attributed methods, zero duplicate
rows, and 11 reviewed body-equivalent groups containing 27 methods. Verification
for the changed owners passes 46 App, 154 Core, and 32 Core.Net cases. The
complete 44-project Release build reports zero warnings and zero errors. The
no-retry complete hermetic Release gate passed 14,387/14,387 with zero skips or
failures across all 12 test assemblies. The four-case reduction is exactly the
three duplicate facts and one duplicate theory row removed above.

View file

@ -499,7 +499,7 @@ public sealed class VulkanCapabilityGateTests
}
[Fact]
public void TheReportFileNameSitsBesideTheGlOne()
public void TheReportFileNameRemainsStableForDiagnosticsAutomation()
{
Assert.Equal(
"graphical-capabilities-vulkan.json",

View file

@ -177,14 +177,4 @@ public sealed class VulkanCapabilityReportContractTests
Assert.Contains("timelineSemaphore", message, StringComparison.Ordinal);
}
/// <summary>
/// The report file name is what the workflow's VULKAN_REPORT path ends in.
/// </summary>
[Fact]
public void TheReportFileNameIsTheOneTheWorkflowPathNames()
{
Assert.Equal(
"graphical-capabilities-vulkan.json",
VulkanCapabilityGuard.ReportFileName);
}
}

View file

@ -38,15 +38,6 @@ public sealed class CastSpellTests
BinaryPrimitives.ReadUInt32LittleEndian(body.AsSpan(16)));
}
[Fact]
public void ParseMagicUpdateSpell_RoundTrip()
{
byte[] payload = new byte[4];
BinaryPrimitives.WriteUInt32LittleEndian(payload, 0x123403E1u);
var parsed = GameEvents.ParseMagicUpdateSpell(payload);
Assert.Equal(0x123403E1u, parsed);
}
[Fact]
public void ParseMagicUpdateEnchantment_RoundTrip()
{

View file

@ -101,7 +101,6 @@ public class MotionCommandCatalogTests
[InlineData(0x0005, 0x45000005u)]
[InlineData(0x0007, 0x44000007u)]
[InlineData(0x000D, 0x6500000Du)]
[InlineData(0x0150, 0x10000150u)]
[InlineData(0x0153, 0x09000153u)] // NOT LifestoneRecall in 2013 numbering — anchor only.
public void Retail2013_AnchorValuesMatchExtractedTable(ushort wire, uint expected)
{

View file

@ -429,16 +429,6 @@ public sealed class MotionInterpreterDoMotionFamilyTests
// StopCompletely — 0x00527e40 @305208 (A9 verbatim quirk)
// =========================================================================
[Fact]
public void StopCompletely_NullPhysicsObj_Returns8()
{
var interp = new MotionInterpreter();
var result = interp.StopCompletely();
Assert.Equal(WeenieError.NoPhysicsObject, result);
}
[Fact]
public void StopCompletely_ZeroesForwardSidestepTurnCommands_OnBothStates()
{

View file

@ -224,6 +224,24 @@ function Get-WaitSites {
return @($sites)
}
function Get-BodyFingerprint {
param([Parameter(Mandatory)]$Method)
$bodyNode = if ($null -ne $Method.Body) {
$Method.Body
} else {
$Method.ExpressionBody
}
if ($null -eq $bodyNode) {
return $null
}
$bodyText = $bodyNode.ToString().Replace("`r`n", "`n")
$bytes = [Text.Encoding]::UTF8.GetBytes($bodyText)
return [Convert]::ToHexString(
[Security.Cryptography.SHA256]::HashData($bytes))
}
function Test-RecursiveSignal {
param(
[Parameter(Mandatory)][string]$MethodKey,
@ -386,6 +404,16 @@ foreach ($relativePath in $trackedFiles) {
}
}
$inlineDataRows = @($methodAttributes | Where-Object {
(Get-ShortAttributeName $_) -eq 'InlineData'
} | ForEach-Object {
if ($null -eq $_.ArgumentList) { '()' } else { $_.ArgumentList.ToString() }
})
$duplicateInlineDataRows = @($inlineDataRows |
Group-Object -CaseSensitive |
Where-Object { $_.Count -gt 1 } |
ForEach-Object { $_.Name })
$bodyText = $method.ToString()
$waitSites = @(Get-WaitSites $tree $method)
$environmentVariables = @([regex]::Matches(
@ -402,6 +430,9 @@ foreach ($relativePath in $trackedFiles) {
Attributes = $testAttributes
Traits = @($traits)
StaticSkip = $staticSkip
BodyFingerprint = Get-BodyFingerprint $method
InlineDataRows = $inlineDataRows
DuplicateInlineDataRows = $duplicateInlineDataRows
EmptyReturns = @($emptyReturns)
HelperPrerequisiteReturns = @($helperPrerequisiteReturns)
PrerequisiteReturnCandidate = @($emptyReturns | Where-Object {
@ -430,6 +461,54 @@ foreach ($relativePath in $trackedFiles) {
}
$orderedRecords = @($records | Sort-Object Path, Line, Method)
$duplicateBodyGroups = @($orderedRecords |
Where-Object { $null -ne $_.BodyFingerprint } |
Group-Object { $_.BodyFingerprint } |
Where-Object { $_.Count -gt 1 } |
ForEach-Object {
[ordered]@{
Fingerprint = $_.Name
Count = $_.Count
Tests = @($_.Group | ForEach-Object {
[ordered]@{
Path = $_.Path
Line = $_.Line
Class = $_.Class
Method = $_.Method
}
})
}
})
$duplicateDataRowsAcrossEquivalentBodies = [Collections.Generic.List[object]]::new()
foreach ($bodyGroup in $duplicateBodyGroups) {
$occurrences = @($bodyGroup.Tests | ForEach-Object {
$test = $_
$record = $orderedRecords | Where-Object {
$_.Path -eq $test.Path -and
$_.Line -eq $test.Line -and
$_.Class -eq $test.Class -and
$_.Method -eq $test.Method
} | Select-Object -First 1
foreach ($row in @($record.InlineDataRows)) {
[ordered]@{
Row = $row
Path = $test.Path
Line = $test.Line
Class = $test.Class
Method = $test.Method
}
}
})
foreach ($rowGroup in @($occurrences |
Group-Object { $_.Row } -CaseSensitive |
Where-Object { $_.Count -gt 1 })) {
$duplicateDataRowsAcrossEquivalentBodies.Add([ordered]@{
BodyFingerprint = $bodyGroup.Fingerprint
Row = $rowGroup.Name
Occurrences = @($rowGroup.Group)
})
}
}
$workingTreeStatus = @(& git -C $repoRoot status --short --untracked-files=no)
$summary = [ordered]@{
GeneratedUtc = [DateTime]::UtcNow.ToString('O')
@ -441,6 +520,14 @@ $summary = [ordered]@{
ParsedCSharpFiles = $parsedFileCount
AttributedTestMethods = $orderedRecords.Count
StaticSkipMethods = @($orderedRecords | Where-Object { $null -ne $_.StaticSkip }).Count
DuplicateInlineDataMethods = @($orderedRecords | Where-Object {
$_.DuplicateInlineDataRows.Count -gt 0
}).Count
ExactBodyDuplicateGroups = $duplicateBodyGroups.Count
MethodsInExactBodyDuplicateGroups = @($duplicateBodyGroups |
ForEach-Object { $_.Tests }).Count
DuplicateDataRowsAcrossEquivalentBodies =
$duplicateDataRowsAcrossEquivalentBodies.Count
EmptyReturnMethods = @($orderedRecords | Where-Object { $_.EmptyReturns.Count -gt 0 }).Count
EmptyReturnSites = @($orderedRecords | ForEach-Object { $_.EmptyReturns }).Count
PrerequisiteReturnCandidates = @($orderedRecords | Where-Object {
@ -512,6 +599,9 @@ $summary = [ordered]@{
$report = [ordered]@{
Summary = $summary
ExactBodyDuplicateGroups = $duplicateBodyGroups
DuplicateDataRowsAcrossEquivalentBodies =
@($duplicateDataRowsAcrossEquivalentBodies)
Tests = $orderedRecords
}
$outputDirectory = Split-Path -Parent $resolvedOutput