A templating language that looks like Lisp and compiles to HTML
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

evaluatorTest.js 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const test = require('tape')
  2. const helpers = require('./helpers')
  3. const AST = require('../src/ast')
  4. const OsloError = require('../src/osloError')
  5. test('applies functions from core library', t => {
  6. t.plan(1)
  7. const tree = helpers.evaluate('(+ 1 2)')
  8. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  9. })
  10. test('applies lambda functions', t => {
  11. t.plan(1)
  12. const tree = helpers.evaluate('((lambda (x y) (+ x y)) 1 2)')
  13. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  14. })
  15. test('define', t => {
  16. t.plan(2)
  17. let tree = helpers.evaluate('(define x 5) (+ x 1)')
  18. t.deepEqual(tree[0], new AST.Number({ value: 6 }))
  19. tree = helpers.evaluate('(define plusOne (lambda (x) (+ x 1))) (plusOne 5)')
  20. t.deepEqual(tree[0], new AST.Number({ value: 6 }))
  21. })
  22. test('conditionals', t => {
  23. t.plan(3)
  24. let tree = helpers.evaluate('(if #t 1 0)')
  25. t.deepEqual(tree[0], new AST.Number({ value: 1, line: 1 }))
  26. tree = helpers.evaluate('(if #f 1 0)')
  27. t.deepEqual(tree[0], new AST.Number({ value: 0, line: 1 }))
  28. tree = helpers.evaluate('(if (= (+ 4 9) (- 20 7)) (+ 10 9) (- 4 2))')
  29. t.deepEqual(tree[0], new AST.Number({ value: 19 }))
  30. })
  31. test('let bindings', t => {
  32. t.plan(1)
  33. const tree = helpers.evaluate('(let ((x 1) (y 2)) (+ x y))')
  34. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  35. })
  36. test('let bindings go out of scope after the let block', t => {
  37. t.plan(1)
  38. const tree = helpers.evaluate('(let ((x 1)) x) x')
  39. t.deepEqual(
  40. tree,
  41. new OsloError({ line: 1, message: "Symbol 'x' is not bound" }),
  42. )
  43. })
  44. test('factorial', t => {
  45. t.plan(1)
  46. const tree = helpers.evaluate(`
  47. (define factorial
  48. (lambda (x)
  49. (if (= x 0)
  50. 1
  51. (* x (factorial (- x 1))))))
  52. (factorial 5)
  53. `)
  54. t.deepEqual(tree[0], new AST.Number({ value: 120 }))
  55. })