--- /dev/null
+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