1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- const test = require('tape')
- const helpers = require('./helpers')
-
- const AST = require('../src/ast')
- 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, line: 1 }))
-
- tree = helpers.evaluate('(if #f 1 0)')
- t.deepEqual(tree[0], new AST.Number({ value: 0, line: 1 }))
-
- 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" }),
- )
- })
-
- test('factorial', t => {
- t.plan(1)
-
- const tree = helpers.evaluate(`
- (define factorial
- (lambda (x)
- (if (= x 0)
- 1
- (* x (factorial (- x 1))))))
- (factorial 5)
-
- `)
- t.deepEqual(tree[0], new AST.Number({ value: 120 }))
- })
|