Skip to content

Commit 63cca93

Browse files
authored
testament: include extra options in test name (#19801)
there's currently no (simple) way to disambiguate which option failed
1 parent 06f02bb commit 63cca93

File tree

2 files changed

+44
-47
lines changed

2 files changed

+44
-47
lines changed

testament/categories.nim

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ proc testNimblePackages(r: var TResults; cat: Category; packageFilter: string) =
437437
if pkg.allowFailure:
438438
inc r.passed
439439
inc r.failedButAllowed
440-
addResult(r, test, targetC, "", cmd & "\n" & outp, reFailed, allowFailure = pkg.allowFailure)
440+
addResult(r, test, targetC, "", "", cmd & "\n" & outp, reFailed, allowFailure = pkg.allowFailure)
441441
continue
442442
outp
443443

@@ -450,21 +450,21 @@ proc testNimblePackages(r: var TResults; cat: Category; packageFilter: string) =
450450
discard tryCommand("nimble install --depsOnly -y", maxRetries = 3)
451451
discard tryCommand(pkg.cmd, reFailed = reBuildFailed)
452452
inc r.passed
453-
r.addResult(test, targetC, "", "", reSuccess, allowFailure = pkg.allowFailure)
453+
r.addResult(test, targetC, "", "", "", reSuccess, allowFailure = pkg.allowFailure)
454454

455455
errors = r.total - r.passed
456456
if errors == 0:
457-
r.addResult(packageFileTest, targetC, "", "", reSuccess)
457+
r.addResult(packageFileTest, targetC, "", "", "", reSuccess)
458458
else:
459-
r.addResult(packageFileTest, targetC, "", "", reBuildFailed)
459+
r.addResult(packageFileTest, targetC, "", "", "", reBuildFailed)
460460

461461
except JsonParsingError:
462462
errors = 1
463-
r.addResult(packageFileTest, targetC, "", "Invalid package file", reBuildFailed)
463+
r.addResult(packageFileTest, targetC, "", "", "Invalid package file", reBuildFailed)
464464
raise
465465
except ValueError:
466466
errors = 1
467-
r.addResult(packageFileTest, targetC, "", "Unknown package", reBuildFailed)
467+
r.addResult(packageFileTest, targetC, "", "", "Unknown package", reBuildFailed)
468468
raise # bug #18805
469469
finally:
470470
if errors == 0: removeDir(packagesDir)

testament/testament.nim

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ Tests skipped: $4 / $1 <br />
259259
""" % [$x.total, $x.passed, $x.failedButAllowed, $x.skipped]
260260

261261
proc addResult(r: var TResults, test: TTest, target: TTarget,
262-
expected, given: string, successOrig: TResultEnum, allowFailure = false, givenSpec: ptr TSpec = nil) =
262+
extraOptions, expected, given: string, successOrig: TResultEnum,
263+
allowFailure = false, givenSpec: ptr TSpec = nil) =
263264
# instead of `ptr TSpec` we could also use `Option[TSpec]`; passing `givenSpec` makes it easier to get what we need
264265
# instead of having to pass individual fields, or abusing existing ones like expected vs given.
265266
# test.name is easier to find than test.name.extractFilename
@@ -269,6 +270,7 @@ proc addResult(r: var TResults, test: TTest, target: TTarget,
269270
if allowFailure:
270271
name.add " (allowed to fail) "
271272
if test.options.len > 0: name.add ' ' & test.options
273+
if extraOptions.len > 0: name.add ' ' & extraOptions
272274

273275
let duration = epochTime() - test.startTime
274276
let success = if test.spec.timeout > 0.0 and duration > test.spec.timeout: reTimeout
@@ -333,7 +335,8 @@ proc addResult(r: var TResults, test: TTest, target: TTarget,
333335
discard waitForExit(p)
334336
close(p)
335337

336-
proc checkForInlineErrors(r: var TResults, expected, given: TSpec, test: TTest, target: TTarget) =
338+
proc checkForInlineErrors(r: var TResults, expected, given: TSpec, test: TTest,
339+
target: TTarget, extraOptions: string) =
337340
let pegLine = peg"{[^(]*} '(' {\d+} ', ' {\d+} ') ' {[^:]*} ':' \s* {.*}"
338341
var covered = initIntSet()
339342
for line in splitLines(given.nimout):
@@ -367,10 +370,10 @@ proc checkForInlineErrors(r: var TResults, expected, given: TSpec, test: TTest,
367370
e.add ": "
368371
e.add expected.inlineErrors[j].msg
369372

370-
r.addResult(test, target, e, given.nimout, reMsgsDiffer)
373+
r.addResult(test, target, extraOptions, e, given.nimout, reMsgsDiffer)
371374
break coverCheck
372375

373-
r.addResult(test, target, "", given.msg, reSuccess)
376+
r.addResult(test, target, extraOptions, "", given.msg, reSuccess)
374377
inc(r.passed)
375378

376379
proc nimoutCheck(expected, given: TSpec): bool =
@@ -381,22 +384,23 @@ proc nimoutCheck(expected, given: TSpec): bool =
381384
elif expected.nimout.len > 0 and not greedyOrderedSubsetLines(expected.nimout, given.nimout):
382385
result = false
383386

384-
proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest, target: TTarget) =
387+
proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest,
388+
target: TTarget, extraOptions: string) =
385389
if expected.inlineErrors.len > 0:
386-
checkForInlineErrors(r, expected, given, test, target)
390+
checkForInlineErrors(r, expected, given, test, target, extraOptions)
387391
elif strip(expected.msg) notin strip(given.msg):
388-
r.addResult(test, target, expected.msg, given.msg, reMsgsDiffer)
392+
r.addResult(test, target, extraOptions, expected.msg, given.msg, reMsgsDiffer)
389393
elif not nimoutCheck(expected, given):
390-
r.addResult(test, target, expected.nimout, given.nimout, reMsgsDiffer)
394+
r.addResult(test, target, extraOptions, expected.nimout, given.nimout, reMsgsDiffer)
391395
elif extractFilename(expected.file) != extractFilename(given.file) and
392396
"internal error:" notin expected.msg:
393-
r.addResult(test, target, expected.file, given.file, reFilesDiffer)
397+
r.addResult(test, target, extraOptions, expected.file, given.file, reFilesDiffer)
394398
elif expected.line != given.line and expected.line != 0 or
395399
expected.column != given.column and expected.column != 0:
396-
r.addResult(test, target, $expected.line & ':' & $expected.column,
400+
r.addResult(test, target, extraOptions, $expected.line & ':' & $expected.column,
397401
$given.line & ':' & $given.column, reLinesDiffer)
398402
else:
399-
r.addResult(test, target, expected.msg, given.msg, reSuccess)
403+
r.addResult(test, target, extraOptions, expected.msg, given.msg, reSuccess)
400404
inc(r.passed)
401405

402406
proc generatedFile(test: TTest, target: TTarget): string =
@@ -434,8 +438,8 @@ proc codegenCheck(test: TTest, target: TTarget, spec: TSpec, expectedMsg: var st
434438
given.err = reCodeNotFound
435439
echo getCurrentExceptionMsg()
436440

437-
proc compilerOutputTests(test: TTest, target: TTarget, given: var TSpec,
438-
expected: TSpec; r: var TResults) =
441+
proc compilerOutputTests(test: TTest, target: TTarget, extraOptions: string,
442+
given: var TSpec, expected: TSpec; r: var TResults) =
439443
var expectedmsg: string = ""
440444
var givenmsg: string = ""
441445
if given.err == reSuccess:
@@ -449,55 +453,50 @@ proc compilerOutputTests(test: TTest, target: TTarget, given: var TSpec,
449453
else:
450454
givenmsg = "$ " & given.cmd & '\n' & given.nimout
451455
if given.err == reSuccess: inc(r.passed)
452-
r.addResult(test, target, expectedmsg, givenmsg, given.err)
456+
r.addResult(test, target, extraOptions, expectedmsg, givenmsg, given.err)
453457

454458
proc getTestSpecTarget(): TTarget =
455459
if getEnv("NIM_COMPILE_TO_CPP", "false") == "true":
456460
result = targetCpp
457461
else:
458462
result = targetC
459463

460-
proc checkDisabled(r: var TResults, test: TTest): bool =
461-
if test.spec.err in {reDisabled, reJoined}:
462-
# targetC is a lie, but parameter is required
463-
r.addResult(test, targetC, "", "", test.spec.err)
464-
inc(r.skipped)
465-
inc(r.total)
466-
result = false
467-
else:
468-
result = true
469-
470464
var count = 0
471465

472466
proc equalModuloLastNewline(a, b: string): bool =
473467
# allow lazy output spec that omits last newline, but really those should be fixed instead
474468
result = a == b or b.endsWith("\n") and a == b[0 ..< ^1]
475469

476470
proc testSpecHelper(r: var TResults, test: var TTest, expected: TSpec,
477-
target: TTarget, nimcache: string, extraOptions = "") =
471+
target: TTarget, extraOptions: string, nimcache: string) =
478472
test.startTime = epochTime()
473+
if test.spec.err in {reDisabled, reJoined}:
474+
r.addResult(test, target, extraOptions, "", "", test.spec.err)
475+
inc(r.skipped)
476+
return
477+
479478
template callNimCompilerImpl(): untyped =
480479
# xxx this used to also pass: `--stdout --hint:Path:off`, but was done inconsistently
481480
# with other branches
482481
callNimCompiler(expected.getCmd, test.name, test.options, nimcache, target, extraOptions)
483482
case expected.action
484483
of actionCompile:
485484
var given = callNimCompilerImpl()
486-
compilerOutputTests(test, target, given, expected, r)
485+
compilerOutputTests(test, target, extraOptions, given, expected, r)
487486
of actionRun:
488487
var given = callNimCompilerImpl()
489488
if given.err != reSuccess:
490-
r.addResult(test, target, "", "$ " & given.cmd & '\n' & given.nimout, given.err, givenSpec = given.addr)
489+
r.addResult(test, target, extraOptions, "", "$ " & given.cmd & '\n' & given.nimout, given.err, givenSpec = given.addr)
491490
else:
492491
let isJsTarget = target == targetJS
493492
var exeFile = changeFileExt(test.name, if isJsTarget: "js" else: ExeExt)
494493
if not fileExists(exeFile):
495-
r.addResult(test, target, expected.output,
494+
r.addResult(test, target, extraOptions, expected.output,
496495
"executable not found: " & exeFile, reExeNotFound)
497496
else:
498497
let nodejs = if isJsTarget: findNodeJs() else: ""
499498
if isJsTarget and nodejs == "":
500-
r.addResult(test, target, expected.output, "nodejs binary not in PATH",
499+
r.addResult(test, target, extraOptions, expected.output, "nodejs binary not in PATH",
501500
reExeNotFound)
502501
else:
503502
var exeCmd: string
@@ -528,41 +527,40 @@ proc testSpecHelper(r: var TResults, test: var TTest, expected: TSpec,
528527
else:
529528
buf
530529
if exitCode != expected.exitCode:
531-
r.addResult(test, target, "exitcode: " & $expected.exitCode,
530+
r.addResult(test, target, extraOptions, "exitcode: " & $expected.exitCode,
532531
"exitcode: " & $exitCode & "\n\nOutput:\n" &
533532
bufB, reExitcodesDiffer)
534533
elif (expected.outputCheck == ocEqual and not expected.output.equalModuloLastNewline(bufB)) or
535534
(expected.outputCheck == ocSubstr and expected.output notin bufB):
536535
given.err = reOutputsDiffer
537-
r.addResult(test, target, expected.output, bufB, reOutputsDiffer)
536+
r.addResult(test, target, extraOptions, expected.output, bufB, reOutputsDiffer)
538537
else:
539-
compilerOutputTests(test, target, given, expected, r)
538+
compilerOutputTests(test, target, extraOptions, given, expected, r)
540539
of actionReject:
541540
let given = callNimCompilerImpl()
542-
cmpMsgs(r, expected, given, test, target)
541+
cmpMsgs(r, expected, given, test, target, extraOptions)
543542

544-
proc targetHelper(r: var TResults, test: TTest, expected: TSpec, extraOptions = "") =
543+
proc targetHelper(r: var TResults, test: TTest, expected: TSpec, extraOptions: string) =
545544
for target in expected.targets:
546545
inc(r.total)
547546
if target notin gTargets:
548-
r.addResult(test, target, "", "", reDisabled)
547+
r.addResult(test, target, extraOptions, "", "", reDisabled)
549548
inc(r.skipped)
550549
elif simulate:
551550
inc count
552551
echo "testSpec count: ", count, " expected: ", expected
553552
else:
554553
let nimcache = nimcacheDir(test.name, test.options, target)
555554
var testClone = test
556-
testSpecHelper(r, testClone, expected, target, nimcache, extraOptions)
555+
testSpecHelper(r, testClone, expected, target, extraOptions, nimcache)
557556

558557
proc testSpec(r: var TResults, test: TTest, targets: set[TTarget] = {}) =
559558
var expected = test.spec
560559
if expected.parseErrors.len > 0:
561560
# targetC is a lie, but a parameter is required
562-
r.addResult(test, targetC, "", expected.parseErrors, reInvalidSpec)
561+
r.addResult(test, targetC, "", "", expected.parseErrors, reInvalidSpec)
563562
inc(r.total)
564563
return
565-
if not checkDisabled(r, test): return
566564

567565
expected.targets.incl targets
568566
# still no target specified at all
@@ -572,14 +570,13 @@ proc testSpec(r: var TResults, test: TTest, targets: set[TTarget] = {}) =
572570
for m in test.spec.matrix:
573571
targetHelper(r, test, expected, m)
574572
else:
575-
targetHelper(r, test, expected)
573+
targetHelper(r, test, expected, "")
576574

577575
proc testSpecWithNimcache(r: var TResults, test: TTest; nimcache: string) {.used.} =
578-
if not checkDisabled(r, test): return
579576
for target in test.spec.targets:
580577
inc(r.total)
581578
var testClone = test
582-
testSpecHelper(r, testClone, test.spec, target, nimcache)
579+
testSpecHelper(r, testClone, test.spec, target, "", nimcache)
583580

584581
proc makeTest(test, options: string, cat: Category): TTest =
585582
result.cat = cat

0 commit comments

Comments
 (0)