Add an interpreter
[fur] / integration_tests.py
index 25550f6..b5ad321 100644 (file)
@@ -6,14 +6,60 @@ import unittest
 # Go to the directory of the current file so we know where we are in the filesystem
 os.chdir(os.path.dirname(os.path.abspath(__file__)))
 
-class OutputTests(unittest.TestCase):
+class InterpreterOutputTests(unittest.TestCase):
     pass
 
-def add_example_output_test(filename):
+def add_example_interpreter_output_test(filename):
+    def test(self):
+        try:
+            p = subprocess.Popen(
+                'python main.py interpret {}'.format(
+                    os.path.join('examples', filename),
+                ),
+                stdout=subprocess.PIPE,
+                stderr=subprocess.PIPE,
+            )
+
+            actual_stdout, actual_stderr = p.communicate()
+
+            expected_stdout_path = os.path.join('examples', filename + '.stdout.txt')
+
+            if os.path.isfile(expected_stdout_path):
+                with open(expected_stdout_path, 'rb') as f:
+                    expected_stdout = f.read()
+            else:
+                expected_stdout = b''
+
+            expected_stderr_path = os.path.join('examples', filename + '.stderr.txt')
+
+            if os.path.isfile(expected_stderr_path):
+                with open(expected_stderr_path, 'rb') as f:
+                    expected_stderr = f.read()
+            else:
+                expected_stderr = b''
+
+            self.assertEqual(expected_stderr, actual_stderr)
+
+            # We don't clean up the C file in the finally clause because it can be useful to have in case of errors
+            os.remove(os.path.join('examples', filename + '.c'))
+
+        finally:
+            try:
+                os.remove('a.out')
+            except OSError:
+                pass
+
+    setattr(InterpreterOutputTests, 'test_' + filename, test)
+
+class CompilerOutputTests(unittest.TestCase):
+    pass
+
+def add_example_compiler_output_test(filename):
     def test(self):
         compile_fur_to_c_result = subprocess.call([
             'python',
             'main.py',
+            'compile',
             os.path.join('examples', filename),
         ])
 
@@ -59,7 +105,7 @@ def add_example_output_test(filename):
             except OSError:
                 pass
 
-    setattr(OutputTests, 'test_' + filename, test)
+    setattr(CompilerOutputTests, 'test_' + filename, test)
 
 class MemoryLeakTests(unittest.TestCase):
     pass
@@ -124,7 +170,8 @@ filenames = (
 )
 
 for filename in filenames:
-    add_example_output_test(filename)
+    add_example_compiler_output_test(filename)
+    add_example_interpreter_output_test(filename)
     add_example_memory_leak_test(filename)
 
 unittest.main()