From a3f092751ae5f29957c78a7e86381532629c7fa3 Mon Sep 17 00:00:00 2001 From: Armin Rigo Date: Sun, 28 May 2006 19:13:17 +0000 Subject: [PATCH] ("Forward-port" of r46506) Remove various dependencies on dictionary order in the standard library tests, and one (clearly an oversight, potentially critical) in the standard library itself - base64.py. Remaining open issues: * test_extcall is an output test, messy to make robust * tarfile.py has a potential bug here, but I'm not familiar enough with this code. Filed in as SF bug #1496501. * urllib2.HTTPPasswordMgr() returns a random result if there is more than one matching root path. I'm asking python-dev for clarification... --- Lib/base64.py | 4 +++- Lib/doctest.py | 11 ++++++----- Lib/optparse.py | 5 ++++- Lib/test/test_csv.py | 5 ++++- Lib/test/test_itertools.py | 2 +- Lib/test/test_optparse.py | 8 +++----- Lib/test/test_urllib2.py | 1 + Lib/test/test_weakref.py | 4 ++-- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Lib/base64.py b/Lib/base64.py index 8914acce923..c196cd8a841 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -126,7 +126,9 @@ _b32alphabet = { 8: 'I', 17: 'R', 26: '2', } -_b32tab = [v for v in _b32alphabet.values()] +_b32tab = _b32alphabet.items() +_b32tab.sort() +_b32tab = [v for k, v in _b32tab] _b32rev = dict([(v, long(k)) for k, v in _b32alphabet.items()]) diff --git a/Lib/doctest.py b/Lib/doctest.py index 971ec6cc4c1..b87df7c4835 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1056,12 +1056,13 @@ class DocTestRunner: >>> tests = DocTestFinder().find(_TestClass) >>> runner = DocTestRunner(verbose=False) + >>> tests.sort(key = lambda test: test.name) >>> for test in tests: - ... print runner.run(test) - (0, 2) - (0, 1) - (0, 2) - (0, 2) + ... print test.name, '->', runner.run(test) + _TestClass -> (0, 2) + _TestClass.__init__ -> (0, 2) + _TestClass.get -> (0, 2) + _TestClass.square -> (0, 1) The `summarize` method prints a summary of all the test cases that have been run by the runner, and returns an aggregated `(f, t)` diff --git a/Lib/optparse.py b/Lib/optparse.py index 9ac987e819c..6b8f5d10b8d 100644 --- a/Lib/optparse.py +++ b/Lib/optparse.py @@ -611,8 +611,10 @@ class Option: else: setattr(self, attr, None) if attrs: + attrs = attrs.keys() + attrs.sort() raise OptionError( - "invalid keyword arguments: %s" % ", ".join(attrs.keys()), + "invalid keyword arguments: %s" % ", ".join(attrs), self) @@ -1661,6 +1663,7 @@ def _match_abbrev(s, wordmap): raise BadOptionError(s) else: # More than one possible completion: ambiguous prefix. + possibilities.sort() raise AmbiguousOptionError(s, possibilities) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 8511a5ae97d..feb6ddf6139 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -875,7 +875,10 @@ Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back def test_delimiters(self): sniffer = csv.Sniffer() dialect = sniffer.sniff(self.sample3) - self.assertEqual(dialect.delimiter, "0") + # given that all three lines in sample3 are equal, + # I think that any character could have been 'guessed' as the + # delimiter, depending on dictionary order + self.assert_(dialect.delimiter in self.sample3) dialect = sniffer.sniff(self.sample3, delimiters="?,") self.assertEqual(dialect.delimiter, "?") dialect = sniffer.sniff(self.sample3, delimiters="/,") diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 635d1563760..4b631dda480 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -766,7 +766,7 @@ Samuele >>> from operator import itemgetter >>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3) ->>> di = sorted(d.iteritems(), key=itemgetter(1)) +>>> di = sorted(sorted(d.iteritems()), key=itemgetter(1)) >>> for k, g in groupby(di, itemgetter(1)): ... print k, map(itemgetter(0), g) ... diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py index 991c06d4477..79df9066e2c 100644 --- a/Lib/test/test_optparse.py +++ b/Lib/test/test_optparse.py @@ -230,7 +230,7 @@ class TestOptionChecks(BaseTest): def test_attr_invalid(self): self.assertOptionError( - "option -b: invalid keyword arguments: foo, bar", + "option -b: invalid keyword arguments: bar, foo", ["-b"], {'foo': None, 'bar': None}) def test_action_invalid(self): @@ -718,9 +718,8 @@ class TestStandard(BaseTest): def test_ambiguous_option(self): self.parser.add_option("--foz", action="store", type="string", dest="foo") - possibilities = ", ".join({"--foz": None, "--foo": None}.keys()) self.assertParseFail(["--f=bar"], - "ambiguous option: --f (%s?)" % possibilities) + "ambiguous option: --f (--foo, --foz?)") def test_short_and_long_option_split(self): @@ -1537,10 +1536,9 @@ class TestMatchAbbrev(BaseTest): def test_match_abbrev_error(self): s = "--f" wordmap = {"--foz": None, "--foo": None, "--fie": None} - possibilities = ", ".join(wordmap.keys()) self.assertRaises( _match_abbrev, (s, wordmap), None, - BadOptionError, "ambiguous option: --f (%s?)" % possibilities) + BadOptionError, "ambiguous option: --f (--fie, --foo, --foz?)") class TestParseNumber(BaseTest): diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index c8f19bcab02..9203e37fb6a 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -560,6 +560,7 @@ class HandlerTests(unittest.TestCase): self.method = method self.selector = url self.req_headers += headers.items() + self.req_headers.sort() if body: self.data = body if self.raise_on_endheaders: diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 392e5fa34b9..18ab4012fb7 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -1053,8 +1053,8 @@ libreftest = """ Doctest for examples in the library reference: libweakref.tex ... >>> obj = Dict(red=1, green=2, blue=3) # this object is weak referencable >>> r = weakref.ref(obj) ->>> print r() -{'blue': 3, 'green': 2, 'red': 1} +>>> print r() is obj +True >>> import weakref >>> class Object: