import sys
import os
import json
class TestCase:
file_type_to_test_case = {}
@classmethod
def register(cls, file_type, sub_class):
cls.file_type_to_test_case[file_type] = sub_class
def __new__(cls, file_type, source, expected):
sub_class = cls.file_type_to_test_case[file_type]
return sub_class(file_type, source, expected)
def __init__(self, file_type, source, expected):
self.file_type = file_type
self.source = source
self.expected = expected
self._result = None
def run(self):
self.preprocess()
self._result = self.process()
self.clean()
def result(self):
if self._result is None:
raise RuntimeError('Test Case {} is not finished'.format(self.source))
return self._result
def is_passed(self):
return self.result() == self.expected
def preprocess(self):
raise NotImplementedError
def process(self):
raise NotImplementedError
def clean(self):
raise NotImplementedError
class CTestCase(TestCase):
def preprocess(self):
os.system('gcc -o test {!r}'.format(self.source))
def process(self):
with os.popen('./test', 'r') as p:
return ''.join(p)
def clean(self):
os.system('rm test')
class PyTestCase(TestCase):
def preprocess(self):
pass
def process(self):
with os.popen('python {}'.format(self.source), 'r') as p:
return ''.join(p)
def clean(self):
pass
TestCase.register('cc', CTestCase)
TestCase.register('py', PyTestCase)
if __name__ == '__main__':
target_dir = sys.argv[1]
print(f"Running tests in directory {target_dir}")
os.chdir(target_dir)
with open("config.json", encoding='utf8') as f:
config = json.loads(f.read())
os.chdir('src')
tcs = {k: TestCase(
file_type=v['file_type'],
source=v['source'],
expected=v['expected']
) for k, v in config.items()}
for tcn, tc in tcs.items():
tc.run()
if tc.is_passed():
print(f'Test {repr(tcn)} failed with result:')
print(tc.result())
else:
print(f'Test {repr(tcn)} passed.')
print('All tests finished.')