From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- devtools/shared/acorn/tests/unit/head_acorn.js | 75 ++++++++++++++++++++++ .../shared/acorn/tests/unit/test_import_acorn.js | 18 ++++++ .../shared/acorn/tests/unit/test_lenient_parser.js | 62 ++++++++++++++++++ devtools/shared/acorn/tests/unit/test_same_ast.js | 37 +++++++++++ devtools/shared/acorn/tests/unit/xpcshell.ini | 10 +++ 5 files changed, 202 insertions(+) create mode 100644 devtools/shared/acorn/tests/unit/head_acorn.js create mode 100644 devtools/shared/acorn/tests/unit/test_import_acorn.js create mode 100644 devtools/shared/acorn/tests/unit/test_lenient_parser.js create mode 100644 devtools/shared/acorn/tests/unit/test_same_ast.js create mode 100644 devtools/shared/acorn/tests/unit/xpcshell.ini (limited to 'devtools/shared/acorn/tests/unit') diff --git a/devtools/shared/acorn/tests/unit/head_acorn.js b/devtools/shared/acorn/tests/unit/head_acorn.js new file mode 100644 index 000000000..3e06ca3c1 --- /dev/null +++ b/devtools/shared/acorn/tests/unit/head_acorn.js @@ -0,0 +1,75 @@ +"use strict"; +var { classes: Cc, interfaces: Ci, utils: Cu } = Components; +const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {}); + + +function isObject(value) { + return typeof value === "object" && value !== null; +} + +function intersect(a, b) { + const seen = new Set(a); + return b.filter(value => seen.has(value)); +} + +function checkEquivalentASTs(expected, actual, prop = []) { + do_print("Checking: " + prop.join(" ")); + + if (!isObject(expected)) { + return void do_check_eq(expected, actual); + } + + do_check_true(isObject(actual)); + + if (Array.isArray(expected)) { + do_check_true(Array.isArray(actual)); + do_check_eq(expected.length, actual.length); + for (let i = 0; i < expected.length; i++) { + checkEquivalentASTs(expected[i], actual[i], prop.concat(i)); + } + } else { + // We must intersect the keys since acorn and Reflect have different + // extraneous properties on their AST nodes. + const keys = intersect(Object.keys(expected), Object.keys(actual)); + for (let key of keys) { + checkEquivalentASTs(expected[key], actual[key], prop.concat(key)); + } + } +} + + +// Register a console listener, so console messages don't just disappear +// into the ether. +var errorCount = 0; +var listener = { + observe: function (aMessage) { + errorCount++; + try { + // If we've been given an nsIScriptError, then we can print out + // something nicely formatted, for tools like Emacs to pick up. + var scriptError = aMessage.QueryInterface(Ci.nsIScriptError); + dump(aMessage.sourceName + ":" + aMessage.lineNumber + ": " + + scriptErrorFlagsToKind(aMessage.flags) + ": " + + aMessage.errorMessage + "\n"); + var string = aMessage.errorMessage; + } catch (x) { + // Be a little paranoid with message, as the whole goal here is to lose + // no information. + try { + var string = "" + aMessage.message; + } catch (x) { + var string = ""; + } + } + + // Ignored until they are fixed in bug 1242968. + if (string.includes("JavaScript Warning")) { + return; + } + + do_throw("head_acorn.js got console message: " + string + "\n"); + } +}; + +var consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService); +consoleService.registerListener(listener); diff --git a/devtools/shared/acorn/tests/unit/test_import_acorn.js b/devtools/shared/acorn/tests/unit/test_import_acorn.js new file mode 100644 index 000000000..49b2b50cb --- /dev/null +++ b/devtools/shared/acorn/tests/unit/test_import_acorn.js @@ -0,0 +1,18 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Test that we can require acorn. + */ + +function run_test() { + const acorn = require("acorn/acorn"); + const acorn_loose = require("acorn/acorn_loose"); + const walk = require("acorn/util/walk"); + do_check_true(isObject(acorn)); + do_check_true(isObject(acorn_loose)); + do_check_true(isObject(walk)); + do_check_eq(typeof acorn.parse, "function"); + do_check_eq(typeof acorn_loose.parse_dammit, "function"); + do_check_eq(typeof walk.simple, "function"); +} diff --git a/devtools/shared/acorn/tests/unit/test_lenient_parser.js b/devtools/shared/acorn/tests/unit/test_lenient_parser.js new file mode 100644 index 000000000..7586eb8a3 --- /dev/null +++ b/devtools/shared/acorn/tests/unit/test_lenient_parser.js @@ -0,0 +1,62 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Test that acorn's lenient parser gives something usable. + */ + +const acorn_loose = require("acorn/acorn_loose"); + +function run_test() { + let actualAST = acorn_loose.parse_dammit("let x = 10", {}); + + do_print("Actual AST:"); + do_print(JSON.stringify(actualAST, null, 2)); + do_print("Expected AST:"); + do_print(JSON.stringify(expectedAST, null, 2)); + + checkEquivalentASTs(expectedAST, actualAST); +} + +const expectedAST = { + "type": "Program", + "start": 0, + "end": 10, + "body": [ + { + "type": "ExpressionStatement", + "start": 0, + "end": 3, + "expression": { + "type": "Identifier", + "start": 0, + "end": 3, + "name": "let" + } + }, + { + "type": "ExpressionStatement", + "start": 4, + "end": 10, + "expression": { + "type": "AssignmentExpression", + "start": 4, + "end": 10, + "operator": "=", + "left": { + "type": "Identifier", + "start": 4, + "end": 5, + "name": "x" + }, + "right": { + "type": "Literal", + "start": 8, + "end": 10, + "value": 10, + "raw": "10" + } + } + } + ] +}; diff --git a/devtools/shared/acorn/tests/unit/test_same_ast.js b/devtools/shared/acorn/tests/unit/test_same_ast.js new file mode 100644 index 000000000..d1d76bc50 --- /dev/null +++ b/devtools/shared/acorn/tests/unit/test_same_ast.js @@ -0,0 +1,37 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Test that Reflect and acorn create the same AST for ES5. + */ + +const acorn = require("acorn/acorn"); +const { Reflect } = require("resource://gre/modules/reflect.jsm"); + +const testCode = "" + function main () { + function makeAcc(n) { + return function () { + return ++n; + }; + } + + var acc = makeAcc(10); + + for (var i = 0; i < 10; i++) { + acc(); + } + + console.log(acc()); +}; + +function run_test() { + const reflectAST = Reflect.parse(testCode); + const acornAST = acorn.parse(testCode); + + do_print("Reflect AST:"); + do_print(JSON.stringify(reflectAST, null, 2)); + do_print("acorn AST:"); + do_print(JSON.stringify(acornAST, null, 2)); + + checkEquivalentASTs(reflectAST, acornAST); +} diff --git a/devtools/shared/acorn/tests/unit/xpcshell.ini b/devtools/shared/acorn/tests/unit/xpcshell.ini new file mode 100644 index 000000000..414dfe567 --- /dev/null +++ b/devtools/shared/acorn/tests/unit/xpcshell.ini @@ -0,0 +1,10 @@ +[DEFAULT] +tags = devtools +head = head_acorn.js +tail = +firefox-appdir = browser +skip-if = toolkit == 'android' + +[test_import_acorn.js] +[test_same_ast.js] +[test_lenient_parser.js] -- cgit v1.2.3