summaryrefslogtreecommitdiffstats
path: root/Lib/unittest/case.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-06-23 18:47:39 (GMT)
committerGitHub <noreply@github.com>2017-06-23 18:47:39 (GMT)
commit48fbe52ac71ea711a4701db909ad1ce2647b09fd (patch)
treeea64577a1775111edd2fe21e422641f23bdc0988 /Lib/unittest/case.py
parentc38e32a10061a7c6d54e7e53ffabf7af7998f045 (diff)
downloadcpython-48fbe52ac71ea711a4701db909ad1ce2647b09fd.zip
cpython-48fbe52ac71ea711a4701db909ad1ce2647b09fd.tar.gz
cpython-48fbe52ac71ea711a4701db909ad1ce2647b09fd.tar.bz2
bpo-30664: The description of a unittest subtest now preserves the (#2265)
order of keyword arguments of TestCase.subTest().
Diffstat (limited to 'Lib/unittest/case.py')
-rw-r--r--Lib/unittest/case.py14
1 files changed, 12 insertions, 2 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index 993aaec..f19afef 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -338,6 +338,16 @@ class _AssertLogsContext(_BaseTestCaseContext):
.format(logging.getLevelName(self.level), self.logger.name))
+class _OrderedChainMap(collections.ChainMap):
+ def __iter__(self):
+ seen = set()
+ for mapping in self.maps:
+ for k in mapping:
+ if k not in seen:
+ seen.add(k)
+ yield k
+
+
class TestCase(object):
"""A class whose instances are single test cases.
@@ -514,7 +524,7 @@ class TestCase(object):
return
parent = self._subtest
if parent is None:
- params_map = collections.ChainMap(params)
+ params_map = _OrderedChainMap(params)
else:
params_map = parent.params.new_child(params)
self._subtest = _SubTest(self, msg, params_map)
@@ -1418,7 +1428,7 @@ class _SubTest(TestCase):
if self.params:
params_desc = ', '.join(
"{}={!r}".format(k, v)
- for (k, v) in sorted(self.params.items()))
+ for (k, v) in self.params.items())
parts.append("({})".format(params_desc))
return " ".join(parts) or '(<subtest>)'