diff --git a/test.js b/test.js new file mode 100644 index 0000000..f8a2793 --- /dev/null +++ b/test.js @@ -0,0 +1,84 @@ +var superTinyCompiler = require('./super-tiny-compiler'); +var assert = require('assert'); + +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 output = '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: ')' } +]; + +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' + }] + }] + }] +}; + +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(tokenizer(input), tokens, 'Tokeizer should turn `input` string into `tokens` array'); +assert.deepStrictEqual(parser(tokens), ast, 'Parser should turn `tokens` array into `ast`'); +assert.deepStrictEqual(transformer(ast), newAst, 'Transformer should turn `ast` into a `newAst`'); +assert.deepStrictEqual(codeGenerator(newAst), output, 'Code Generator should turn `newAst` into `output` string'); +assert.deepStrictEqual(compiler(input), output, 'Compiler should turn `input` into `output`'); + +console.log('All Passed!'); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 7fcfdda..0000000 --- a/test/test.js +++ /dev/null @@ -1,101 +0,0 @@ -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!');