Add python.2 implementation
[jackhill/mal.git] / python.2 / tests / test_step4.py
1 import unittest
2
3 import step4_if_fn_do
4 from env import Env
5 from mal_types import MalInvalidArgumentException
6 from mal_types import MalList, MalInt, MalFunctionCompiled, MalBoolean
7 from mal_types import MalSymbol
8
9
10 class TestStep4(unittest.TestCase):
11 def test_step4_nil(self):
12 self.assertEqual("nil", step4_if_fn_do.rep("nil"))
13
14 def test_step4_boolean(self):
15 self.assertEqual("true", step4_if_fn_do.rep("true"))
16 self.assertEqual("false", step4_if_fn_do.rep("false"))
17
18 def test_print_function(self):
19 self.assertEqual("#<function>", str(MalFunctionCompiled(lambda x: MalInt(0))))
20
21 def test_if_basic_true(self):
22 env = Env(None)
23 self.assertEqual(
24 4321,
25 step4_if_fn_do.EVAL(
26 MalList(
27 [MalSymbol("if"), MalBoolean(True), MalInt(4321), MalInt(1234)]
28 ),
29 env,
30 ).native(),
31 )
32
33 def test_if_basic_false(self):
34 env = Env(None)
35 self.assertEqual(
36 1234,
37 step4_if_fn_do.EVAL(
38 MalList(
39 [MalSymbol("if"), MalBoolean(False), MalInt(4321), MalInt(1234)]
40 ),
41 env,
42 ).native(),
43 )
44
45 def test_if_basic_false_no_fourth_arg(self):
46 env = Env(None)
47 self.assertEqual(
48 "nil",
49 str(
50 step4_if_fn_do.EVAL(
51 MalList([MalSymbol("if"), MalBoolean(False), MalInt(4321)]), env
52 )
53 ),
54 )
55
56 def test_env_constructor_binds(self):
57 env = Env(outer=None, binds=[MalSymbol("a")], exprs=[MalInt(3)])
58 self.assertEqual(3, env.get("a").native())
59
60 def test_env_constructor_binds_multiple(self):
61 env = Env(
62 outer=None,
63 binds=[MalSymbol("a"), MalSymbol("b")],
64 exprs=[MalInt(44), MalInt(32)],
65 )
66 self.assertEqual(44, env.get("a").native())
67 self.assertEqual(32, env.get("b").native())
68
69 def test_step4_do(self):
70 self.assertEqual("44", step4_if_fn_do.rep("(do 1 2 3 44)"))
71 self.assertEqual("21", step4_if_fn_do.rep("(do 21)"))
72
73 def test_step4_fn(self):
74 self.assertEqual("#<function>", step4_if_fn_do.rep("(fn* (a) 0)"))
75
76 def test_step4_use_fn(self):
77 self.assertEqual("7", step4_if_fn_do.rep("((fn* (a) a) 7)"))
78
79 def test_step4_use_fn_multiple(self):
80 self.assertEqual("8", step4_if_fn_do.rep("((fn* (a b) a) 8 9)"))
81
82 def test_step4_use_fn_multiple_nested(self):
83 self.assertEqual("10", step4_if_fn_do.rep("((fn* (a b) (+ a (+ b 1))) 4 5)"))
84
85 def test_step4_use_fn_func_param(self):
86 self.assertEqual(
87 "8", step4_if_fn_do.rep("((fn* (f x) (f x)) (fn* (a) (+ 1 a)) 7)")
88 )
89
90 def test_step4_prn(self):
91 self.assertEqual("nil", step4_if_fn_do.rep("(prn 4)"))
92
93 def test_step4_list(self):
94 self.assertEqual("(1 2 (3 4) 5)", step4_if_fn_do.rep("(list 1 2 (list 3 4) 5)"))
95
96 def test_step4_listP(self):
97 self.assertEqual("true", step4_if_fn_do.rep("(list? (list 1 2))"))
98 self.assertEqual("false", step4_if_fn_do.rep("(list? 4)"))
99
100 def test_step4_empty(self):
101 self.assertEqual("true", step4_if_fn_do.rep("(empty? (list))"))
102
103 def test_step4_count(self):
104 self.assertEqual("0", step4_if_fn_do.rep("(count (list))"))
105 self.assertEqual("2", step4_if_fn_do.rep("(count (list 1 2))"))
106 self.assertEqual("0", step4_if_fn_do.rep("(count nil)"))
107
108 def test_step4_equal(self):
109 self.assertEqual("true", step4_if_fn_do.rep("(= 0 0)"))
110 self.assertEqual("true", step4_if_fn_do.rep("(= (list 1) (list 1))"))
111 self.assertEqual("false", step4_if_fn_do.rep("(= (list 1) (list 1 2))"))
112 self.assertEqual(
113 "true",
114 step4_if_fn_do.rep("(= (list (list 1) (list 2)) (list (list 1) (list 2)))"),
115 )
116 self.assertEqual("true", step4_if_fn_do.rep("(= nil nil)"))
117
118 def test_step4_less(self):
119 self.assertEqual("true", step4_if_fn_do.rep("(< 1 2)"))
120 self.assertEqual("false", step4_if_fn_do.rep("(< 2 1)"))
121 self.assertEqual("false", step4_if_fn_do.rep("(< 1 1)"))
122 try:
123 step4_if_fn_do.rep("(< 1 nil)")
124 self.fail("Expected exception")
125 except MalInvalidArgumentException:
126 pass
127 try:
128 step4_if_fn_do.rep("(< nil 1)")
129 self.fail("Expected exception")
130 except MalInvalidArgumentException:
131 pass
132
133 def test_step4_less_equal(self):
134 self.assertEqual("true", step4_if_fn_do.rep("(<= 1 2)"))
135 self.assertEqual("false", step4_if_fn_do.rep("(<= 2 1)"))
136 self.assertEqual("true", step4_if_fn_do.rep("(<= 1 1)"))
137 try:
138 step4_if_fn_do.rep("(<= 1 nil)")
139 self.fail("Expected exception")
140 except MalInvalidArgumentException:
141 pass
142 try:
143 step4_if_fn_do.rep("(<= nil 1)")
144 self.fail("Expected exception")
145 except MalInvalidArgumentException:
146 pass
147
148 def test_step4_more(self):
149 self.assertEqual("false", step4_if_fn_do.rep("(> 1 2)"))
150 self.assertEqual("true", step4_if_fn_do.rep("(> 2 1)"))
151 self.assertEqual("false", step4_if_fn_do.rep("(> 1 1)"))
152 try:
153 step4_if_fn_do.rep("(> 1 nil)")
154 self.fail("Expected exception")
155 except MalInvalidArgumentException:
156 pass
157 try:
158 step4_if_fn_do.rep("(> nil 1)")
159 self.fail("Expected exception")
160 except MalInvalidArgumentException:
161 pass
162
163 def test_step4_more_equal(self):
164 self.assertEqual("false", step4_if_fn_do.rep("(>= 1 2)"))
165 self.assertEqual("true", step4_if_fn_do.rep("(>= 2 1)"))
166 self.assertEqual("true", step4_if_fn_do.rep("(>= 1 1)"))
167 try:
168 step4_if_fn_do.rep("(>= 1 nil)")
169 self.fail("Expected exception")
170 except MalInvalidArgumentException:
171 pass
172 try:
173 step4_if_fn_do.rep("(>= nil 1)")
174 self.fail("Expected exception")
175 except MalInvalidArgumentException:
176 pass
177
178 def test_step4_closures(self):
179 self.assertEqual(
180 "12", step4_if_fn_do.rep("(( (fn* (a) (fn* (b) (+ a b))) 5) 7)")
181 )
182 self.assertEqual(
183 "#<function>",
184 step4_if_fn_do.rep("(def! gen-plus5 (fn* () (fn* (b) (+ 5 b))))"),
185 )
186 self.assertEqual(
187 "#<function>",
188 step4_if_fn_do.rep("(def! gen-plus5 (fn* () (fn* (b) (+ 5 b))))"),
189 )
190 self.assertEqual("#<function>", step4_if_fn_do.rep("(def! plus5 (gen-plus5))"))
191 self.assertEqual("12", step4_if_fn_do.rep("(plus5 7)"))
192
193 def test_step4_variadic_a(self):
194 self.assertEqual(
195 "3", step4_if_fn_do.rep("( (fn* (& more) (count more)) 1 2 3)")
196 )
197
198 def test_step4_variadic_b(self):
199 self.assertEqual("0", step4_if_fn_do.rep("((fn* (& more) (count more)))"))
200
201 def test_step4_quoted_string(self):
202 self.assertEqual('"\\""', step4_if_fn_do.rep('"\\""'))
203
204 def test_step4_str(self):
205 self.assertEqual('"(1 a 2 3)"', step4_if_fn_do.rep('(str (list 1 "a" 2 3))'))
206
207 def test_step4_equal_vector_list(self):
208 self.assertEqual("true", step4_if_fn_do.rep("(=[] (list))"))
209
210
211 if __name__ == "__main__":
212 unittest.main()