diff --git a/src/runner.nim b/src/runner.nim index a17b9ca..eebcd53 100644 --- a/src/runner.nim +++ b/src/runner.nim @@ -193,14 +193,21 @@ proc simplifyPathsInMessageValues(j: var JsonNode) = simplifyPaths test["message"].str proc writeOutput*(resultsFileName, runtimeOutput: string) = - var testResults = parseFile resultsFileName - let submissionOutput = runtimeOutput.extractSubmissionOutput - - for index, test in submissionOutput.tests: - testResults["tests"][index]["output"] = test.output.newJString() - - simplifyPathsInMessageValues testResults - resultsFileName.writeFile $testResults + let resultsContents = readFile resultsFileName + if resultsContents.len > 0: + try: + var testResults = parseJson resultsContents + let submissionOutput = runtimeOutput.extractSubmissionOutput + + for index, test in submissionOutput.tests: + testResults["tests"][index]["output"] = test.output.newJString() + + simplifyPathsInMessageValues testResults + resultsFileName.writeFile $testResults + except JsonParsingError: + writeTopLevelErrorJson(resultsFileName, runtimeOutput) + else: + writeTopLevelErrorJson(resultsFileName, runtimeOutput) proc run*(paths: Paths): tuple[output: string, exitCode: int] = ## Compiles and runs the file in `paths.tmpTest`. Returns its exit code and diff --git a/tests/error/runtime_error_recursion_limit/expected_results.json b/tests/error/runtime_error_recursion_limit/expected_results.json new file mode 100644 index 0000000..70089b4 --- /dev/null +++ b/tests/error/runtime_error_recursion_limit/expected_results.json @@ -0,0 +1,12 @@ +{ + "version": 2, + "status": "fail", + "tests": [ + { + "name": "identity function of 1", + "status": "error", + "message": "Traceback (most recent call last)\n/nim/lib/pure/unittest.nim(654) test_identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\n(1874 calls omitted) ...\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim(2) identity\nidentity.nim identity\nError: call depth limit reached in a debug build (2000 function calls). You can change it with -d:nimCallDepthLimit= but really try to avoid deep recursions instead.\n", + "output": "" + } + ] +} diff --git a/tests/error/runtime_error_recursion_limit/identity.nim b/tests/error/runtime_error_recursion_limit/identity.nim new file mode 100644 index 0000000..929550a --- /dev/null +++ b/tests/error/runtime_error_recursion_limit/identity.nim @@ -0,0 +1,2 @@ +func identity*(n: int): int = + identity(n) diff --git a/tests/error/runtime_error_recursion_limit/test_identity.nim b/tests/error/runtime_error_recursion_limit/test_identity.nim new file mode 100644 index 0000000..f0ebd38 --- /dev/null +++ b/tests/error/runtime_error_recursion_limit/test_identity.nim @@ -0,0 +1,6 @@ +import std/unittest +import identity + +suite "Identity Function": + test "identity function of 1": + check identity(1) == 1 diff --git a/tests/error/runtime_error_recursion_limit_middle_test/expected_results.json b/tests/error/runtime_error_recursion_limit_middle_test/expected_results.json new file mode 100644 index 0000000..a9e6d8c --- /dev/null +++ b/tests/error/runtime_error_recursion_limit_middle_test/expected_results.json @@ -0,0 +1,17 @@ +{ + "version": 2, + "status": "fail", + "tests": [ + { + "name": "identity function of 1", + "status": "pass", + "output": "" + }, + { + "name": "identity function of 2", + "status": "error", + "message": "Traceback (most recent call last)\n/nim/lib/pure/unittest.nim(654) test_identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\n(1874 calls omitted) ...\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim(3) identity\nidentity.nim identity\nError: call depth limit reached in a debug build (2000 function calls). You can change it with -d:nimCallDepthLimit= but really try to avoid deep recursions instead.\n", + "output": "" + } + ] +} diff --git a/tests/error/runtime_error_recursion_limit_middle_test/identity.nim b/tests/error/runtime_error_recursion_limit_middle_test/identity.nim new file mode 100644 index 0000000..a14510b --- /dev/null +++ b/tests/error/runtime_error_recursion_limit_middle_test/identity.nim @@ -0,0 +1,5 @@ +func identity*(n: int): int = + if n == 2: + identity(n) + else: + n diff --git a/tests/error/runtime_error_recursion_limit_middle_test/test_identity.nim b/tests/error/runtime_error_recursion_limit_middle_test/test_identity.nim new file mode 100644 index 0000000..d6c95b4 --- /dev/null +++ b/tests/error/runtime_error_recursion_limit_middle_test/test_identity.nim @@ -0,0 +1,12 @@ +import std/unittest +import identity + +suite "Identity Function": + test "identity function of 1": + check identity(1) == 1 + + test "identity function of 2": + check identity(2) == 2 + + test "identity function of 3": + check identity(3) == 3