diff --git a/.gitignore b/.gitignore index 30eef3e..86a1d0a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,4 @@ docout doc/rstPreproc doc/tmp.rst doc/**/code -test/yaml-test-suite nimsuggest.log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9a4284a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "test/yaml-test-suite"] + path = test/yaml-test-suite + url = https://github.com/yaml/yaml-test-suite.git + branch = data diff --git a/test/tparser.nim b/test/tparser.nim index cebf8cd..e37c0fd 100644 --- a/test/tparser.nim +++ b/test/tparser.nim @@ -4,55 +4,18 @@ # See the file "copying.txt", included in this # distribution, for details about the copyright. -import os, osproc, terminal, strutils, streams, macros, unittest +import os, osproc, terminal, strutils, streams, macros, unittest, sets import testEventParser, commonTestUtils import "../yaml" const testSuiteFolder = "yaml-test-suite" - testSuiteUrl = "https://github.com/yaml/yaml-test-suite.git" proc echoError(msg: string) = styledWriteLine(stdout, fgRed, "[error] ", fgWhite, msg, resetStyle) -proc ensureTestSuiteCloneCorrect(pwd: string) {.compileTime.} = - let absolutePath = pwd / testSuiteFolder - if dirExists(absolutePath): - var isCorrectClone = true - if dirExists(absolutePath / ".git"): - let remoteUrl = - staticExec("cd \"" & absolutePath & "\" && git remote get-url origin").strip - if remoteUrl != testSuiteUrl: - isCorrectClone = false - let branches = staticExec("cd \"" & absolutePath & "\" && git branch").strip - if "* data" notin branches.splitLines(): - isCorrectClone = false - if isCorrectClone: - let updateOutput = staticExec("cd \"" & absolutePath & "\" && git pull") - #if uError != 0: - # echo "could not update yaml-test-suite! please fix this problem and compile again." - # echo "output:\n" - # echo "$ git pull" - # echo updateOutput - # quit 1 - else: - echo testSuiteFolder, " exists, but is not in expected state. Make sure it is a git repo," - echo "cloned from ", testSuiteUrl, ", and the data branch" - echo "is active. Alternatively, delete the folder " & testSuiteFolder & '.' - quit 1 - else: - let cloneOutput = staticExec("cd \"" & pwd & - "\" && git clone " & testSuiteUrl & " -b data") - #if cError != 0: - if not(dirExists(absolutePath)) or not(dirExists(absolutePath / ".git")) or - not(dirExists(absolutePath / "229Q")): - echo "could not clone ", testSuiteUrl, ". Make sure" - echo "you are connected to the internet and your proxy settings are correct. output:\n" - echo "$ git clone ", testSuiteUrl, " -b data" - echo cloneOutput - quit 1 -proc parserTest(path: string): bool = +proc parserTest(path: string, errorExpected : bool): bool = var tagLib = initExtendedTagLibrary() parser = newYamlParser(tagLib) @@ -68,49 +31,65 @@ proc parserTest(path: string): bool = while not actual.finished(): let actualEvent = actual.next() if expected.finished(): - echoError("At token #" & $i & ": Expected stream end, got " & - $actualEvent.kind) - return false + result = errorExpected + if not result: + echoError("At token #" & $i & ": Expected stream end, got " & + $actualEvent.kind) + return let expectedEvent = expected.next() if expectedEvent != actualEvent: - printDifference(expectedEvent, actualEvent) - echoError("At token #" & $i & - ": Actual tokens do not match expected tokens") - return false + result = errorExpected + if not result: + printDifference(expectedEvent, actualEvent) + echoError("At token #" & $i & + ": Actual tokens do not match expected tokens") + return i.inc() if not expected.finished(): - echoError("Got fewer tokens than expected, first missing " & - "token: " & $expected.next().kind) - return false + result = errorExpected + if not result: + echoError("Got fewer tokens than expected, first missing " & + "token: " & $expected.next().kind) + return + result = not errorExpected + if not result: + echo "Expected error, but parsed without error." except: - let e = getCurrentException() - if e.parent of YamlParserError: - let pe = (ref YamlParserError)(e.parent) - echo "line ", pe.line, ", column ", pe.column, ": ", pe.msg - echo pe.lineContent - else: echo e.msg - echoError("Catched an exception at token #" & $i & - " test was not successful") - return false - result = true + result = errorExpected + if not result: + let e = getCurrentException() + if e.parent of YamlParserError: + let pe = (ref YamlParserError)(e.parent) + echo "line ", pe.line, ", column ", pe.column, ": ", pe.msg + echo pe.lineContent + else: echo e.msg + echoError("Catched an exception at token #" & $i & + " test was not successful") macro genTests(): untyped = let pwd = staticExec("pwd").strip absolutePath = '"' & (pwd / testSuiteFolder) & '"' echo "[tparser] Generating tests from " & absolutePath - ensureTestSuiteCloneCorrect(pwd) + discard staticExec("git submodule init && git submodule update --remote") + + let errorTests = toSet(staticExec("cd " & (absolutePath / "tags" / "error") & + " && ls -1d *").splitLines()) + let ignored = toSet(["3MYT", "JDH8", ".git", "name", "tags", "meta"]) + result = newStmtList() # walkDir for some crude reason does not work with travis build let dirItems = staticExec("ls -1d " & absolutePath / "*") for dirPath in dirItems.splitLines(): if dirPath.strip.len == 0: continue - if dirPath[^4..^1] in [".git", "name", "tags", "meta"]: continue + let testId = dirPath[^4..^1] + if ignored.contains(testId): continue let title = slurp(dirPath / "===") + result.add(newCall("test", newLit(strip(title) & " [" & - dirPath[^4..^1] & ']'), newCall("doAssert", newCall("parserTest", - newLit(dirPath))))) + testId & ']'), newCall("doAssert", newCall("parserTest", + newLit(dirPath), newLit(errorTests.contains(testId)))))) result = newCall("suite", newLit("Parser Tests (from yaml-test-suite)"), result) genTests() diff --git a/test/yaml-test-suite b/test/yaml-test-suite new file mode 160000 index 0000000..daa74b9 --- /dev/null +++ b/test/yaml-test-suite @@ -0,0 +1 @@ +Subproject commit daa74b930d50a1863a8f90d7b8376904ad183771