const test = require("tape"); const helpers = require("./helpers"); const AST = require("../src/ast/index"); test("quote", t => { t.plan(3); t.deepEqual(helpers.resolve("(quote 5)"), [ new AST.Symbol({ value: new AST.Number({ value: 5 }) }) ]); t.deepEqual(helpers.resolve('(quote "hello")'), [ new AST.Symbol({ value: new AST.String({ value: "hello" }) }) ]); t.deepEqual(helpers.resolve("(quote (list 1 2 3))"), [ new AST.Symbol({ value: new AST.Application({ functionName: new AST.Identifier({ name: "list" }), args: [ new AST.Number({ value: 1 }), new AST.Number({ value: 2 }), new AST.Number({ value: 3 }) ] }) }) ]); }); test("list", t => { t.plan(2); t.deepEqual(helpers.resolve("(list 1 2 3 4 5)"), [ new AST.List({ elements: [ new AST.Number({ value: 1 }), new AST.Number({ value: 2 }), new AST.Number({ value: 3 }), new AST.Number({ value: 4 }), new AST.Number({ value: 5 }) ] }) ]); t.deepEqual(helpers.resolve("(list (list 1 2) (list 3 4))"), [ new AST.List({ elements: [ new AST.List({ elements: [new AST.Number({ value: 1 }), new AST.Number({ value: 2 })] }), new AST.List({ elements: [new AST.Number({ value: 3 }), new AST.Number({ value: 4 })] }) ] }) ]); }); test("if", t => { t.plan(3); t.deepEqual(helpers.resolve("(if #t 1 0)"), [new AST.Number({ value: 1 })]); t.deepEqual(helpers.resolve("(if #f 1 0)"), [new AST.Number({ value: 0 })]); t.deepEqual(helpers.resolve("(if (if #t #t #f) 1 0)"), [ new AST.Number({ value: 1 }) ]); }); test("=", t => { t.plan(6); t.equal(helpers.resolve("(= 5 5)")[0].value, true); t.equal(helpers.resolve("(= 5 6)")[0].value, false); t.equal(helpers.resolve('(= "hello" "hello")')[0].value, true); t.equal(helpers.resolve('(= "hello" "world")')[0].value, false); t.equal( helpers.resolve("(= (list #t #t #t) (list (> 5 4) (< 3 7) (= 9 9)))")[0] .value, true ); t.equal( helpers.resolve("(= (list #t #t #t) (list (> 5 4) (< 3 7) (= 9 10)))")[0] .value, false ); }); test(">", t => { t.plan(2); t.deepEqual(helpers.resolve("(> 5 4)"), [new AST.Boolean({ value: true })]); t.deepEqual(helpers.resolve("(> 4 5)"), [new AST.Boolean({ value: false })]); }); test("<", t => { t.plan(2); t.deepEqual(helpers.resolve("(< 5 4)"), [new AST.Boolean({ value: false })]); t.deepEqual(helpers.resolve("(< 4 5)"), [new AST.Boolean({ value: true })]); }); test(">=", t => { t.plan(3); t.deepEqual(helpers.resolve("(>= 5 5)"), [new AST.Boolean({ value: true })]); t.deepEqual(helpers.resolve("(>= 6 5)"), [new AST.Boolean({ value: true })]); t.deepEqual(helpers.resolve("(>= 5 6)"), [new AST.Boolean({ value: false })]); }); test("<=", t => { t.plan(3); t.deepEqual(helpers.resolve("(<= 5 5)"), [new AST.Boolean({ value: true })]); t.deepEqual(helpers.resolve("(<= 5 6)"), [new AST.Boolean({ value: true })]); t.deepEqual(helpers.resolve("(<= 6 5)"), [new AST.Boolean({ value: false })]); }); test("and", t => { t.plan(2); t.equal(helpers.resolve("(and #t #t #t)")[0].value, true); t.equal(helpers.resolve("(and #t #t #f)")[0].value, false); }); test("or", t => { t.plan(2); t.equal(helpers.resolve("(or #f #f #f)")[0].value, false); t.equal(helpers.resolve("(or #t #f #f)")[0].value, true); });