make megatest consistent with unjoined tests wrt newlines, honor newlines in output spec (#16151)

* fix megatest newlines
* still allow missing trailing newline for now but in a more strict way than before
This commit is contained in:
Timothee Cour 2020-11-28 00:09:31 -08:00 • committed by GitHub
commit b809562c7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 110 additions and 96 deletions

View file

@ -591,12 +591,14 @@ proc isJoinableSpec(spec: TSpec): bool =
if spec.file.readFile.contains "when isMainModule":
result = false
proc norm(s: var string) =
while true:
let tmp = s.replace("\n\n", "\n")
if tmp == s: break
s = tmp
s = s.strip
when false:
proc norm(s: var string) =
## strip empty newlines
while true:
let tmp = s.replace("\n\n", "\n")
if tmp == s: break
s = tmp
s = s.strip
proc quoted(a: string): string =
# todo: consider moving to system.nim
@ -654,16 +656,16 @@ proc runJoinedTest(r: var TResults, cat: Category, testsDir: string) =
echo buf.string
quit(failString & "megatest execution failed")
norm buf.string
const outputExceptedFile = "outputExpected.txt"
const outputGottenFile = "outputGotten.txt"
writeFile(outputGottenFile, buf.string)
var outputExpected = ""
for i, runSpec in specs:
outputExpected.add marker & runSpec.file & "\n"
outputExpected.add runSpec.output.strip
outputExpected.add '\n'
norm outputExpected
if runSpec.output.len > 0:
outputExpected.add runSpec.output
if not runSpec.output.endsWith "\n":
outputExpected.add '\n'
if buf.string != outputExpected:
writeFile(outputExceptedFile, outputExpected)

View file

@ -280,7 +280,7 @@ proc parseSpec*(filename: string): TSpec =
of "output":
if result.outputCheck != ocSubstr:
result.outputCheck = ocEqual
result.output = strip(e.value)
result.output = e.value
of "input":
result.input = e.value
of "outputsub":

View file

@ -469,6 +469,10 @@ proc checkDisabled(r: var TResults, test: TTest): bool =
var count = 0
proc equalModuloLastNewline(a, b: string): bool =
# allow lazy output spec that omits last newline, but really those should be fixed instead
result = a == b or b.endsWith("\n") and a == b[0 ..< ^1]
proc testSpecHelper(r: var TResults, test: var TTest, expected: TSpec,
target: TTarget, nimcache: string, extraOptions = "") =
test.startTime = epochTime()
@ -513,16 +517,18 @@ proc testSpecHelper(r: var TResults, test: var TTest, expected: TSpec,
if exitCode != 0: exitCode = 1
let bufB =
if expected.sortoutput:
var x = splitLines(strip(buf.string))
var buf2 = buf.string
buf2.stripLineEnd
var x = splitLines(buf2)
sort(x, system.cmp)
join(x, "\n")
join(x, "\n") & "\n"
else:
strip(buf.string)
buf.string
if exitCode != expected.exitCode:
r.addResult(test, target, "exitcode: " & $expected.exitCode,
"exitcode: " & $exitCode & "\n\nOutput:\n" &
bufB, reExitcodesDiffer)
elif (expected.outputCheck == ocEqual and expected.output != bufB) or
elif (expected.outputCheck == ocEqual and not expected.output.equalModuloLastNewline(bufB)) or
(expected.outputCheck == ocSubstr and expected.output notin bufB):
given.err = reOutputsDiffer
r.addResult(test, target, expected.output, bufB, reOutputsDiffer)