| Index: test/snippets.js |
| =================================================================== |
| --- a/test/snippets.js |
| +++ b/test/snippets.js |
| @@ -185,8 +185,68 @@ |
| checkParsedScript("Script containing Unicode composite characters", |
| "f\ud83d\ude42\ud83d\ude42 b\ud83d\ude02r", |
| [["f\ud83d\ude42\ud83d\ude42", "b\ud83d\ude02r"]]); |
| checkParsedScript("Script with no-op commands", "foo; ;;; ; ; bar 1", |
| [["foo"], ["bar", "1"]]); |
| test.done(); |
| }; |
| + |
| +exports.testScriptCompilation = function(test) |
| +{ |
| + let {compileScript, parseScript} = Snippets; |
| + |
| + let libraries = [ |
| + function(exports) |
| + { |
| + exports.hello = function(message) |
| + { |
| + console.log(message); |
| + }; |
| + }, |
| + function(exports) |
| + { |
| + exports.hello = function(message) |
| + { |
| + console.log(message || "Hello."); |
| + }; |
| + } |
| + ] |
| + .map(library => library.toString()); |
| + |
| + let template = ` |
| + "use strict"; |
| + { |
| + const libraries = ${JSON.stringify(libraries)}; |
| + |
| + const script = {{{script}}}; |
| + |
| + let imports = Object.create(null); |
| + for (let library of libraries) |
| + new Function("exports", library)(imports); |
| + |
| + for (let [name, ...args] of script) |
| + { |
| + if (Object.prototype.hasOwnProperty.call(imports, name)) |
| + { |
| + let value = imports[name]; |
| + if (typeof value == "function") |
| + value(...args); |
| + } |
| + } |
| + } |
| + `; |
| + |
| + function verifyExecutable(script) |
| + { |
| + let actual = compileScript(script, libraries); |
| + let expected = template.replace("{{{script}}}", |
| + JSON.stringify(parseScript(script))); |
| + |
| + // Trim surrounding spaces because of possible difference in indentation. |
| + test.equal(expected.trim(), actual.trim()); |
| + } |
| + |
| + verifyExecutable("hello 'How are you?'"); |
| + |
| + test.done(); |
| +}; |