1(use judge)
2(use ../lox/interpreter)
3
4(test (evaluate [:literal false]) false)
5(test (evaluate [:unary {:token [:minus]} [:literal 1]]) -1)
6(test (evaluate [:unary {:token [:bang]} [:literal false]]) true)
7(test (evaluate [:unary {:token [:bang]} [:literal 1]]) false)
8
9(def add [:binary [:literal 1] {:token [:plus]} [:literal 2]])
10(def concat [:binary [:literal "1"] {:token [:plus]} [:literal "2"]])
11(test (evaluate add) 3)
12(test (evaluate [:binary add {:token [:plus]} [:literal 2]]) 5)
13(test (evaluate concat) "12")
14(test (evaluate [:binary [:literal 1] {:token [:minus]} [:literal 2]]) -1)
15
16(test-error (evaluate [:unary {:token [:minus]} [:literal ""]])
17 "Operand must be number")
18(test-error (evaluate [:binary [:literal 1] {:token [:plus]} [:literal "2"]])
19 "Operands must be two numbers or two strings")
20(test-error (evaluate [:binary [:literal "1"] {:token [:plus]} [:literal 2]])
21 "Operands must be two numbers or two strings")
22(test-error (evaluate [:binary [:literal true] {:token [:plus]} [:literal true]])
23 "Operands must be two numbers or two strings")
24(test-error (evaluate [:binary [:literal ""] {:token [:minus]} [:literal 2]])
25 "Operands must be numbers")
26(test-error (evaluate [:binary [:literal 1] {:token [:minus]} [:literal ""]])
27 "Operands must be numbers")
28(test-error (evaluate [:binary [:literal 1] {:token [:pow]} [:literal 2]])
29 "Unknown operator :pow")
30
31(test (evaluate [:binary [:literal 1] {:token [:greater]} [:literal 2]]) false)
32(test (evaluate [:binary [:literal 2] {:token [:greater-eq]} [:literal 2]]) true)
33(test (evaluate [:binary [:literal "12"] {:token [:eq-eq]} concat]) true)
34(test (evaluate [:binary [:literal 1] {:token [:eq-eq]} [:literal 1]]) true)
35(test (evaluate [:binary [:literal 1] {:token [:eq-eq]} [:literal 2]]) false)
36(test (evaluate [:binary [:literal 1] {:token [:eq-eq]} [:literal "1"]]) false)
37
38(def nan [:binary [:literal 0] {:token [:slash]} [:literal 0]])
39(test (evaluate [:binary nan {:token [:eq-eq]} nan]) false)
40(test (evaluate [:binary [:literal 1] {:token [:bang-eq]} [:literal 1]]) false)
41(test (evaluate [:binary [:literal 1] {:token [:bang-eq]} [:literal 2]]) true)
42(test (evaluate [:logical [:literal false] {:token [:and]} [:literal true]]) false)
43(test (evaluate [:logical [:literal false] {:token [:or]} [:literal true]]) true)
44(test (evaluate [:logical [:literal false] {:token [:or]} [:literal false]]) false)
45
46(test-stdout (execute [:print [:literal nil]]) `
47 nil
48`)
49(test-stdout (execute [:print [:literal true]]) `
50 true
51`)
52(test-stdout (execute [:print [:literal 1]]) `
53 1
54`)
55(test-stdout (execute [:print [:literal 1.1]]) `
56 1.1
57`)
58(test-stdout (execute [:print [:literal "one"]]) `
59 one
60`)
61(test-stdout (execute [:if [:literal true] [:print [:literal 1]] nil]) `
62 1
63`)
64(test-stdout (execute [:if [:literal true] [:print [:literal 1]] [:print [:literal 2]]]) `
65 1
66`)
67# TODO judge fails on empty stdout
68# (test-stdout (execute [:if [:literal false] [:print [:literal 1]] nil]) "")
69(test-stdout (execute [:if [:literal false] [:print [:literal 1]] [:print [:literal 2]]]) `
70 2
71`)