Tests: Optional error location column spec

This allows some test to specify error location column, to ensure compiler is
generating diagnostics pointing to exactly right place of an error.
This commit is contained in:
Adam Strzelecki
2015-04-19 17:46:03 +02:00
parent 2b4e233510
commit 505836385c
2 changed files with 15 additions and 6 deletions

View File

@@ -42,7 +42,8 @@ type
action*: TTestAction
file*, cmd*: string
outp*: string
line*, exitCode*: int
line*, column*: int
exitCode*: int
msg*: string
ccodeCheck*: string
err*: TResultEnum
@@ -98,6 +99,8 @@ proc parseSpec*(filename: string): TSpec =
result.nimout = ""
result.ccodeCheck = ""
result.cmd = cmdTemplate
result.line = 0
result.column = 0
parseSpecAux:
case normalize(e.key)
of "action":
@@ -108,6 +111,7 @@ proc parseSpec*(filename: string): TSpec =
else: echo ignoreMsg(p, e)
of "file": result.file = e.value
of "line": discard parseInt(e.value, result.line)
of "column": discard parseInt(e.value, result.column)
of "output":
result.action = actionRun
result.outp = e.value

View File

@@ -50,7 +50,7 @@ type
let
pegLineError =
peg"{[^(]*} '(' {\d+} ', ' \d+ ') ' ('Error') ':' \s* {.*}"
peg"{[^(]*} '(' {\d+} ', ' {\d+} ') ' ('Error') ':' \s* {.*}"
pegOtherError = peg"'Error:' \s* {.*}"
pegSuccess = peg"'Hint: operation successful'.*"
pegOfInterest = pegLineError / pegOtherError
@@ -77,11 +77,13 @@ proc callCompiler(cmdTemplate, filename, options: string,
result.msg = ""
result.file = ""
result.outp = ""
result.line = -1
result.line = 0
result.column = 0
if err =~ pegLineError:
result.file = extractFilename(matches[0])
result.line = parseInt(matches[1])
result.msg = matches[2]
result.column = parseInt(matches[2])
result.msg = matches[3]
elif err =~ pegOtherError:
result.msg = matches[0]
elif suc =~ pegSuccess:
@@ -130,8 +132,11 @@ proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest) =
elif extractFilename(expected.file) != extractFilename(given.file) and
"internal error:" notin expected.msg:
r.addResult(test, expected.file, given.file, reFilesDiffer)
elif expected.line != given.line and expected.line != 0:
r.addResult(test, $expected.line, $given.line, reLinesDiffer)
elif expected.line != given.line and expected.line != 0 or
expected.column != given.column and expected.column != 0:
r.addResult(test, $expected.line & ':' & $expected.column,
$given.line & ':' & $given.column,
reLinesDiffer)
else:
r.addResult(test, expected.msg, given.msg, reSuccess)
inc(r.passed)