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.

stdlibTest.js 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. const test = require("tape");
  2. const helpers = require("./helpers");
  3. const AST = require("../src/ast/index");
  4. test("quote", t => {
  5. t.plan(3);
  6. t.deepEqual(helpers.resolve("(quote 5)"), [
  7. new AST.Symbol({
  8. value: new AST.Number({
  9. value: 5
  10. })
  11. })
  12. ]);
  13. t.deepEqual(helpers.resolve('(quote "hello")'), [
  14. new AST.Symbol({
  15. value: new AST.String({
  16. value: "hello"
  17. })
  18. })
  19. ]);
  20. t.deepEqual(helpers.resolve("(quote (list 1 2 3))"), [
  21. new AST.Symbol({
  22. value: new AST.Application({
  23. functionName: new AST.Identifier({ name: "list" }),
  24. args: [
  25. new AST.Number({ value: 1 }),
  26. new AST.Number({ value: 2 }),
  27. new AST.Number({ value: 3 })
  28. ]
  29. })
  30. })
  31. ]);
  32. });
  33. test("list", t => {
  34. t.plan(2);
  35. t.deepEqual(helpers.resolve("(list 1 2 3 4 5)"), [
  36. new AST.List({
  37. elements: [
  38. new AST.Number({ value: 1 }),
  39. new AST.Number({ value: 2 }),
  40. new AST.Number({ value: 3 }),
  41. new AST.Number({ value: 4 }),
  42. new AST.Number({ value: 5 })
  43. ]
  44. })
  45. ]);
  46. t.deepEqual(helpers.resolve("(list (list 1 2) (list 3 4))"), [
  47. new AST.List({
  48. elements: [
  49. new AST.List({
  50. elements: [new AST.Number({ value: 1 }), new AST.Number({ value: 2 })]
  51. }),
  52. new AST.List({
  53. elements: [new AST.Number({ value: 3 }), new AST.Number({ value: 4 })]
  54. })
  55. ]
  56. })
  57. ]);
  58. });
  59. test("if", t => {
  60. t.plan(3);
  61. t.deepEqual(helpers.resolve("(if #t 1 0)"), [new AST.Number({ value: 1 })]);
  62. t.deepEqual(helpers.resolve("(if #f 1 0)"), [new AST.Number({ value: 0 })]);
  63. t.deepEqual(helpers.resolve("(if (if #t #t #f) 1 0)"), [
  64. new AST.Number({ value: 1 })
  65. ]);
  66. });
  67. test("=", t => {
  68. t.plan(6);
  69. t.equal(helpers.resolve("(= 5 5)")[0].value, true);
  70. t.equal(helpers.resolve("(= 5 6)")[0].value, false);
  71. t.equal(helpers.resolve('(= "hello" "hello")')[0].value, true);
  72. t.equal(helpers.resolve('(= "hello" "world")')[0].value, false);
  73. t.equal(
  74. helpers.resolve("(= (list #t #t #t) (list (> 5 4) (< 3 7) (= 9 9)))")[0]
  75. .value,
  76. true
  77. );
  78. t.equal(
  79. helpers.resolve("(= (list #t #t #t) (list (> 5 4) (< 3 7) (= 9 10)))")[0]
  80. .value,
  81. false
  82. );
  83. });
  84. test(">", t => {
  85. t.plan(2);
  86. t.deepEqual(helpers.resolve("(> 5 4)"), [new AST.Boolean({ value: true })]);
  87. t.deepEqual(helpers.resolve("(> 4 5)"), [new AST.Boolean({ value: false })]);
  88. });
  89. test("<", t => {
  90. t.plan(2);
  91. t.deepEqual(helpers.resolve("(< 5 4)"), [new AST.Boolean({ value: false })]);
  92. t.deepEqual(helpers.resolve("(< 4 5)"), [new AST.Boolean({ value: true })]);
  93. });
  94. test(">=", t => {
  95. t.plan(3);
  96. t.deepEqual(helpers.resolve("(>= 5 5)"), [new AST.Boolean({ value: true })]);
  97. t.deepEqual(helpers.resolve("(>= 6 5)"), [new AST.Boolean({ value: true })]);
  98. t.deepEqual(helpers.resolve("(>= 5 6)"), [new AST.Boolean({ value: false })]);
  99. });
  100. test("<=", t => {
  101. t.plan(3);
  102. t.deepEqual(helpers.resolve("(<= 5 5)"), [new AST.Boolean({ value: true })]);
  103. t.deepEqual(helpers.resolve("(<= 5 6)"), [new AST.Boolean({ value: true })]);
  104. t.deepEqual(helpers.resolve("(<= 6 5)"), [new AST.Boolean({ value: false })]);
  105. });
  106. test("and", t => {
  107. t.plan(2);
  108. t.equal(helpers.resolve("(and #t #t #t)")[0].value, true);
  109. t.equal(helpers.resolve("(and #t #t #f)")[0].value, false);
  110. });
  111. test("or", t => {
  112. t.plan(2);
  113. t.equal(helpers.resolve("(or #f #f #f)")[0].value, false);
  114. t.equal(helpers.resolve("(or #t #f #f)")[0].value, true);
  115. });