UNPKG

dogescript-3

Version:

an unofficial third version of dogescript

172 lines (134 loc) 15.1 kB
var assert = require("assert"), parser = require('../lib/parser.js'); describe("Parser", function () { describe("parse expressions", function () { describe("parse values", function () { it("should parse literals", function () { // number assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":1}}]}, parser.parse("1"), "Expected number '1'."); // string assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":"hello world!"}}]}, parser.parse("'hello world!'"), "Expected string 'hello world!'"); // identifier assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Identifier","name":"apple"}}]}, parser.parse('apple'), "Expected identifier 'apple'"); // booleans assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":true}}]}, parser.parse('yes'), "Expected identifier 'true'"); assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":false}}]}, parser.parse('no'), "Expected identifier 'false'"); // null assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":null}}]}, parser.parse('null'), "Expected identifier 'null'"); assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":null}}]}, parser.parse('empty'), "Expected identifier 'null'"); }); it("should parse member expressions", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"MemberExpression","computed":true,"object":{"type":"MemberExpression","computed":false,"object":{"type":"Identifier","name":"a"},"property":{"type":"Identifier","name":"b"}},"property":{"type":"Literal","value":"c"}}}]}, parser.parse('a.b["c"]'), 'Expected a.b["c"]'); }); }); describe("parse algebraic expressions", function () { it("should parse binary and logical expressions in the correct order", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"BinaryExpression","operator":"/","left":{"type":"LogicalExpression","operator":"||","left":{"type":"LogicalExpression","operator":"&&","left":{"type":"Literal","value":1,},"right":{"type":"Literal","value":2,}},"right":{"type":"BinaryExpression","operator":"+","left":{"type":"Literal","value":3,},"right":{"type":"BinaryExpression","operator":"*","left":{"type":"Literal","value":4,},"right":{"type":"Literal","value":5,}}}},"right":{"type":"Literal","value":6,}}}]}, parser.parse("(1 && 2 || 3 + 4 * 5) / 6"), "Expected binary expression (1 && 2 || 3 + 4 * 5) / 6."); }); it("should do comparisons", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"BinaryExpression","operator":"===","left":{"type":"Literal","value":1},"right":{"type":"Literal","value":1}}}]}, parser.parse("1 === 1"), "Expected 1 === 1"); assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"BinaryExpression","operator":"!==","left":{"type":"Literal","value":1},"right":{"type":"Literal","value":1}}}]}, parser.parse("1 not 1"), "Expected 1 !== 1"); }); it("should do unary operators", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"UnaryExpression","operator":"-","argument":{"type":"Literal","value":5},"prefix":true}}]}, parser.parse("-5"), "Expected -5"); assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"UpdateExpression","operator":"++","argument":{"type":"Identifier","name":"a"},"prefix":false}}]}, parser.parse("a++"), "Expected a++"); }); }); describe("parses function calls", function () { it("should parse functions calls", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"CallExpression","callee":{"type":"Identifier","name":"print"},"arguments":[]}}]}, parser.parse("plz print"), "Expected print()"); }); it("should parse old function calls", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"CallExpression","callee":{"type":"MemberExpression","computed":false,"object":{"type":"Identifier","name":"console"},"property":{"type":"Identifier","name":"log"}},"arguments":[{"type":"Literal","value":"abc"}]}}]}, parser.parse("console dose log with 'abc'"), "Expected 'console.log(\"abc\")'"); }); it("should parse functions calls with arguments", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"CallExpression","callee":{"type":"Identifier","name":"print"},"arguments":[{"type":"Literal","value":1},{"type":"Literal","value":2}]}}]}, parser.parse("plz print with 1, 2"), "Expected print(1, 2)"); }); }); describe("parses assignment expression", function () { it("should parse assignment expression", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"AssignmentExpression","operator":"=","left":{"type":"Identifier","name":"a"},"right":{"type":"Identifier","name":"b"}}}]}, parser.parse("a as b"), "Expected 'a = b'"); }); }); describe("parses 'new' function call", function () { it("should parse 'new' function call", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"NewExpression","callee":{"type":"Identifier","name":"a"},"arguments":[]}}]}, parser.parse("new a"), "Expected 'new a'"); }); it("should parse 'new' function call with arguments", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"NewExpression","callee":{"type":"Identifier","name":"a"},"arguments":[{"type":"Literal","value":1}]}}]}, parser.parse("new a with 1"), "Expected 'new a(1)'"); }); }); }); describe("parses statements", function () { it("should parse variable declarations", function () { assert.deepEqual({"type":"Program","body":[{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"a"},"init":null}],"kind":"var"}]}, parser.parse("very a"), "Expected 'var a'"); assert.deepEqual({"type":"Program","body":[{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"a"},"init":{"type":"Literal","value":5}}],"kind":"var"}]}, parser.parse("very a is 5"), "Expected 'var a = 5'"); assert.deepEqual({"type":"Program","body":[{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"a"},"init":null}],"kind":"const"}]}, parser.parse("always a"), "Expected 'const a'"); assert.deepEqual({"type":"Program","body":[{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"a"},"init":{"type":"Literal","value":5}}],"kind":"const"}]}, parser.parse("always a is 5"), "Expected 'const a = 5'"); }); it("should parse assignment statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"AssignmentExpression","operator":"=","left":{"type":"Identifier","name":"a"},"right":{"type":"Literal","value":1}}}]}, parser.parse("a is 1"), "Expected 'a = 1'"); }); it("should parse wow statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"ReturnStatement","argument":{"type":"Literal","value":1}}]}, parser.parse("wow 1"), "Expected 'return 1;'"); }); it("should parse trained statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"Literal","value":"use strict"}}]}, parser.parse("trained"), "Expected 'use strict'"); }); it("should parse import statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"abc"},"init":{"type":"CallExpression","callee":{"type":"Identifier","name":"require"},"arguments":[{"type":"Literal","value":"abc"}]}}],"kind":"var"}]}, parser.parse("so abc"), "Expected 'var abc = require(\"abc\")'"); assert.deepEqual({"type":"Program","body":[{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"test"},"init":{"type":"CallExpression","callee":{"type":"Identifier","name":"require"},"arguments":[{"type":"Literal","value":"test.js"}]}}],"kind":"var"}]}, parser.parse('so "test.js"'), "Expected 'var test = require(\"test.js\")'"); }); it("should parse export statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"ExpressionStatement","expression":{"type":"AssignmentExpression","operator":"=","left":{"type":"MemberExpression","computed":false,"object":{"type":"Identifier","name":"module"},"property":{"type":"Identifier","name":"exports"}},"right":{"type":"Literal","value":1}}}]}, parser.parse('out 1'), "Expected 'module.exports = 1'"); }); it("should parse debooger statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"DebuggerStatement"}]}, parser.parse("debooger"), "Expected 'debugger'"); }); it("should parse bark statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"BreakStatement"}]}, parser.parse("bark"), "Expected 'break'"); }); it("should parse throw statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"ThrowStatement","argument":{"type":"Literal","value":"Error"}}]}, parser.parse("throw 'Error'"), "Expected 'throw \"Error\"'"); }); describe("parses if statements", function () { it("should parse if statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"IfStatement","test":{"type":"Literal","value":1},"consequent":{"type":"BlockStatement","body":[]},"alternate":null}]}, parser.parse("rly 1\nwow"), "Expected 'if(1) {}'"); }); it("should parse if-else statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"IfStatement","test":{"type":"Literal","value":1},"consequent":{"type":"BlockStatement","body":[]},"alternate":{"type":"BlockStatement","body":[]}}]}, parser.parse("rly 1\nbut\nwow"), "Expected 'if(1) {} else {}'"); }); it("should parse if-elif statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"IfStatement","test":{"type":"Literal","value":1},"consequent":{"type":"BlockStatement","body":[]},"alternate":{"type":"IfStatement","test":{"type":"Literal","value":2},"consequent":{"type":"BlockStatement","body":[]},"alternate":null}}]}, parser.parse("rly 1\nbut rly 2\nwow"), "Expected 'if(1) {} else if (2) {}'"); }); it("should parse if-elif-else statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"IfStatement","test":{"type":"Literal","value":1},"consequent":{"type":"BlockStatement","body":[]},"alternate":{"type":"IfStatement","test":{"type":"Literal","value":2},"consequent":{"type":"BlockStatement","body":[]},"alternate":{"type":"BlockStatement","body":[]}}}]}, parser.parse("rly 1\nbut rly 2\nbut\nwow"), "Expected 'if(1) {} else if (2) {} else {}'"); }); }); it("should parse while statement", function () { assert.deepEqual({"type":"Program","body":[{"type":"WhileStatement","test":{"type":"Literal","value":1},"body":{"type":"BlockStatement","body":[]}}]}, parser.parse("many 1\nwow"), "Expected 'while(1) {}'"); }); describe("should parse for statement", function () { it("should parse for-expr statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"ForStatement","init":null,"test":null,"update":null,"body":{"type":"BlockStatement","body":[]}}]}, parser.parse("much next next\nwow"), "Expected 'for(;;) {}'"); assert.deepEqual({"type":"Program","body":[{"type":"ForStatement","init":{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"i"},"init":null}],"kind":"var"},"test":null,"update":null,"body":{"type":"BlockStatement","body":[]}}]}, parser.parse("much very i next next\nwow"), "Expected 'for(var i;;) {}'"); assert.deepEqual({"type":"Program","body":[{"type":"ForStatement","init":{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"i"},"init":{"type":"Literal","value":0}}],"kind":"var"},"test":null,"update":null,"body":{"type":"BlockStatement","body":[]}}]}, parser.parse("much very i as 0 next next\nwow"), "Expected 'for(var i = 0;;) {}'"); }); it("should parse for-in statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"ForInStatement","left":{"type":"Identifier","name":"i"},"right":{"type":"Literal","value":1},"body":{"type":"BlockStatement","body":[]}}]}, parser.parse("much i in 1\nwow"), "Expected 'for (i in 1) {}"); assert.deepEqual({"type":"Program","body":[{"type":"ForInStatement","left":{"type":"VariableDeclaration","declarations":[{"type":"VariableDeclarator","id":{"type":"Identifier","name":"i"},"init":null}],"kind":"var"},"right":{"type":"Literal","value":1},"body":{"type":"BlockStatement","body":[]}}]}, parser.parse("much very i in 1\nwow"), "Expected 'for (var i in 1) {}"); }); }); describe("parses try statement", function () { it("should parse try-catch statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"TryStatement","block":{"type":"BlockStatement","body":[]},"handler":{"type":"CatchClause","param":{"type":"Identifier","name":"e"},"body":{"type":"BlockStatement","body":[]}},"finalizer":null}]}, parser.parse("try\ncatch e\nwow"), "Expected 'try{} catch(e){}'"); }); it("should parse try-finally statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"TryStatement","block":{"type":"BlockStatement","body":[]},"handler":null,"finalizer":{"type":"BlockStatement","body":[]}}]}, parser.parse("try\nretrieve\nwow"), "Expected 'try{} finally{}'"); }); it("should parse try-catch-finally statements", function () { assert.deepEqual({"type":"Program","body":[{"type":"TryStatement","block":{"type":"BlockStatement","body":[]},"handler":{"type":"CatchClause","param":{"type":"Identifier","name":"e"},"body":{"type":"BlockStatement","body":[]}},"finalizer":{"type":"BlockStatement","body":[]}}]}, parser.parse("try\ncatch e\nretrieve\nwow"), "Expected 'try{}catch(e){}finally{}"); }); }); }); });