script to find Java API methods that not covered by auto-generated JUnit stubs
authorAndrey Pavlenko <no@email>
Mon, 25 Jul 2011 12:13:37 +0000 (12:13 +0000)
committerAndrey Pavlenko <no@email>
Mon, 25 Jul 2011 12:13:37 +0000 (12:13 +0000)
modules/java/check-tests.py [new file with mode: 0644]

diff --git a/modules/java/check-tests.py b/modules/java/check-tests.py
new file mode 100644 (file)
index 0000000..b3138b7
--- /dev/null
@@ -0,0 +1,85 @@
+import sys, os, re\r
+\r
+class JavaParser:\r
+    def __init__(self):\r
+        self.clear()\r
+\r
+    def clear(self):\r
+        self.mdict = {}\r
+        self.tdict = {}\r
+        self.r1 = re.compile("\s*public\s+(?:static\s+)?(\w+)\(([^)]*)\)") # c-tor\r
+        self.r2 = re.compile("\s*public\s+(?:static\s+)?\w+\s+(\w+)\(([^)]*)\)")\r
+\r
+    def dict2set(self, d):\r
+        s = set()\r
+        for f in d.keys():\r
+            if len(d[f]) == 1:\r
+                s.add(f)\r
+            else:\r
+                s |= set(d[f])\r
+        return s\r
+\r
+\r
+    def get_not_tested(self):\r
+        mset = self.dict2set(self.mdict)\r
+        tset = self.dict2set(self.tdict)\r
+        return mset - tset\r
+\r
+\r
+    def parse(self, path):\r
+        if ".svn" in path:\r
+            return\r
+        if os.path.isfile(path):\r
+            parser.parse_file(path)\r
+        elif os.path.isdir(path):\r
+            for x in os.listdir(path):\r
+                self.parse(path + "/" + x)\r
+        return\r
+\r
+\r
+    def parse_file(self, fname):\r
+        clsname = os.path.basename(fname).replace("Test", "").replace(".java", "")\r
+        clsname = clsname[0].upper() + clsname[1:]\r
+        f = open(fname, "rt")\r
+        for line in f:\r
+            m1 = self.r1.match(line)\r
+            m2 = self.r2.match(line)\r
+            func = ''\r
+            args_str = ''\r
+            if m1:\r
+                func = m1.group(1)\r
+                args_str = m1.group(2)\r
+            elif m2:\r
+                func = m2.group(1)\r
+                args_str = m2.group(2)\r
+            else:\r
+                continue\r
+            d = (self.mdict, self.tdict)["test" in func]\r
+            func = re.sub(r"^test", "", func)\r
+            func = clsname + "--" + func[0].upper() + func[1:]\r
+            args_str = args_str.replace("[]", "Array").replace("...", "Array ")\r
+            args_str = re.sub(r"List<(\w+)>", "ListOf\g<1>", args_str)\r
+            args = [a.split()[0] for a in args_str.split(",") if a]\r
+            func_ex = func + "".join([a[0].upper() + a[1:] for a in args])\r
+            if func in d:\r
+                d[func].append(func_ex)\r
+            else:\r
+                d[func] = [func_ex]\r
+        f.close()\r
+        return\r
+\r
+\r
+if __name__ == '__main__':\r
+    if len(sys.argv) < 2:\r
+        print "Usage:\n", \\r
+            os.path.basename(sys.argv[0]), \\r
+            "<Classes/Tests dir1/file1> [<Classes/Tests dir2/file2> ...]\n", "Not tested methods are logged to stdout."\r
+        exit(0)\r
+    parser = JavaParser()\r
+    for x in sys.argv[1:]:\r
+        parser.parse(x)\r
+    funcs = parser.get_not_tested()\r
+    if funcs:\r
+        print "UNTESTED methods (%i):\n\t" % len(funcs), "\n\t".join(sorted(funcs))\r
+    print "Done."\r
+\r