6 class IsIntegerTests(unittest.TestCase):
7 def test_returns_true_for_integers(self):
9 self.assertTrue(stutter.is_integer(i))
11 def test_returns_false_for_booleans(self):
12 self.assertFalse(stutter.is_integer(True))
13 self.assertFalse(stutter.is_integer(False))
15 def test_returns_false_for_other_types(self):
16 for o in [object(), '', 0.1, [], (), {}, set()]:
17 self.assertFalse(stutter.is_integer(o))
19 class UndelimitStringTests(unittest.TestCase):
20 def test_returns_empty_strings(self):
22 actual = stutter.undelimit_string('""')
24 self.assertEqual(expected, actual)
26 def test_returns_strings_without_escapes(self):
27 expected = 'Hello, world'
28 actual = stutter.undelimit_string('"Hello, world"')
30 self.assertEqual(expected, actual)
32 def test_returns_strings_with_newlines(self):
33 expected = 'Hello, world\nGoodbye, cruel world'
34 actual = stutter.undelimit_string('"Hello, world\\nGoodbye, cruel world"')
36 self.assertEqual(expected, actual)
38 def test_returns_strings_with_escaped_delimiters(self):
39 expected = '"Hello, world"'
40 actual = stutter.undelimit_string('"\\"Hello, world\\""')
42 self.assertEqual(expected, actual)
44 def test_returns_strings_with_escaped_escape_characters(self):
46 actual = stutter.undelimit_string('"\\\\no"')
48 self.assertEqual(expected, actual)
50 class IndentTests(unittest.TestCase):
51 def test_indents_single_line(self):
52 expected = ' Hello, world'
53 actual = stutter.indent('Hello, world')
54 self.assertEqual(expected, actual)
56 def test_indents_multiple_lines(self):
57 expected = ' Hello, world\n Goodbye, cruel world'
58 actual = stutter.indent('Hello, world\nGoodbye, cruel world')
59 self.assertEqual(expected, actual)
61 def test_leaves_empty_lines_empty(self):
62 expected = ' Hello, world\n\n Goodbye, cruel world'
63 actual = stutter.indent('Hello, world\n \nGoodbye, cruel world')
64 self.assertEqual(expected, actual)
66 def test_indents_already_indented_lines(self):
67 expected = ' Hello, world\n\n Goodbye, cruel world'
68 actual = stutter.indent(' Hello, world\n\n Goodbye, cruel world')
69 self.assertEqual(expected, actual)
71 class ParseAllTests(unittest.TestCase):
72 def test_parses_integers(self):
74 actual = stutter.parse_all('0')
76 self.assertEqual(expected, actual)
78 def test_parses_identifiers(self):
79 expected = [stutter.Symbol('print')]
80 actual = stutter.parse_all('print')
82 self.assertEqual(expected, actual)
84 def test_parses_strings(self):
85 expected = ['Hello, world']
86 actual = stutter.parse_all('"Hello, world"')
88 self.assertEqual(expected, actual)
90 def test_parses_strings_with_escaped_delimiters(self):
91 expected = ['"Hello, world"']
92 actual = stutter.parse_all('"\\"Hello, world\\""')
94 self.assertEqual(expected, actual)
96 def test_parses_empty_s_expressions(self):
98 actual = stutter.parse_all('()')
100 self.assertEqual(expected, actual)
102 def test_parses_s_expressions(self):
103 expected = [(0, 1, 2)]
104 actual = stutter.parse_all('(0 1 2)')
106 self.assertEqual(expected, actual)
108 def test_parses_nested_s_expressions(self):
109 expected = [(0, (1, (2,)))]
110 actual = stutter.parse_all('(0 (1 (2)))')
112 self.assertEqual(expected, actual)
114 def test_parses_multiple_expressions(self):
116 actual = stutter.parse_all('0 ()')
118 self.assertEqual(expected, actual)
120 def test_raises_exception_for_unclosed_parenthese(self):
121 self.assertRaises(Exception, stutter.parse_all, '(')
123 def test_raises_exception_for_unopened_parenthese(self):
124 self.assertRaises(Exception, stutter.parse_all, ')')
126 class QuoteToCTests(unittest.TestCase):
127 def test_quotes_integer_literals(self):
129 expected = stutter.CFunctionCallExpression(
130 'makeObjectPointerFromInteger',
131 [stutter.CIntegerLiteralExpression(i)],
134 actual = stutter.quote_to_c(i)
136 self.assertEqual(expected, actual)
138 def test_quotes_string_literals(self):
140 expected = stutter.CFunctionCallExpression(
141 'makeObjectPointerFromString',
142 [stutter.CStringLiteralExpression(s)],
145 actual = stutter.quote_to_c(s)
147 self.assertEqual(expected, actual)
149 class EvaluateApplicationArgumentsToCTests(unittest.TestCase):
150 def test_evaluates_empty_to_null(self):
151 expected = stutter.CVariableExpression('NULL')
152 actual = stutter.evaluate_application_arguments_to_c(())
154 self.assertEqual(expected, actual)
156 def test_evaluates_one_argument_to_cons(self):
159 sentinel = stutter.CStringLiteralExpression('1bd9707e76f8f807f3bad3e39049fea4a36d8ef2f8e2ed471ec755f7adb291d5')
161 def mock(argument_to_quote):
162 if argument_to_quote == argument:
165 expected = stutter.CFunctionCallExpression(
167 (sentinel, stutter.CVariableExpression('NULL')),
170 actual = stutter.evaluate_application_arguments_to_c(
175 self.assertEqual(expected, actual)
177 class EvaluateApplicationToCTests(unittest.TestCase):
178 def test_evaluates_function_calls_with_no_arguments(self):
181 sentinel = stutter.CVariableExpression('NULL')
184 assert arguments == ()
187 result = stutter.evaluate_application_to_c(
188 (stutter.Symbol(name),),
189 evaluate_application_arguments_to_c = mock,
192 self.assertEqual(result.name, name)
193 self.assertEqual(len(result.arguments), 1)
194 self.assertIs(result.arguments[0], sentinel)
196 def test_evaluates_function_calls_with_arguments(self):
200 sentinel = stutter.CFunctionCallExpression(
203 stutter.CFunctionCallExpression(
204 'makeObjectPointerFromInteger',
205 [stutter.CIntegerLiteralExpression(argument)],
211 assert arguments == (argument,)
214 result = stutter.evaluate_application_to_c(
215 (stutter.Symbol(name), argument),
216 evaluate_application_arguments_to_c = mock,
219 self.assertEqual(result.name, name)
220 self.assertEqual(len(result.arguments), 1)
221 self.assertIs(result.arguments[0], sentinel)
223 class EvaluateToCTests(unittest.TestCase):
224 def test_evaluates_integers(self):
226 result = stutter.evaluate_to_c(i)
227 self.assertIsInstance(result, stutter.CIntegerLiteralExpression)
228 self.assertEqual(result.integer, i)
230 def test_evaluates_string_literals(self):
232 result = stutter.evaluate_to_c(s)
234 self.assertIsInstance(result, stutter.CStringLiteralExpression)
235 self.assertEqual(result.string, s)
237 def test_calls_evaluate_application_when_given_an_application(self):
239 application = (stutter.Symbol('print'), 'Hello, world')
242 if argument == application:
245 result = stutter.evaluate_to_c(
247 evaluate_application_to_c = mock,
250 self.assertIs(result, sentinel)
252 class EvaluateAllToCTests(unittest.TestCase):
253 def test_returns_function_body(self):
254 result = stutter.evaluate_all_to_c([0])
256 self.assertIsInstance(result, stutter.CFunctionBody)
258 def test_main_contains_expression_statements_followed_by_return_statement(self):
259 result = stutter.evaluate_all_to_c([0,0,0])
261 self.assertIsInstance(result.statements[0],stutter.CExpressionStatement)
262 self.assertIsInstance(result.statements[1],stutter.CExpressionStatement)
263 self.assertIsInstance(result.statements[2],stutter.CReturnStatement)
265 class GeneratePointerTypeTests(unittest.TestCase):
266 def test_basic(self):
268 actual = stutter.generate_pointer_type(stutter.CPointerType(stutter.CType('int')))
269 self.assertEqual(expected, actual)
271 class GenerateTypeTests(unittest.TestCase):
272 def test_basic(self):
274 actual = stutter.generate_type(stutter.CType('int'))
275 self.assertEqual(expected, actual)
277 def test_generates_pointer_types(self):
279 actual = stutter.generate_type(
280 stutter.CPointerType(stutter.CType('int')),
281 generate_pointer_type = lambda x : expected)
283 self.assertIs(expected, actual)
285 class GenerateArgumentDeclarationTests(unittest.TestCase):
286 def test_basic(self):
287 expected = 'int argc'
288 actual = stutter.generate_argument_declaration(
289 stutter.CArgumentDeclaration(stutter.CType('int'), 'argc'))
290 self.assertEqual(expected, actual)
292 class GenerateArgumentDeclarationListTests(unittest.TestCase):
293 def test_basic(self):
294 argument_declarations = [
295 stutter.CArgumentDeclaration(stutter.CType('int'),'argc'),
296 stutter.CArgumentDeclaration(stutter.CPointerType(stutter.CPointerType(stutter.CType('char'))), 'argv'),
298 expected = 'int argc, char** argv'
299 actual = stutter.generate_argument_declaration_list(argument_declarations)
300 self.assertEqual(expected, actual)
302 class GenerateIntegerLiteralExpressionTests(unittest.TestCase):
303 def test_basic(self):
305 actual = stutter.generate_integer_literal_expression(
306 stutter.CIntegerLiteralExpression(0),
308 self.assertEqual(expected, actual)
310 class GenerateStringLiteralExpressionTests(unittest.TestCase):
311 def test_basic(self):
312 expected = '"Hello, world"'
313 actual = stutter.generate_string_literal_expression(
314 stutter.CStringLiteralExpression('Hello, world'),
316 self.assertEqual(expected, actual)
318 def test_escapes(self):
319 expected = r'"\\\n\"\t"'
320 actual = stutter.generate_string_literal_expression(
321 stutter.CStringLiteralExpression('\\\n"\t'),
323 self.assertEqual(expected, actual)
325 class GenerateVariableExpressionTests(unittest.TestCase):
326 def test_generates(self):
328 actual = stutter.generate_variable_expression(
329 stutter.CVariableExpression(expected),
332 self.assertEqual(expected, actual)
334 class GenerateFunctionCallExpressionTests(unittest.TestCase):
335 def test_no_arguments(self):
337 actual = stutter.generate_function_call_expression(
338 stutter.CFunctionCallExpression('name', []),
340 self.assertEqual(expected, actual)
342 def test_one_argument(self):
344 actual = stutter.generate_function_call_expression(
345 stutter.CFunctionCallExpression(
348 stutter.CIntegerLiteralExpression(0),
352 self.assertEqual(expected, actual)
354 def test_many_arguments(self):
355 expected = 'name(0, 1)'
356 actual = stutter.generate_function_call_expression(
357 stutter.CFunctionCallExpression(
360 stutter.CIntegerLiteralExpression(0),
361 stutter.CIntegerLiteralExpression(1),
365 self.assertEqual(expected, actual)
367 class GenerateExpressionTests(unittest.TestCase):
368 def test_generates_integer_literal_expressions(self):
370 actual = stutter.generate_expression(
371 stutter.CIntegerLiteralExpression(0),
372 generate_integer_literal_expression = lambda x : expected)
374 self.assertIs(expected, actual)
376 def test_generates_string_literal_expressions(self):
378 actual = stutter.generate_expression(
379 stutter.CStringLiteralExpression('Hello, world'),
380 generate_string_literal_expression = lambda x : expected)
382 self.assertIs(expected, actual)
384 def test_generates_variable_expression(self):
386 actual = stutter.generate_expression(
387 stutter.CVariableExpression('name'),
388 generate_variable_expression = lambda x : expected)
390 self.assertIs(expected, actual)
392 def test_generates_function_call_expression(self):
394 actual = stutter.generate_expression(
395 stutter.CFunctionCallExpression('name',[]),
396 generate_function_call_expression = lambda x : expected)
398 self.assertIs(expected, actual)
400 class GenerateStatement(unittest.TestCase):
401 def test_generates_expression_statement(self):
402 return_statement = stutter.CExpressionStatement('0')
405 actual = stutter.generate_statement(
407 generate_expression_statement = lambda _ : expected)
409 self.assertIs(expected, actual)
411 def test_generates_return_statement(self):
412 return_statement = stutter.CReturnStatement(stutter.CIntegerLiteralExpression(0))
415 actual = stutter.generate_statement(
417 generate_return_statement = lambda _ : expected)
419 self.assertIs(expected, actual)
421 class GenerateExpressionStatementTests(unittest.TestCase):
422 def test_generates_return_statement(self):
423 expression_statement = stutter.CExpressionStatement(stutter.CIntegerLiteralExpression(0))
426 actual = stutter.generate_expression_statement(expression_statement)
428 self.assertEqual(expected, actual)
430 class GenerateReturnStatementTests(unittest.TestCase):
431 def test_generates_return_statement(self):
432 return_statement = stutter.CReturnStatement(stutter.CIntegerLiteralExpression(0))
434 expected = 'return 0;'
435 actual = stutter.generate_return_statement(return_statement)
437 self.assertEqual(expected, actual)
439 class GenerateFunctionDeclarationTests(unittest.TestCase):
440 def test_basic(self):
441 return_type = stutter.CType('int')
442 argument_declarations = [
443 stutter.CArgumentDeclaration(stutter.CType('int'),'argc'),
444 stutter.CArgumentDeclaration(stutter.CPointerType(stutter.CPointerType(stutter.CType('char'))), 'argv'),
447 function_declaration = stutter.CFunctionDeclaration(
450 argument_declarations,
451 stutter.CFunctionBody(
452 [stutter.CReturnStatement(stutter.CIntegerLiteralExpression(0))],
456 expected = 'int main(int argc, char** argv)\n{\n return 0;\n}'
457 actual = stutter.generate_function_declaration(function_declaration)
458 self.assertEqual(expected, actual)