diff --git a/README.md b/README.md index 85f11c4..3389501 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,10 @@ inline annotations. If you want to come back when that's done, you can either watch/star this repo or follow me on [twitter](https://twitter.com/thejameskyle) for updates. +### Tests + +Run with `node ./test/test.js` + --- [![cc-by-4.0](https://licensebuttons.net/l/by/4.0/80x15.png)](http://creativecommons.org/licenses/by/4.0/) diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..7fcfdda --- /dev/null +++ b/test/test.js @@ -0,0 +1,101 @@ +var assert = require('assert'); +var superTinyCompiler = require('../super-tiny-compiler'); + +var tokenizer = superTinyCompiler.tokenizer; +var parser = superTinyCompiler.parser; +var transformer = superTinyCompiler.transformer; +var codeGenerator = superTinyCompiler.codeGenerator; +var compiler = superTinyCompiler.compiler; + +var input = '(add 2 (subtract 4 2))'; + +var tokens = [ + { type: 'paren', value: '(' }, + { type: 'name', value: 'add' }, + { type: 'number', value: '2' }, + { type: 'paren', value: '(' }, + { type: 'name', value: 'subtract' }, + { type: 'number', value: '4' }, + { type: 'number', value: '2' }, + { type: 'paren', value: ')' }, + { type: 'paren', value: ')' } +]; + +//test tokenizer +assert.deepStrictEqual(tokenizer(input), tokens); + +var ast = { + type: 'Program', + body: [{ + type: 'CallExpression', + name: 'add', + params: [{ + type: 'NumberLiteral', + value: '2' + }, { + type: 'CallExpression', + name: 'subtract', + params: [{ + type: 'NumberLiteral', + value: '4' + }, { + type: 'NumberLiteral', + value: '2' + }] + }] + }] +}; + +// test parser/ast +assert.deepStrictEqual(parser(tokens), ast); + +var newAst = { + "type": "Program", + "body": [ + { + "type": "ExpressionStatement", + "expression": { + "type": "CallExpression", + "callee": { + "type": "Identifier", + "name": "add" + }, + "arguments": [ + { + "type": "NumberLiteral", + "value": "2" + }, + { + "type": "CallExpression", + "callee": { + "type": "Identifier", + "name": "subtract" + }, + "arguments": [ + { + "type": "NumberLiteral", + "value": "4" + }, + { + "type": "NumberLiteral", + "value": "2" + } + ] + } + ] + } + } + ] +}; + +assert.deepStrictEqual(transformer(ast), newAst); + +var output = 'add(2, subtract(4, 2));'; + +// test generator +assert.deepStrictEqual(codeGenerator(newAst), output); + +// test whole compiler +assert.deepStrictEqual(compiler(input), output); + +console.log('All Passed!');