@@ -259,7 +259,8 @@ Tests skipped: $4 / $1 <br />
259
259
""" % [$ x.total, $ x.passed, $ x.failedButAllowed, $ x.skipped]
260
260
261
261
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 ) =
263
264
# instead of `ptr TSpec` we could also use `Option[TSpec]`; passing `givenSpec` makes it easier to get what we need
264
265
# instead of having to pass individual fields, or abusing existing ones like expected vs given.
265
266
# test.name is easier to find than test.name.extractFilename
@@ -269,6 +270,7 @@ proc addResult(r: var TResults, test: TTest, target: TTarget,
269
270
if allowFailure:
270
271
name.add " (allowed to fail) "
271
272
if test.options.len > 0 : name.add ' ' & test.options
273
+ if extraOptions.len > 0 : name.add ' ' & extraOptions
272
274
273
275
let duration = epochTime() - test.startTime
274
276
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,
333
335
discard waitForExit(p)
334
336
close(p)
335
337
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 ) =
337
340
let pegLine = peg" {[^(]*} '(' {\ d+} ', ' {\ d+} ') ' {[^:]*} ':' \ s* {.*}"
338
341
var covered = initIntSet()
339
342
for line in splitLines(given.nimout):
@@ -367,10 +370,10 @@ proc checkForInlineErrors(r: var TResults, expected, given: TSpec, test: TTest,
367
370
e.add " : "
368
371
e.add expected.inlineErrors[j].msg
369
372
370
- r.addResult(test, target, e, given.nimout, reMsgsDiffer)
373
+ r.addResult(test, target, extraOptions, e, given.nimout, reMsgsDiffer)
371
374
break coverCheck
372
375
373
- r.addResult(test, target, " " , given.msg, reSuccess)
376
+ r.addResult(test, target, extraOptions, " " , given.msg, reSuccess)
374
377
inc(r.passed)
375
378
376
379
proc nimoutCheck(expected, given: TSpec): bool =
@@ -381,22 +384,23 @@ proc nimoutCheck(expected, given: TSpec): bool =
381
384
elif expected.nimout.len > 0 and not greedyOrderedSubsetLines(expected.nimout, given.nimout):
382
385
result = false
383
386
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 ) =
385
389
if expected.inlineErrors.len > 0 :
386
- checkForInlineErrors(r, expected, given, test, target)
390
+ checkForInlineErrors(r, expected, given, test, target, extraOptions )
387
391
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)
389
393
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)
391
395
elif extractFilename(expected.file) != extractFilename(given.file) and
392
396
" 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)
394
398
elif expected.line != given.line and expected.line != 0 or
395
399
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,
397
401
$ given.line & ':' & $ given.column, reLinesDiffer)
398
402
else :
399
- r.addResult(test, target, expected.msg, given.msg, reSuccess)
403
+ r.addResult(test, target, extraOptions, expected.msg, given.msg, reSuccess)
400
404
inc(r.passed)
401
405
402
406
proc generatedFile(test: TTest, target: TTarget): string =
@@ -434,8 +438,8 @@ proc codegenCheck(test: TTest, target: TTarget, spec: TSpec, expectedMsg: var st
434
438
given.err = reCodeNotFound
435
439
echo getCurrentExceptionMsg()
436
440
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) =
439
443
var expectedmsg: string = " "
440
444
var givenmsg: string = " "
441
445
if given.err == reSuccess:
@@ -449,55 +453,50 @@ proc compilerOutputTests(test: TTest, target: TTarget, given: var TSpec,
449
453
else :
450
454
givenmsg = " $ " & given.cmd & '\n ' & given.nimout
451
455
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)
453
457
454
458
proc getTestSpecTarget(): TTarget =
455
459
if getEnv(" NIM_COMPILE_TO_CPP" , " false" ) == " true" :
456
460
result = targetCpp
457
461
else :
458
462
result = targetC
459
463
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
-
470
464
var count = 0
471
465
472
466
proc equalModuloLastNewline(a, b: string ): bool =
473
467
# allow lazy output spec that omits last newline, but really those should be fixed instead
474
468
result = a == b or b.endsWith(" \n " ) and a == b[0 ..< ^ 1 ]
475
469
476
470
proc testSpecHelper(r: var TResults, test: var TTest, expected: TSpec,
477
- target: TTarget, nimcache : string , extraOptions = " " ) =
471
+ target: TTarget, extraOptions : string , nimcache: string ) =
478
472
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
+
479
478
template callNimCompilerImpl(): untyped =
480
479
# xxx this used to also pass: `--stdout --hint:Path:off`, but was done inconsistently
481
480
# with other branches
482
481
callNimCompiler(expected.getCmd, test.name, test.options, nimcache, target, extraOptions)
483
482
case expected.action
484
483
of actionCompile:
485
484
var given = callNimCompilerImpl()
486
- compilerOutputTests(test, target, given, expected, r)
485
+ compilerOutputTests(test, target, extraOptions, given, expected, r)
487
486
of actionRun:
488
487
var given = callNimCompilerImpl()
489
488
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 )
491
490
else :
492
491
let isJsTarget = target == targetJS
493
492
var exeFile = changeFileExt(test.name, if isJsTarget: " js" else : ExeExt)
494
493
if not fileExists(exeFile):
495
- r.addResult(test, target, expected.output,
494
+ r.addResult(test, target, extraOptions, expected.output,
496
495
" executable not found: " & exeFile, reExeNotFound)
497
496
else :
498
497
let nodejs = if isJsTarget: findNodeJs() else : " "
499
498
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" ,
501
500
reExeNotFound)
502
501
else :
503
502
var exeCmd: string
@@ -528,41 +527,40 @@ proc testSpecHelper(r: var TResults, test: var TTest, expected: TSpec,
528
527
else :
529
528
buf
530
529
if exitCode != expected.exitCode:
531
- r.addResult(test, target, " exitcode: " & $ expected.exitCode,
530
+ r.addResult(test, target, extraOptions, " exitcode: " & $ expected.exitCode,
532
531
" exitcode: " & $ exitCode & " \n\n Output:\n " &
533
532
bufB, reExitcodesDiffer)
534
533
elif (expected.outputCheck == ocEqual and not expected.output.equalModuloLastNewline(bufB)) or
535
534
(expected.outputCheck == ocSubstr and expected.output notin bufB):
536
535
given.err = reOutputsDiffer
537
- r.addResult(test, target, expected.output, bufB, reOutputsDiffer)
536
+ r.addResult(test, target, extraOptions, expected.output, bufB, reOutputsDiffer)
538
537
else :
539
- compilerOutputTests(test, target, given, expected, r)
538
+ compilerOutputTests(test, target, extraOptions, given, expected, r)
540
539
of actionReject:
541
540
let given = callNimCompilerImpl()
542
- cmpMsgs(r, expected, given, test, target)
541
+ cmpMsgs(r, expected, given, test, target, extraOptions )
543
542
544
- proc targetHelper(r: var TResults, test: TTest, expected: TSpec, extraOptions = " " ) =
543
+ proc targetHelper(r: var TResults, test: TTest, expected: TSpec, extraOptions: string ) =
545
544
for target in expected.targets:
546
545
inc(r.total)
547
546
if target notin gTargets:
548
- r.addResult(test, target, " " , " " , reDisabled)
547
+ r.addResult(test, target, extraOptions, " " , " " , reDisabled)
549
548
inc(r.skipped)
550
549
elif simulate:
551
550
inc count
552
551
echo " testSpec count: " , count, " expected: " , expected
553
552
else :
554
553
let nimcache = nimcacheDir(test.name, test.options, target)
555
554
var testClone = test
556
- testSpecHelper(r, testClone, expected, target, nimcache, extraOptions )
555
+ testSpecHelper(r, testClone, expected, target, extraOptions, nimcache )
557
556
558
557
proc testSpec(r: var TResults, test: TTest, targets: set [TTarget] = {}) =
559
558
var expected = test.spec
560
559
if expected.parseErrors.len > 0 :
561
560
# 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)
563
562
inc(r.total)
564
563
return
565
- if not checkDisabled(r, test): return
566
564
567
565
expected.targets.incl targets
568
566
# still no target specified at all
@@ -572,14 +570,13 @@ proc testSpec(r: var TResults, test: TTest, targets: set[TTarget] = {}) =
572
570
for m in test.spec.matrix:
573
571
targetHelper(r, test, expected, m)
574
572
else :
575
- targetHelper(r, test, expected)
573
+ targetHelper(r, test, expected, " " )
576
574
577
575
proc testSpecWithNimcache(r: var TResults, test: TTest; nimcache: string ) {.used.} =
578
- if not checkDisabled(r, test): return
579
576
for target in test.spec.targets:
580
577
inc(r.total)
581
578
var testClone = test
582
- testSpecHelper(r, testClone, test.spec, target, nimcache)
579
+ testSpecHelper(r, testClone, test.spec, target, " " , nimcache)
583
580
584
581
proc makeTest(test, options: string , cat: Category): TTest =
585
582
result .cat = cat
0 commit comments