SVN: zope.testing/branches/ctheune-importchecking/ Backmerge from trunk.

Christian Theune <[email protected]>
Newsgroups gmane.comp.web.zope.zope3.cvs
Message-ID <20090703154056.009A394179__33326.942244503$1246635670$gmane$org@cvs.zope.org>
Log message for revision 101461:
  Backmerge from trunk.
  

Changed:
  U   zope.testing/branches/ctheune-importchecking/CHANGES.txt
  U   zope.testing/branches/ctheune-importchecking/buildout.cfg
  U   zope.testing/branches/ctheune-importchecking/setup.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/__init__.py
  D   zope.testing/branches/ctheune-importchecking/src/zope/testing/DEPENDENCIES.cfg
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/module.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/__init__.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/formatter.py
  D   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.py
  D   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.txt
  D   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importchecker-fixtures/
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/options.py
  A   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/process.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/runner.py
  D   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/subprocess.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-arguments.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-colors.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-coverage.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging-layer-setup.test
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-edge-cases.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-errors.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-ex/sample2/sampletests_1.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-gc.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-knit.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers-ntd.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-leaks-err.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling-cprofiler.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-progress.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-repeat.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-simple.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-test-selection.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-verbose.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-wo-source.txt
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/tests.py
  U   zope.testing/branches/ctheune-importchecking/src/zope/testing/tests.py

-=-
Modified: zope.testing/branches/ctheune-importchecking/CHANGES.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/CHANGES.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/CHANGES.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -1,19 +1,73 @@
 zope.testing Changelog
 **********************
 
-3.7.2 (unreleased)
+3.7.7 (unreleased)
 ==================
 
-- Added feature that warns about re-imports of symbols that originate
-  from a different location. This allows detecting when classes and
-  functions get moved from one module to another.
+- ...
 
+3.7.6 (2009-07-02)
+==================
+
+- Add zope-testrunner console_scripts entry point. This exposes a
+  zope-testrunner binary with default installs allowing the testrunner to be
+  run from the command line.
+
+3.7.5 (2009-06-08)
+==================
+
+- Fix bug when running subprocesses on Windows.
+
+- The option REPORT_ONLY_FIRST_FAILURE (command line option "-1") is now
+  respected even when a doctest declares its own REPORTING_FLAGS, such as
+  REPORT_NDIFF.
+
+- Fixed bug that broke readline with pdb when using doctest
+  (see http://bugs.python.org/issue5727).
+
+- Made tests pass on Windows and Linux at the same time.
+
+
+3.7.4 (2009-05-01)
+==================
+
+- Filenames of doctest examples now contain the line number and not
+  only the example number. So a stack trace in pdb tells the exact
+  line number of the current example. This fixes
+  https://bugs.launchpad.net/bugs/339813
+
+- Colorization of doctest output correctly handles blank lines.
+
+
+3.7.3 (2009-04-22)
+==================
+
+- Better deal with rogue threads by always exiting with status so even
+  spinning daemon threads won't block the runner from exiting. This deprecated
+  the ``--with-exit-status`` option.
+
+
+3.7.2 (2009-04-13)
+==================
+
+- fix test failure on Python 2.4 because of slight difference in the way
+  coverage is reported (__init__ files with only a single comment line are now
+  not reported)
+- fixed bug that caused the test runner to hang when running subprocesses (as a
+  result Python 2.3 is no longer supported).
+- there is apparently a bug in Python 2.6 (related to
+  http://bugs.python.org/issue1303673) that causes the profile tests to fail.
+- added explanitory notes to buildout.cfg about how to run the tests with
+  multiple versions of Python
+
+
 3.7.1 (2008-10-17)
 ==================
 
 - The setupstack temporary-directory support now properly handles
   read-only files by making them writable before removing them.
 
+
 3.7.0 (2008-09-22)
 ==================
 

Modified: zope.testing/branches/ctheune-importchecking/buildout.cfg
===================================================================
--- zope.testing/branches/ctheune-importchecking/buildout.cfg	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/buildout.cfg	2009-07-03 15:40:55 UTC (rev 101461)
@@ -2,23 +2,33 @@
 develop = .
 parts = test
 
-find-links = http://download.zope.org/distribution/
-
 [test]
 recipe = zc.recipe.testrunner
 eggs = zope.testing
 
-[test23]
-python = python23
-recipe = zc.recipe.testrunner
-eggs = zope.testing
 
+# The [test2X] sections below are to make testing with various Python versions
+# easier.  You'll need entries in your default.cfg that point to the location
+# that your various versions of Python are installed.  Like so:
+#
+# [python2.4]
+# executable = /usr/local/bin/python2.4
+#
+# And then run "bin/buildout install test24 test25 test26" to build the
+# version-specific test scripts.  Once that's done you ran run "bin/test24"
+# (etc.).
+
 [test24]
-python = python24
+python = python2.4
 recipe = zc.recipe.testrunner
 eggs = zope.testing
 
 [test25]
-python = python25
+python = python2.5
 recipe = zc.recipe.testrunner
 eggs = zope.testing
+
+[test26]
+python = python2.6
+recipe = zc.recipe.testrunner
+eggs = zope.testing

Modified: zope.testing/branches/ctheune-importchecking/setup.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/setup.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/setup.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -25,6 +25,7 @@
         install_requires = ['setuptools',
                             'zope.interface'],
         extras_require={'zope_tracebacks': 'zope.exceptions'},
+        entry_points = {'console_scripts': ['zope-testrunner = zope.testing.testrunner:run',]},
         include_package_data = True,
         zip_safe = False,
         )
@@ -79,14 +80,29 @@
 
 setup(
     name='zope.testing',
-    version='3.7.2dev',
+    version = '3.7.7dev',
     url='http://pypi.python.org/pypi/zope.testing',
     license='ZPL 2.1',
     description='Zope testing framework, including the testrunner script.',
     long_description=long_description,
     author='Zope Corporation and Contributors',
-    author_email='[email protected]',
+    author_email='[email protected]',
 
     packages=["zope", "zope.testing"],
     package_dir = {'': 'src'},
+
+    classifiers=[
+        "Development Status :: 5 - Production/Stable",
+        "Environment :: Console",
+        "Framework :: Zope3",
+        "Intended Audience :: Developers",
+        "License :: OSI Approved :: Zope Public License",
+        "Operating System :: OS Independent",
+        "Programming Language :: Python :: 2.4",
+        "Programming Language :: Python :: 2.5",
+        "Programming Language :: Python :: 2.6",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+        "Topic :: Software Development :: Testing",
+        ],
+
     **extra)

Modified: zope.testing/branches/ctheune-importchecking/src/zope/__init__.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/__init__.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/__init__.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -1,7 +1 @@
-# namespace package boilerplate
-try:
-    __import__('pkg_resources').declare_namespace(__name__)
-except ImportError, e:
-    from pkgutil import extend_path
-    __path__ = extend_path(__path__, __name__)
-
+__import__('pkg_resources').declare_namespace(__name__)

Deleted: zope.testing/branches/ctheune-importchecking/src/zope/testing/DEPENDENCIES.cfg
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/DEPENDENCIES.cfg	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/DEPENDENCIES.cfg	2009-07-03 15:40:55 UTC (rev 101461)
@@ -1 +0,0 @@
-zope.exceptions

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -355,9 +355,11 @@
         self.__out = out
         self.__debugger_used = False
         try:
-	    pdb.Pdb.__init__(self, stdin=sys.stdin, stdout=out)
+            pdb.Pdb.__init__(self, stdin=sys.stdin, stdout=out)
         except TypeError:
-            pdb.Pdb.__init__(self) 
+            pdb.Pdb.__init__(self)
+        # enable readline
+        self.use_rawinput = 1
 
     def set_trace(self):
         self.__debugger_used = True
@@ -1345,7 +1347,10 @@
             # Use a special filename for compile(), so we can retrieve
             # the source code during interactive debugging (see
             # __patched_linecache_getlines).
-            filename = '<doctest %s[%d]>' % (test.name, examplenum)
+            # Line number counting starts with 0 so we add one to get
+            # the real line number.
+            filename = '<doctest %s[line %d, example %d]>' % (
+                test.name, example.lineno+1, examplenum)
 
             # Run the example in the given context (globs), and record
             # any exception that gets raised.  (But don't intercept
@@ -1428,9 +1433,10 @@
         self.failures += f
         self.tries += t
 
-    __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
-                                         r'(?P<name>[\w\.]+)'
-                                         r'\[(?P<examplenum>\d+)\]>$')
+    __LINECACHE_FILENAME_RE = re.compile(
+        r'<doctest (?P<name>[\w\.]+)\[line \d+, example (?P<examplenum>\d+)\]>$'
+        )
+
     def __patched_linecache_getlines(self, filename, module_globals=None):
         m = self.__LINECACHE_FILENAME_RE.match(filename)
         if m and m.group('name') == self.test.name:
@@ -2305,6 +2311,9 @@
             # so add the default reporting flags
             optionflags |= _unittest_reportflags
 
+        if _unittest_reportflags & REPORT_ONLY_FIRST_FAILURE:
+            optionflags |= REPORT_ONLY_FIRST_FAILURE
+
         runner = DocTestRunner(optionflags=optionflags,
                                checker=self._dt_checker, verbose=False)
         def write(value):

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/doctest.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -4,7 +4,7 @@
 
 Most `doctest` module tests are located within the module. This file only
 tests a few additional features not covered by the module tests, so that the
-changes to the `doctest` module -- which is forked from the Python stanadrd
+changes to the `doctest` module -- which is forked from the Python standard
 library -- are minimized.
 
 Working with Carriage Returns
@@ -12,7 +12,7 @@
 
 Due to the way releases are made on different platforms, we sometimes test
 files on a *nix system with Windows file endings. Unfortunately, that leaves
-some the tests broken:
+some of the test files broken:
 
   >>> import tempfile
   >>> fn = tempfile.mktemp()

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/module.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/module.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/module.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -89,7 +89,7 @@
   >>> import zope.testing.unlikelymodulename
   Traceback (most recent call last):
     ...
-  ImportError: No module named zope.testing.unlikelymodulename
+  ImportError: No module named unlikelymodulename
 
 This only works for packages that already exist::
  

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/__init__.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/__init__.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/__init__.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -23,16 +23,26 @@
 import zope.testing.testrunner.interfaces
 
 
+def run(defaults=None, args=None):
+    """Main runner function which can be and is being used from main programs.
 
-def run(defaults=None, args=None):
-    # This function is here to make the whole test runner compatible before
-    # the large refactoring.
+    Will execute the tests and exit the process according to the test result.
+
+    """
+    failed = run_internal(defaults, args)
+    sys.exit(int(failed))
+
+
+def run_internal(defaults=None, args=None):
+    """Execute tests.
+
+    Returns whether errors or failures occured during testing.
+
+    """
     # XXX Bah. Lazy import to avoid circular/early import problems
     from zope.testing.testrunner.runner import Runner
     runner = Runner(defaults, args)
     runner.run()
-    if runner.failed and runner.options.exitwithstatus:
-        sys.exit(1)
     return runner.failed
 
 

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/formatter.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/formatter.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/formatter.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -584,12 +584,15 @@
                         self.color('normal'), '\n'])
                 else:
                     print line
-            elif line.startswith('    '):
+            elif line.startswith('    ') or line.strip() == '':
                 if colorize_diff and len(line) > 4:
                     color = self.diff_color.get(line[4], color_of_indented_text)
                     print self.colorize(color, line)
                 else:
-                    print self.colorize(color_of_indented_text, line)
+                    if line.strip() != '':
+                        print self.colorize(color_of_indented_text, line)
+                    else:
+                        print line
             else:
                 colorize_diff = False
                 if line.startswith('Failed example'):

Deleted: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -1,230 +0,0 @@
-# vim:fileencoding=utf-8
-# Copyright (c) 2008 gocept gmbh & co. kg
-# See also LICENSE.txt
-
-# XXX: Is there *any* way to detect instances that are shuffled around?
-
-import ihooks
-import os.path
-import sys
-import types
-import zope.testing.testrunner.feature
-import inspect
-
-
-WHITELIST = [('re', 'match', 'sre'),
-             ('new', 'module', '__builtin__'),
-             ('os', 'error', 'exceptions')]
-
-wrapper_cache = {}
-seen = set()
-
-
-def guess_package_name(frame):
-    """Guess which package a code frame originated from."""
-    if '__name__' in frame.f_globals:
-        return frame.f_globals['__name__']
-    filename = frame.f_globals['__file__']
-    for mod in sys.modules.values():
-        if not hasattr(mod, '__file__'):
-            continue
-        if os.path.dirname(mod.__file__) == os.path.dirname(filename):
-            return mod.__name__
-    raise RuntimeError("Can't guess module name for %r" % frame)
-
-
-def rule_whitelist(import_mod, name, real_mod):
-    # No warning for things on the whitelist.
-    return (import_mod, name, real_mod) in WHITELIST
-
-
-def rule_doctest(import_mod, name, real_mod):
-    # doctest regularly sticks stuff somewhere else. We
-    # ignore those.
-    return real_mod in ['doctest', 'zope.testing.doctest']
-
-
-def rule_stdlib_and_builtins(import_mod, name, real_mod):
-    # Some builtins are redirected within the stdlib (and vice versa)
-    if import_mod == 'sys' and name in ['stdin', 'stdout']:
-        return True
-    if import_mod == 'os' and real_mod == 'posix':
-        return True
-    if name == '__class__' and real_mod == '__builtin__':
-        return True
-    if import_mod == '__builtin__' and real_mod == 'exceptions':
-        return True
-    if (import_mod == 'types' or
-          import_mod.startswith('xml.dom')) and real_mod == '__builtin__':
-        # No warning for the types from the type module that
-        # really originate from builtins
-        return True
-
-
-def rule_intra_package_reimport(import_mod, name, real_mod):
-    # Don't warn if the package of a module re-exports a symbol.
-    return import_mod.split('.') == real_mod.split('.')[:-1]
-
-
-def rule_intra_package_reimport2(import_mod, name, real_mod):
-    # Don't warn if symbols of an underscore module are reimported
-    # by a module belonging to the same package.
-    real_path = real_mod.split('.')
-    real_module = real_path[-1]
-    base = '.'.join(real_path[:-1]) + '.'
-    return real_module.startswith('_') and import_mod.startswith(base)
-
-
-def rule_unclean_c_module(import_mod, name, real_mod):
-    # The real module seems to be a C-Module which is regularly masked using
-    # another Python module in front of it.
-    if (real_mod in sys.modules and
-            hasattr(sys.modules[real_mod], '__file__')):
-        real_file = sys.modules[real_mod].__file__
-        extension = os.path.splitext(real_file)[1]
-        if not extension.startswith('.py'):
-            return True
-    if real_mod.startswith('_') and real_mod == import_mod.split('.')[-1]:
-        # Looks like a C-module which doesn't declare its
-        # package path correctly.
-        return True
-
-
-def rule_zope_deferredimport(import_mod, name, real_mod):
-    if real_mod == 'zope.deferredimport.deferredmodule':
-        return True
-
-
-def rule_internal_underscore_reimport(import_mod, name, real_mod):
-    # Looks like an internal module, prefixed with _ was exported to the same
-    # module name without an _
-    return real_mod.split('.')[-1] == '_' + import_mod.split('.')[-1]
-
-
-
-RULES = [func for name, func in locals().items()
-         if name.startswith('rule_')]
-
-
-class IndirectAttributeAccessChecker(types.ModuleType):
-
-    def __init__(self, module, options):
-        self.__import_checker_module = module
-        self.__import_checker_options = options
-
-    def __eq__(self, other):
-        if isinstance(other, IndirectAttributeAccessChecker):
-            other = (
-                other._IndirectAttributeAccessChecker__import_checker_module)
-        return other == self._IndirectAttributeAccessChecker__import_checker_module
-
-    def __setattr__(self, name, value):
-        if name.startswith('_IndirectAttributeAccessChecker__import_checker_'):
-            object.__setattr__(self, name.replace('_IndirectAttributeAccessChecker', ''), value)
-        else:
-            module = self.__import_checker_module
-            setattr(module, name, value)
-
-    def __getattribute__(self, name):
-        if name.startswith('_IndirectAttributeAccessChecker__import_checker_'):
-            return object.__getattribute__(self, name.replace('_IndirectAttributeAccessChecker', ''))
-        module = self.__import_checker_module
-        attr = getattr(module, name)
-        if not isinstance(attr,
-                (types.ClassType, types.TypeType, types.FunctionType)):
-            return attr
-        if attr.__module__ == module.__name__:
-            return attr
-
-        frame = sys._getframe(1)
-        show_only_from = self.__import_checker_options.indirect_source
-        if show_only_from:
-            for include in show_only_from:
-                if guess_package_name(frame).startswith(include):
-                    break
-            else:
-                # This warning was caused in a module not under the
-                # `indirect source` parameter.
-                return attr
-
-        import_mod, real_mod = module.__name__, attr.__module__
-        for rule in RULES:
-            # Warning suppression rules: if no rule matches, we display
-            # a warning.
-            if rule(import_mod, name, real_mod):
-                break
-        else:
-            attr_type = type(attr).__name__
-            file = frame.f_code.co_filename
-            line = frame.f_lineno
-            signature = (import_mod, name, real_mod, file, line)
-            if signature not in seen:
-                print ("WARNING: indirect import of %s `%s.%s` (originally defined at `%s`)"
-                        % (attr_type, import_mod, name, real_mod))
-                print "caused at %s:%s" % (file, line)
-                seen.add(signature)
-
-        return attr
-
-
-class IndirectImportWarner(ihooks.ModuleImporter):
-
-    def __init__(self, options):
-        ihooks.ModuleImporter.__init__(self)
-        self.options = options
-
-    def import_module(self, name, globals=None, locals=None,
-            fromlist=None):
-        result = ihooks.ModuleImporter.import_module(
-            self, name, globals=globals, locals=locals, fromlist=fromlist)
-        if id(result) not in wrapper_cache:
-            checker = IndirectAttributeAccessChecker(
-                result, self.options)
-            if not hasattr(result, '__all__'):
-                # Support * imports
-                checker.__all__ = [x for x in dir(result) if not
-                        x.startswith('_')]
-            wrapper_cache[id(result)] = checker
-        return wrapper_cache[id(result)]
-
-    def import_it(self, partname, fqname, parent, force_load=0):
-        result = ihooks.ModuleImporter.import_it(self, partname, fqname,
-                parent, force_load)
-        if result is not None:
-            if hasattr(result, '__file__') and not '.' in os.path.basename(result.__file__):
-                # Smells like a package which didn't get __init__.py
-                # attached to its path.
-                result.__file__ = os.path.join(result.__file__, '__init__.py')
-        return result
-
-    def determine_parent(self, globals):
-        if not globals or not "__name__" in globals:
-            return None
-        pname = globals['__name__']
-        if "__path__" in globals:
-            parent = self.modules[pname]
-            # XXX The original class used to use an `assert` here which
-            # conflicts with doctest creating copys of the globs.
-            # assert globals is parent.__dict__
-            return parent
-        if '.' in pname:
-            i = pname.rfind('.')
-            pname = pname[:i]
-            parent = self.modules[pname]
-            assert parent.__name__ == pname
-            return parent
-        return None
-
-
-class ImportChecker(zope.testing.testrunner.feature.Feature):
-    """Monitor indirect imports and warn about them."""
-
-    active = True
-
-    def global_setup(self):
-        if self.runner.options.indirect_imports:
-            ihooks.install(IndirectImportWarner(self.runner.options))
-
-    def global_teardown(self):
-        if self.runner.options.indirect_imports:
-            ihooks.uninstall()

Deleted: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/importcheck.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -1,107 +0,0 @@
-=============
-Import checks
-=============
-
-Import checks are intended to help finding imports of classes and
-functions that have been moved and are still referred to by their old
-location. We usually re-import them at their old location to keep code
-working, but for cleaning up, it's nice to get a heads-up where we still
-refer to the old locations.
-
-Note: Only objects that support `__module__` can be checked for indirect
-reports. This is especially *not* true for instances.
-
-Test-runner integration
-=======================
-
-This test (as it is a test for the test runner) assumes that the test
-runner has the import check enabled. We extend Python's search path to
-include some example modules that trigger the import checker:
-
->>> import sys, os.path
->>> import zope.testing.testrunner
->>> sys.path.insert(0, os.path.join(os.path.dirname(
-...     zope.testing.testrunner.__file__), 'importchecker-fixtures'))
-
-When importing a function or a class from a module that isn't its
-original place of definition, a warning will be printed:
-
->>> import impcheck0
->>> import impcheck0a
->>> import impcheck0b
-WARNING: indirect import of type `impcheck0a.X` (originally defined at `impcheck0`)
-caused at ...impcheck0b.py:NNN
-WARNING: indirect import of function `impcheck0a.y` (originally defined at `impcheck0`)
-caused at ...impcheck0b.py:NNN
-
-
-Heuristics for ignoring re-imports
-==================================
-
-Indirect imports in the standard library
-----------------------------------------
-
-The standard library uses reimports to hide some lower level modules which is
-ok for us.
-
-The types in the `type` module come originally from `__builtin__`. This is ok
-for us and we ignore that:
-
->>> from types import NoneType
->>> NoneType.__module__
-'__builtin__'
-
-The `os` module tends to reimport from locations like `posix`:
-
->>> from os import unlink
->>> unlink.__module__
-'posix'
-
-The `re` module imports its content from the `sre` module:
-
->>> from re import match
-
-
-Indirect imports due to the testing environment
------------------------------------------------
-
-The test runner and `doctest` redirect the stdout temporarily, so sys.stdout
-can be ignored as well:
-
->>> from sys import stdout
->>> stdout.__module__
-'zope.testing.doctest'
-
-
-Indirect imports from packages and their sub-modules
-----------------------------------------------------
-
-We allow indirect imports for the sake of providing an API within a package
-that hides its (sub-)modules. E.g. the following structure is ok, as X is
-defined in module `impcheck1.sub1` and re-imported from `impcheck1`:
-
->>> from impcheck1 import X
->>> from impcheck1.sub1 import X
-
-
-However, we do not allow re-imports from sibling modules:
-
->>> from impcheck1.sub2 import X
-WARNING: indirect import of type `impcheck1.sub2.X` (originally defined at `impcheck1.sub1`)
-caused at <doctest importcheck.txt[15]>:1
-
-
-Also, we only allow one level of re-importing via modules:
-
->>> from impcheck1 import Y
-WARNING: indirect import of type `impcheck1.Y` (originally defined at `impcheck1.sub3.sub3a`)
-caused at <doctest importcheck.txt[16]>:1
-
-
-Indirect imports from C-modules
--------------------------------
-
-Often there are indirect imports from modules that are written in C to provide
-a nicer API for it. We ignore symbols that are re-imported from C:
-
->>> from curses import setupterm

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/options.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/options.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/options.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -314,20 +314,6 @@
 Run the tests under pychecker
 """)
 
-analysis.add_option(
-    '--indirect-imports', '-i', action="store_true", dest='indirect_imports',
-    help="""\
-Inject an import hook and report usage of indirectly imported classes
-and functions.
-""")
-
-analysis.add_option(
-    '--indirect-source', action="append", dest='indirect_source',
-    help="""\
-Only report indirect imports that originated in the given package or
-module (or one of its sub-packages or sub-modules).
-""")
-
 parser.add_option_group(analysis)
 
 ######################################################################
@@ -420,13 +406,6 @@
 other = optparse.OptionGroup(parser, "Other", "Other options")
 
 other.add_option(
-    '--exit-with-status', action="store_true", dest='exitwithstatus',
-    help="""\
-Return an error exit status if the tests failed.  This can be useful for
-an invoking process that wants to monitor the result of a test run.
-""")
-
-other.add_option(
     '-j', action="store", type="int", dest='processes',
     help="""\
 Use up to given number of parallel processes to execute tests.  May decrease
@@ -458,6 +437,12 @@
 compilation to .pyc/.pyo.  Use of this option implies --keepbytecode.
 """)
 
+other.add_option(
+    '--exit-with-status', action="store_true", dest='exitwithstatus',
+    help="""DEPRECATED: The test runner will always exit with a status.\
+""")
+
+
 parser.add_option_group(other)
 
 ######################################################################
@@ -531,7 +516,6 @@
         args = sys.argv
 
     options, positional = parser.parse_args(args[1:], defaults)
-
     options.original_testrunner_args = args
 
     if options.color:

Copied: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/process.py (from rev 101395, zope.testing/trunk/src/zope/testing/testrunner/process.py)
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/process.py	                        (rev 0)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/process.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -0,0 +1,44 @@
+##############################################################################
+#
+# Copyright (c) 2004-2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Subprocess support.
+
+$Id: __init__.py 86218 2008-05-03 14:17:26Z ctheune $
+"""
+
+import sys
+import time
+import zope.testing.testrunner.feature
+
+
+class SubProcess(zope.testing.testrunner.feature.Feature):
+    """Lists all tests in the report instead of running the tests."""
+
+    def __init__(self, runner):
+        super(SubProcess, self).__init__(runner)
+        self.active = bool(runner.options.resume_layer)
+
+    def global_setup(self):
+        self.original_stderr = sys.stderr
+        sys.stderr = sys.stdout
+        self.runner.options.verbose = False
+
+    def report(self):
+        sys.stdout.close()
+        # Communicate with the parent.  The protocol is obvious:
+        print >> self.original_stderr, self.runner.ran, \
+                len(self.runner.failures), len(self.runner.errors)
+        for test, exc_info in self.runner.failures:
+            print >> self.original_stderr, ' '.join(str(test).strip().split('\n'))
+        for test, exc_info in self.runner.errors:
+            print >> self.original_stderr, ' '.join(str(test).strip().split('\n'))

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/runner.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/runner.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/runner.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -16,6 +16,8 @@
 $Id: __init__.py 86232 2008-05-03 15:09:33Z ctheune $
 """
 
+import subprocess
+
 import cStringIO
 import gc
 import glob
@@ -43,12 +45,10 @@
 import zope.testing.testrunner.garbagecollection
 import zope.testing.testrunner.listing
 import zope.testing.testrunner.statistics
-import zope.testing.testrunner.subprocess
+import zope.testing.testrunner.process
 import zope.testing.testrunner.interfaces
 import zope.testing.testrunner.debug
-import zope.testing.testrunner.importcheck
 
-
 PYREFCOUNT_PATTERN = re.compile('\[[0-9]+ refs\]')
 
 is_jython = sys.platform.startswith('java')
@@ -189,11 +189,10 @@
             self.features.append(zope.testing.testrunner.garbagecollection.Debug(self))
 
         self.features.append(zope.testing.testrunner.find.Find(self))
-        self.features.append(zope.testing.testrunner.subprocess.SubProcess(self))
+        self.features.append(zope.testing.testrunner.process.SubProcess(self))
         self.features.append(zope.testing.testrunner.filter.Filter(self))
         self.features.append(zope.testing.testrunner.listing.Listing(self))
         self.features.append(zope.testing.testrunner.statistics.Statistics(self))
-        self.features.append(zope.testing.testrunner.importcheck.ImportChecker(self))
 
         # Remove all features that aren't activated
         self.features = [f for f in self.features if f.active]
@@ -403,47 +402,29 @@
         for feature in features:
             feature.layer_setup(layer)
 
-        subin, subout, suberr = os.popen3(args)
-        while True:
-            try:
-                for line in subout:
-                    result.stdout.append(line)
-            except IOError, e:
-                if e.errno == errno.EINTR:
-                    # If the reading the subprocess input is interruped (as
-                    # be caused by recieving SIGCHLD), then retry.
-                    continue
-                options.output.error(
-                    "Error reading subprocess output for %s" % layer_name)
-                options.output.info(str(e))
-            else:
-                break
+        child = subprocess.Popen(args, shell=False, stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+            close_fds=not sys.platform.startswith('win'))
+        subout, suberr = child.communicate()
 
-        # The subprocess may have spewed any number of things to stderr, so
-        # we'll keep looking until we find the information we're looking for.
-        whole_suberr = ''
-        while True:
-            line = suberr.readline()
-            whole_suberr += line
-            if not line:
-                raise SubprocessError(
-                    'No subprocess summary found', repr(whole_suberr))
-
+        erriter = iter(suberr.splitlines())
+        for line in erriter:
             try:
                 result.num_ran, nfail, nerr = map(int, line.strip().split())
-                break
-            except KeyboardInterrupt:
-                raise
-            except:
+            except ValueError:
                 continue
+            else:
+                break
 
         while nfail > 0:
             nfail -= 1
-            failures.append((suberr.readline().strip(), None))
+            failures.append((erriter.next().strip(), None))
         while nerr > 0:
             nerr -= 1
-            errors.append((suberr.readline().strip(), None))
+            errors.append((erriter.next().strip(), None))
 
+        result.stdout.append(subout)
+
     finally:
         result.done = True
 
@@ -491,7 +472,6 @@
                 current_result = results_iter.next()
             except StopIteration:
                 current_result = None
-
         time.sleep(0.01) # Keep the loop from being too tight.
 
     # Return the total number of tests run.

Deleted: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/subprocess.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/subprocess.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/subprocess.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -1,44 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004-2008 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Subprocess support.
-
-$Id: __init__.py 86218 2008-05-03 14:17:26Z ctheune $
-"""
-
-import sys
-import time
-import zope.testing.testrunner.feature
-
-
-class SubProcess(zope.testing.testrunner.feature.Feature):
-    """Lists all tests in the report instead of running the tests."""
-
-    def __init__(self, runner):
-        super(SubProcess, self).__init__(runner)
-        self.active = bool(runner.options.resume_layer)
-
-    def global_setup(self):
-        self.original_stderr = sys.stderr
-        sys.stderr = sys.stdout
-        self.runner.options.verbose = False
-
-    def report(self):
-        sys.stdout.close()
-        # Communicate with the parent.  The protocol is obvious:
-        print >> self.original_stderr, self.runner.ran, \
-                len(self.runner.failures), len(self.runner.errors)
-        for test, exc_info in self.runner.failures:
-            print >> self.original_stderr, ' '.join(str(test).strip().split('\n'))
-        for test, exc_info in self.runner.errors:
-            print >> self.original_stderr, ' '.join(str(test).strip().split('\n'))

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-arguments.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-arguments.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-arguments.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -12,7 +12,7 @@
     ...     '--tests-pattern', '^sampletestsf?$',
     ...     ]
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults, 'test --layer 111'.split())
+    >>> testrunner.run_internal(defaults, 'test --layer 111'.split())
     Running samplelayers.Layer111 tests:
       Set up samplelayers.Layerx in N.NNN seconds.
       Set up samplelayers.Layer1 in N.NNN seconds.
@@ -38,7 +38,7 @@
     ...     '--tests-pattern', '^sampletestsf?$',
     ...     ]
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults, 'test --layer 111'.split())
+    >>> testrunner.run_internal(defaults, 'test --layer 111'.split())
     Listing samplelayers.Layer111 tests:
       test_x1 (sample1.sampletests.test111.TestA)
       test_y0 (sample1.sampletests.test111.TestA)

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-colors.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-colors.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-colors.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -52,7 +52,7 @@
 A successful test run soothes the developer with warm green colors:
 
     >>> sys.argv = 'test --layer 122 -c'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     {normal}Running samplelayers.Layer122 tests:{normal}
       Set up samplelayers.Layer1 in {green}0.000{normal} seconds.
       Set up samplelayers.Layer12 in {green}0.000{normal} seconds.
@@ -71,7 +71,7 @@
 A failed test run highlights the failures in red:
 
     >>> sys.argv = 'test -c --tests-pattern ^sampletests(f|_e|_f)?$ '.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     {normal}Running samplelayers.Layer1 tests:{normal}
       Set up samplelayers.Layer1 in {green}0.000{normal} seconds.
     {normal}  Ran {green}9{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.001{normal} seconds.{normal}
@@ -118,7 +118,7 @@
     {red}    Traceback (most recent call last):{normal}
     {red}      File ".../doctest.py", line 1356, in __run{normal}
     {red}        compileflags, 1) in test.globs{normal}
-    {red}      File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?{normal}
+    {red}      File "<doctest sample2.sampletests_e.eek[line 2, example 0]>", line 1, in ?{normal}
     {red}        f(){normal}
     {red}      File "testrunner-ex/sample2/sampletests_e.py", line 19, in f{normal}
     {red}        g(){normal}
@@ -154,9 +154,9 @@
     {red}    Traceback (most recent call last):{normal}
     {red}      File ".../doctest.py", line 1356, in __run{normal}
     {red}        compileflags, 1) in test.globs{normal}
-    {red}      File "<doctest e.txt[1]>", line 1, in ?{normal}
+    {red}      File "<doctest e.txt[line 4, example 1]>", line 1, in ?{normal}
     {red}        f(){normal}
-    {red}      File "<doctest e.txt[0]>", line 2, in f{normal}
+    {red}      File "<doctest e.txt[line 1, example 0]>", line 2, in f{normal}
     {red}        return x{normal}
     {red}    NameError: global name 'x' is not defined{normal}
     <BLANKLINE>
@@ -186,7 +186,7 @@
 colors:
 
     >>> sys.argv = 'test --tests-pattern ^pledge$ -c'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     {normal}Running zope.testing.testrunner.layer.UnitTests tests:{normal}
       Set up zope.testing.testrunner.layer.UnitTests in {green}N.NNN{normal} seconds.
     <BLANKLINE>
@@ -218,7 +218,7 @@
 apart:
 
     >>> sys.argv = 'test --tests-pattern ^pledge$ --ndiff -c'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     {normal}Running zope.testing.testrunner.layer.UnitTests tests:{normal}
       Set up zope.testing.testrunner.layer.UnitTests in {green}N.NNN{normal} seconds.
     <BLANKLINE>
@@ -243,14 +243,44 @@
     {normal}Tearing down left over layers:{normal}
       Tear down zope.testing.testrunner.layer.UnitTests in {green}N.NNN{normal} seconds.
 
+Even test failures that have actual blank lines (as opposed to <BLANKLINE>) in
+them are highlighted correctly.
 
+    >>> import zope.testing.testrunner.formatter
+    >>> formatter = zope.testing.testrunner.formatter.ColorfulOutputFormatter(None)
+    >>> formatter.print_doctest_failure("""\
+    ...     File "sometest.txt", line 221, in sometest.txt
+    ... Failed example:
+    ...     foo()
+    ... Expected:
+    ...     Output that contains
+    ...
+    ...     blank lines.
+    ... Got:
+    ...     Output that still contains
+    ...
+    ...     blank lines.""")
+    {normal}    File "sometest.txt", line 221, in sometest.txt{normal}
+    Failed example:
+    {cyan}    foo(){normal}
+    Expected:
+    {green}    Output that contains{normal}
+    <BLANKLINE>
+    {green}    blank lines.{normal}
+    Got:
+    {red}    Output that still contains{normal}
+    <BLANKLINE>
+    {red}    blank lines.{normal}
+    <BLANKLINE>
+
+
 Timing individual tests
 -----------------------
 
 At very high verbosity levels you can see the time taken by each test
 
     >>> sys.argv = 'test -u -t test_one.TestNotMuch -c -vvv'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     {normal}Running tests at level 1{normal}
     {normal}Running zope.testing.testrunner.layer.UnitTests tests:{normal}
       Set up zope.testing.testrunner.layer.UnitTests in {green}N.NNN{normal} seconds.
@@ -272,7 +302,7 @@
 in the test runner to 0 seconds to make all of the tests seem slow.
 
     >>> sys.argv = 'test -u -t test_one.TestNotMuch -c -vvv --slow-test 0'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     {normal}Running tests at level 1{normal}
     {normal}Running zope.testing.testrunner.layer.UnitTests tests:{normal}
       Set up zope.testing.testrunner.layer.UnitTests in {green}N.NNN{normal} seconds.
@@ -298,7 +328,7 @@
 --no-color options will disable colorized output:
 
     >>> sys.argv = 'test --layer 122 -c -C'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
@@ -311,7 +341,7 @@
     False
 
     >>> sys.argv = 'test --layer 122 -c --no-color'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
@@ -332,7 +362,7 @@
 pretends it is a terminal, but the curses module will realize it isn't:
 
     >>> sys.argv = 'test --layer 122 --auto-color'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
@@ -356,7 +386,7 @@
     >>> sys.modules['curses'] = FakeCurses()
 
     >>> sys.argv = 'test --layer 122 --auto-color'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     {normal}Running samplelayers.Layer122 tests:{normal}
       Set up samplelayers.Layer1 in {green}0.000{normal} seconds.
       Set up samplelayers.Layer12 in {green}0.000{normal} seconds.
@@ -375,7 +405,7 @@
     >>> sys.stdout = real_stdout
 
     >>> sys.argv = 'test --layer 122 --auto-color'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-coverage.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-coverage.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-coverage.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -15,7 +15,7 @@
     >>> sys.argv = 'test --coverage=coverage_dir'.split()
 
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Ran 9 tests with 0 failures and 0 errors in 0.000 seconds.
@@ -52,31 +52,7 @@
     Tearing down left over layers:
       Tear down zope.testing.testrunner.layer.UnitTests in 0.000 seconds.
     lines   cov%   module   (path)
-        1   100%   sample1.__init__   (testrunner-ex/sample1/__init__.py)
-        1   100%   sample1.sample11.__init__   (testrunner-ex/sample1/sample11/__init__.py)
-       74    86%   sample1.sample11.sampletests   (testrunner-ex/sample1/sample11/sampletests.py)
-        1   100%   sample1.sample13.__init__   (testrunner-ex/sample1/sample13/__init__.py)
-       48   100%   sample1.sample13.sampletests   (testrunner-ex/sample1/sample13/sampletests.py)
-        1   100%   sample1.sampletests.__init__   (testrunner-ex/sample1/sampletests/__init__.py)
-       48   100%   sample1.sampletests.test1   (testrunner-ex/sample1/sampletests/test1.py)
-       74   100%   sample1.sampletests.test11   (testrunner-ex/sample1/sampletests/test11.py)
-       74   100%   sample1.sampletests.test111   (testrunner-ex/sample1/sampletests/test111.py)
-       74   100%   sample1.sampletests.test112   (testrunner-ex/sample1/sampletests/test112.py)
-       74   100%   sample1.sampletests.test12   (testrunner-ex/sample1/sampletests/test12.py)
-       74   100%   sample1.sampletests.test121   (testrunner-ex/sample1/sampletests/test121.py)
-       74   100%   sample1.sampletests.test122   (testrunner-ex/sample1/sampletests/test122.py)
-       48   100%   sample1.sampletests.test_one   (testrunner-ex/sample1/sampletests/test_one.py)
-       48   100%   sample1.sampletestsf   (testrunner-ex/sample1/sampletestsf.py)
-        1   100%   sample2.__init__   (testrunner-ex/sample2/__init__.py)
-        1   100%   sample2.sample21.__init__   (testrunner-ex/sample2/sample21/__init__.py)
-       48   100%   sample2.sample21.sampletests   (testrunner-ex/sample2/sample21/sampletests.py)
-        1   100%   sample2.sampletests.__init__   (testrunner-ex/sample2/sampletests/__init__.py)
-       48   100%   sample2.sampletests.test_1   (testrunner-ex/sample2/sampletests/test_1.py)
-       48   100%   sample2.sampletests.testone   (testrunner-ex/sample2/sampletests/testone.py)
-        1   100%   sample3.__init__   (testrunner-ex/sample3/__init__.py)
-       48   100%   sample3.sampletests   (testrunner-ex/sample3/sampletests.py)
-       84    85%   samplelayers   (testrunner-ex/samplelayers.py)
-        1   100%   sampletests.__init__   (testrunner-ex/sampletests/__init__.py)
+    ...
        48   100%   sampletests.test1   (testrunner-ex/sampletests/test1.py)
        74   100%   sampletests.test11   (testrunner-ex/sampletests/test11.py)
        74   100%   sampletests.test111   (testrunner-ex/sampletests/test111.py)

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging-layer-setup.test
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging-layer-setup.test	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging-layer-setup.test	2009-07-03 15:40:55 UTC (rev 101461)
@@ -43,7 +43,7 @@
     >>> sys.argv = [testrunner_script]
     >>> import zope.testing.testrunner
     >>> try:
-    ...     zope.testing.testrunner.run(['--path', dir, '-D'])
+    ...     zope.testing.testrunner.run_internal(['--path', dir, '-D'])
     ... finally: sys.stdin = real_stdin
     ... # doctest: +ELLIPSIS
     Running tests.Layer tests:
@@ -98,9 +98,10 @@
 
     >>> import sys
     >>> try:
-    ...     zope.testing.testrunner.run(
+    ...     zope.testing.testrunner.run_internal(
     ...       ['--path', dir, '-Dvv', '--tests-pattern', 'tests2'])
     ... finally: sys.stdin = real_stdin
+    ... # doctest: +ELLIPSIS +REPORT_NDIFF
     Running tests at level 1
     Running tests2.Layer1 tests:
       Set up tests2.Layer1 in 0.000 seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-debugging.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -32,7 +32,7 @@
 
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t set_trace1').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +ELLIPSIS
     Running zope.testing.testrunner.layer.UnitTests tests:
@@ -58,7 +58,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem1 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
     Running zope.testing.testrunner.layer.UnitTests tests:
@@ -87,7 +87,7 @@
     >>> sys.stdin = Input('up\np x\np y\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem_failure1 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
     Running zope.testing.testrunner.layer.UnitTests tests:

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-edge-cases.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-edge-cases.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-edge-cases.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -22,20 +22,18 @@
     ...     '--tests-pattern', '^sampletestsf?$',
     ...     ]
     >>> sys.argv = ['test']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     ... # doctest: +ELLIPSIS
     Test-module import failures:
     <BLANKLINE>
     Module: sampletestsf
     <BLANKLINE>
-    Traceback (most recent call last):
-    ...
     ImportError: No module named sampletestsf
     ...
 
     >>> sys.path.append(directory_with_tests)
     >>> sys.argv = ['test']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     ... # doctest: +ELLIPSIS
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -73,7 +71,7 @@
     ...     sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t set_trace2').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +ELLIPSIS
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -91,7 +89,7 @@
     >>> sys.stdin = Input('n\np x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t set_trace4').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     Running zope.testing.testrunner.layer.UnitTests tests:...
     --Return--
@@ -112,14 +110,14 @@
     >>> sys.stdin = Input('n\np x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t set_trace3').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     Running zope.testing.testrunner.layer.UnitTests tests:...
     --Return--
     > doctest.py(351)set_trace()->None
     -> pdb.Pdb.set_trace(self)
     (Pdb) n
-    > <doctest sample3.sampletests_d.set_trace3[1]>(3)...()
+    > <doctest sample3.sampletests_d.set_trace3[line 3, example 1]>(3)...()
     -> y = x
     (Pdb) p x
     1
@@ -134,14 +132,14 @@
     >>> sys.stdin = Input('n\np x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t set_trace5').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     Running zope.testing.testrunner.layer.UnitTests tests:...
     --Return--
     > doctest.py(351)set_trace()->None
     -> pdb.Pdb.set_trace(self)
     (Pdb) n
-    > <doctest set_trace5.txt[1]>(3)...()
+    > <doctest set_trace5.txt[line 2, example 1]>(3)...()
     -> y = x
     (Pdb) p x
     1
@@ -157,7 +155,7 @@
     >>> sys.stdin = Input('n\np x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t set_trace6').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     Running zope.testing.testrunner.layer.UnitTests tests:...
     --Return--
@@ -178,7 +176,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem2 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -208,7 +206,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem3 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -229,7 +227,7 @@
     <BLANKLINE>
     exceptions.ValueError:
     <BLANKLINE>
-    > <doctest sample3.sampletests_d.post_mortem3[1]>(1)...()
+    > <doctest sample3.sampletests_d.post_mortem3[line 3, example 1]>(1)...()
     (Pdb) p x
     1
     (Pdb) c
@@ -240,7 +238,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem4 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -272,7 +270,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem5 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -294,7 +292,7 @@
     <BLANKLINE>
     exceptions.ValueError:
     <BLANKLINE>
-    > <doctest post_mortem5.txt[1]>(1)...()
+    > <doctest post_mortem5.txt[line 2, example 1]>(1)...()
     (Pdb) p x
     1
     (Pdb) c
@@ -306,7 +304,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem6 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -340,7 +338,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem_failure2 -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -375,7 +373,7 @@
     >>> sys.stdin = Input('p x\nc')
     >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
     ...             ' -t post_mortem_failure.txt -D').split()
-    >>> try: testrunner.run(defaults)
+    >>> try: testrunner.run_internal(defaults)
     ... finally: sys.stdin = real_stdin
     ... # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:...
@@ -407,7 +405,7 @@
 Post-mortem debugging with triple verbosity
 
     >>> sys.argv = 'test --layer samplelayers.Layer1$ -vvv -D'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -432,7 +430,7 @@
     >>> sys.argv = ['test',
     ...             '--tests-pattern', '^sampletests_none_suite$',
     ...     ]
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Test-module import failures:
     <BLANKLINE>
     Module: sample1.sampletests_none_suite
@@ -450,7 +448,7 @@
     >>> sys.argv = ['test',
     ...             '--tests-pattern', '^sampletests_none_test$',
     ...     ]
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Test-module import failures:
     <BLANKLINE>
     Module: sample1.sampletests_none_test
@@ -471,7 +469,7 @@
 repeat count greater than 1
 
     >>> sys.argv = 'test -r'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
             You must use the --repeat (-N) option to specify a repeat
             count greater than 1 when using the --report_refcounts (-r)
             option.
@@ -479,7 +477,7 @@
     True
 
     >>> sys.argv = 'test -r -N1'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
             You must use the --repeat (-N) option to specify a repeat
             count greater than 1 when using the --report_refcounts (-r)
             option.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-errors.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-errors.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-errors.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -16,7 +16,7 @@
     ...     for f in files:
     ...         shutil.copy(os.path.join(root, f),
     ...                     os.path.join(directory_with_tests, root[n:], f))
-    
+
     >>> from zope.testing import testrunner
     >>> defaults = [
     ...     '--path', directory_with_tests,
@@ -24,7 +24,7 @@
     ...     ]
 
     >>> sys.argv = 'test --tests-pattern ^sampletests(f|_e|_f)?$ '.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
     Running samplelayers.Layer1 tests:
     ...
@@ -44,7 +44,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_e.eek[line 2, example 0]>", line 1, in ?
             f()
           File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
             g()
@@ -78,9 +78,9 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest e.txt[1]>", line 1, in ?
+          File "<doctest e.txt[line 4, example 1]>", line 1, in ?
             f()
-          File "<doctest e.txt[0]>", line 2, in f
+          File "<doctest e.txt[line 1, example 0]>", line 2, in f
             return x
         NameError: global name 'x' is not defined
     <BLANKLINE>
@@ -108,7 +108,7 @@
 there'll be a summary of the errors at the end of the test:
 
     >>> sys.argv = 'test --tests-pattern ^sampletests(f|_e|_f)?$ -uv'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
@@ -129,7 +129,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_e.eek[line 2, example 0]>", line 1, in ?
             f()
           File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
             g()
@@ -164,9 +164,9 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest e.txt[1]>", line 1, in ?
+          File "<doctest e.txt[line 4, example 1]>", line 1, in ?
             f()
-          File "<doctest e.txt[0]>", line 2, in f
+          File "<doctest e.txt[line 1, example 0]>", line 2, in f
             return x
         NameError: global name 'x' is not defined
     <BLANKLINE>
@@ -198,7 +198,7 @@
 
     >>> sys.argv = ('test --tests-pattern ^sampletests(f|_e|_f)?$ -u -ssample2'
     ...             ' -p').split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -218,7 +218,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_e.eek[line 2, example 0]>", line 1, in ?
             f()
           File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
             g()
@@ -226,10 +226,10 @@
             x = y + 1
         NameError: global name 'y' is not defined
     <BLANKLINE>
-        2/56 (3.6%)\r
-                   \r
-        3/56 (5.4%)\r
-                   \r
+        2/56 (3.6%)##r##
+                   ##r##
+        3/56 (5.4%)##r##
+                   ##r##
         4/56 (7.1%)
     <BLANKLINE>
     Error in test test3 (sample2.sampletests_e.Test)
@@ -242,10 +242,10 @@
         x = y + 1
     NameError: global name 'y' is not defined
     <BLANKLINE>
-        5/56 (8.9%)\r
-                   \r
-        6/56 (10.7%)\r
-                    \r
+        5/56 (8.9%)##r##
+                   ##r##
+        6/56 (10.7%)##r##
+                    ##r##
         7/56 (12.5%)
     <BLANKLINE>
     Failure in test testrunner-ex/sample2/e.txt
@@ -260,9 +260,9 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest e.txt[1]>", line 1, in ?
+          File "<doctest e.txt[line 4, example 1]>", line 1, in ?
             f()
-          File "<doctest e.txt[0]>", line 2, in f
+          File "<doctest e.txt[line 1, example 0]>", line 2, in f
             return x
         NameError: global name 'x' is not defined
     <BLANKLINE>
@@ -276,85 +276,84 @@
         raise self.failureException, \
     AssertionError: 1 != 0
     <BLANKLINE>
-        9/56 (16.1%)\r
-                    \r
-        10/56 (17.9%)\r
-                     \r
-        11/56 (19.6%)\r
-                     \r
-        12/56 (21.4%)\r
-                     \r
-        13/56 (23.2%)\r
-                     \r
-        14/56 (25.0%)\r
-                     \r
-        15/56 (26.8%)\r
-                     \r
-        16/56 (28.6%)\r
-                     \r
-        17/56 (30.4%)\r
-                     \r
-        18/56 (32.1%)\r
-                     \r
-        19/56 (33.9%)\r
-                     \r
-        20/56 (35.7%)\r
-                     \r
-        24/56 (42.9%)\r
-                     \r
-        25/56 (44.6%)\r
-                     \r
-        26/56 (46.4%)\r
-                     \r
-        27/56 (48.2%)\r
-                     \r
-        28/56 (50.0%)\r
-                     \r
-        29/56 (51.8%)\r
-                     \r
-        30/56 (53.6%)\r
-                     \r
-        31/56 (55.4%)\r
-                     \r
-        32/56 (57.1%)\r
-                     \r
-        33/56 (58.9%)\r
-                     \r
-        34/56 (60.7%)\r
-                     \r
-        35/56 (62.5%)\r
-                     \r
-        36/56 (64.3%)\r
-                     \r
-        40/56 (71.4%)\r
-                     \r
-        41/56 (73.2%)\r
-                     \r
-        42/56 (75.0%)\r
-                     \r
-        43/56 (76.8%)\r
-                     \r
-        44/56 (78.6%)\r
-                     \r
-        45/56 (80.4%)\r
-                     \r
-        46/56 (82.1%)\r
-                     \r
-        47/56 (83.9%)\r
-                     \r
-        48/56 (85.7%)\r
-                     \r
-        49/56 (87.5%)\r
-                     \r
-        50/56 (89.3%)\r
-                     \r
-        51/56 (91.1%)\r
-                     \r
-        52/56 (92.9%)\r
-                     \r
-        56/56 (100.0%)\r
-                      \r
-    <BLANKLINE>
+        9/56 (16.1%)##r##
+                    ##r##
+        10/56 (17.9%)##r##
+                     ##r##
+        11/56 (19.6%)##r##
+                     ##r##
+        12/56 (21.4%)##r##
+                     ##r##
+        13/56 (23.2%)##r##
+                     ##r##
+        14/56 (25.0%)##r##
+                     ##r##
+        15/56 (26.8%)##r##
+                     ##r##
+        16/56 (28.6%)##r##
+                     ##r##
+        17/56 (30.4%)##r##
+                     ##r##
+        18/56 (32.1%)##r##
+                     ##r##
+        19/56 (33.9%)##r##
+                     ##r##
+        20/56 (35.7%)##r##
+                     ##r##
+        24/56 (42.9%)##r##
+                     ##r##
+        25/56 (44.6%)##r##
+                     ##r##
+        26/56 (46.4%)##r##
+                     ##r##
+        27/56 (48.2%)##r##
+                     ##r##
+        28/56 (50.0%)##r##
+                     ##r##
+        29/56 (51.8%)##r##
+                     ##r##
+        30/56 (53.6%)##r##
+                     ##r##
+        31/56 (55.4%)##r##
+                     ##r##
+        32/56 (57.1%)##r##
+                     ##r##
+        33/56 (58.9%)##r##
+                     ##r##
+        34/56 (60.7%)##r##
+                     ##r##
+        35/56 (62.5%)##r##
+                     ##r##
+        36/56 (64.3%)##r##
+                     ##r##
+        40/56 (71.4%)##r##
+                     ##r##
+        41/56 (73.2%)##r##
+                     ##r##
+        42/56 (75.0%)##r##
+                     ##r##
+        43/56 (76.8%)##r##
+                     ##r##
+        44/56 (78.6%)##r##
+                     ##r##
+        45/56 (80.4%)##r##
+                     ##r##
+        46/56 (82.1%)##r##
+                     ##r##
+        47/56 (83.9%)##r##
+                     ##r##
+        48/56 (85.7%)##r##
+                     ##r##
+        49/56 (87.5%)##r##
+                     ##r##
+        50/56 (89.3%)##r##
+                     ##r##
+        51/56 (91.1%)##r##
+                     ##r##
+        52/56 (92.9%)##r##
+                     ##r##
+        56/56 (100.0%)##r##
+                      ##r##
       Ran 56 tests with 3 failures and 1 errors in 0.054 seconds.
     Tearing down left over layers:
       Tear down zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -371,7 +370,7 @@
 examples in the same test to fail.  Each failure is reported:
 
     >>> sys.argv = 'test --tests-pattern ^sampletests_1$'.split()
-    >>> testrunner.run(defaults) # doctest: +NORMALIZE_WHITESPACE
+    >>> testrunner.run_internal(defaults) # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -389,7 +388,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 2, example 0]>", line 1, in ?
             x = y
         NameError: name 'y' is not defined
     ----------------------------------------------------------------------
@@ -401,7 +400,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[1]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 4, example 1]>", line 1, in ?
             x
         NameError: name 'x' is not defined
     ----------------------------------------------------------------------
@@ -413,7 +412,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[2]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 7, example 2]>", line 1, in ?
             z = x + 1
         NameError: name 'x' is not defined
     <BLANKLINE>
@@ -428,7 +427,7 @@
 me the first failed example in a doctest" :)
 
     >>> sys.argv = 'test --tests-pattern ^sampletests_1$ -1'.split()
-    >>> testrunner.run(defaults) # doctest:
+    >>> testrunner.run_internal(defaults) # doctest:
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -446,7 +445,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 2, example 0]>", line 1, in ?
             x = y
         NameError: name 'y' is not defined
     <BLANKLINE>
@@ -461,7 +460,7 @@
     ...     'test --tests-pattern ^sampletests_1$'
     ...     ' --hide-secondary-failures'
     ...     ).split()
-    >>> testrunner.run(defaults) # doctest:
+    >>> testrunner.run_internal(defaults) # doctest:
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -479,7 +478,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 2, example 0]>", line 1, in ?
             x = y
         NameError: name 'y' is not defined
     <BLANKLINE>
@@ -497,7 +496,7 @@
     ...     'test --tests-pattern ^sampletests_1$'
     ...     ' --hide-secondary-failures --show-secondary-failures'
     ...     ).split()
-    >>> testrunner.run(defaults) # doctest: +NORMALIZE_WHITESPACE
+    >>> testrunner.run_internal(defaults) # doctest: +NORMALIZE_WHITESPACE
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -515,7 +514,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 2, example 0]>", line 1, in ?
             x = y
         NameError: name 'y' is not defined
     ----------------------------------------------------------------------
@@ -527,7 +526,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[1]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 4, example 1]>", line 1, in ?
             x
         NameError: name 'x' is not defined
     ----------------------------------------------------------------------
@@ -539,7 +538,7 @@
         Traceback (most recent call last):
           File ".../doctest.py", line 1256, in __run
             compileflags, 1) in test.globs
-          File "<doctest sample2.sampletests_1.eek[2]>", line 1, in ?
+          File "<doctest sample2.sampletests_1.eek[line 7, example 2]>", line 1, in ?
             z = x + 1
         NameError: name 'x' is not defined
     <BLANKLINE>
@@ -558,7 +557,7 @@
 kinds.
 
     >>> sys.argv = 'test --tests-pattern ^pledge$'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -598,7 +597,7 @@
 caret marking the mismatching column positions.
 
     >>> sys.argv = 'test --tests-pattern ^pledge$ --ndiff'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -626,7 +625,7 @@
 The -udiff option requests a standard "unified" diff:
 
     >>> sys.argv = 'test --tests-pattern ^pledge$ --udiff'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -653,7 +652,7 @@
 The -cdiff option requests a standard "context" diff:
 
     >>> sys.argv = 'test --tests-pattern ^pledge$ --cdiff'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -702,13 +701,12 @@
 
     >>> sys.argv = ('test --tests-pattern ^sampletests(f|_i)?$ --layer 1 '
     ...            ).split()
-    >>> testrunner.run(defaults)
-    ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
+    >>> testrunner.run_internal(defaults)
+    ... # doctest: +NORMALIZE_WHITESPACE
     Test-module import failures:
     <BLANKLINE>
     Module: sample2.sampletests_i
     <BLANKLINE>
-    ...
       File "testrunner-ex/sample2/sampletests_i.py", line 1
         importx unittest
                        ^
@@ -718,11 +716,9 @@
     Module: sample2.sample21.sampletests_i
     <BLANKLINE>
     Traceback (most recent call last):
-      ...
       File "testrunner-ex/sample2/sample21/sampletests_i.py", line 15, in ?
         import zope.testing.huh
-      ...
-    ImportError: No module named zope.testing.huh
+    ImportError: No module named huh
     <BLANKLINE>
     <BLANKLINE>
     Module: sample2.sample22.sampletests_i
@@ -733,7 +729,6 @@
     Module: sample2.sample23.sampletests_i
     <BLANKLINE>
     Traceback (most recent call last):
-      ...
       File "testrunner-ex/sample2/sample23/sampletests_i.py", line 18, in ?
         class Test(unittest.TestCase):
       File "testrunner-ex/sample2/sample23/sampletests_i.py", line 23, in Test
@@ -789,7 +784,7 @@
 unicode and another not:
 
     >>> sys.argv = 'test --tests-pattern ^unicode$ -u'.split()
-    >>> testrunner.run(defaults) # doctest: +REPORT_NDIFF
+    >>> testrunner.run_internal(defaults) # doctest: +REPORT_NDIFF
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     <BLANKLINE>
@@ -820,18 +815,19 @@
       Tear down zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     True
 
- 
+
 Reporting Errors to Calling Processes
 -------------------------------------
 
-The testrunner can return an error status, indicating that the tests
+The testrunner returns the error status, indicating that the tests
 failed.  This can be useful for an invoking process that wants to
 monitor the result of a test run.
 
-To use, specify the argument "--exit-with-status".
+This is applied when invoking the testrunner using the ``run()`` function
+instead of ``run_internal()``:
 
     >>> sys.argv = (
-    ...     'test --exit-with-status --tests-pattern ^sampletests_1$'.split())
+    ...     'test --tests-pattern ^sampletests_1$'.split())
     >>> try:
     ...     testrunner.run(defaults)
     ... except SystemExit, e:
@@ -847,14 +843,14 @@
       Tear down zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     exited with code 1
 
-A passing test does not exit.
+Passing tests exit with code 0 according to UNIX practices:
 
     >>> sys.argv = (
-    ...     'test --exit-with-status --tests-pattern ^sampletests$'.split())
+    ...     'test --tests-pattern ^sampletests$'.split())
     >>> try:
     ...     testrunner.run(defaults)
     ... except SystemExit, e2:
-    ...     print 'oops'
+    ...     print 'exited with code', e2.code
     ... else:
     ...     print 'sys.exit was not called'
     ... # doctest: +ELLIPSIS
@@ -869,8 +865,7 @@
     Tearing down left over layers:
       Tear down zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     Total: 364 tests, 0 failures, 0 errors in N.NNN seconds.
-    ...
-    sys.exit was not called
+    exited with code 0
 
 And remove the temporary directory:
 

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-ex/sample2/sampletests_1.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-ex/sample2/sampletests_1.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-ex/sample2/sampletests_1.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -26,4 +26,4 @@
     """
         
 def test_suite():
-    return doctest.DocTestSuite()
+    return doctest.DocTestSuite(optionflags=doctest.REPORT_NDIFF)

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-gc.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-gc.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-gc.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -17,7 +17,7 @@
     >>> from zope.testing import testrunner
 
     >>> sys.argv = 'test --tests-pattern ^gc0$ --gc 0 -vv'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Cyclic garbage collection is disabled.
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
@@ -34,7 +34,7 @@
 by providing a low threshold:
     
     >>> sys.argv = 'test --tests-pattern ^gc1$ --gc 1 -vv'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Cyclic garbage collection threshold set to: (1,)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
@@ -51,7 +51,7 @@
     
     >>> sys.argv = ('test --tests-pattern ^gcset$ --gc 701 --gc 11 --gc 9 -vv'
     ...             .split())
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Cyclic garbage collection threshold set to: (701, 11, 9)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
@@ -79,7 +79,7 @@
     >>> sys.argv = ('test --tests-pattern ^gcstats$ -G DEBUG_STATS'
     ...             ' -G DEBUG_COLLECTABLE -vv'
     ...             .split())
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-knit.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-knit.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-knit.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -41,7 +41,7 @@
     >>> from zope.testing import testrunner
     
     >>> sys.argv = 'test --layer Layer111 -vv'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer111 tests:
       Set up samplelayers.Layerx in 0.000 seconds.
@@ -69,7 +69,7 @@
 or individual packages within knit-in packages:
 
     >>> sys.argv = 'test --package sample4.products -vv'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer111 tests:
       Set up samplelayers.Layerx in 0.000 seconds.
@@ -87,7 +87,7 @@
       Tear down samplelayers.Layer1 in 0.000 seconds.
 
     >>> sys.argv = 'test --package sample4.products.more -vv'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer111 tests:
       Set up samplelayers.Layerx in 0.000 seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers-ntd.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers-ntd.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers-ntd.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -14,7 +14,7 @@
     ...     ]
 
     >>> sys.argv = 'test -ssample2 --tests-pattern sampletests_ntd$'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running sample2.sampletests_ntd.Layer tests:
       Set up sample2.sampletests_ntd.Layer in 0.000 seconds.
       Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
@@ -27,7 +27,7 @@
 resuming tests where it left off:
 
     >>> sys.argv = [testrunner_script, '--tests-pattern', 'sampletests_ntd$']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running sample1.sampletests_ntd.Layer tests:
       Set up sample1.sampletests_ntd.Layer in N.NNN seconds.
       Ran 1 tests with 0 failures and 0 errors in N.NNN seconds.
@@ -85,7 +85,7 @@
 
     >>> sys.argv = [testrunner_script, '--tests-pattern', 'sampletests_ntd$',
     ...             '-D', ]
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running sample1.sampletests_ntd.Layer tests:
       Set up sample1.sampletests_ntd.Layer in N.NNN seconds.
       Ran 1 tests with 0 failures and 0 errors in N.NNN seconds.
@@ -159,7 +159,7 @@
 that is run as a subprocess:
 
     >>> sys.argv = [testrunner_script, '--tests-pattern', 'sampletests_ntds']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running sample1.sampletests_ntds.Layer tests:
       Set up sample1.sampletests_ntds.Layer in 0.000 seconds.
       Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
@@ -246,7 +246,7 @@
 
     >>> sys.argv = [testrunner_script, '-s', 'sample2', '--tests-pattern',
     ...     '(sampletests_ntd$|stderrtest)']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running sample2.sampletests_ntd.Layer tests:
       Set up sample2.sampletests_ntd.Layer in 0.000 seconds.
       Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-layers.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -12,7 +12,7 @@
 
     >>> sys.argv = 'test --layer 112 --layer Unit'.split()
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer112 tests:
       Set up samplelayers.Layerx in N.NNN seconds.
       Set up samplelayers.Layer1 in N.NNN seconds.
@@ -35,7 +35,7 @@
 We can also specify that we want to run only the unit tests:
 
     >>> sys.argv = 'test -u'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
       Ran 192 tests with 0 failures and 0 errors in N.NNN seconds.
@@ -47,7 +47,7 @@
 Or that we want to run all of the tests except for the unit tests:
 
     >>> sys.argv = 'test -f'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in N.NNN seconds.
       Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.
@@ -85,7 +85,7 @@
 Or we can explicitly say that we want both unit and non-unit tests.
 
     >>> sys.argv = 'test -uf'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in N.NNN seconds.
       Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.
@@ -127,7 +127,7 @@
 It is possible to force the layers to run in subprocesses and parallelize them.
 
     >>> sys.argv = [testrunner_script, '-j2']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in N.NNN seconds.
       Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-leaks-err.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-leaks-err.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-leaks-err.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -15,7 +15,7 @@
     >>> from zope.testing import testrunner
     
     >>> sys.argv = 'test -r -N6'.split()
-    >>> _ = testrunner.run(defaults)
+    >>> _ = testrunner.run_internal(defaults)
             The Python you are running was not configured
             with --with-pydebug. This is required to use
             the --report-refcounts option.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling-cprofiler.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling-cprofiler.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling-cprofiler.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -18,7 +18,7 @@
 When the tests are run, we get profiling output::
 
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running...
     ...
        ncalls  tottime  percall  cumtime  percall filename:lineno(function)...
@@ -28,7 +28,7 @@
 
     >>> sys.argv = [testrunner_script, '-ssample2', '--profile=cProfile',
     ...             '--tests-pattern', 'sampletests_ntd']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running...
       Tear down ... not supported...
        ncalls  tottime  percall  cumtime  percall filename:lineno(function)...

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-profiling.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -18,7 +18,7 @@
 When the tests are run, we get profiling output.
 
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer1 tests:
     ...
     Running samplelayers.Layer11 tests:
@@ -34,7 +34,7 @@
 
     >>> sys.argv = [testrunner_script, '-ssample2', '--profile=hotshot',
     ...             '--tests-pattern', 'sampletests_ntd']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running...
       Tear down ... not supported...
        ncalls  tottime  percall  cumtime  percall filename:lineno(function)...

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-progress.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-progress.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-progress.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -15,65 +15,64 @@
 
     >>> sys.argv = 'test --layer 122 -p'.split()
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
       Set up samplelayers.Layer122 in 0.000 seconds.
       Running:
-        1/34 (2.9%)\r
-                   \r
-        2/34 (5.9%)\r
-                   \r
-        3/34 (8.8%)\r
-                   \r
-        4/34 (11.8%)\r
-                    \r
-        5/34 (14.7%)\r
-                    \r
-        6/34 (17.6%)\r
-                    \r
-        7/34 (20.6%)\r
-                    \r
-        8/34 (23.5%)\r
-                    \r
-        9/34 (26.5%)\r
-                    \r
-        10/34 (29.4%)\r
-                     \r
-        11/34 (32.4%)\r
-                     \r
-        12/34 (35.3%)\r
-                     \r
-        17/34 (50.0%)\r
-                     \r
-        18/34 (52.9%)\r
-                     \r
-        19/34 (55.9%)\r
-                     \r
-        20/34 (58.8%)\r
-                     \r
-        21/34 (61.8%)\r
-                     \r
-        22/34 (64.7%)\r
-                     \r
-        23/34 (67.6%)\r
-                     \r
-        24/34 (70.6%)\r
-                     \r
-        25/34 (73.5%)\r
-                     \r
-        26/34 (76.5%)\r
-                     \r
-        27/34 (79.4%)\r
-                     \r
-        28/34 (82.4%)\r
-                     \r
-        29/34 (85.3%)\r
-                     \r
-        34/34 (100.0%)\r
-                      \r
-    <BLANKLINE>
+        1/34 (2.9%)##r##
+                   ##r##
+        2/34 (5.9%)##r##
+                   ##r##
+        3/34 (8.8%)##r##
+                   ##r##
+        4/34 (11.8%)##r##
+                    ##r##
+        5/34 (14.7%)##r##
+                    ##r##
+        6/34 (17.6%)##r##
+                    ##r##
+        7/34 (20.6%)##r##
+                    ##r##
+        8/34 (23.5%)##r##
+                    ##r##
+        9/34 (26.5%)##r##
+                    ##r##
+        10/34 (29.4%)##r##
+                     ##r##
+        11/34 (32.4%)##r##
+                     ##r##
+        12/34 (35.3%)##r##
+                     ##r##
+        17/34 (50.0%)##r##
+                     ##r##
+        18/34 (52.9%)##r##
+                     ##r##
+        19/34 (55.9%)##r##
+                     ##r##
+        20/34 (58.8%)##r##
+                     ##r##
+        21/34 (61.8%)##r##
+                     ##r##
+        22/34 (64.7%)##r##
+                     ##r##
+        23/34 (67.6%)##r##
+                     ##r##
+        24/34 (70.6%)##r##
+                     ##r##
+        25/34 (73.5%)##r##
+                     ##r##
+        26/34 (76.5%)##r##
+                     ##r##
+        27/34 (79.4%)##r##
+                     ##r##
+        28/34 (82.4%)##r##
+                     ##r##
+        29/34 (85.3%)##r##
+                     ##r##
+        34/34 (100.0%)##r##
+                      ##r##
       Ran 34 tests with 0 failures and 0 errors in 0.008 seconds.
     Tearing down left over layers:
       Tear down samplelayers.Layer122 in 0.000 seconds.
@@ -81,7 +80,7 @@
       Tear down samplelayers.Layer1 in 0.000 seconds.
     False
 
-(Note that, in the examples above and below, we show "\r" followed by
+(Note that, in the examples above and below, we show "##r##" followed by
 new lines where carriage returns would appear in actual output.)
 
 Using a single level of verbosity causes test descriptions to be
@@ -89,66 +88,65 @@
 width, when the terminal width can't be determined, is 80:
 
 >>> sys.argv = 'test --layer 122 -pv'.split()
->>> testrunner.run(defaults)
+>>> testrunner.run_internal(defaults)
 Running tests at level 1
 Running samplelayers.Layer122 tests:
   Set up samplelayers.Layer1 in 0.000 seconds.
   Set up samplelayers.Layer12 in 0.000 seconds.
   Set up samplelayers.Layer122 in 0.000 seconds.
   Running:
-    1/34 (2.9%) test_x1 (sample1.sampletests.test122.TestA)\r
-                                                           \r
-    2/34 (5.9%) test_y0 (sample1.sampletests.test122.TestA)\r
-                                                           \r
-    3/34 (8.8%) test_z0 (sample1.sampletests.test122.TestA)\r
-                                                           \r
-    4/34 (11.8%) test_x0 (sample1.sampletests.test122.TestB)\r
-                                                            \r
-    5/34 (14.7%) test_y1 (sample1.sampletests.test122.TestB)\r
-                                                            \r
-    6/34 (17.6%) test_z0 (sample1.sampletests.test122.TestB)\r
-                                                            \r
-    7/34 (20.6%) test_1 (sample1.sampletests.test122.TestNotMuch)\r
-                                                                 \r
-    8/34 (23.5%) test_2 (sample1.sampletests.test122.TestNotMuch)\r
-                                                                 \r
-    9/34 (26.5%) test_3 (sample1.sampletests.test122.TestNotMuch)\r
-                                                                 \r
-    10/34 (29.4%) test_x0 (sample1.sampletests.test122)\r
-                                                       \r
-    11/34 (32.4%) test_y0 (sample1.sampletests.test122)\r
-                                                       \r
-    12/34 (35.3%) test_z1 (sample1.sampletests.test122)\r
-                                                       \r
-    17/34 (50.0%) ... /testrunner-ex/sample1/sampletests/../../sampletestsl.txt\r
-                                                                               \r
-    18/34 (52.9%) test_x1 (sampletests.test122.TestA)\r
-                                                     \r
-    19/34 (55.9%) test_y0 (sampletests.test122.TestA)\r
-                                                     \r
-    20/34 (58.8%) test_z0 (sampletests.test122.TestA)\r
-                                                     \r
-    21/34 (61.8%) test_x0 (sampletests.test122.TestB)\r
-                                                     \r
-    22/34 (64.7%) test_y1 (sampletests.test122.TestB)\r
-                                                     \r
-    23/34 (67.6%) test_z0 (sampletests.test122.TestB)\r
-                                                     \r
-    24/34 (70.6%) test_1 (sampletests.test122.TestNotMuch)\r
-                                                          \r
-    25/34 (73.5%) test_2 (sampletests.test122.TestNotMuch)\r
-                                                          \r
-    26/34 (76.5%) test_3 (sampletests.test122.TestNotMuch)\r
-                                                          \r
-    27/34 (79.4%) test_x0 (sampletests.test122)\r
-                                               \r
-    28/34 (82.4%) test_y0 (sampletests.test122)\r
-                                               \r
-    29/34 (85.3%) test_z1 (sampletests.test122)\r
-                                               \r
-    34/34 (100.0%) ... pe/testing/testrunner-ex/sampletests/../sampletestsl.txt\r
-                                                                               \r
-<BLANKLINE>
+    1/34 (2.9%) test_x1 (sample1.sampletests.test122.TestA)##r##
+                                                           ##r##
+    2/34 (5.9%) test_y0 (sample1.sampletests.test122.TestA)##r##
+                                                           ##r##
+    3/34 (8.8%) test_z0 (sample1.sampletests.test122.TestA)##r##
+                                                           ##r##
+    4/34 (11.8%) test_x0 (sample1.sampletests.test122.TestB)##r##
+                                                            ##r##
+    5/34 (14.7%) test_y1 (sample1.sampletests.test122.TestB)##r##
+                                                            ##r##
+    6/34 (17.6%) test_z0 (sample1.sampletests.test122.TestB)##r##
+                                                            ##r##
+    7/34 (20.6%) test_1 (sample1.sampletests.test122.TestNotMuch)##r##
+                                                                 ##r##
+    8/34 (23.5%) test_2 (sample1.sampletests.test122.TestNotMuch)##r##
+                                                                 ##r##
+    9/34 (26.5%) test_3 (sample1.sampletests.test122.TestNotMuch)##r##
+                                                                 ##r##
+    10/34 (29.4%) test_x0 (sample1.sampletests.test122)##r##
+                                                       ##r##
+    11/34 (32.4%) test_y0 (sample1.sampletests.test122)##r##
+                                                       ##r##
+    12/34 (35.3%) test_z1 (sample1.sampletests.test122)##r##
+                                                       ##r##
+    17/34 (50.0%) ... /testrunner-ex/sample1/sampletests/../../sampletestsl.txt##r##
+                                                                               ##r##
+    18/34 (52.9%) test_x1 (sampletests.test122.TestA)##r##
+                                                     ##r##
+    19/34 (55.9%) test_y0 (sampletests.test122.TestA)##r##
+                                                     ##r##
+    20/34 (58.8%) test_z0 (sampletests.test122.TestA)##r##
+                                                     ##r##
+    21/34 (61.8%) test_x0 (sampletests.test122.TestB)##r##
+                                                     ##r##
+    22/34 (64.7%) test_y1 (sampletests.test122.TestB)##r##
+                                                     ##r##
+    23/34 (67.6%) test_z0 (sampletests.test122.TestB)##r##
+                                                     ##r##
+    24/34 (70.6%) test_1 (sampletests.test122.TestNotMuch)##r##
+                                                          ##r##
+    25/34 (73.5%) test_2 (sampletests.test122.TestNotMuch)##r##
+                                                          ##r##
+    26/34 (76.5%) test_3 (sampletests.test122.TestNotMuch)##r##
+                                                          ##r##
+    27/34 (79.4%) test_x0 (sampletests.test122)##r##
+                                               ##r##
+    28/34 (82.4%) test_y0 (sampletests.test122)##r##
+                                               ##r##
+    29/34 (85.3%) test_z1 (sampletests.test122)##r##
+                                               ##r##
+    34/34 (100.0%) ... pe/testing/testrunner-ex/sampletests/../sampletestsl.txt##r##
+                                                                               ##r##
   Ran 34 tests with 0 failures and 0 errors in 0.008 seconds.
 Tearing down left over layers:
   Tear down samplelayers.Layer122 in 0.000 seconds.
@@ -166,66 +164,65 @@
     ...         return 60
     >>> old_curses = sys.modules.get('curses')
     >>> sys.modules['curses'] = FakeCurses()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
       Set up samplelayers.Layer122 in 0.000 seconds.
       Running:
-        1/34 (2.9%) test_x1 (sample1.sampletests.test122.TestA)\r
-                                                               \r
-        2/34 (5.9%) test_y0 (sample1.sampletests.test122.TestA)\r
-                                                               \r
-        3/34 (8.8%) test_z0 (sample1.sampletests.test122.TestA)\r
-                                                               \r
-        4/34 (11.8%) test_x0 (...le1.sampletests.test122.TestB)\r
-                                                               \r
-        5/34 (14.7%) test_y1 (...le1.sampletests.test122.TestB)\r
-                                                               \r
-        6/34 (17.6%) test_z0 (...le1.sampletests.test122.TestB)\r
-                                                               \r
-        7/34 (20.6%) test_1 (...ampletests.test122.TestNotMuch)\r
-                                                               \r
-        8/34 (23.5%) test_2 (...ampletests.test122.TestNotMuch)\r
-                                                               \r
-        9/34 (26.5%) test_3 (...ampletests.test122.TestNotMuch)\r
-                                                               \r
-        10/34 (29.4%) test_x0 (sample1.sampletests.test122)\r
-                                                           \r
-        11/34 (32.4%) test_y0 (sample1.sampletests.test122)\r
-                                                           \r
-        12/34 (35.3%) test_z1 (sample1.sampletests.test122)\r
-                                                           \r
-        17/34 (50.0%) ... e1/sampletests/../../sampletestsl.txt\r
-                                                               \r
-        18/34 (52.9%) test_x1 (sampletests.test122.TestA)\r
-                                                         \r
-        19/34 (55.9%) test_y0 (sampletests.test122.TestA)\r
-                                                         \r
-        20/34 (58.8%) test_z0 (sampletests.test122.TestA)\r
-                                                         \r
-        21/34 (61.8%) test_x0 (sampletests.test122.TestB)\r
-                                                         \r
-        22/34 (64.7%) test_y1 (sampletests.test122.TestB)\r
-                                                         \r
-        23/34 (67.6%) test_z0 (sampletests.test122.TestB)\r
-                                                         \r
-        24/34 (70.6%) test_1 (sampletests.test122.TestNotMuch)\r
-                                                              \r
-        25/34 (73.5%) test_2 (sampletests.test122.TestNotMuch)\r
-                                                              \r
-        26/34 (76.5%) test_3 (sampletests.test122.TestNotMuch)\r
-                                                              \r
-        27/34 (79.4%) test_x0 (sampletests.test122)\r
-                                                   \r
-        28/34 (82.4%) test_y0 (sampletests.test122)\r
-                                                   \r
-        29/34 (85.3%) test_z1 (sampletests.test122)\r
-                                                   \r
-        34/34 (100.0%) ... r-ex/sampletests/../sampletestsl.txt\r
-                                                               \r
-    <BLANKLINE>
+        1/34 (2.9%) test_x1 (sample1.sampletests.test122.TestA)##r##
+                                                               ##r##
+        2/34 (5.9%) test_y0 (sample1.sampletests.test122.TestA)##r##
+                                                               ##r##
+        3/34 (8.8%) test_z0 (sample1.sampletests.test122.TestA)##r##
+                                                               ##r##
+        4/34 (11.8%) test_x0 (...le1.sampletests.test122.TestB)##r##
+                                                               ##r##
+        5/34 (14.7%) test_y1 (...le1.sampletests.test122.TestB)##r##
+                                                               ##r##
+        6/34 (17.6%) test_z0 (...le1.sampletests.test122.TestB)##r##
+                                                               ##r##
+        7/34 (20.6%) test_1 (...ampletests.test122.TestNotMuch)##r##
+                                                               ##r##
+        8/34 (23.5%) test_2 (...ampletests.test122.TestNotMuch)##r##
+                                                               ##r##
+        9/34 (26.5%) test_3 (...ampletests.test122.TestNotMuch)##r##
+                                                               ##r##
+        10/34 (29.4%) test_x0 (sample1.sampletests.test122)##r##
+                                                           ##r##
+        11/34 (32.4%) test_y0 (sample1.sampletests.test122)##r##
+                                                           ##r##
+        12/34 (35.3%) test_z1 (sample1.sampletests.test122)##r##
+                                                           ##r##
+        17/34 (50.0%) ... e1/sampletests/../../sampletestsl.txt##r##
+                                                               ##r##
+        18/34 (52.9%) test_x1 (sampletests.test122.TestA)##r##
+                                                         ##r##
+        19/34 (55.9%) test_y0 (sampletests.test122.TestA)##r##
+                                                         ##r##
+        20/34 (58.8%) test_z0 (sampletests.test122.TestA)##r##
+                                                         ##r##
+        21/34 (61.8%) test_x0 (sampletests.test122.TestB)##r##
+                                                         ##r##
+        22/34 (64.7%) test_y1 (sampletests.test122.TestB)##r##
+                                                         ##r##
+        23/34 (67.6%) test_z0 (sampletests.test122.TestB)##r##
+                                                         ##r##
+        24/34 (70.6%) test_1 (sampletests.test122.TestNotMuch)##r##
+                                                              ##r##
+        25/34 (73.5%) test_2 (sampletests.test122.TestNotMuch)##r##
+                                                              ##r##
+        26/34 (76.5%) test_3 (sampletests.test122.TestNotMuch)##r##
+                                                              ##r##
+        27/34 (79.4%) test_x0 (sampletests.test122)##r##
+                                                   ##r##
+        28/34 (82.4%) test_y0 (sampletests.test122)##r##
+                                                   ##r##
+        29/34 (85.3%) test_z1 (sampletests.test122)##r##
+                                                   ##r##
+        34/34 (100.0%) ... r-ex/sampletests/../sampletestsl.txt##r##
+                                                               ##r##
       Ran 34 tests with 0 failures and 0 errors in 0.008 seconds.
     Tearing down left over layers:
       Tear down samplelayers.Layer122 in 0.000 seconds.
@@ -239,62 +236,61 @@
 information.
 
     >>> sys.argv = 'test --layer 122 -pvv -t !txt'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
       Set up samplelayers.Layer122 in 0.000 seconds.
       Running:
-        1/24 (4.2%) test_x1 (sample1.sampletests.test122.TestA)\r
-                                                              \r
-        2/24 (8.3%) test_y0 (sample1.sampletests.test122.TestA)\r
-                                                              \r
-        3/24 (12.5%) test_z0 (sample1.sampletests.test122.TestA)\r
-                                                               \r
-        4/24 (16.7%) test_x0 (sample1.sampletests.test122.TestB)\r
-                                                               \r
-        5/24 (20.8%) test_y1 (sample1.sampletests.test122.TestB)\r
-                                                               \r
-        6/24 (25.0%) test_z0 (sample1.sampletests.test122.TestB)\r
-                                                               \r
-        7/24 (29.2%) test_1 (sample1.sampletests.test122.TestNotMuch)\r
-                                                                    \r
-        8/24 (33.3%) test_2 (sample1.sampletests.test122.TestNotMuch)\r
-                                                                    \r
-        9/24 (37.5%) test_3 (sample1.sampletests.test122.TestNotMuch)\r
-                                                                    \r
-        10/24 (41.7%) test_x0 (sample1.sampletests.test122)\r
-                                                          \r
-        11/24 (45.8%) test_y0 (sample1.sampletests.test122)\r
-                                                          \r
-        12/24 (50.0%) test_z1 (sample1.sampletests.test122)\r
-                                                          \r
-        13/24 (54.2%) test_x1 (sampletests.test122.TestA)\r
-                                                        \r
-        14/24 (58.3%) test_y0 (sampletests.test122.TestA)\r
-                                                        \r
-        15/24 (62.5%) test_z0 (sampletests.test122.TestA)\r
-                                                        \r
-        16/24 (66.7%) test_x0 (sampletests.test122.TestB)\r
-                                                        \r
-        17/24 (70.8%) test_y1 (sampletests.test122.TestB)\r
-                                                        \r
-        18/24 (75.0%) test_z0 (sampletests.test122.TestB)\r
-                                                        \r
-        19/24 (79.2%) test_1 (sampletests.test122.TestNotMuch)\r
-                                                             \r
-        20/24 (83.3%) test_2 (sampletests.test122.TestNotMuch)\r
-                                                             \r
-        21/24 (87.5%) test_3 (sampletests.test122.TestNotMuch)\r
-                                                             \r
-        22/24 (91.7%) test_x0 (sampletests.test122)\r
-                                                  \r
-        23/24 (95.8%) test_y0 (sampletests.test122)\r
-                                                  \r
-        24/24 (100.0%) test_z1 (sampletests.test122)\r
-                                                   \r
-    <BLANKLINE>
+        1/24 (4.2%) test_x1 (sample1.sampletests.test122.TestA)##r##
+                                                              ##r##
+        2/24 (8.3%) test_y0 (sample1.sampletests.test122.TestA)##r##
+                                                              ##r##
+        3/24 (12.5%) test_z0 (sample1.sampletests.test122.TestA)##r##
+                                                               ##r##
+        4/24 (16.7%) test_x0 (sample1.sampletests.test122.TestB)##r##
+                                                               ##r##
+        5/24 (20.8%) test_y1 (sample1.sampletests.test122.TestB)##r##
+                                                               ##r##
+        6/24 (25.0%) test_z0 (sample1.sampletests.test122.TestB)##r##
+                                                               ##r##
+        7/24 (29.2%) test_1 (sample1.sampletests.test122.TestNotMuch)##r##
+                                                                    ##r##
+        8/24 (33.3%) test_2 (sample1.sampletests.test122.TestNotMuch)##r##
+                                                                    ##r##
+        9/24 (37.5%) test_3 (sample1.sampletests.test122.TestNotMuch)##r##
+                                                                    ##r##
+        10/24 (41.7%) test_x0 (sample1.sampletests.test122)##r##
+                                                          ##r##
+        11/24 (45.8%) test_y0 (sample1.sampletests.test122)##r##
+                                                          ##r##
+        12/24 (50.0%) test_z1 (sample1.sampletests.test122)##r##
+                                                          ##r##
+        13/24 (54.2%) test_x1 (sampletests.test122.TestA)##r##
+                                                        ##r##
+        14/24 (58.3%) test_y0 (sampletests.test122.TestA)##r##
+                                                        ##r##
+        15/24 (62.5%) test_z0 (sampletests.test122.TestA)##r##
+                                                        ##r##
+        16/24 (66.7%) test_x0 (sampletests.test122.TestB)##r##
+                                                        ##r##
+        17/24 (70.8%) test_y1 (sampletests.test122.TestB)##r##
+                                                        ##r##
+        18/24 (75.0%) test_z0 (sampletests.test122.TestB)##r##
+                                                        ##r##
+        19/24 (79.2%) test_1 (sampletests.test122.TestNotMuch)##r##
+                                                             ##r##
+        20/24 (83.3%) test_2 (sampletests.test122.TestNotMuch)##r##
+                                                             ##r##
+        21/24 (87.5%) test_3 (sampletests.test122.TestNotMuch)##r##
+                                                             ##r##
+        22/24 (91.7%) test_x0 (sampletests.test122)##r##
+                                                  ##r##
+        23/24 (95.8%) test_y0 (sampletests.test122)##r##
+                                                  ##r##
+        24/24 (100.0%) test_z1 (sampletests.test122)##r##
+                                                   ##r##
       Ran 24 tests with 0 failures and 0 errors in 0.006 seconds.
     Tearing down left over layers:
       Tear down samplelayers.Layer122 in 0.000 seconds.
@@ -306,50 +302,49 @@
 with '!' to exclude tests containing the string "txt".
 
     >>> sys.argv = 'test --layer 122 -pvvv -t!(txt|NotMuch)'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
       Set up samplelayers.Layer12 in 0.000 seconds.
       Set up samplelayers.Layer122 in 0.000 seconds.
       Running:
-        1/18 (5.6%) test_x1 (sample1.sampletests.test122.TestA) (0.000 s)\r
-                                                                          \r
-        2/18 (11.1%) test_y0 (sample1.sampletests.test122.TestA) (0.000 s)\r
-                                                                           \r
-        3/18 (16.7%) test_z0 (sample1.sampletests.test122.TestA) (0.000 s)\r
-                                                                           \r
-        4/18 (22.2%) test_x0 (sample1.sampletests.test122.TestB) (0.000 s)\r
-                                                                           \r
-        5/18 (27.8%) test_y1 (sample1.sampletests.test122.TestB) (0.000 s)\r
-                                                                           \r
-        6/18 (33.3%) test_z0 (sample1.sampletests.test122.TestB) (0.000 s)\r
-                                                                           \r
-        7/18 (38.9%) test_x0 (sample1.sampletests.test122) (0.001 s)\r
-                                                                     \r
-        8/18 (44.4%) test_y0 (sample1.sampletests.test122) (0.001 s)\r
-                                                                     \r
-        9/18 (50.0%) test_z1 (sample1.sampletests.test122) (0.001 s)\r
-                                                                     \r
-        10/18 (55.6%) test_x1 (sampletests.test122.TestA) (0.000 s)\r
-                                                                    \r
-        11/18 (61.1%) test_y0 (sampletests.test122.TestA) (0.000 s)\r
-                                                                    \r
-        12/18 (66.7%) test_z0 (sampletests.test122.TestA) (0.000 s)\r
-                                                                    \r
-        13/18 (72.2%) test_x0 (sampletests.test122.TestB) (0.000 s)\r
-                                                                    \r
-        14/18 (77.8%) test_y1 (sampletests.test122.TestB) (0.000 s)\r
-                                                                    \r
-        15/18 (83.3%) test_z0 (sampletests.test122.TestB) (0.000 s)\r
-                                                                    \r
-        16/18 (88.9%) test_x0 (sampletests.test122) (0.001 s)\r
-                                                              \r
-        17/18 (94.4%) test_y0 (sampletests.test122) (0.001 s)\r
-                                                              \r
-        18/18 (100.0%) test_z1 (sampletests.test122) (0.001 s)\r
-                                                               \r
-    <BLANKLINE>
+        1/18 (5.6%) test_x1 (sample1.sampletests.test122.TestA) (0.000 s)##r##
+                                                                          ##r##
+        2/18 (11.1%) test_y0 (sample1.sampletests.test122.TestA) (0.000 s)##r##
+                                                                           ##r##
+        3/18 (16.7%) test_z0 (sample1.sampletests.test122.TestA) (0.000 s)##r##
+                                                                           ##r##
+        4/18 (22.2%) test_x0 (sample1.sampletests.test122.TestB) (0.000 s)##r##
+                                                                           ##r##
+        5/18 (27.8%) test_y1 (sample1.sampletests.test122.TestB) (0.000 s)##r##
+                                                                           ##r##
+        6/18 (33.3%) test_z0 (sample1.sampletests.test122.TestB) (0.000 s)##r##
+                                                                           ##r##
+        7/18 (38.9%) test_x0 (sample1.sampletests.test122) (0.001 s)##r##
+                                                                     ##r##
+        8/18 (44.4%) test_y0 (sample1.sampletests.test122) (0.001 s)##r##
+                                                                     ##r##
+        9/18 (50.0%) test_z1 (sample1.sampletests.test122) (0.001 s)##r##
+                                                                     ##r##
+        10/18 (55.6%) test_x1 (sampletests.test122.TestA) (0.000 s)##r##
+                                                                    ##r##
+        11/18 (61.1%) test_y0 (sampletests.test122.TestA) (0.000 s)##r##
+                                                                    ##r##
+        12/18 (66.7%) test_z0 (sampletests.test122.TestA) (0.000 s)##r##
+                                                                    ##r##
+        13/18 (72.2%) test_x0 (sampletests.test122.TestB) (0.000 s)##r##
+                                                                    ##r##
+        14/18 (77.8%) test_y1 (sampletests.test122.TestB) (0.000 s)##r##
+                                                                    ##r##
+        15/18 (83.3%) test_z0 (sampletests.test122.TestB) (0.000 s)##r##
+                                                                    ##r##
+        16/18 (88.9%) test_x0 (sampletests.test122) (0.001 s)##r##
+                                                              ##r##
+        17/18 (94.4%) test_y0 (sampletests.test122) (0.001 s)##r##
+                                                              ##r##
+        18/18 (100.0%) test_z1 (sampletests.test122) (0.001 s)##r##
+                                                               ##r##
       Ran 18 tests with 0 failures and 0 errors in 0.006 seconds.
     Tearing down left over layers:
       Tear down samplelayers.Layer122 in 0.000 seconds.
@@ -383,23 +378,22 @@
     >>> sys.stdout = Terminal(sys.stdout)
 
     >>> sys.argv = 'test -u -t test_one.TestNotMuch --auto-progress'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
       Running:
-        1/6 (16.7%)\r
-                   \r
-        2/6 (33.3%)\r
-                   \r
-        3/6 (50.0%)\r
-                   \r
-        4/6 (66.7%)\r
-                   \r
-        5/6 (83.3%)\r
-                   \r
-        6/6 (100.0%)\r
-                    \r
-    <BLANKLINE>
+        1/6 (16.7%)##r##
+                   ##r##
+        2/6 (33.3%)##r##
+                   ##r##
+        3/6 (50.0%)##r##
+                   ##r##
+        4/6 (66.7%)##r##
+                   ##r##
+        5/6 (83.3%)##r##
+                   ##r##
+        6/6 (100.0%)##r##
+                    ##r##
       Ran 6 tests with 0 failures and 0 errors in N.NNN seconds.
     Tearing down left over layers:
       Tear down zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -411,7 +405,7 @@
     >>> sys.stdout = real_stdout
 
     >>> sys.argv = 'test -u -t test_one.TestNotMuch --auto-progress'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
       Ran 6 tests with 0 failures and 0 errors in N.NNN seconds.
@@ -428,13 +422,10 @@
 --no-progress:
 
     >>> sys.argv = 'test -u -t test_one.TestNotMuch -p --no-progress'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
       Ran 6 tests with 0 failures and 0 errors in N.NNN seconds.
     Tearing down left over layers:
       Tear down zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
     False
-
-
-

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-repeat.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-repeat.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-repeat.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -14,7 +14,7 @@
 
     >>> sys.argv = 'test --layer 112 --layer UnitTests --repeat 3'.split()
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer112 tests:
       Set up samplelayers.Layerx in 0.000 seconds.
       Set up samplelayers.Layer1 in 0.000 seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-simple.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-simple.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-simple.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -46,7 +46,7 @@
     >>> from zope.testing import testrunner
     >>> import sys
     >>> sys.argv = ['test']
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running samplelayers.Layer1 tests:
       Set up samplelayers.Layer1 in N.NNN seconds.
       Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-test-selection.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-test-selection.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-test-selection.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -13,7 +13,7 @@
 
     >>> sys.argv = 'test --layer 122 -ssample1 -vv'.split()
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -43,7 +43,7 @@
 You can specify multiple packages:
 
     >>> sys.argv = 'test -u  -vv -ssample1 -ssample2'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -163,7 +163,7 @@
     >>> subdir = os.path.join(directory_with_tests, 'sample1')
     >>> sys.argv = ('test --layer 122 -s %s -vv' % subdir).split()
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -193,7 +193,7 @@
 We can select by test module name using the --module (-m) option:
 
     >>> sys.argv = 'test -u  -vv -ssample1 -m_one -mtest1'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -233,7 +233,7 @@
 and by test within the module using the --test (-t) option:
 
     >>> sys.argv = 'test -u  -vv -ssample1 -m_one -mtest1 -tx0 -ty0'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -253,7 +253,7 @@
 
 
     >>> sys.argv = 'test -u  -vv -ssample1 -ttxt'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -274,7 +274,7 @@
 match the regular expression are selected:
 
     >>> sys.argv = 'test -u  -vv -ssample1 -m!sample1[.]sample1'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -328,7 +328,7 @@
 
 
     >>> sys.argv = 'test -u  -vv -ssample1 !sample1[.]sample1'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -379,7 +379,7 @@
 
 
     >>> sys.argv = 'test -u  -vv -ssample1 . txt'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -403,7 +403,7 @@
 
 
     >>> sys.argv = 'test -u  -vv -t test_y1 -t test_y0'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -454,7 +454,7 @@
 additional tests:
 
     >>> sys.argv = 'test -u  -vv -a 2 -t test_y1 -t test_y0'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 2
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -506,7 +506,7 @@
 We can use the --all option to run tests at all levels:
 
     >>> sys.argv = 'test -u  -vv --all -t test_y1 -t test_y0'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at all levels
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -564,7 +564,7 @@
 specifications.
 
     >>> sys.argv = 'test --all -m sample1 -t test_y0 --list-tests'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Listing samplelayers.Layer11 tests:
       test_y0 (sample1.sampletests.test11.TestA)
       test_y0 (sample1.sampletests.test11)

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-verbose.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-verbose.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-verbose.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -15,7 +15,7 @@
     ...     ]
     >>> sys.argv = 'test --layer 122 -v'.split()
     >>> from zope.testing import testrunner
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -34,7 +34,7 @@
 50:
 
     >>> sys.argv = 'test -uv'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -49,7 +49,7 @@
 each test is printed as it is run:
 
     >>> sys.argv = 'test --layer 122 -vv'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -93,7 +93,7 @@
 test-execution times are printed:
 
     >>> sys.argv = 'test --layer 122 -vvv'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running tests at level 1
     Running samplelayers.Layer122 tests:
       Set up samplelayers.Layer1 in 0.000 seconds.
@@ -145,7 +145,7 @@
     ...     '-v'
     ...     ]
     >>> sys.argv = 'test -q -u'.split()
-    >>> testrunner.run(defaults)
+    >>> testrunner.run_internal(defaults)
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
       Ran 192 tests with 0 failures and 0 errors in 0.034 seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-wo-source.txt
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-wo-source.txt	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/testrunner-wo-source.txt	2009-07-03 15:40:55 UTC (rev 101461)
@@ -42,7 +42,7 @@
     ...     '-vv',
     ...     ]
     >>> sys.argv = ['test']
-    >>> testrunner.run(mydefaults)
+    >>> testrunner.run_internal(mydefaults)
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.
@@ -66,7 +66,7 @@
     ...    for f in files:
     ...        if f.endswith(".py"):
     ...            os.remove(os.path.join(root, f))
-    >>> testrunner.run(mydefaults, ["test", "--keepbytecode"])
+    >>> testrunner.run_internal(mydefaults, ["test", "--keepbytecode"])
     Running tests at level 1
     Total: 0 tests, 0 failures, 0 errors in N.NNN seconds.
     False
@@ -77,7 +77,7 @@
 of "removing stale bytecode ..." messages shows that ``--usecompiled``
 also implies ``--keepbytecode``:
 
-    >>> testrunner.run(mydefaults, ["test", "--usecompiled"])
+    >>> testrunner.run_internal(mydefaults, ["test", "--usecompiled"])
     Running tests at level 1
     Running zope.testing.testrunner.layer.UnitTests tests:
       Set up zope.testing.testrunner.layer.UnitTests in N.NNN seconds.

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/tests.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/tests.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/testrunner/tests.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -26,45 +26,103 @@
 from zope.testing import renormalizing
 
 
-checker = renormalizing.RENormalizing([
-    # 2.5 changed the way pdb reports exceptions
-    (re.compile(r"<class 'exceptions.(\w+)Error'>:"),
-                r'exceptions.\1Error:'),
+#separated checkers for the different platform,
+#because it s...s to maintain just one
+if sys.platform == 'win32':
+    checker = renormalizing.RENormalizing([
+        # 2.5 changed the way pdb reports exceptions
+        (re.compile(r"<class 'exceptions.(\w+)Error'>:"),
+                    r'exceptions.\1Error:'),
 
-    (re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
-    (re.compile(r"<module>"),(r'?')),
-    (re.compile(r"<type 'exceptions.(\w+)Error'>:"),
-                r'exceptions.\1Error:'),
-    (re.compile("'[A-Za-z]:\\\\"), "'"), # hopefully, we'll make Windows happy
-    (re.compile(r'\\\\'), '/'), # more Windows happiness
-    (re.compile(r'\\'), '/'), # even more Windows happiness
-    (re.compile('/r'), '\\\\r'), # undo damage from previous
-    (re.compile(r'\r'), '\\\\r\n'),
-    (re.compile(r'\d+[.]\d\d\d seconds'), 'N.NNN seconds'),
-    (re.compile(r'\d+[.]\d\d\d s'), 'N.NNN s'),
-    (re.compile(r'\d+[.]\d\d\d{'), 'N.NNN{'),
-    (re.compile('( |")[^\n]+testrunner-ex'), r'\1testrunner-ex'),
-    (re.compile('( |")[^\n]+testrunner.py'), r'\1testrunner.py'),
-    (re.compile(r'> [^\n]*(doc|unit)test[.]py\(\d+\)'),
-                r'\1test.py(NNN)'),
-    (re.compile(r'[.]py\(\d+\)'), r'.py(NNN)'),
-    (re.compile(r'[.]py:\d+'), r'.py:NNN'),
-    (re.compile(r' line \d+,', re.IGNORECASE), r' Line NNN,'),
-    (re.compile(r' line {([a-z]+)}\d+{', re.IGNORECASE), r' Line {\1}NNN{'),
+        #rewrite pdb prompt to ... the current location
+        #windows, py2.4 pdb seems not to put the '>' on doctest locations
+        #therefore we cut it here
+        (re.compile('^> doctest[^\n]+->None$', re.M), '...->None'),
 
-    # omit traceback entries for unittest.py or doctest.py from
-    # output:
-    (re.compile(r'^ +File "[^\n]*(doc|unit)test.py", [^\n]+\n[^\n]+\n',
-                re.MULTILINE),
-     r''),
-    (re.compile(r'^{\w+} +File "{\w+}[^\n]*(doc|unit)test.py{\w+}", [^\n]+\n[^\n]+\n',
-                re.MULTILINE),
-     r''),
-    (re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
-    (re.compile('import pdb; pdb'), 'Pdb()'), # Py 2.3
-    ])
+        #rewrite pdb prompt to ... the current location
+        (re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
 
+        (re.compile(r"<module>"),(r'?')),
+        (re.compile(r"<type 'exceptions.(\w+)Error'>:"),
+                    r'exceptions.\1Error:'),
 
+        (re.compile("'[A-Za-z]:\\\\"), "'"), # hopefully, we'll make Windows happy
+                                             # replaces drives with nothing
+
+        (re.compile(r'\\\\'), '/'), # more Windows happiness
+                                    # double backslashes in coverage???
+
+        (re.compile(r'\\'), '/'), # even more Windows happiness
+                                  # replaces backslashes in paths
+
+        #this is a magic to put linefeeds into the doctest
+        (re.compile('##r##\n'), '\r'),
+
+        (re.compile(r'\d+[.]\d\d\d seconds'), 'N.NNN seconds'),
+        (re.compile(r'\d+[.]\d\d\d s'), 'N.NNN s'),
+        (re.compile(r'\d+[.]\d\d\d{'), 'N.NNN{'),
+        (re.compile('( |")[^\n]+testrunner-ex'), r'\1testrunner-ex'),
+        (re.compile('( |")[^\n]+testrunner.py'), r'\1testrunner.py'),
+        (re.compile(r'> [^\n]*(doc|unit)test[.]py\(\d+\)'),
+                    r'\1test.py(NNN)'),
+        (re.compile(r'[.]py\(\d+\)'), r'.py(NNN)'),
+        (re.compile(r'[.]py:\d+'), r'.py:NNN'),
+        (re.compile(r' line \d+,', re.IGNORECASE), r' Line NNN,'),
+        (re.compile(r' line {([a-z]+)}\d+{', re.IGNORECASE), r' Line {\1}NNN{'),
+
+        # omit traceback entries for unittest.py or doctest.py from
+        # output:
+        (re.compile(r'^ +File "[^\n]*(doc|unit)test.py", [^\n]+\n[^\n]+\n',
+                    re.MULTILINE),
+         r''),
+        (re.compile(r'^{\w+} +File "{\w+}[^\n]*(doc|unit)test.py{\w+}", [^\n]+\n[^\n]+\n',
+                    re.MULTILINE),
+         r''),
+        #(re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
+        (re.compile('import pdb; pdb'), 'Pdb()'), # Py 2.3
+        ])
+else:
+    #*nix
+    checker = renormalizing.RENormalizing([
+        # 2.5 changed the way pdb reports exceptions
+        (re.compile(r"<class 'exceptions.(\w+)Error'>:"),
+                    r'exceptions.\1Error:'),
+
+        #rewrite pdb prompt to ... the current location
+        (re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
+
+        (re.compile(r"<module>"),(r'?')),
+        (re.compile(r"<type 'exceptions.(\w+)Error'>:"),
+                    r'exceptions.\1Error:'),
+
+        #this is a magic to put linefeeds into the doctest
+        #on win it takes one step, linux is crazy about the same...
+        (re.compile('##r##'), r'\r'),
+        (re.compile(r'\r'), '\\\\r\n'),
+
+        (re.compile(r'\d+[.]\d\d\d seconds'), 'N.NNN seconds'),
+        (re.compile(r'\d+[.]\d\d\d s'), 'N.NNN s'),
+        (re.compile(r'\d+[.]\d\d\d{'), 'N.NNN{'),
+        (re.compile('( |")[^\n]+testrunner-ex'), r'\1testrunner-ex'),
+        (re.compile('( |")[^\n]+testrunner.py'), r'\1testrunner.py'),
+        (re.compile(r'> [^\n]*(doc|unit)test[.]py\(\d+\)'),
+                    r'\1test.py(NNN)'),
+        (re.compile(r'[.]py\(\d+\)'), r'.py(NNN)'),
+        (re.compile(r'[.]py:\d+'), r'.py:NNN'),
+        (re.compile(r' line \d+,', re.IGNORECASE), r' Line NNN,'),
+        (re.compile(r' line {([a-z]+)}\d+{', re.IGNORECASE), r' Line {\1}NNN{'),
+
+        # omit traceback entries for unittest.py or doctest.py from
+        # output:
+        (re.compile(r'^ +File "[^\n]*(doc|unit)test.py", [^\n]+\n[^\n]+\n',
+                    re.MULTILINE),
+         r''),
+        (re.compile(r'^{\w+} +File "{\w+}[^\n]*(doc|unit)test.py{\w+}", [^\n]+\n[^\n]+\n',
+                    re.MULTILINE),
+         r''),
+        (re.compile('import pdb; pdb'), 'Pdb()'), # Py 2.3
+        ])
+
 def setUp(test):
     test.globs['saved-sys-info'] = (
         sys.path[:],
@@ -104,12 +162,12 @@
         'testrunner-repeat.txt',
         'testrunner-gc.txt',
         'testrunner-knit.txt',
-        'importcheck.txt',
         setUp=setUp, tearDown=tearDown,
         optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
         checker=checker),
         doctest.DocTestSuite('zope.testing.testrunner'),
-        doctest.DocTestSuite('zope.testing.testrunner.coverage'),
+        doctest.DocTestSuite('zope.testing.testrunner.coverage',
+            optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE),
         doctest.DocTestSuite('zope.testing.testrunner.options'),
         doctest.DocTestSuite('zope.testing.testrunner.find'),
         ]

Modified: zope.testing/branches/ctheune-importchecking/src/zope/testing/tests.py
===================================================================
--- zope.testing/branches/ctheune-importchecking/src/zope/testing/tests.py	2009-07-03 15:38:58 UTC (rev 101460)
+++ zope.testing/branches/ctheune-importchecking/src/zope/testing/tests.py	2009-07-03 15:40:55 UTC (rev 101461)
@@ -17,9 +17,10 @@
 """
 
 import os
+import re
 import sys
 import unittest
-from zope.testing import doctest, testrunner
+from zope.testing import doctest, testrunner, renormalizing
 
 def test_suite():
     return unittest.TestSuite((
@@ -28,6 +29,15 @@
         doctest.DocTestSuite('zope.testing.server'),
         doctest.DocFileSuite('doctest.txt'),
         doctest.DocFileSuite('formparser.txt'),
-        doctest.DocFileSuite('module.txt'),
+        doctest.DocFileSuite(
+            'module.txt',
+            # when this test is run in isolation, the error message shows the
+            # module name as fully qualified; when it is run as part of the
+            # full test suite, the error message shows the module name as
+            # relative.
+            checker=renormalizing.RENormalizing([
+                (re.compile('No module named zope.testing.unlikelymodulename'),
+                 'No module named unlikelymodulename')])),
         doctest.DocFileSuite('setupstack.txt'),
+        doctest.DocTestSuite(doctest, optionflags=doctest.INTERPRET_FOOTNOTES),
         ))
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.