ui:util:pager: document Nathan Weizenbaum as author of Ruby inspiration
[be.git] / test.py
diff --git a/test.py b/test.py
index 29dece6a0ac7303618cfac0b45f155c63acf0ef9..060452869c9d1c02f15c480ea769d1b55004bccb 100644 (file)
--- a/test.py
+++ b/test.py
@@ -1,15 +1,22 @@
-# Copyright
-
-"""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
-"""
+# Copyright (C) 2005-2012 Aaron Bentley <abentley@panoramicfeedback.com>
+#                         Chris Ball <cjb@laptop.org>
+#                         Marien Zwart <marien.zwart@gmail.com>
+#                         W. Trevor King <wking@tremily.us>
+#
+# This file is part of Bugs Everywhere.
+#
+# Bugs Everywhere 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.
+#
+# Bugs Everywhere 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
+# Bugs Everywhere.  If not, see <http://www.gnu.org/licenses/>.
 
 import doctest
 import os
@@ -21,6 +28,7 @@ import libbe
 libbe.TESTING = True
 from libbe.util.tree import Tree
 from libbe.util.plugin import import_by_name
+from libbe.version import version
 
 def python_tree(root_path='libbe', root_modname='libbe'):
     tree = Tree()
@@ -52,7 +60,11 @@ def python_tree(root_path='libbe', root_modname='libbe'):
     return tree
 
 def add_module_tests(suite, modname):
-    mod = import_by_name(modname)
+    try:
+        mod = import_by_name(modname)
+    except ValueError as e:
+        sys.stderr.write('Failed to import "{}"\n'.format(modname))
+        raise e
     if hasattr(mod, 'suite'):
         s = mod.suite
     else:
@@ -64,27 +76,49 @@ def add_module_tests(suite, modname):
             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
+if __name__ == '__main__':
+    import optparse
+    parser = optparse.OptionParser(usage='%prog [options] [modules ...]',
+                                   description=
+"""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::
 
-result = unittest.TextTestRunner(verbosity=2).run(suite)
+    $ python test.py libbe.bugdir libbe.storage
+""")
+    parser.add_option('-q', '--quiet', action='store_true', default=False,
+                      help='Run unittests in quiet mode (verbosity 1).')
+    options,args = parser.parse_args()
+    sys.stderr.write('Testing BE\n{}\n'.format(version(verbose=True)))
 
-numErrors = len(result.errors)
-numFailures = len(result.failures)
-numBad = numErrors + numFailures
-if numBad > 126:
-    numBad = 1
-sys.exit(numBad)
+    verbosity = 2
+    if options.quiet == True:
+        verbosity = 1
+
+    suite = unittest.TestSuite()
+    tree = python_tree()
+    if len(args) == 0:
+        for node in tree.traverse():
+            add_module_tests(suite, node.modname)
+    else:
+        added = []
+        for modname in args:
+            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=verbosity).run(suite)
+    
+    numErrors = len(result.errors)
+    numFailures = len(result.failures)
+    numBad = numErrors + numFailures
+    if numBad > 126:
+        numBad = 1
+    sys.exit(numBad)