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.

lexerTest.js 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. const test = require('tape')
  2. const helpers = require('./helpers')
  3. const tt = require('../src/tokenTypes')
  4. test('lexes simple template correctly', t => {
  5. t.plan(4)
  6. let tokens = helpers.scan(
  7. '(div :class "foobar" (p "Lorem ipsum dolor sit amet"))',
  8. ).tokens
  9. t.deepEqual(tokens.map(token => token.type), [
  10. tt.OPAREN,
  11. tt.IDENTIFIER,
  12. tt.ATTRIBUTE,
  13. tt.QUOTE,
  14. tt.LITERAL,
  15. tt.QUOTE,
  16. tt.OPAREN,
  17. tt.IDENTIFIER,
  18. tt.QUOTE,
  19. tt.LITERAL,
  20. tt.QUOTE,
  21. tt.CPAREN,
  22. tt.CPAREN,
  23. tt.EOF,
  24. ])
  25. t.equal(tokens[1].value, 'div')
  26. t.equal(tokens[2].value, 'class')
  27. t.equal(tokens[9].value, 'Lorem ipsum dolor sit amet')
  28. })
  29. test('keeps track of line numbers', t => {
  30. t.plan(2)
  31. let tokens = helpers.scan(`(
  32. (div :class "foobar"
  33. (p :class "bazquux"))
  34. `).tokens
  35. t.equal(tokens[2].line, 2)
  36. t.equal(tokens[7].line, 3)
  37. })
  38. test('multiple identifiers in a row are kept separate', t => {
  39. t.plan(2)
  40. let tokens = helpers.scan(`(test test test)`).tokens
  41. t.deepEqual(tokens.map(token => token.type), [
  42. tt.OPAREN,
  43. tt.IDENTIFIER,
  44. tt.IDENTIFIER,
  45. tt.IDENTIFIER,
  46. tt.CPAREN,
  47. tt.EOF,
  48. ])
  49. tokens = helpers.scan(`(test "test" test test)`).tokens
  50. t.deepEqual(tokens.map(token => token.type), [
  51. tt.OPAREN,
  52. tt.IDENTIFIER,
  53. tt.QUOTE,
  54. tt.LITERAL,
  55. tt.QUOTE,
  56. tt.IDENTIFIER,
  57. tt.IDENTIFIER,
  58. tt.CPAREN,
  59. tt.EOF,
  60. ])
  61. })
  62. test('allow special characters inside quotes', t => {
  63. t.plan(2)
  64. let tokens = helpers.scan(`
  65. (p "(test)")
  66. `).tokens
  67. t.deepEqual(tokens.map(token => token.type), [
  68. tt.OPAREN,
  69. tt.IDENTIFIER,
  70. tt.QUOTE,
  71. tt.LITERAL,
  72. tt.QUOTE,
  73. tt.CPAREN,
  74. tt.EOF,
  75. ])
  76. t.equal(tokens[3].value, '(test)')
  77. })
  78. test('lex numbers', t => {
  79. t.plan(2)
  80. let tokens = helpers.scan('1 2 3 4 5').tokens
  81. t.deepEqual(tokens.map(token => token.type), [
  82. tt.NUMBER,
  83. tt.NUMBER,
  84. tt.NUMBER,
  85. tt.NUMBER,
  86. tt.NUMBER,
  87. tt.EOF,
  88. ])
  89. t.deepEqual(tokens.map(token => token.value), [
  90. 1,
  91. 2,
  92. 3,
  93. 4,
  94. 5,
  95. undefined, // undefined is for the EOF
  96. ])
  97. })
  98. test('lex booleans', t => {
  99. t.plan(2)
  100. let tokens = helpers.scan('#t #f').tokens
  101. t.deepEqual(tokens.map(token => token.type), [tt.BOOLEAN, tt.BOOLEAN, tt.EOF])
  102. t.deepEqual(tokens.map(token => token.value), [
  103. true,
  104. false,
  105. undefined, // undefined is for the EOF
  106. ])
  107. })