# Globals
# Directory that the generated files should be placed into
-outdir = 'gen'
+outdir = sys.argv[2]
# Start of the test function table definition
testfuntableheader = """
-static void (*const _tests[])(void) = {
+void
+__runSuite(void)
+{
"""
-
# End of the test function table definition
-testfuntablefooter = """\tNULL
-};
+testfuntablefooter = """}
"""
# Code to generate the suite function
testfunsuite = """
-void **
-suite(void)
-{
- return (void **)_tests;
-}
-
-const char *
-getSuiteName(void)
+code const char *
+__getSuiteName(void)
{
- return "{testcase}";
+ return "{testcase}";
}
"""
self.functions = []
# Emit the suite wrapper into a temporary file
self.tmpname = tempfile.mktemp()
- (self.basename, self.ext) = re.split(r'\.', self.inname)
- self.ext = '.' + self.ext
+ (self.dirname, self.filename) = os.path.split(self.inname)
+ (self.basename, self.ext) = os.path.splitext (self.filename)
def permute(self, basepath, keys, trans = {}):
"""Permutes across all of the names. For each value, recursivly creates
if len(keys) == 0:
# End of the recursion.
# Set the runtime substitutions.
- trans['testcase'] = basepath
+ trans['testcase'] = re.sub(r'\\', r'\\\\', basepath)
# Create the instance from the template
T = TemplateDocument(self.tmpname)
T.substitutions = trans
# Emmit the suite table
fout.write(testfuntableheader)
+ n = 0;
for fun in self.functions:
- # Turn the function definition into a pointer
- fun = re.sub(r'\(\w+\)', '', fun)
- fout.write("\t" + fun + ",\n")
+ # Turn the function definition into a function call
+ fout.write(" __prints(\"Running " + fun + "\\n\");\n");
+ fout.write(' ' + fun + "();\n")
+ n += 1;
fout.write(testfuntablefooter)
+ fout.write("\nconst int __numCases = " + str(n) + ";\n")
fout.write(testfunsuite);
fout.close()
+ return n
def readfile(self):
"""Read in all of the input file."""
None
else:
# Pull out any test function names
- if re.search(r'^test\w+\(\w+\)', line) != None:
- self.functions.append(line)
+ m = re.match(r'^(?:\W*void\W+)?\W*(test\w*)\W*\(\W*void\W*\)', line)
+ if m != None:
+ self.functions.append(m.group(1))
def generate(self):
"""Main function. Generates all of the instances."""
self.readfile()
self.parse()
- self.writetemplate()
+ if self.writetemplate() == 0:
+ sys.stderr.write("Empty function list in " + self.inname + "!\n")
# Create the output directory if it doesn't exist
createdir(outdir)
# Remove the temporary file
os.remove(self.tmpname)
-# Check and parse the command line arguments
-if len(sys.argv) < 2:
- # PENDING: How to throw an error?
- print "usage: generate-cases.py template.c"
+def main():
+ # Check and parse the command line arguments
+ if len(sys.argv) < 3:
+ print "usage: generate-cases.py template.c outdir"
+ sys.exit(-1)
+
+ # Input name is the first arg.
-# Input name is the first arg.
+ s = InstanceGenerator(sys.argv[1])
+ s.generate()
-s = InstanceGenerator(sys.argv[1])
-s.generate()
+if __name__ == '__main__':
+ main()