const test = require('tape') const helpers = require('./helpers') const AST = require('../src/ast') const tt = require('../src/tokenTypes') test('parses token stream into a tree', t => { t.plan(1) const tree = helpers.parse(` (div :class "foobar" (p :class (if #t "primary" "secondary"))) `) t.deepEqual(tree, [ new AST.Application({ function: new AST.Identifier({name: 'div', line: 2 }), args: [ new AST.Attribute({ name: 'class', value: new AST.String({ value: 'foobar' }), }), new AST.Application({ function: new AST.Identifier({ name: 'p', line: 3 }), args: [ new AST.Attribute({ name: 'class', value: new AST.Conditional({ condition: new AST.Boolean({ value: true }), ifCase: new AST.String({ value: 'primary' }), elseCase: new AST.String({ value: 'secondary' }), }), }), ], }), ], }), ]) }) test('allow empty strings', t => { t.plan(1) const tree = helpers.parse('(p "")') t.deepEqual(tree, [ new AST.Application({ function: new AST.Identifier({ name: 'p', line: 1 }), args: [new AST.String({ value: '' })], }), ]) }) test('parse lambdas and expressions in function position', t => { t.plan(1) const tree = helpers.parse('((lambda (n) (+ n 1)) 5)') t.deepEqual(tree, [ new AST.Application({ function: new AST.Lambda({ parameters: [new AST.Identifier({ name: 'n' })], body: new AST.Application({ function: new AST.Identifier({ name: '+', line: 1 }), args: [ new AST.Identifier({ name: 'n', line: 1 }), new AST.Number({ value: 1 }), ], }), }), args: [new AST.Number({ value: 5 })], }), ]) }) test('parse conditionals', t => { t.plan(1) const tree = helpers.parse('(if #t (do this) (do that))') t.deepEqual(tree, [ new AST.Conditional({ condition: new AST.Boolean({ value: true }), ifCase: new AST.Application({ function: new AST.Identifier({ line: 1, name: 'do' }), args: [new AST.Identifier({ line: 1, name: 'this' })], }), elseCase: new AST.Application({ function: new AST.Identifier({ line: 1, name: 'do' }), args: [new AST.Identifier({ line: 1, name: 'that' })], }), }), ]) })