aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/doctest.py
diff options
context:
space:
mode:
authorHugo van Kemenade <1324225+hugovk@users.noreply.github.com>2024-03-27 16:46:35 +0200
committerGitHub <noreply@github.com>2024-03-27 16:46:35 +0200
commitce00de4c8cd39816f992e749c1074487d93abe9d (patch)
treef7d4606de7b2f01311bd43aa955f5f89981277b2 /Lib/doctest.py
parent92397d5ead38dde4154e70d00f24973bcf2a925a (diff)
downloadcpython-ce00de4c8cd39816f992e749c1074487d93abe9d.tar.gz
cpython-ce00de4c8cd39816f992e749c1074487d93abe9d.zip
gh-117225: doctest: only print "and X failed" when non-zero, don't pluralise "1 items" (#117228)
Diffstat (limited to 'Lib/doctest.py')
-rw-r--r--Lib/doctest.py59
1 files changed, 39 insertions, 20 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index 6049423b514..7a9f4e40d81 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -1191,9 +1191,9 @@ class DocTestRunner:
2 tests in _TestClass
2 tests in _TestClass.__init__
2 tests in _TestClass.get
- 1 tests in _TestClass.square
+ 1 test in _TestClass.square
7 tests in 4 items.
- 7 passed and 0 failed.
+ 7 passed.
Test passed.
TestResults(failed=0, attempted=7)
@@ -1568,49 +1568,59 @@ class DocTestRunner:
"""
if verbose is None:
verbose = self._verbose
- notests = []
- passed = []
- failed = []
+
+ notests, passed, failed = [], [], []
total_tries = total_failures = total_skips = 0
- for item in self._stats.items():
- name, (failures, tries, skips) = item
+
+ for name, (failures, tries, skips) in self._stats.items():
assert failures <= tries
total_tries += tries
total_failures += failures
total_skips += skips
+
if tries == 0:
notests.append(name)
elif failures == 0:
passed.append((name, tries))
else:
- failed.append(item)
+ failed.append((name, (failures, tries, skips)))
+
if verbose:
if notests:
- print(f"{len(notests)} items had no tests:")
+ print(f"{_n_items(notests)} had no tests:")
notests.sort()
for name in notests:
print(f" {name}")
+
if passed:
- print(f"{len(passed)} items passed all tests:")
- passed.sort()
- for name, count in passed:
- print(f" {count:3d} tests in {name}")
+ print(f"{_n_items(passed)} passed all tests:")
+ for name, count in sorted(passed):
+ s = "" if count == 1 else "s"
+ print(f" {count:3d} test{s} in {name}")
+
if failed:
print(self.DIVIDER)
- print(f"{len(failed)} items had failures:")
- failed.sort()
- for name, (failures, tries, skips) in failed:
+ print(f"{_n_items(failed)} had failures:")
+ for name, (failures, tries, skips) in sorted(failed):
print(f" {failures:3d} of {tries:3d} in {name}")
+
if verbose:
- print(f"{total_tries} tests in {len(self._stats)} items.")
- print(f"{total_tries - total_failures} passed and {total_failures} failed.")
+ s = "" if total_tries == 1 else "s"
+ print(f"{total_tries} test{s} in {_n_items(self._stats)}.")
+
+ and_f = f" and {total_failures} failed" if total_failures else ""
+ print(f"{total_tries - total_failures} passed{and_f}.")
+
if total_failures:
- msg = f"***Test Failed*** {total_failures} failures"
+ s = "" if total_failures == 1 else "s"
+ msg = f"***Test Failed*** {total_failures} failure{s}"
if total_skips:
- msg = f"{msg} and {total_skips} skipped tests"
+ s = "" if total_skips == 1 else "s"
+ msg = f"{msg} and {total_skips} skipped test{s}"
print(f"{msg}.")
elif verbose:
print("Test passed.")
+
return TestResults(total_failures, total_tries, skipped=total_skips)
#/////////////////////////////////////////////////////////////////
@@ -1627,6 +1637,15 @@ class DocTestRunner:
d[name] = (failures, tries, skips)
+def _n_items(items: list) -> str:
+ """
+ Helper to pluralise the number of items in a list.
+ """
+ n = len(items)
+ s = "" if n == 1 else "s"
+ return f"{n} item{s}"
+
+
class OutputChecker:
"""
A class used to check the whether the actual output from a doctest