diff options
-rwxr-xr-x | interpreter.py | 26 | ||||
-rwxr-xr-x | shellgenerator.py | 26 | ||||
-rw-r--r-- | test cases/1 trivial/builder.txt | 2 |
3 files changed, 51 insertions, 3 deletions
diff --git a/interpreter.py b/interpreter.py index cb9b4d2..9d3aa78 100755 --- a/interpreter.py +++ b/interpreter.py @@ -87,7 +87,6 @@ class Executable(BuildTarget): self.filename = self.name + '.' + suffix else: self.filename = self.name - class StaticLibrary(BuildTarget): def __init__(self, name, sources, environment): @@ -103,6 +102,18 @@ class SharedLibrary(BuildTarget): suffix = environment.get_shared_lib_suffix() self.filename = prefix + self.name + '.' + suffix +class Test(InterpreterObject): + def __init__(self, name, exe): + InterpreterObject.__init__(self) + self.name = name + self.exe = exe + + def get_exe(self): + return self.exe + + def get_name(self): + return self.name + class Interpreter(): def __init__(self, code, environment): @@ -115,6 +126,7 @@ class Interpreter(): self.environment = environment self.static_linker = self.environment.detect_static_linker() self.build_func_dict() + self.tests = [] def build_func_dict(self): self.funcs = {'project' : self.func_project, @@ -123,7 +135,8 @@ class Interpreter(): 'executable': self.func_executable, 'find_dep' : self.func_find_dep, 'static_library' : self.func_static_lib, - 'shared_library' : self.func_shared_lib + 'shared_library' : self.func_shared_lib, + 'add_test' : self.func_add_test } def get_project(self): @@ -131,6 +144,9 @@ class Interpreter(): def get_targets(self): return self.targets + + def get_tests(self): + return self.tests def sanity_check_ast(self): if not isinstance(self.ast, nodes.CodeBlock): @@ -216,6 +232,12 @@ class Interpreter(): def func_shared_lib(self, node, args): return self.build_target(node, args, SharedLibrary) + + def func_add_test(self, node, args): + self.validate_arguments(args, 2, [str, Executable]) + t = Test(args[0], args[1]) + self.tests.append(t) + print('Adding test "%s"' % args[0]) def build_target(self, node, args, targetclass): for a in args: diff --git a/shellgenerator.py b/shellgenerator.py index 2f04ecd..009ac7c 100755 --- a/shellgenerator.py +++ b/shellgenerator.py @@ -26,10 +26,15 @@ class ShellGenerator(): self.environment = environment self.interpreter = interpreter self.build_filename = 'compile.sh' + self.test_filename = 'run_tests.sh' self.processed_targets = {} def generate(self): self.interpreter.run() + self.generate_compile_script() + self.generate_test_script() + + def generate_compile_script(self): outfilename = os.path.join(self.environment.get_build_dir(), self.build_filename) outfile = open(outfilename, 'w') outfile.write('#!/bin/sh\n\n') @@ -43,6 +48,27 @@ class ShellGenerator(): os.chmod(outfilename, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC |\ stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) + def generate_test_script(self): + outfilename = os.path.join(self.environment.get_build_dir(), self.test_filename) + outfile = open(outfilename, 'w') + outfile.write('#!/bin/sh\n\n') + outfile.write('echo This is an autogenerated shell script test file for project \\"%s\\".\n' + % self.interpreter.get_project()) + outfile.write('echo Run the compile script before this one or bad things will happen!\n') + cdcmd = ['cd', self.environment.get_build_dir()] + outfile.write(' '.join(shell_quote(cdcmd)) + '\n') + self.generate_tests(outfile) + outfile.close() + os.chmod(outfilename, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC |\ + stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) + + def generate_tests(self, outfile): + for t in self.interpreter.get_tests(): + cmds = [] + cmds.append(self.get_target_filename(t.get_exe())) + outfile.write('echo Running test \\"%s\\".\n' % t.get_name()) + outfile.write(' '.join(shell_quote(cmds)) + ' || exit\n') + def generate_single_compile(self, target, outfile, src): compiler = None for i in self.interpreter.compilers: diff --git a/test cases/1 trivial/builder.txt b/test cases/1 trivial/builder.txt index 0ab3f5d..c8a0ae2 100644 --- a/test cases/1 trivial/builder.txt +++ b/test cases/1 trivial/builder.txt @@ -1,4 +1,4 @@ project('trivial test') language('c') exe = executable('trivialprog', 'trivial.c') - +add_test('runtest', exe) |