Skip to content

Commit c26ce50

Browse files
author
Nathan Parsons
authored
forth: Fix errors in tests (exercism#1063)
* forth: Fix errors in tests * forth: Add empty line test * forth: Update example to work with new tests
1 parent 636909b commit c26ce50

File tree

2 files changed

+46
-27
lines changed

2 files changed

+46
-27
lines changed

exercises/forth/example.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ def is_integer(string):
1111

1212

1313
def evaluate(input_data):
14+
if not input_data:
15+
return []
1416
defines = {}
15-
while input_data[0][0] == ':':
17+
while input_data[0][:1] == ':':
1618
values = input_data.pop(0).split()
1719
values.pop()
1820
values.pop(0)

exercises/forth/forth_test.py

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,30 @@
44

55

66
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0
7+
# Tests for case-insensitivity are track-specific
8+
9+
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+
20+
def test_numbers_just_get_pushed_to_stack(self):
21+
input_data = ["1 2 3 4 5"]
22+
expected = [1, 2, 3, 4, 5]
23+
self.assertEqual(evaluate(input_data), expected)
724

825

926
class ForthAdditionTest(unittest.TestCase):
1027
def test_can_add_two_numbers(self):
1128
input_data = ["1 2 +"]
1229
expected = [3]
13-
self.assertEqual(expected, evaluate(input_data))
30+
self.assertEqual(evaluate(input_data), expected)
1431

1532
def test_errors_if_there_is_nothing_on_the_stack(self):
1633
input_data = ["+"]
@@ -27,7 +44,7 @@ class ForthSubtractionTest(unittest.TestCase):
2744
def test_can_subtract_two_numbers(self):
2845
input_data = ["3 4 -"]
2946
expected = [-1]
30-
self.assertEqual(expected, evaluate(input_data))
47+
self.assertEqual(evaluate(input_data), expected)
3148

3249
def test_errors_if_there_is_nothing_on_the_stack(self):
3350
input_data = ["-"]
@@ -44,7 +61,7 @@ class ForthMultiplicationTest(unittest.TestCase):
4461
def test_can_multiply_two_numbers(self):
4562
input_data = ["2 4 *"]
4663
expected = [8]
47-
self.assertEqual(expected, evaluate(input_data))
64+
self.assertEqual(evaluate(input_data), expected)
4865

4966
def test_errors_if_there_is_nothing_on_the_stack(self):
5067
input_data = ["*"]
@@ -59,14 +76,14 @@ def test_errors_if_there_is_only_one_value_on_the_stack(self):
5976

6077
class ForthDivisionTest(unittest.TestCase):
6178
def test_can_divide_two_numbers(self):
62-
input_data = ["3 4 -"]
63-
expected = [-1]
64-
self.assertEqual(expected, evaluate(input_data))
79+
input_data = ["12 3 /"]
80+
expected = [4]
81+
self.assertEqual(evaluate(input_data), expected)
6582

6683
def test_performs_integer_division(self):
6784
input_data = ["8 3 /"]
6885
expected = [2]
69-
self.assertEqual(expected, evaluate(input_data))
86+
self.assertEqual(evaluate(input_data), expected)
7087

7188
def test_errors_if_dividing_by_zero(self):
7289
input_data = ["4 0 /"]
@@ -88,24 +105,24 @@ class ForthCombinedArithmeticTest(unittest.TestCase):
88105
def test_addition_and_subtraction(self):
89106
input_data = ["1 2 + 4 -"]
90107
expected = [-1]
91-
self.assertEqual(expected, evaluate(input_data))
108+
self.assertEqual(evaluate(input_data), expected)
92109

93110
def test_multiplication_and_division(self):
94111
input_data = ["2 4 * 3 /"]
95112
expected = [2]
96-
self.assertEqual(expected, evaluate(input_data))
113+
self.assertEqual(evaluate(input_data), expected)
97114

98115

99116
class ForthDupTest(unittest.TestCase):
100117
def test_copies_the_top_value_on_the_stack(self):
101118
input_data = ["1 DUP"]
102119
expected = [1, 1]
103-
self.assertEqual(expected, evaluate(input_data))
120+
self.assertEqual(evaluate(input_data), expected)
104121

105122
def test_is_case_insensitive(self):
106123
input_data = ["1 2 Dup"]
107124
expected = [1, 2, 2]
108-
self.assertEqual(expected, evaluate(input_data))
125+
self.assertEqual(evaluate(input_data), expected)
109126

110127
def test_errors_if_there_is_nothing_on_the_stack(self):
111128
input_data = ["dup"]
@@ -117,17 +134,17 @@ class ForthDropTest(unittest.TestCase):
117134
def test_removes_the_top_value_on_the_stack_if_it_is_the_only_one(self):
118135
input_data = ["1 DROP"]
119136
expected = []
120-
self.assertEqual(expected, evaluate(input_data))
137+
self.assertEqual(evaluate(input_data), expected)
121138

122139
def test_removes_the_top_value_on_the_stack_if_it_not_the_only_one(self):
123140
input_data = ["3 4 DROP"]
124141
expected = [3]
125-
self.assertEqual(expected, evaluate(input_data))
142+
self.assertEqual(evaluate(input_data), expected)
126143

127144
def test_is_case_insensitive(self):
128145
input_data = ["1 2 Drop"]
129146
expected = [1]
130-
self.assertEqual(expected, evaluate(input_data))
147+
self.assertEqual(evaluate(input_data), expected)
131148

132149
def test_errors_if_there_is_nothing_on_the_stack(self):
133150
input_data = ["drop"]
@@ -139,17 +156,17 @@ class ForthSwapTest(unittest.TestCase):
139156
def test_swaps_only_two_values_on_stack(self):
140157
input_data = ["1 2 SWAP"]
141158
expected = [2, 1]
142-
self.assertEqual(expected, evaluate(input_data))
159+
self.assertEqual(evaluate(input_data), expected)
143160

144161
def test_swaps_two_two_values_on_stack(self):
145162
input_data = ["1 2 3 SWAP"]
146163
expected = [1, 3, 2]
147-
self.assertEqual(expected, evaluate(input_data))
164+
self.assertEqual(evaluate(input_data), expected)
148165

149166
def test_is_case_insensitive(self):
150167
input_data = ["3 4 Swap"]
151168
expected = [4, 3]
152-
self.assertEqual(expected, evaluate(input_data))
169+
self.assertEqual(evaluate(input_data), expected)
153170

154171
def test_errors_if_there_is_nothing_on_the_stack(self):
155172
input_data = ["swap"]
@@ -166,17 +183,17 @@ class ForthOverTest(unittest.TestCase):
166183
def test_copies_the_second_element_if_there_are_only_two(self):
167184
input_data = ["1 2 OVER"]
168185
expected = [1, 2, 1]
169-
self.assertEqual(expected, evaluate(input_data))
186+
self.assertEqual(evaluate(input_data), expected)
170187

171188
def test_copies_the_second_element_if_there_are_more_than_two(self):
172189
input_data = ["1 2 3 OVER"]
173190
expected = [1, 2, 3, 2]
174-
self.assertEqual(expected, evaluate(input_data))
191+
self.assertEqual(evaluate(input_data), expected)
175192

176193
def test_is_case_insensitive(self):
177194
input_data = ["3 4 Over"]
178195
expected = [3, 4, 3]
179-
self.assertEqual(expected, evaluate(input_data))
196+
self.assertEqual(evaluate(input_data), expected)
180197

181198
def test_errors_if_there_is_nothing_on_the_stack(self):
182199
input_data = ["over"]
@@ -196,15 +213,15 @@ def test_can_consist_of_built_in_words(self):
196213
"1 dup-twice"
197214
]
198215
expected = [1, 1, 1]
199-
self.assertEqual(expected, evaluate(input_data))
216+
self.assertEqual(evaluate(input_data), expected)
200217

201218
def test_execute_in_the_right_order(self):
202219
input_data = [
203220
": countup 1 2 3 ;",
204221
"countup"
205222
]
206223
expected = [1, 2, 3]
207-
self.assertEqual(expected, evaluate(input_data))
224+
self.assertEqual(evaluate(input_data), expected)
208225

209226
def test_can_override_other_user_defined_words(self):
210227
input_data = [
@@ -213,31 +230,31 @@ def test_can_override_other_user_defined_words(self):
213230
"1 foo"
214231
]
215232
expected = [1, 1, 1]
216-
self.assertEqual(expected, evaluate(input_data))
233+
self.assertEqual(evaluate(input_data), expected)
217234

218235
def test_can_override_built_in_words(self):
219236
input_data = [
220237
": swap dup ;",
221238
"1 swap"
222239
]
223240
expected = [1, 1]
224-
self.assertEqual(expected, evaluate(input_data))
241+
self.assertEqual(evaluate(input_data), expected)
225242

226243
def test_can_override_built_in_operators(self):
227244
input_data = [
228245
": + * ;",
229246
"3 4 +"
230247
]
231248
expected = [12]
232-
self.assertEqual(expected, evaluate(input_data))
249+
self.assertEqual(evaluate(input_data), expected)
233250

234251
def test_is_case_insensitive(self):
235252
input_data = [
236253
": foo dup ;",
237254
"1 FOO"
238255
]
239256
expected = [1, 1]
240-
self.assertEqual(expected, evaluate(input_data))
257+
self.assertEqual(evaluate(input_data), expected)
241258

242259
def test_cannot_redefine_numbers(self):
243260
input_data = [": 1 2 ;"]

0 commit comments

Comments
 (0)