From 284b868c936382246b1f2fc26d41963087ec5837 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Sun, 29 Nov 2020 10:42:50 -0800 Subject: [PATCH] testament: error instead of silently overwrite a spec (#16166) --- testament/specs.nim | 18 +++++++++++++----- testament/testament.nim | 5 ++--- tests/casestmt/tcaseexpr1.nim | 26 ++++++++++++++++---------- tests/exception/t13115.nim | 9 ++++----- tests/generics/tmetafield.nim | 20 ++++++++++++++++---- 5 files changed, 51 insertions(+), 27 deletions(-) diff --git a/testament/specs.nim b/testament/specs.nim index c60ed7e206a54..d2f37b96c7213 100644 --- a/testament/specs.nim +++ b/testament/specs.nim @@ -8,7 +8,7 @@ # import sequtils, parseutils, strutils, os, streams, parsecfg, - tables, hashes + tables, hashes, sets type TestamentData* = ref object # better to group globals under 1 object; could group the other ones here too @@ -82,7 +82,7 @@ type tline*, tcolumn*: int exitCode*: int msg*: string - ccodeCheck*: string + ccodeCheck*: seq[string] maxCodeSize*: int err*: TResultEnum inCurrentBatch*: bool @@ -244,11 +244,19 @@ proc parseSpec*(filename: string): TSpec = var ss = newStringStream(specStr) var p: CfgParser open(p, ss, filename, 1) + var flags: HashSet[string] while true: var e = next(p) case e.kind of cfgKeyValuePair: - case normalize(e.key) + let key = e.key.normalize + const whiteListMulti = ["disabled", "ccodecheck"] + ## list of flags that are correctly handled when passed multiple times + ## (instead of being overwritten) + if key notin whiteListMulti: + doAssert key notin flags, $(key, filename) + flags.incl key + case key of "action": case e.value.normalize of "compile": @@ -298,7 +306,7 @@ proc parseSpec*(filename: string): TSpec = result.msg = e.value if result.action != actionRun: result.action = actionCompile - of "errormsg", "errmsg": + of "errormsg", "errmsg": # xxx just use errormsg, no need for such aliases result.msg = e.value result.action = actionReject of "nimout": @@ -361,7 +369,7 @@ proc parseSpec*(filename: string): TSpec = else: result.cmd = e.value of "ccodecheck": - result.ccodeCheck = e.value + result.ccodeCheck.add e.value of "maxcodesize": discard parseInt(e.value, result.maxCodeSize) of "timeout": diff --git a/testament/testament.nim b/testament/testament.nim index c014a79a61bd1..f2ac9c338bac2 100644 --- a/testament/testament.nim +++ b/testament/testament.nim @@ -402,9 +402,8 @@ proc codegenCheck(test: TTest, target: TTarget, spec: TSpec, expectedMsg: var st try: let genFile = generatedFile(test, target) let contents = readFile(genFile).string - let check = spec.ccodeCheck - if check.len > 0: - if check[0] == '\\': + for check in spec.ccodeCheck: + if check.len > 0 and check[0] == '\\': # little hack to get 'match' support: if not contents.match(check.peg): given.err = reCodegenFailure diff --git a/tests/casestmt/tcaseexpr1.nim b/tests/casestmt/tcaseexpr1.nim index 3d4b6c0872920..82af2410b8c6b 100644 --- a/tests/casestmt/tcaseexpr1.nim +++ b/tests/casestmt/tcaseexpr1.nim @@ -1,17 +1,23 @@ discard """ - errormsg: "type mismatch: got but expected 'int'" - line: 33 - file: "tcaseexpr1.nim" - - errormsg: "not all cases are covered; missing: {C}" - line: 27 - file: "tcaseexpr1.nim" + cmd: "nim check $options $file" + action: "reject" + nimout: ''' +tcaseexpr1.nim(33, 10) Error: not all cases are covered; missing: {C} +''' """ -# NOTE: This spec is wrong. Spec doesn't support multiple error -# messages. The first one is simply overridden by the second one. -# This just has never been noticed. +#[ +# xxx make nimout comparison use nimoutCheck instead of: +elif expected.nimout.len > 0 and expected.nimout.normalizeMsg notin given.nimout.normalizeMsg: + +and then use nimout: ''' +tcaseexpr1.nim(33, 10) Error: not all cases are covered2; missing: {C} +tcaseexpr1.nim(39, 12) Error: type mismatch: got but expected 'int literal(10)' +''' +]# + +# line 20 type E = enum A, B, C diff --git a/tests/exception/t13115.nim b/tests/exception/t13115.nim index 9d88bbeda11ea..53e078076a252 100644 --- a/tests/exception/t13115.nim +++ b/tests/exception/t13115.nim @@ -2,12 +2,11 @@ discard """ exitcode: 1 targets: "c" matrix: "-d:debug; -d:release" - outputsub: '''t13115.nim(13) t13115 -Error: unhandled exception: This char is''' outputsub: ''' and works fine! [Exception]''' """ -const b_null: char = 0.char -var msg = "This char is `" & $b_null & "` and works fine!" +# bug #13115 +# xxx bug: doesn't yet work for cpp -raise newException(Exception, msg) \ No newline at end of file +var msg = "This char is `" & '\0' & "` and works fine!" +raise newException(Exception, msg) diff --git a/tests/generics/tmetafield.nim b/tests/generics/tmetafield.nim index 7a2375abe3b78..cf30a936d9d46 100644 --- a/tests/generics/tmetafield.nim +++ b/tests/generics/tmetafield.nim @@ -1,10 +1,23 @@ discard """ cmd: "nim check $options $file" - errormsg: "'proc' is not a concrete type" - errormsg: "'Foo' is not a concrete type." - errormsg: "invalid type: 'proc' in this context: 'TBaseMed'" + action: "reject" + nimout: ''' +tmetafield.nim(26, 5) Error: 'proc' is not a concrete type; for a callback without parameters use 'proc()' +tmetafield.nim(27, 5) Error: 'Foo' is not a concrete type +tmetafield.nim(29, 5) Error: invalid type: 'proc' in this context: 'TBaseMed' for var +''' """ +# bug #188 + + + + + + + + +# line 20 type Foo[T] = object x: T @@ -15,4 +28,3 @@ type var a: TBaseMed -# issue 188