summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2011-09-04 03:27:06 +0200
committerVicent Marti <tanoku@gmail.com>2011-09-04 03:28:08 +0200
commit55f207110fac886861b100831305c32c94da01da (patch)
treea6e01a59224eaca24548097f81dec0a7c11d3c4e
parent05e45403cb262aaca63d4028b676e6823f44c132 (diff)
downloadlibgit2-clay-test.tar.gz
Add Clay 0.7.0 scriptclay-test
-rwxr-xr-xtests/clay213
-rw-r--r--tests/clay_main.c2
2 files changed, 214 insertions, 1 deletions
diff --git a/tests/clay b/tests/clay
new file mode 100755
index 000000000..cd3d42d21
--- /dev/null
+++ b/tests/clay
@@ -0,0 +1,213 @@
+#!/usr/bin/env python
+
+from __future__ import with_statement
+from string import Template
+import re, fnmatch, os
+
+VERSION = "0.7.0"
+
+TEST_FUNC_REGEX = r"^(void\s+(test_%s__(\w+))\(\s*(void)?\s*\))\s*\{"
+
+TEMPLATE_MAIN = Template(
+r"""
+/*
+ * Clay v${version}
+ *
+ * This is an autogenerated file. Do not modify.
+ * To add new unit tests or suites, regenerate the whole
+ * file with `./clay`
+ */
+
+#define clay_print(...) ${clay_print}
+
+${clay_library}
+
+${extern_declarations}
+
+static const struct clay_func _all_callbacks[] = {
+ ${test_callbacks}
+};
+
+static const struct clay_suite _all_suites[] = {
+ ${test_suites}
+};
+
+static const char _suites_str[] = "${suites_str}";
+
+int main(int argc, char *argv[])
+{
+ return clay_test(
+ argc, argv, _suites_str,
+ _all_callbacks, ${cb_count},
+ _all_suites, ${suite_count}
+ );
+}
+""")
+
+TEMPLATE_SUITE = Template(
+r"""
+ {
+ "${clean_name}",
+ ${initialize},
+ ${cleanup},
+ ${cb_ptr}, ${cb_count}
+ }
+""")
+
+def main():
+ from optparse import OptionParser
+
+ parser = OptionParser()
+
+ parser.add_option('-c', '--clay-path', dest='clay_path')
+ parser.add_option('-o', '--output', dest='output')
+ parser.add_option('-v', '--report-to', dest='print_mode', default='stdout')
+
+ options, args = parser.parse_args()
+
+ for folder in args:
+ builder = ClayTestBuilder(folder,
+ clay_path = options.clay_path,
+ output = options.output,
+ print_mode = options.print_mode)
+
+ builder.render()
+
+
+class ClayTestBuilder:
+ def __init__(self, folder_name, output = None, clay_path = None, print_mode = 'stdout'):
+ self.declarations = []
+ self.callbacks = []
+ self.suites = []
+ self.suite_list = []
+
+ self.clay_path = clay_path
+ self.print_mode = print_mode
+ self.output = output or os.path.join(folder_name, "clay_main.c")
+ self.output_header = os.path.join(folder_name, "clay.h")
+
+ self.modules = ["clay.c", "clay_sandbox.c"]
+
+ print("Loading test suites...")
+
+ file_list = os.listdir(folder_name)
+ for fname in fnmatch.filter(file_list, "*.c"):
+ with open(fname) as f:
+ tcount = self._process_test_file(fname, f.read())
+ if tcount:
+ print (" %s: %d tests" % (fname, tcount))
+
+ def render(self):
+ template = TEMPLATE_MAIN.substitute(
+ version = VERSION,
+ clay_print = self._get_print_method(),
+ clay_library = self._get_library(),
+ extern_declarations = "\n".join(self.declarations),
+
+ suites_str = ", ".join(self.suite_list),
+
+ test_callbacks = ",\n\t".join(self.callbacks),
+ cb_count = len(self.callbacks),
+
+ test_suites = ",\n\t".join(self.suites),
+ suite_count = len(self.suites),
+ )
+
+ with open(self.output, "w") as out:
+ out.write(template)
+
+ with open(self.output_header, "w") as out:
+ out.write(self._load_file('clay.h'))
+
+ print ('Written test suite to "%s"' % self.output)
+ print ('Written header to "%s"' % self.output_header)
+
+ #####################################################
+ # Internal methods
+ #####################################################
+ def _get_print_method(self):
+ return {
+ 'stdout' : 'printf(__VA_ARGS__)',
+ 'stderr' : 'fprintf(stderr, __VA_ARGS__)',
+ 'silent' : ''
+ }[self.print_mode]
+
+ def _load_file(self, filename):
+ if self.clay_path:
+ filename = os.path.join(self.clay_path, filename)
+ with open(filename) as cfile:
+ return cfile.read()
+
+ else:
+ import zlib, base64, sys
+ content = CLAY_FILES[filename]
+
+ if sys.version_info >= (3, 0):
+ content = bytearray(content, 'utf_8')
+ content = base64.b64decode(content)
+ content = zlib.decompress(content)
+ return str(content)
+ else:
+ content = base64.b64decode(content)
+ return zlib.decompress(content)
+
+ def _get_library(self):
+ return "\n".join(self._load_file(f) for f in self.modules)
+
+ def _parse_comment(self, comment):
+ comment = comment[2:-2]
+ comment = comment.splitlines()
+ comment = [line.strip() for line in comment]
+ comment = "\n".join(comment)
+
+ return comment
+
+ def _process_test_file(self, file_name, contents):
+ file_name = os.path.basename(file_name)
+ file_name, _ = os.path.splitext(file_name)
+
+ regex_string = TEST_FUNC_REGEX % file_name
+ regex = re.compile(regex_string, re.MULTILINE)
+
+ callbacks = []
+ initialize = cleanup = "{NULL, NULL, 0}"
+
+ for (declaration, symbol, short_name, _) in regex.findall(contents):
+ self.declarations.append("extern %s;" % declaration)
+ func_ptr = '{"%s", &%s, %d}' % (
+ short_name, symbol, len(self.suites)
+ )
+
+ if short_name == 'initialize':
+ initialize = func_ptr
+ elif short_name == 'cleanup':
+ cleanup = func_ptr
+ else:
+ callbacks.append(func_ptr)
+
+ if not callbacks:
+ return 0
+
+ suite = TEMPLATE_SUITE.substitute(
+ clean_name = file_name,
+ initialize = initialize,
+ cleanup = cleanup,
+ cb_ptr = "&_all_callbacks[%d]" % len(self.callbacks),
+ cb_count = len(callbacks)
+ ).strip()
+
+ self.callbacks += callbacks
+ self.suites.append(suite)
+ self.suite_list.append(file_name)
+
+ return len(callbacks)
+
+CLAY_FILES = {
+"clay.c" : r"""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""",
+"clay_sandbox.c" : r"""eJx1VG1P2zAQ/uz8iiPVSrKGETa0acr6YRJlqii0akFMopUVEgesJU6J3Wps8N93jkNeCquiJvE9d/c895IeT2KWAL0eX3z6aPUIvnDBYDb5fnk6nZ/TxWgG+8vlvtVjqWT/Axxqu4h5YllShYpHEN2HBdAoDR/pOlT3N8f+18+roDZzoSwu6TZMeUxVti5BTpQLqYzre33gWn8tIlWxiRRoR/wLLFIwtSkEOKk+cjTOg75ULgyH4EO/bxHiLOh4cTKeO1J9kIpmecxceHpCizZMLs7aBtf4hFHEpKziXdPpmQnoBtZzhzbKb1Muyd5ukoQVHkj+h1EFKRN3NXtTjlJZZd6GBY3yjVAwhONgB2MCMrHF4hTyZoUYDEPsy/MZCrI90E/lbWTuV4vRfDafno4nI9sC8oxFBlJl4vjS63SY8AScH0xdsmw90wKck+vp/MQ1lD0wSlwXU1Z1Pgrq3pIkL8DhSMkPgMO3RkkAgwF3S6Y7MhB8xxQ+OLUmvsKikpLJHh7qXNpLcbFhSNhYXk+HhpoUeiZEtH50XuqOJu+l6jp0izshzxZe9dj4O/2EKGWhoEmexqx4ewJbh7mkURbrruzWldhFDIcSDh9gab+TS9sOqp3RpgwOiqRtqApaBo3yLAtF/LIjRIp1gcwSpzKYucrrd9ereHhQcmx2Qj5KxbIa15a6zXkM5T5uhETjbf7b0WdGYbsGzdbuzr7xf+3d1Ed7URXytBxcu8TrBv4sf7YWV6+IbnU5A92NatLXuluM2pPp6wgYCDPhQOBDl7qJ3voGaegBHK1gb9j5fpmh6gIHAy2gjQrMGGEmPXkNGgZajNdIr1Nnv7AZ6zYp/UW5uJpMdkUYdMyLjnr/i++7mqz/Fj667+LfRjaLgOT/ATlX1I8=""",
+"clay.h" : r"""eJy9lF9PwjAUxZ/Zp7huLxtZCL4ikhgDkYT4IonxqSntnTTWdvaP4re33TA6HCG+8LTb2/b+zjnZlolKcayAkNvVzRNZzx/W5I6QJAtNofBPP8mEYtJzhKl1XIrNaDtLknctODBJPwmh1qJxeTIQygHTigsntCqTQaht6GypgWElJJbtERkoB7tojDYHPY6WGVHvZ8WLdqu95IRutHHF1W8NFh1hEqnydd508+F+WbTrYVFCW+iavnmM178NNxNevXWkDlZy3NWmhEgvugabnQJm1zAuQ0qL5WpOSKxWy/umShdesagXGJUSKho88wmkkP3MLOGy6CHHsyfJ06Pg+a5G5pBD1VHgdCPipIQ95hT/4rjzIMCgtZEsLCjtwBmPfeAumW2RvZwn93HRhz5v8L0azpD7+DD3xnYP8RhnjeG7bIMdpcdeow9qlFDP/5n72F4B7k18uIjBHTIfs5ykHf0Y/ixV8gUUh4yr"""
+}
+
+if __name__ == '__main__':
+ main()
+
diff --git a/tests/clay_main.c b/tests/clay_main.c
index 059b66e4d..738d79efa 100644
--- a/tests/clay_main.c
+++ b/tests/clay_main.c
@@ -1,6 +1,6 @@
/*
- * Clay v0.3.0
+ * Clay v0.7.0
*
* This is an autogenerated file. Do not modify.
* To add new unit tests or suites, regenerate the whole