Skip to content

Commit e09fee4

Browse files
mrcfpscmccandless
authored andcommitted
forth: Fix exercism#1135, update test to v1.4.0 (exercism#1175)
* forth: Fix exercism#1135, update test to v1.4.0 * forth: improve example to pass test v1.4.0
1 parent f6ae46b commit e09fee4

2 files changed

Lines changed: 44 additions & 39 deletions

File tree

exercises/forth/example.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def evaluate(input_data):
1818
values = input_data.pop(0).split()
1919
values.pop()
2020
values.pop(0)
21-
key = values.pop(0)
21+
key = values.pop(0).lower()
2222
if is_integer(key):
2323
raise ValueError("Integers cannot be redefined")
2424
defines[key] = values

exercises/forth/forth_test.py

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,10 @@
33
from 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

99
class 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

156146
class 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+
360365
if __name__ == '__main__':
361366
unittest.main()

0 commit comments

Comments
 (0)