33from forth import evaluate , StackUnderflowError
44
55
6- # Tests adapted from `problem-specifications//canonical-data.json` @ v1.2 .0
6+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.4 .0
77# Tests for case-insensitivity are track-specific
88
99class ForthParsingTest (unittest .TestCase ):
10- def test_empty_input_empty_stack (self ):
11- input_data = []
12- expected = []
13- self .assertEqual (evaluate (input_data ), expected )
14-
15- def test_empty_line_empty_stack (self ):
16- input_data = ["" ]
17- expected = []
18- self .assertEqual (evaluate (input_data ), expected )
19-
2010 def test_numbers_just_get_pushed_to_stack (self ):
2111 input_data = ["1 2 3 4 5" ]
2212 expected = [1 , 2 , 3 , 4 , 5 ]
@@ -154,13 +144,13 @@ def test_multiplication_and_division(self):
154144
155145
156146class ForthDupTest (unittest .TestCase ):
157- def test_copies_the_top_value_on_the_stack (self ):
158- input_data = ["1 DUP " ]
147+ def test_copies_a_value_on_the_stack (self ):
148+ input_data = ["1 dup " ]
159149 expected = [1 , 1 ]
160150 self .assertEqual (evaluate (input_data ), expected )
161151
162- def test_is_case_insensitive (self ):
163- input_data = ["1 2 Dup " ]
152+ def test_copies_the_top_value_on_the_stack (self ):
153+ input_data = ["1 2 dup " ]
164154 expected = [1 , 2 , 2 ]
165155 self .assertEqual (evaluate (input_data ), expected )
166156
@@ -191,11 +181,6 @@ def test_removes_the_top_value_on_the_stack_if_it_not_the_only_one(self):
191181 expected = [3 ]
192182 self .assertEqual (evaluate (input_data ), expected )
193183
194- def test_is_case_insensitive (self ):
195- input_data = ["1 2 Drop" ]
196- expected = [1 ]
197- self .assertEqual (evaluate (input_data ), expected )
198-
199184 def test_errors_if_there_is_nothing_on_the_stack (self ):
200185 input_data = ["drop" ]
201186 with self .assertRaisesWithMessage (StackUnderflowError ):
@@ -223,11 +208,6 @@ def test_swaps_two_two_values_on_stack(self):
223208 expected = [1 , 3 , 2 ]
224209 self .assertEqual (evaluate (input_data ), expected )
225210
226- def test_is_case_insensitive (self ):
227- input_data = ["3 4 Swap" ]
228- expected = [4 , 3 ]
229- self .assertEqual (evaluate (input_data ), expected )
230-
231211 def test_errors_if_there_is_nothing_on_the_stack (self ):
232212 input_data = ["swap" ]
233213 with self .assertRaisesWithMessage (StackUnderflowError ):
@@ -260,11 +240,6 @@ def test_copies_the_second_element_if_there_are_more_than_two(self):
260240 expected = [1 , 2 , 3 , 2 ]
261241 self .assertEqual (evaluate (input_data ), expected )
262242
263- def test_is_case_insensitive (self ):
264- input_data = ["3 4 Over" ]
265- expected = [3 , 4 , 3 ]
266- self .assertEqual (evaluate (input_data ), expected )
267-
268243 def test_errors_if_there_is_nothing_on_the_stack (self ):
269244 input_data = ["over" ]
270245 with self .assertRaisesWithMessage (StackUnderflowError ):
@@ -328,14 +303,6 @@ def test_can_override_built_in_operators(self):
328303 expected = [12 ]
329304 self .assertEqual (evaluate (input_data ), expected )
330305
331- def test_is_case_insensitive (self ):
332- input_data = [
333- ": foo dup ;" ,
334- "1 FOO"
335- ]
336- expected = [1 , 1 ]
337- self .assertEqual (evaluate (input_data ), expected )
338-
339306 def test_cannot_redefine_numbers (self ):
340307 input_data = [": 1 2 ;" ]
341308 with self .assertRaisesWithMessage (ValueError ):
@@ -357,5 +324,43 @@ def assertRaisesWithMessage(self, exception):
357324 return self .assertRaisesRegex (exception , r".+" )
358325
359326
327+ class ForthCaseInsensitivityTest (unittest .TestCase ):
328+ def test_dup_is_case_insensitive (self ):
329+ input_data = ["1 DUP Dup dup" ]
330+ expected = [1 , 1 , 1 , 1 ]
331+ self .assertEqual (evaluate (input_data ), expected )
332+
333+ def test_drop_is_case_insensitive (self ):
334+ input_data = ["1 2 3 4 DROP Drop drop" ]
335+ expected = [1 ]
336+ self .assertEqual (evaluate (input_data ), expected )
337+
338+ def test_swap_is_case_insensitive (self ):
339+ input_data = ["1 2 SWAP 3 Swap 4 swap" ]
340+ expected = [2 , 3 , 4 , 1 ]
341+ self .assertEqual (evaluate (input_data ), expected )
342+
343+ def test_over_is_case_insensitive (self ):
344+ input_data = ["1 2 OVER Over over" ]
345+ expected = [1 , 2 , 1 , 2 , 1 ]
346+ self .assertEqual (evaluate (input_data ), expected )
347+
348+ def test_user_defined_words_are_case_insensitive (self ):
349+ input_data = [
350+ ": foo dup ;" ,
351+ "1 FOO Foo foo"
352+ ]
353+ expected = [1 , 1 , 1 , 1 ]
354+ self .assertEqual (evaluate (input_data ), expected )
355+
356+ def test_definitions_are_case_insensitive (self ):
357+ input_data = [
358+ ": SWAP DUP Dup dup ;" ,
359+ "1 swap"
360+ ]
361+ expected = [1 , 1 , 1 , 1 ]
362+ self .assertEqual (evaluate (input_data ), expected )
363+
364+
360365if __name__ == '__main__' :
361366 unittest .main ()
0 commit comments