Updated copyright information
[be.git] / test.py
diff --git a/test.py b/test.py
index 8913c1f835b6797d412a36d2e22b6bfef204d100..fc7e5d3ed84bd986317bec0b52d7286ef6779743 100644 (file)
--- a/test.py
+++ b/test.py
-from libbe import plugin
+# Copyright (C) 2005-2010 Aaron Bentley and Panometrics, Inc.
+#                         Marien Zwart <marienz@gentoo.org>
+#                         W. Trevor King <wking@drexel.edu>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+"""Usage: python test.py [module(s) ...]
+
+When called without optional module names, run the test suites for
+*all* modules.  This may raise lots of errors if you haven't installed
+one of the versioning control systems.
+
+When called with module name arguments, only run the test suites from
+those modules and their submodules.  For example:
+  python test.py libbe.bugdir libbe.storage
+"""
+
 import doctest
+import os
+import os.path
 import sys
-if len(sys.argv) > 1:
-    match = False
-    mod = plugin.get_plugin("libbe", sys.argv[1])
-    if mod is not None:
-        doctest.testmod(mod)
-        match = True
-    mod = plugin.get_plugin("becommands", sys.argv[1])
-    if mod is not None:
-        doctest.testmod(mod)
-        match = True
-    if not match:
-        print "No modules match \"%s\"" % sys.argv[1]
-else:    
-    for module in plugin.iter_plugins("libbe"):
-        doctest.testmod(module[1])
-    for module in plugin.iter_plugins("becommands"):
-        doctest.testmod(module[1])
+import unittest
+
+import libbe
+libbe.TESTING = True
+from libbe.util.tree import Tree
+from libbe.util.plugin import import_by_name
+
+def python_tree(root_path='libbe', root_modname='libbe'):
+    tree = Tree()
+    tree.path = root_path
+    tree.parent = None
+    stack = [tree]
+    while len(stack) > 0:
+        f = stack.pop(0)
+        if f.path.endswith('.py'):
+            f.name = os.path.basename(f.path)[:-len('.py')]
+        elif os.path.isdir(f.path) \
+                and os.path.exists(os.path.join(f.path, '__init__.py')):
+            f.name = os.path.basename(f.path)
+            f.is_module = True
+            for child in os.listdir(f.path):
+                if child == '__init__.py':
+                    continue
+                c = Tree()
+                c.path = os.path.join(f.path, child)
+                c.parent = f
+                stack.append(c)
+        else:
+            continue
+        if f.parent == None:
+            f.modname = root_modname
+        else:
+            f.modname = f.parent.modname + '.' + f.name
+            f.parent.append(f)
+    return tree
+
+def add_module_tests(suite, modname):
+    try:
+        mod = import_by_name(modname)
+    except ValueError, e:
+        print >> sys.stderr, 'Failed to import "%s"' % (modname)
+        raise e
+    if hasattr(mod, 'suite'):
+        s = mod.suite
+    else:
+        s = unittest.TestLoader().loadTestsFromModule(mod)
+        try:
+            sdoc = doctest.DocTestSuite(mod)
+            suite.addTest(sdoc)
+        except ValueError:
+            pass
+    suite.addTest(s)
+
+suite = unittest.TestSuite()
+tree = python_tree()
+if len(sys.argv) <= 1:
+    for node in tree.traverse():
+        add_module_tests(suite, node.modname)
+else:
+    added = []
+    for modname in sys.argv[1:]:
+        for node in tree.traverse():
+            if node.modname == modname:
+                for n in node.traverse():
+                    if n.modname not in added:
+                        add_module_tests(suite, n.modname)
+                        added.append(n.modname)
+                break
+
+result = unittest.TextTestRunner(verbosity=2).run(suite)
+
+numErrors = len(result.errors)
+numFailures = len(result.failures)
+numBad = numErrors + numFailures
+if numBad > 126:
+    numBad = 1
+sys.exit(numBad)