const test = require('tape') const Lexer = require('../src/lexer') const Node = require('../src/node') const Parser = require('../src/parser') const tt = require('../src/tokenTypes') test('parses token stream into a tree', t => { t.plan(1) const lexer = new Lexer() let tokenStream = lexer.scan(` (div :class "foobar" (p :class "bazquux")) `) let parser = new Parser(tokenStream) let tree = parser.parse() t.deepEqual(tree, [ new Node({ type: 'functionCall', functionName: 'div', args: [ new Node({ attributeName: 'class', attributeValue: new Node({ type: 'string', content: 'foobar' }), }), ], subtree: [ new Node({ type: 'functionCall', functionName: 'p', args: [ new Node({ attributeName: 'class', attributeValue: new Node({ type: 'string', content: 'bazquux' }), }), ], subtree: [], }), ], }), ]) }) test('missing close paren returns an error', function(t) { t.plan(2) const lexer = new Lexer() let tokenStream = lexer.scan(` (div :class "foobar" `) let parser = new Parser(tokenStream) let tree = parser.parse() t.equal(tree.error.constructor.name, 'Error') t.deepEqual(tree.error, { file: undefined, line: 3, message: 'Encountered an unexpected EOF while looking for a ).', }) }) test('unexpected attribute return an error', function(t) { t.plan(2) const lexer = new Lexer() let tokenStream = lexer.scan(` (div :class :id) `) let parser = new Parser(tokenStream) let tree = parser.parse() t.equal(tree.error.constructor.name, 'Error') t.deepEqual(tree.error, { file: undefined, line: 2, message: 'Encountered an unexpected attribute while looking for a string or identifier.', }) })