[conduit: 84/138] Add a progress bar



commit 8be59f51636250e3e14c76542cc6cdbf577f25df
Author: John Carr <john carr unrouted co uk>
Date:   Mon May 4 08:36:35 2009 -0700

    Add a progress bar
---
 test/soup/result.py |  100 +++++++++++++++++++++++++++++++++++++++++++++++++++
 test/soup/soup      |    8 +++--
 2 files changed, 105 insertions(+), 3 deletions(-)

diff --git a/test/soup/result.py b/test/soup/result.py
new file mode 100644
index 0000000..b495a30
--- /dev/null
+++ b/test/soup/result.py
@@ -0,0 +1,100 @@
+
+from soup import UnavailableFeature
+from soup.utils import progressbar
+
+import sys
+import unittest
+
+class TestResult(unittest.TestResult):
+
+    def __init__(self, stream, descriptions, verbosity, num_tests=None):
+        super(TestResult, self).__init__()
+        self.stream = stream
+        self.descriptions = descriptions
+        self.verbosity = verbosity
+        self.num_tests = num_tests
+
+    def startTest(self, test):
+        super(TestResult, self).startTest(test)
+        self.report_test_start(test)
+
+    def stopTest(self, test):
+        super(TestResult, self).stopTest(test)
+        self.report_test_stop(test)
+
+    def addError(self, test, err):
+        if isinstance(err, UnavailableFeature):
+            self.addSkipped(self, test)
+        else:
+            super(TestResult, self).addError(test, err)
+            self.report_error(test)
+
+    def addFailure(self, test, err):
+        super(TestResult, self).addFailure(test, err)
+        self.report_failure(test)
+
+    def addSkipped(self, test):
+        self.report_skipped(test)
+
+    def addSuccess(self, test):
+        super(TestResult, self).addSuccess(test)
+        self.report_success(test)
+
+    # FIXME: Maybe these should be callbacks?
+
+    def report_test_start(self, test):
+        pass
+
+    def report_test_stop(self, test):
+        pass
+
+    def report_error(self, test):
+        pass
+
+    def report_failure(self, test):
+        pass
+
+    def report_skipped(self, test):
+        pass
+
+    def report_success(self, test):
+        pass
+
+
+class SimpleTestResult(TestResult):
+
+    def report_starting(self):
+        self.pb = progressbar.ProgressBar()
+        self.pb.max = self.num_tests
+
+    def report_test_start(self, test):
+        self.pb.update(self.pb.cur + 1)
+
+
+class VerboseConsoleTextResult(TestResult):
+
+    def report_test_start(self, test):
+        print test.shortDescription()
+
+
+class TestRunner(object):
+
+    def __init__(self, stream=sys.stderr, descriptions=0, verbosity=1):
+        self.stream = stream
+        self.descriptions = 0
+        self.verbosity = 0
+
+    def make_results(self, tests):
+        if self.verbosity > 1:
+            klass = VerboseConsoleTextResult
+        else:
+            klass = SimpleTestResult
+
+        return klass(self.stream, self.descriptions, self.verbosity, num_tests=tests.countTestCases())
+
+    def run(self, tests):
+        result = self.make_results(tests)
+        result.report_starting()
+        tests.run(result)
+        return result
+
diff --git a/test/soup/soup b/test/soup/soup
index a3a20d3..9fa679a 100755
--- a/test/soup/soup
+++ b/test/soup/soup
@@ -22,8 +22,10 @@ from test_datatypes import *
 from test_dataprovider import *
 from test_synchronization import *
 
+import result
+
 def run_tests(tests, verbose=False, do_coverage=False):
-    runner = unittest.TextTestRunner(verbosity=2 if verbose else 1)
+    runner = result.TestRunner(verbosity=2 if verbose else 1)
 
     if verbose:
         logging.basicConfig(level=logging.DEBUG)
@@ -33,7 +35,7 @@ def run_tests(tests, verbose=False, do_coverage=False):
         coverage.erase()
         coverage.start()
 
-    result = runner.run(unittest.TestSuite(tests))
+    res = runner.run(unittest.TestSuite(tests))
 
     if do_coverage:
         coverage.stop()
@@ -41,7 +43,7 @@ def run_tests(tests, verbose=False, do_coverage=False):
         coverage.report(modules, ignore_errors=1, show_missing=0)
         coverage.erase()
 
-    sys.exit(not result.wasSuccessful())
+    sys.exit(not res.wasSuccessful())
 
 def list_tests(tests):
     for test in tests:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]