From 3bd0cc8b35fe8572eabb5b417363de4c245ce289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Cha=CC=81varri?= Date: Mon, 21 Sep 2020 00:31:29 +0200 Subject: [PATCH] update parser + test runner to fail when in non-recover mode --- src/res_cli.ml | 10 +-- .../__snapshots__/parse.spec.js.snap | 6 +- .../grammar/expressions/polyvariant.js | 6 +- tests/runner.js | 80 ++++++++++++++----- 4 files changed, 72 insertions(+), 30 deletions(-) diff --git a/src/res_cli.ml b/src/res_cli.ml index 9159b6da..2ee1830c 100644 --- a/src/res_cli.ml +++ b/src/res_cli.ml @@ -236,11 +236,11 @@ module CliArgProcessor = struct backend.stringOfDiagnostics ~source:parseResult.source ~filename:parseResult.filename - parseResult.diagnostics; - if recover || not parseResult.invalid then + parseResult.diagnostics; + if recover then printEngine.printInterface ~width ~filename ~comments:parseResult.comments parseResult.parsetree - else () + else exit 1 end else printEngine.printInterface @@ -252,10 +252,10 @@ module CliArgProcessor = struct ~source:parseResult.source ~filename:parseResult.filename parseResult.diagnostics; - if recover || not parseResult.invalid then + if recover then printEngine.printImplementation ~width ~filename ~comments:parseResult.comments parseResult.parsetree - else () + else exit 1 end else printEngine.printImplementation diff --git a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap index 7023a8fe..75ba26f6 100644 --- a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap @@ -1142,7 +1142,11 @@ let switchExpr = match myVar with | Blue -> \\"blue\\" | Red -> \\"red\\" let constrainedExpr = (x : int)" `; -exports[`polyvariant.js 1`] = `""`; +exports[`polyvariant.js 1`] = ` +"let x = \`Red +let z = \`Rgb () +let v = \`Vertex (1., 2., 3., 4.)" +`; exports[`primary.js 1`] = ` "let x = a.b diff --git a/tests/parsing/grammar/expressions/polyvariant.js b/tests/parsing/grammar/expressions/polyvariant.js index d7243377..b097858c 100644 --- a/tests/parsing/grammar/expressions/polyvariant.js +++ b/tests/parsing/grammar/expressions/polyvariant.js @@ -1,7 +1,7 @@ -let x = `Red +let x = #Red // sugar for Rgb(()) -let z = `Rgb() +let z = #Rgb() -let v = `Vertex(1., 2., 3., 4.) +let v = #Vertex(1., 2., 3., 4.) diff --git a/tests/runner.js b/tests/runner.js index 1fa9c4b4..17aac202 100644 --- a/tests/runner.js +++ b/tests/runner.js @@ -44,7 +44,13 @@ function parseFile(filename, recover, env) { let args = ["-print", "ml"]; if (recover) args.push("-recover"); args.push(filename); - return env ? cp.spawnSync(parser, args, { env }) : cp.spawnSync(parser, args); + let result = env ? cp.spawnSync(parser, args, { env }) : cp.spawnSync(parser, args); + + return { + result: result.stdout.toString(), + status: result.status, + errorOutput: result.stderr + } } function parseOcamlFileToNapkin(filename) { @@ -154,7 +160,11 @@ function printFile(filename) { case "reason": parserSrc = "re"; - return parseReasonFileToNapkin(filename, 80); + return { + result: parseReasonFileToNapkin(filename, 80), + status: 0, + errorOutput: "" + }; break; case "rescript": @@ -173,7 +183,13 @@ function printFile(filename) { args.push(filename); - return cp.spawnSync(parser, args).stdout.toString("utf8"); + let result = cp.spawnSync(parser, args); + + return { + result: result.stdout.toString("utf8"), + status: result.status, + errorOutput: result.stderr + } } /* Parser error output format: @@ -196,16 +212,27 @@ global.runPrinter = (dirname) => { } test(base, () => { - let napkin = printFile(filename); - expect(napkin).toMatchSnapshot(); + let {result, errorOutput, status} = printFile(filename); + if (status > 0) { + let msg = `Test from file: ${filename} failed with error output: + +------------ BEGIN ------------ +${errorOutput} +------------- END ------------- + +Make sure the test input is syntactically valid.`; + fail(msg); + } else { + expect(result).toMatchSnapshot(); + } if (process.env.ROUNDTRIP_TEST) { let intf = isInterface(filename); let sexpAst = parseFileToSexp(filename); - let napkin2 = parseNapkinStdinToNapkin(napkin, intf, 80); - let napkinSexpAst = parseNapkinStdinToSexp(napkin, intf); - expect(sexpAst).toEqual(napkinSexpAst); - expect(napkin).toEqual(napkin2); + let result2 = parseNapkinStdinToNapkin(result, intf, 80); + let resultSexpAst = parseNapkinStdinToSexp(result, intf); + expect(sexpAst).toEqual(resultSexpAst); + expect(result).toEqual(result2); } }); }); @@ -219,20 +246,31 @@ global.runParser = (dirname, recover = false, showError = false, env) => { } test(base, () => { - let res = parseFile(filename, recover, env); - let parsetree = res.stdout.toString(); - let output = ""; - if (showError) { - output += `=====Parsetree==========================================\n`; - output += `${parsetree}\n`; - output += `=====Errors=============================================\n`; - output += `${makeReproducibleFilename(res.stderr.toString())}\n`; - output += `========================================================`; + let {result, errorOutput, status} = parseFile(filename, recover, env); + if (status > 0) { + let msg = `Test from file: ${filename} failed with error output: + +------------ BEGIN ------------ +${errorOutput} +------------- END ------------- + +Make sure the test input is syntactically valid or run your test suite with 'recover' set to true.`; + fail(msg); } else { - output = parsetree; + let parsetree = result; + let output = ""; + if (showError) { + output += `=====Parsetree==========================================\n`; + output += `${parsetree}\n`; + output += `=====Errors=============================================\n`; + output += `${makeReproducibleFilename(errorOutput.toString())}\n`; + output += `========================================================`; + } else { + output = parsetree; + } + + expect(output).toMatchSnapshot(); } - - expect(output).toMatchSnapshot(); }); }); };