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.

parserTest.js 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. const test = require('tape')
  2. const helpers = require('./helpers')
  3. const AST = require('../src/ast')
  4. const tt = require('../src/tokenTypes')
  5. test('parses token stream into a tree', t => {
  6. t.plan(1)
  7. const tree = helpers.parse(`
  8. (div :class "foobar"
  9. (p :class (if #t "primary" "secondary")))
  10. `)
  11. t.deepEqual(tree, [
  12. new AST.Application({
  13. function: new AST.Identifier({name: 'div', line: 2 }),
  14. args: [
  15. new AST.Attribute({
  16. name: 'class',
  17. value: new AST.String({ value: 'foobar' }),
  18. }),
  19. new AST.Application({
  20. function: new AST.Identifier({ name: 'p', line: 3 }),
  21. args: [
  22. new AST.Attribute({
  23. name: 'class',
  24. value: new AST.Conditional({
  25. condition: new AST.Boolean({ value: true }),
  26. ifCase: new AST.String({ value: 'primary' }),
  27. elseCase: new AST.String({ value: 'secondary' }),
  28. }),
  29. }),
  30. ],
  31. }),
  32. ],
  33. }),
  34. ])
  35. })
  36. test('allow empty strings', t => {
  37. t.plan(1)
  38. const tree = helpers.parse('(p "")')
  39. t.deepEqual(tree, [
  40. new AST.Application({
  41. function: new AST.Identifier({ name: 'p', line: 1 }),
  42. args: [new AST.String({ value: '' })],
  43. }),
  44. ])
  45. })
  46. test('parse lambdas and expressions in function position', t => {
  47. t.plan(1)
  48. const tree = helpers.parse('((lambda (n) (+ n 1)) 5)')
  49. t.deepEqual(tree, [
  50. new AST.Application({
  51. function: new AST.Lambda({
  52. parameters: [new AST.Identifier({ name: 'n' })],
  53. body: new AST.Application({
  54. function: new AST.Identifier({ name: '+', line: 1 }),
  55. args: [
  56. new AST.Identifier({ name: 'n', line: 1 }),
  57. new AST.Number({ value: 1 }),
  58. ],
  59. }),
  60. }),
  61. args: [new AST.Number({ value: 5 })],
  62. }),
  63. ])
  64. })
  65. test('parse conditionals', t => {
  66. t.plan(1)
  67. const tree = helpers.parse('(if #t (do this) (do that))')
  68. t.deepEqual(tree, [
  69. new AST.Conditional({
  70. condition: new AST.Boolean({ value: true }),
  71. ifCase: new AST.Application({
  72. function: new AST.Identifier({ line: 1, name: 'do' }),
  73. args: [new AST.Identifier({ line: 1, name: 'this' })],
  74. }),
  75. elseCase: new AST.Application({
  76. function: new AST.Identifier({ line: 1, name: 'do' }),
  77. args: [new AST.Identifier({ line: 1, name: 'that' })],
  78. }),
  79. }),
  80. ])
  81. })