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.

coreTest.js 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. const test = require('tape')
  2. const helpers = require('./helpers')
  3. const AST = require('../src/ast')
  4. const OsloError = require('../src/osloError')
  5. test('list function', t => {
  6. t.plan(1)
  7. const tree = helpers.evaluate('(list 1 2 3)')
  8. t.deepEqual(
  9. tree[0],
  10. new AST.List({
  11. elements: [
  12. new AST.Number({ value: 1, line: 1 }),
  13. new AST.Number({ value: 2, line: 1 }),
  14. new AST.Number({ value: 3, line: 1 }),
  15. ],
  16. }),
  17. )
  18. })
  19. test('length function', t => {
  20. t.plan(1)
  21. const tree = helpers.evaluate('(length (list 1 2 3))')
  22. t.deepEqual(tree[0], new AST.Number({ value: 3 }))
  23. })
  24. test('map', t => {
  25. t.plan(1)
  26. const tree = helpers.evaluate(`
  27. (define my-map
  28. (lambda (f xs)
  29. (if (= (length xs) 0)
  30. (list)
  31. (cons
  32. (f (first xs))
  33. (my-map f (rest xs))))))
  34. (my-map (lambda (x) (+ x 1)) (list 1 2 3))
  35. `)
  36. t.deepEqual(
  37. tree[0],
  38. new AST.List({
  39. elements: [
  40. new AST.Number({ value: 2 }),
  41. new AST.Number({ value: 3 }),
  42. new AST.Number({ value: 4 }),
  43. ],
  44. }),
  45. )
  46. })
  47. test('div', t => {
  48. t.plan(1)
  49. const tree = helpers.evaluate('(div :class "hello" "world")')
  50. t.deepEqual(
  51. tree[0],
  52. new AST.HTMLElement({
  53. name: 'div',
  54. attributes: [
  55. new AST.Attribute({
  56. name: 'class',
  57. value: new AST.String({ value: 'hello' }),
  58. })
  59. ],
  60. contents: [ new AST.String({ value: 'world' }) ],
  61. selfClosing: false,
  62. })
  63. )
  64. })
  65. test('nested elements', t => {
  66. t.plan(1)
  67. const tree = helpers.evaluate('(div :class "hello" (div :class "world"))')
  68. t.deepEqual(
  69. tree[0],
  70. new AST.HTMLElement({
  71. name: 'div',
  72. attributes: [
  73. new AST.Attribute({
  74. name: 'class',
  75. value: new AST.String({ value: 'hello' }),
  76. }),
  77. ],
  78. contents: [
  79. new AST.HTMLElement({
  80. name: 'div',
  81. attributes: [
  82. new AST.Attribute({
  83. name: 'class',
  84. value: new AST.String({ value: 'world' }),
  85. })
  86. ],
  87. contents: [],
  88. selfClosing: false,
  89. })
  90. ],
  91. selfClosing: false,
  92. })
  93. )
  94. })
  95. test('self closing tag', t => {
  96. t.plan(1)
  97. const tree = helpers.evaluate('(img)')
  98. t.deepEqual(
  99. tree[0],
  100. new AST.HTMLElement({
  101. name: 'img',
  102. attributes: [],
  103. contents: [],
  104. selfClosing: true,
  105. })
  106. )
  107. })