lit: Add a custom test format for use in clang.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 16 Sep 2009 01:34:52 +0000 (01:34 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 16 Sep 2009 01:34:52 +0000 (01:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81987 91177308-0d34-0410-b5e6-96231b3b80d8

utils/lit/LitFormats.py
utils/lit/TestFormats.py

index e22f84bf89ad44844c7a152a223b3f69361b97e8..9b8250d0aaf982f6df3a3ab09f5cca57d47eb685 100644 (file)
@@ -1,2 +1,2 @@
-from TestFormats import GoogleTest, ShTest, TclTest
+from TestFormats import GoogleTest, ShTest, TclTest, SyntaxCheckTest
 
index 62451469fda4642653a703ad21bb72f0309a3e47..61bdb185355f48ea56941e0ceee9e08cbd0404ca 100644 (file)
@@ -89,3 +89,56 @@ class ShTest(FileBasedTest):
 class TclTest(FileBasedTest):
     def execute(self, test, litConfig):
         return TestRunner.executeTclTest(test, litConfig)
+
+###
+
+import re
+import tempfile
+
+class SyntaxCheckTest:
+    # FIXME: Refactor into generic test for running some command on a directory
+    # of inputs.
+
+    def __init__(self, compiler, dir, recursive, pattern, extra_cxx_args=[]):
+        self.compiler = str(compiler)
+        self.dir = str(dir)
+        self.recursive = bool(recursive)
+        self.pattern = re.compile(pattern)
+        self.extra_cxx_args = list(extra_cxx_args)
+
+    def getTestsInDirectory(self, testSuite, path_in_suite,
+                            litConfig, localConfig):
+        for dirname,subdirs,filenames in os.walk(self.dir):
+            if not self.recursive:
+                subdirs[:] = []
+
+            for filename in filenames:
+                if (not self.pattern.match(filename) or
+                    filename in localConfig.excludes):
+                    continue
+
+                path = os.path.join(dirname,filename)
+                suffix = path[len(self.dir):]
+                if suffix.startswith(os.sep):
+                    suffix = suffix[1:]
+                test = Test.Test(testSuite,
+                                 path_in_suite + tuple(suffix.split(os.sep)),
+                                 localConfig)
+                # FIXME: Hack?
+                test.source_path = path
+                yield test
+
+    def execute(self, test, litConfig):
+        tmp = tempfile.NamedTemporaryFile(suffix='.cpp')
+        print >>tmp, '#include "%s"' % test.source_path
+        tmp.flush()
+
+        cmd = [self.compiler, '-x', 'c++', '-fsyntax-only', tmp.name]
+        cmd.extend(self.extra_cxx_args)
+        out, err, exitCode = TestRunner.executeCommand(cmd)
+
+        diags = out + err
+        if not exitCode and not diags.strip():
+            return Test.PASS,''
+
+        return Test.FAIL, diags