const test = require('tape') const helpers = require('./helpers') const AST = require('../src/ast') const Evaluator = require('../src/evaluator') const OsloError = require('../src/osloError') test('applies functions from core library', t => { t.plan(1) const tree = helpers.evaluate('(+ 1 2)') t.deepEqual(tree[0], new AST.Number({ value: 3 })) }) test('applies lambda functions', t => { t.plan(1) const tree = helpers.evaluate('((lambda (x y) (+ x y)) 1 2)') t.deepEqual(tree[0], new AST.Number({ value: 3 })) }) test('define', t => { t.plan(2) let tree = helpers.evaluate('(define x 5) (+ x 1)') t.deepEqual(tree[0], new AST.Number({ value: 6 })) tree = helpers.evaluate('(define plusOne (lambda (x) (+ x 1))) (plusOne 5)') t.deepEqual(tree[0], new AST.Number({ value: 6 })) }) test('conditionals', t => { t.plan(3) let tree = helpers.evaluate('(if #t 1 0)') t.deepEqual(tree[0], new AST.Number({ value: 1 })) tree = helpers.evaluate('(if #f 1 0)') t.deepEqual(tree[0], new AST.Number({ value: 0 })) tree = helpers.evaluate('(if (= (+ 4 9) (- 20 7)) (+ 10 9) (- 4 2))') t.deepEqual(tree[0], new AST.Number({ value: 19 })) }) test('let bindings', t => { t.plan(1) const tree = helpers.evaluate('(let ((x 1) (y 2)) (+ x y))') t.deepEqual(tree[0], new AST.Number({ value: 3 })) }) test('let bindings go out of scope after the let block', t => { t.plan(1) const tree = helpers.evaluate('(let ((x 1)) x) x') t.deepEqual(tree, new OsloError({ line: 1, message: 'Symbol \'x\' is not bound' })) })