test: remove exact duplicate coverage
This commit is contained in:
parent
9c6b143a03
commit
5fa9933636
7 changed files with 133 additions and 32 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue