Skip to content

Commit 8108aa3

Browse files
Require independent emit fixture oracles
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 587a4ae commit 8108aa3

2 files changed

Lines changed: 65 additions & 18 deletions

File tree

tests/Conformance.Tests.ps1

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,31 @@ ship-to:
270270
$mutatedResult.EmitYamlReason | Should -Be 'EmitYamlRepresentationMismatch'
271271
}
272272

273+
It 'uses JSON as the oracle for invalid-source emit fixtures' {
274+
$mutatedSuitePath = Join-Path $TestDrive 'mutated-invalid-emit-fixtures'
275+
$null = New-Item -Path $mutatedSuitePath -ItemType Directory -Force
276+
Copy-Item -LiteralPath (Join-Path $suiteDataPath 'DK95') `
277+
-Destination $mutatedSuitePath -Recurse
278+
foreach ($case in @('01', '06')) {
279+
'--- altered' | Set-Content `
280+
-LiteralPath (Join-Path $mutatedSuitePath "DK95\$case\emit.yaml") `
281+
-Encoding utf8NoBOM
282+
}
283+
284+
$mutatedResults = @(
285+
& $runnerPath -Path $mutatedSuitePath -CompareEmitYaml
286+
)
287+
$invalidFixtureResults = @(
288+
$mutatedResults |
289+
Where-Object Case -In @('DK95/01', 'DK95/06') |
290+
Sort-Object Case
291+
)
292+
293+
@($invalidFixtureResults.EmitYamlResult) | Should -Be @('Fail', 'Fail')
294+
@($invalidFixtureResults.EmitYamlReason | Select-Object -Unique) |
295+
Should -Be @('EmitYamlRepresentationMismatch')
296+
}
297+
273298
It 'accounts honestly for general module self-round-trips' {
274299
@($suiteResults | Where-Object SelfRoundTripResult -EQ 'Pass').Count |
275300
Should -Be 306

tests/tools/Invoke-YamlTestSuite.ps1

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,8 @@ foreach ($inputFile in $inputFiles) {
812812
$projectedJsonCanonical = $null
813813
$projectedReference = ''
814814
$projectionError = ''
815+
$jsonOracleValues = $null
816+
$jsonOracleCanonical = $null
815817
$eventExpected = $null
816818
$eventActual = $null
817819
$jsonExpected = $null
@@ -879,6 +881,19 @@ foreach ($inputFile in $inputFiles) {
879881
}
880882
}
881883

884+
if ($hasJson -and ($CompareJson -or ($CompareEmitYaml -and $hasEmitYaml))) {
885+
$expectedDocuments = Split-YamlSuiteJsonDocument -Text (
886+
[System.IO.File]::ReadAllText($jsonPath, [System.Text.UTF8Encoding]::new($false, $true))
887+
)
888+
$expectedValues = [System.Collections.Generic.List[object]]::new()
889+
foreach ($document in $expectedDocuments) {
890+
$expectedValues.Add((ConvertFrom-Json -InputObject $document -AsHashtable -NoEnumerate))
891+
}
892+
$jsonOracleValues = [object[]] $expectedValues.ToArray()
893+
$jsonOracleCanonical = ConvertTo-YamlSuiteCanonicalValue `
894+
-Value $jsonOracleValues -SortMappings
895+
}
896+
882897
if ($CompareEvents -and $hasEvent) {
883898
if ($null -eq $representation -or $expectsError) {
884899
$eventResult = 'NotApplicable'
@@ -906,22 +921,13 @@ foreach ($inputFile in $inputFiles) {
906921
if ($syntaxResult -eq 'PolicyDifference') { $jsonReason = $syntaxReason }
907922
if ($projectionError) { $jsonReason = $projectionError }
908923
} else {
909-
$expectedDocuments = Split-YamlSuiteJsonDocument -Text (
910-
[System.IO.File]::ReadAllText($jsonPath, [System.Text.UTF8Encoding]::new($false, $true))
911-
)
912-
$expectedValues = [System.Collections.Generic.List[object]]::new()
913-
foreach ($document in $expectedDocuments) {
914-
$expectedValues.Add((ConvertFrom-Json -InputObject $document -AsHashtable -NoEnumerate))
915-
}
916-
$expectedCanonical = ConvertTo-YamlSuiteCanonicalValue `
917-
-Value ([object[]] $expectedValues.ToArray()) -SortMappings
918-
$jsonExpected = $expectedCanonical
924+
$jsonExpected = $jsonOracleCanonical
919925
$jsonActual = $projectedJsonCanonical
920-
if ($projectedJsonCanonical -ceq $expectedCanonical) {
926+
if ($projectedJsonCanonical -ceq $jsonOracleCanonical) {
921927
$jsonResult = 'Pass'
922928
} else {
923929
$reason = Get-YamlSuiteJsonPolicyReason `
924-
-ExpectedValues ([object[]] $expectedValues.ToArray()) `
930+
-ExpectedValues $jsonOracleValues `
925931
-ActualValues ([object[]] $projectedValues)
926932
if ($reason) {
927933
$jsonResult = 'PolicyDifference'
@@ -990,14 +996,30 @@ foreach ($inputFile in $inputFiles) {
990996
$fixtureReference = ConvertTo-YamlSuiteReferenceSignature `
991997
-Value ([object[]] $fixtureValues)
992998

993-
if ($null -ne $projectedCanonical -and
994-
($fixtureCanonical -cne $projectedCanonical -or
995-
$fixtureReference -cne $projectedReference)) {
999+
$fixtureOracleCanonical = $null
1000+
$fixtureOracleActual = $fixtureCanonical
1001+
$fixtureReferenceMismatch = $false
1002+
if ($null -ne $projectedCanonical) {
1003+
$fixtureOracleCanonical = $projectedCanonical
1004+
$fixtureReferenceMismatch = $fixtureReference -cne $projectedReference
1005+
} elseif ($null -ne $jsonOracleCanonical) {
1006+
$fixtureOracleCanonical = $jsonOracleCanonical
1007+
$fixtureOracleActual = ConvertTo-YamlSuiteCanonicalValue `
1008+
-Value ([object[]] $fixtureValues) -SortMappings
1009+
}
1010+
1011+
if ($null -eq $fixtureOracleCanonical) {
1012+
$emitYamlResult = 'Fail'
1013+
$emitYamlReason = 'EmitYamlOracleUnavailable'
1014+
} elseif ($fixtureOracleActual -cne $fixtureOracleCanonical -or
1015+
$fixtureReferenceMismatch) {
9961016
$emitYamlResult = 'Fail'
9971017
$emitYamlReason = 'EmitYamlRepresentationMismatch'
998-
$emitYamlExpected = $projectedCanonical
999-
$emitYamlActual = $fixtureCanonical
1000-
$emitYamlExpectedReference = $projectedReference
1018+
$emitYamlExpected = $fixtureOracleCanonical
1019+
$emitYamlActual = $fixtureOracleActual
1020+
if ($null -ne $projectedCanonical) {
1021+
$emitYamlExpectedReference = $projectedReference
1022+
}
10011023
$emitYamlActualReference = $fixtureReference
10021024
} else {
10031025
$fixtureEmittedDocuments = [System.Collections.Generic.List[string]]::new()

0 commit comments

Comments
 (0)