blob: a85298e26f33512314ed0d3cedc584b673f31522 [file] [log] [blame]
Tim Petersa814db52001-05-14 07:05:58 +00001import pprint
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002import test.support
Fred Drake43913dd2001-05-14 17:41:20 +00003import unittest
Christian Heimes969fe572008-01-25 11:23:10 +00004import test.test_set
Raymond Hettingera7da1662009-11-19 01:07:05 +00005import random
Raymond Hettingerbad3c882010-09-09 12:31:00 +00006import collections
7import itertools
Tim Petersa814db52001-05-14 07:05:58 +00008
Walter Dörwald7a7ede52003-12-03 20:15:28 +00009# list, tuple and dict subclasses that do or don't overwrite __repr__
10class list2(list):
11 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000012
Walter Dörwald7a7ede52003-12-03 20:15:28 +000013class list3(list):
14 def __repr__(self):
15 return list.__repr__(self)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000016
Walter Dörwald7a7ede52003-12-03 20:15:28 +000017class tuple2(tuple):
18 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000019
Walter Dörwald7a7ede52003-12-03 20:15:28 +000020class tuple3(tuple):
21 def __repr__(self):
22 return tuple.__repr__(self)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000023
Serhiy Storchaka51844382013-10-02 11:40:49 +030024class set2(set):
25 pass
26
27class set3(set):
28 def __repr__(self):
29 return set.__repr__(self)
30
31class frozenset2(frozenset):
32 pass
33
34class frozenset3(frozenset):
35 def __repr__(self):
36 return frozenset.__repr__(self)
37
Walter Dörwald7a7ede52003-12-03 20:15:28 +000038class dict2(dict):
39 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000040
Walter Dörwald7a7ede52003-12-03 20:15:28 +000041class dict3(dict):
42 def __repr__(self):
43 return dict.__repr__(self)
Tim Petersa814db52001-05-14 07:05:58 +000044
Raymond Hettingera7da1662009-11-19 01:07:05 +000045class Unorderable:
46 def __repr__(self):
47 return str(id(self))
48
Fred Drake43913dd2001-05-14 17:41:20 +000049class QueryTestCase(unittest.TestCase):
Tim Petersa814db52001-05-14 07:05:58 +000050
Fred Drake43913dd2001-05-14 17:41:20 +000051 def setUp(self):
Guido van Rossum805365e2007-05-07 22:24:25 +000052 self.a = list(range(100))
53 self.b = list(range(200))
Fred Drake43913dd2001-05-14 17:41:20 +000054 self.a[-12] = self.b
Tim Petersa814db52001-05-14 07:05:58 +000055
Fred Drake43913dd2001-05-14 17:41:20 +000056 def test_basic(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000057 # Verify .isrecursive() and .isreadable() w/o recursion
Fred Drakeb456e4f2002-12-31 07:16:16 +000058 pp = pprint.PrettyPrinter()
Walter Dörwald5de48bd2007-06-11 21:38:39 +000059 for safe in (2, 2.0, 2j, "abc", [3], (2,2), {3: 3}, "yaddayadda",
Fred Drake43913dd2001-05-14 17:41:20 +000060 self.a, self.b):
Fred Drakeb456e4f2002-12-31 07:16:16 +000061 # module-level convenience functions
Ezio Melottib19f43d2010-01-24 20:59:24 +000062 self.assertFalse(pprint.isrecursive(safe),
63 "expected not isrecursive for %r" % (safe,))
64 self.assertTrue(pprint.isreadable(safe),
65 "expected isreadable for %r" % (safe,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000066 # PrettyPrinter methods
Ezio Melottib19f43d2010-01-24 20:59:24 +000067 self.assertFalse(pp.isrecursive(safe),
68 "expected not isrecursive for %r" % (safe,))
69 self.assertTrue(pp.isreadable(safe),
70 "expected isreadable for %r" % (safe,))
Tim Petersa814db52001-05-14 07:05:58 +000071
Fred Drake43913dd2001-05-14 17:41:20 +000072 def test_knotted(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000073 # Verify .isrecursive() and .isreadable() w/ recursion
Fred Drake43913dd2001-05-14 17:41:20 +000074 # Tie a knot.
75 self.b[67] = self.a
76 # Messy dict.
77 self.d = {}
78 self.d[0] = self.d[1] = self.d[2] = self.d
Tim Petersa814db52001-05-14 07:05:58 +000079
Fred Drakeb456e4f2002-12-31 07:16:16 +000080 pp = pprint.PrettyPrinter()
Tim Petersa814db52001-05-14 07:05:58 +000081
Fred Drake43913dd2001-05-14 17:41:20 +000082 for icky in self.a, self.b, self.d, (self.d, self.d):
Ezio Melottib19f43d2010-01-24 20:59:24 +000083 self.assertTrue(pprint.isrecursive(icky), "expected isrecursive")
84 self.assertFalse(pprint.isreadable(icky), "expected not isreadable")
85 self.assertTrue(pp.isrecursive(icky), "expected isrecursive")
86 self.assertFalse(pp.isreadable(icky), "expected not isreadable")
Fred Drake43913dd2001-05-14 17:41:20 +000087
88 # Break the cycles.
89 self.d.clear()
90 del self.a[:]
91 del self.b[:]
92
93 for safe in self.a, self.b, self.d, (self.d, self.d):
Fred Drakeb456e4f2002-12-31 07:16:16 +000094 # module-level convenience functions
Ezio Melottib19f43d2010-01-24 20:59:24 +000095 self.assertFalse(pprint.isrecursive(safe),
96 "expected not isrecursive for %r" % (safe,))
97 self.assertTrue(pprint.isreadable(safe),
98 "expected isreadable for %r" % (safe,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000099 # PrettyPrinter methods
Ezio Melottib19f43d2010-01-24 20:59:24 +0000100 self.assertFalse(pp.isrecursive(safe),
101 "expected not isrecursive for %r" % (safe,))
102 self.assertTrue(pp.isreadable(safe),
103 "expected isreadable for %r" % (safe,))
Fred Drake43913dd2001-05-14 17:41:20 +0000104
105 def test_unreadable(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000106 # Not recursive but not readable anyway
Fred Drakeb456e4f2002-12-31 07:16:16 +0000107 pp = pprint.PrettyPrinter()
Fred Drake43913dd2001-05-14 17:41:20 +0000108 for unreadable in type(3), pprint, pprint.isrecursive:
Fred Drakeb456e4f2002-12-31 07:16:16 +0000109 # module-level convenience functions
Ezio Melottib19f43d2010-01-24 20:59:24 +0000110 self.assertFalse(pprint.isrecursive(unreadable),
111 "expected not isrecursive for %r" % (unreadable,))
112 self.assertFalse(pprint.isreadable(unreadable),
113 "expected not isreadable for %r" % (unreadable,))
Fred Drakeb456e4f2002-12-31 07:16:16 +0000114 # PrettyPrinter methods
Ezio Melottib19f43d2010-01-24 20:59:24 +0000115 self.assertFalse(pp.isrecursive(unreadable),
116 "expected not isrecursive for %r" % (unreadable,))
117 self.assertFalse(pp.isreadable(unreadable),
118 "expected not isreadable for %r" % (unreadable,))
Fred Drake43913dd2001-05-14 17:41:20 +0000119
Tim Peters95b3f782001-05-14 18:39:41 +0000120 def test_same_as_repr(self):
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000121 # Simple objects, small containers and classes that overwrite __repr__
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000122 # For those the result should be the same as repr().
123 # Ahem. The docs don't say anything about that -- this appears to
124 # be testing an implementation quirk. Starting in Python 2.5, it's
125 # not true for dicts: pprint always sorts dicts by key now; before,
126 # it sorted a dict display if and only if the display required
127 # multiple lines. For that reason, dicts with more than one element
128 # aren't tested here.
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000129 for simple in (0, 0, 0+0j, 0.0, "", b"",
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000130 (), tuple2(), tuple3(),
131 [], list2(), list3(),
Serhiy Storchaka51844382013-10-02 11:40:49 +0300132 set(), set2(), set3(),
133 frozenset(), frozenset2(), frozenset3(),
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000134 {}, dict2(), dict3(),
Ezio Melottib19f43d2010-01-24 20:59:24 +0000135 self.assertTrue, pprint,
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000136 -6, -6, -6-6j, -1.5, "x", b"x", (3,), [3], {3: 6},
Benjamin Petersond23f8222009-04-05 19:13:16 +0000137 (1,2), [3,4], {5: 6},
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000138 tuple2((1,2)), tuple3((1,2)), tuple3(range(100)),
139 [3,4], list2([3,4]), list3([3,4]), list3(range(100)),
Serhiy Storchaka51844382013-10-02 11:40:49 +0300140 set({7}), set2({7}), set3({7}),
141 frozenset({8}), frozenset2({8}), frozenset3({8}),
Benjamin Petersond23f8222009-04-05 19:13:16 +0000142 dict2({5: 6}), dict3({5: 6}),
Tim Peters95b3f782001-05-14 18:39:41 +0000143 range(10, -11, -1)
144 ):
145 native = repr(simple)
Serhiy Storchaka51844382013-10-02 11:40:49 +0300146 self.assertEqual(pprint.pformat(simple), native)
147 self.assertEqual(pprint.pformat(simple, width=1, indent=0)
148 .replace('\n', ' '), native)
149 self.assertEqual(pprint.saferepr(simple), native)
Fred Drake43913dd2001-05-14 17:41:20 +0000150
Barry Warsaw00859c02001-11-28 05:49:39 +0000151 def test_basic_line_wrap(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000152 # verify basic line-wrapping operation
Barry Warsaw00859c02001-11-28 05:49:39 +0000153 o = {'RPM_cal': 0,
154 'RPM_cal2': 48059,
155 'Speed_cal': 0,
156 'controldesk_runtime_us': 0,
157 'main_code_runtime_us': 0,
158 'read_io_runtime_us': 0,
159 'write_io_runtime_us': 43690}
160 exp = """\
161{'RPM_cal': 0,
162 'RPM_cal2': 48059,
163 'Speed_cal': 0,
164 'controldesk_runtime_us': 0,
165 'main_code_runtime_us': 0,
166 'read_io_runtime_us': 0,
167 'write_io_runtime_us': 43690}"""
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000168 for type in [dict, dict2]:
169 self.assertEqual(pprint.pformat(type(o)), exp)
170
171 o = range(100)
172 exp = '[%s]' % ',\n '.join(map(str, o))
173 for type in [list, list2]:
174 self.assertEqual(pprint.pformat(type(o)), exp)
175
176 o = tuple(range(100))
177 exp = '(%s)' % ',\n '.join(map(str, o))
178 for type in [tuple, tuple2]:
179 self.assertEqual(pprint.pformat(type(o)), exp)
Barry Warsaw00859c02001-11-28 05:49:39 +0000180
Walter Dörwaldc8de4582003-12-03 20:26:05 +0000181 # indent parameter
182 o = range(100)
183 exp = '[ %s]' % ',\n '.join(map(str, o))
184 for type in [list, list2]:
185 self.assertEqual(pprint.pformat(type(o), indent=4), exp)
186
Georg Brandl3ccb7872008-07-16 03:00:45 +0000187 def test_nested_indentations(self):
188 o1 = list(range(10))
189 o2 = dict(first=1, second=2, third=3)
190 o = [o1, o2]
191 expected = """\
192[ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
193 { 'first': 1,
194 'second': 2,
195 'third': 3}]"""
196 self.assertEqual(pprint.pformat(o, indent=4, width=42), expected)
197
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000198 def test_sorted_dict(self):
199 # Starting in Python 2.5, pprint sorts dict displays by key regardless
200 # of how small the dictionary may be.
201 # Before the change, on 32-bit Windows pformat() gave order
202 # 'a', 'c', 'b' here, so this test failed.
203 d = {'a': 1, 'b': 1, 'c': 1}
204 self.assertEqual(pprint.pformat(d), "{'a': 1, 'b': 1, 'c': 1}")
205 self.assertEqual(pprint.pformat([d, d]),
206 "[{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 1}]")
207
208 # The next one is kind of goofy. The sorted order depends on the
209 # alphabetic order of type names: "int" < "str" < "tuple". Before
210 # Python 2.5, this was in the test_same_as_repr() test. It's worth
211 # keeping around for now because it's one of few tests of pprint
212 # against a crazy mix of types.
213 self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}),
214 r"{5: [[]], 'xy\tab\n': (3,), (): {}}")
215
Raymond Hettingerbad3c882010-09-09 12:31:00 +0000216 def test_ordered_dict(self):
217 words = 'the quick brown fox jumped over a lazy dog'.split()
218 d = collections.OrderedDict(zip(words, itertools.count()))
219 self.assertEqual(pprint.pformat(d),
220"""\
221{'the': 0,
222 'quick': 1,
223 'brown': 2,
224 'fox': 3,
225 'jumped': 4,
226 'over': 5,
227 'a': 6,
228 'lazy': 7,
229 'dog': 8}""")
Fred Drakeaee113d2002-04-02 05:08:35 +0000230 def test_subclassing(self):
231 o = {'names with spaces': 'should be presented using repr()',
232 'others.should.not.be': 'like.this'}
233 exp = """\
234{'names with spaces': 'should be presented using repr()',
235 others.should.not.be: like.this}"""
236 self.assertEqual(DottedPrettyPrinter().pformat(o), exp)
237
Serhiy Storchaka51844382013-10-02 11:40:49 +0300238 def test_set_reprs(self):
239 self.assertEqual(pprint.pformat(set()), 'set()')
240 self.assertEqual(pprint.pformat(set(range(3))), '{0, 1, 2}')
241 self.assertEqual(pprint.pformat(set(range(7)), width=20), '''\
242{0,
243 1,
244 2,
245 3,
246 4,
247 5,
248 6}''')
249 self.assertEqual(pprint.pformat(set2(range(7)), width=20), '''\
250set2({0,
251 1,
252 2,
253 3,
254 4,
255 5,
256 6})''')
257 self.assertEqual(pprint.pformat(set3(range(7)), width=20),
258 'set3({0, 1, 2, 3, 4, 5, 6})')
259
260 self.assertEqual(pprint.pformat(frozenset()), 'frozenset()')
261 self.assertEqual(pprint.pformat(frozenset(range(3))),
262 'frozenset({0, 1, 2})')
263 self.assertEqual(pprint.pformat(frozenset(range(7)), width=20), '''\
264frozenset({0,
265 1,
266 2,
267 3,
268 4,
269 5,
270 6})''')
271 self.assertEqual(pprint.pformat(frozenset2(range(7)), width=20), '''\
272frozenset2({0,
273 1,
274 2,
275 3,
276 4,
277 5,
278 6})''')
279 self.assertEqual(pprint.pformat(frozenset3(range(7)), width=20),
280 'frozenset3({0, 1, 2, 3, 4, 5, 6})')
281
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400282 @unittest.expectedFailure
283 #See http://bugs.python.org/issue13907
Daniel Stutzbachc944cfc2010-09-21 21:08:09 +0000284 @test.support.cpython_only
Serhiy Storchaka51844382013-10-02 11:40:49 +0300285 def test_set_of_sets_reprs(self):
Daniel Stutzbachc944cfc2010-09-21 21:08:09 +0000286 # This test creates a complex arrangement of frozensets and
287 # compares the pretty-printed repr against a string hard-coded in
288 # the test. The hard-coded repr depends on the sort order of
289 # frozensets.
290 #
291 # However, as the docs point out: "Since sets only define
292 # partial ordering (subset relationships), the output of the
293 # list.sort() method is undefined for lists of sets."
294 #
295 # In a nutshell, the test assumes frozenset({0}) will always
296 # sort before frozenset({1}), but:
297 #
298 # >>> frozenset({0}) < frozenset({1})
299 # False
300 # >>> frozenset({1}) < frozenset({0})
301 # False
302 #
303 # Consequently, this test is fragile and
304 # implementation-dependent. Small changes to Python's sort
305 # algorithm cause the test to fail when it should pass.
Benjamin Peterson7d95e402012-04-23 11:24:50 -0400306 # XXX Or changes to the dictionary implmentation...
Daniel Stutzbachc944cfc2010-09-21 21:08:09 +0000307
Christian Heimes969fe572008-01-25 11:23:10 +0000308 cube_repr_tgt = """\
309{frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000310 frozenset({0}): frozenset({frozenset(),
Christian Heimes969fe572008-01-25 11:23:10 +0000311 frozenset({0, 2}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000312 frozenset({0, 1})}),
313 frozenset({1}): frozenset({frozenset(),
Christian Heimes969fe572008-01-25 11:23:10 +0000314 frozenset({1, 2}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000315 frozenset({0, 1})}),
316 frozenset({2}): frozenset({frozenset(),
Christian Heimes969fe572008-01-25 11:23:10 +0000317 frozenset({1, 2}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000318 frozenset({0, 2})}),
319 frozenset({1, 2}): frozenset({frozenset({2}),
Christian Heimes969fe572008-01-25 11:23:10 +0000320 frozenset({1}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000321 frozenset({0, 1, 2})}),
322 frozenset({0, 2}): frozenset({frozenset({2}),
Christian Heimes969fe572008-01-25 11:23:10 +0000323 frozenset({0}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000324 frozenset({0, 1, 2})}),
325 frozenset({0, 1}): frozenset({frozenset({0}),
Christian Heimes969fe572008-01-25 11:23:10 +0000326 frozenset({1}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000327 frozenset({0, 1, 2})}),
328 frozenset({0, 1, 2}): frozenset({frozenset({1, 2}),
Christian Heimes969fe572008-01-25 11:23:10 +0000329 frozenset({0, 2}),
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000330 frozenset({0, 1})})}"""
Christian Heimes969fe572008-01-25 11:23:10 +0000331 cube = test.test_set.cube(3)
332 self.assertEqual(pprint.pformat(cube), cube_repr_tgt)
333 cubo_repr_tgt = """\
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000334{frozenset({frozenset({0, 2}), frozenset({0})}): frozenset({frozenset({frozenset({0,
335 2}),
336 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000337 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000338 2})}),
339 frozenset({frozenset({0}),
340 frozenset({0,
341 1})}),
342 frozenset({frozenset(),
343 frozenset({0})}),
344 frozenset({frozenset({2}),
345 frozenset({0,
346 2})})}),
347 frozenset({frozenset({0, 1}), frozenset({1})}): frozenset({frozenset({frozenset({0,
348 1}),
349 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000350 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000351 2})}),
352 frozenset({frozenset({0}),
353 frozenset({0,
354 1})}),
355 frozenset({frozenset({1}),
356 frozenset({1,
357 2})}),
358 frozenset({frozenset(),
359 frozenset({1})})}),
360 frozenset({frozenset({1, 2}), frozenset({1})}): frozenset({frozenset({frozenset({1,
361 2}),
362 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000363 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000364 2})}),
365 frozenset({frozenset({2}),
366 frozenset({1,
367 2})}),
368 frozenset({frozenset(),
369 frozenset({1})}),
370 frozenset({frozenset({1}),
371 frozenset({0,
372 1})})}),
373 frozenset({frozenset({1, 2}), frozenset({2})}): frozenset({frozenset({frozenset({1,
374 2}),
375 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000376 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000377 2})}),
378 frozenset({frozenset({1}),
379 frozenset({1,
380 2})}),
381 frozenset({frozenset({2}),
382 frozenset({0,
383 2})}),
384 frozenset({frozenset(),
385 frozenset({2})})}),
386 frozenset({frozenset(), frozenset({0})}): frozenset({frozenset({frozenset({0}),
387 frozenset({0,
388 1})}),
389 frozenset({frozenset({0}),
390 frozenset({0,
391 2})}),
392 frozenset({frozenset(),
393 frozenset({1})}),
394 frozenset({frozenset(),
395 frozenset({2})})}),
396 frozenset({frozenset(), frozenset({1})}): frozenset({frozenset({frozenset(),
397 frozenset({0})}),
398 frozenset({frozenset({1}),
399 frozenset({1,
400 2})}),
401 frozenset({frozenset(),
402 frozenset({2})}),
403 frozenset({frozenset({1}),
404 frozenset({0,
405 1})})}),
406 frozenset({frozenset({2}), frozenset()}): frozenset({frozenset({frozenset({2}),
407 frozenset({1,
408 2})}),
409 frozenset({frozenset(),
410 frozenset({0})}),
411 frozenset({frozenset(),
412 frozenset({1})}),
413 frozenset({frozenset({2}),
414 frozenset({0,
415 2})})}),
416 frozenset({frozenset({0, 1, 2}), frozenset({0, 1})}): frozenset({frozenset({frozenset({1,
417 2}),
418 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000419 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000420 2})}),
421 frozenset({frozenset({0,
422 2}),
423 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000424 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000425 2})}),
426 frozenset({frozenset({0}),
427 frozenset({0,
428 1})}),
429 frozenset({frozenset({1}),
430 frozenset({0,
431 1})})}),
432 frozenset({frozenset({0}), frozenset({0, 1})}): frozenset({frozenset({frozenset(),
433 frozenset({0})}),
434 frozenset({frozenset({0,
435 1}),
436 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000437 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000438 2})}),
439 frozenset({frozenset({0}),
440 frozenset({0,
441 2})}),
442 frozenset({frozenset({1}),
443 frozenset({0,
444 1})})}),
445 frozenset({frozenset({2}), frozenset({0, 2})}): frozenset({frozenset({frozenset({0,
446 2}),
447 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000448 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000449 2})}),
450 frozenset({frozenset({2}),
451 frozenset({1,
452 2})}),
453 frozenset({frozenset({0}),
454 frozenset({0,
455 2})}),
456 frozenset({frozenset(),
457 frozenset({2})})}),
458 frozenset({frozenset({0, 1, 2}), frozenset({0, 2})}): frozenset({frozenset({frozenset({1,
459 2}),
460 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000461 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000462 2})}),
463 frozenset({frozenset({0,
464 1}),
465 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000466 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000467 2})}),
468 frozenset({frozenset({0}),
469 frozenset({0,
470 2})}),
471 frozenset({frozenset({2}),
472 frozenset({0,
473 2})})}),
474 frozenset({frozenset({1, 2}), frozenset({0, 1, 2})}): frozenset({frozenset({frozenset({0,
475 2}),
476 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000477 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000478 2})}),
479 frozenset({frozenset({0,
480 1}),
481 frozenset({0,
Christian Heimes969fe572008-01-25 11:23:10 +0000482 1,
Raymond Hettinger4b8db412008-01-31 01:10:03 +0000483 2})}),
484 frozenset({frozenset({2}),
485 frozenset({1,
486 2})}),
487 frozenset({frozenset({1}),
488 frozenset({1,
489 2})})})}"""
Christian Heimes969fe572008-01-25 11:23:10 +0000490
491 cubo = test.test_set.linegraph(cube)
492 self.assertEqual(pprint.pformat(cubo), cubo_repr_tgt)
493
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000494 def test_depth(self):
495 nested_tuple = (1, (2, (3, (4, (5, 6)))))
496 nested_dict = {1: {2: {3: {4: {5: {6: 6}}}}}}
497 nested_list = [1, [2, [3, [4, [5, [6, []]]]]]]
498 self.assertEqual(pprint.pformat(nested_tuple), repr(nested_tuple))
499 self.assertEqual(pprint.pformat(nested_dict), repr(nested_dict))
500 self.assertEqual(pprint.pformat(nested_list), repr(nested_list))
501
502 lv1_tuple = '(1, (...))'
503 lv1_dict = '{1: {...}}'
504 lv1_list = '[1, [...]]'
505 self.assertEqual(pprint.pformat(nested_tuple, depth=1), lv1_tuple)
506 self.assertEqual(pprint.pformat(nested_dict, depth=1), lv1_dict)
507 self.assertEqual(pprint.pformat(nested_list, depth=1), lv1_list)
508
Raymond Hettingera7da1662009-11-19 01:07:05 +0000509 def test_sort_unorderable_values(self):
510 # Issue 3976: sorted pprints fail for unorderable values.
511 n = 20
512 keys = [Unorderable() for i in range(n)]
513 random.shuffle(keys)
514 skeys = sorted(keys, key=id)
515 clean = lambda s: s.replace(' ', '').replace('\n','')
516
517 self.assertEqual(clean(pprint.pformat(set(keys))),
518 '{' + ','.join(map(repr, skeys)) + '}')
519 self.assertEqual(clean(pprint.pformat(frozenset(keys))),
520 'frozenset({' + ','.join(map(repr, skeys)) + '})')
521 self.assertEqual(clean(pprint.pformat(dict.fromkeys(keys))),
522 '{' + ','.join('%r:None' % k for k in skeys) + '}')
Fred Drakeaee113d2002-04-02 05:08:35 +0000523
Florent Xiclunad6da90f2012-07-21 11:17:38 +0200524 # Issue 10017: TypeError on user-defined types as dict keys.
525 self.assertEqual(pprint.pformat({Unorderable: 0, 1: 0}),
526 '{1: 0, ' + repr(Unorderable) +': 0}')
527
528 # Issue 14998: TypeError on tuples with NoneTypes as dict keys.
Florent Xicluna6e571d62012-07-21 12:44:20 +0200529 keys = [(1,), (None,)]
530 self.assertEqual(pprint.pformat(dict.fromkeys(keys, 0)),
531 '{%r: 0, %r: 0}' % tuple(sorted(keys, key=id)))
Florent Xiclunad6da90f2012-07-21 11:17:38 +0200532
533
Fred Drakeaee113d2002-04-02 05:08:35 +0000534class DottedPrettyPrinter(pprint.PrettyPrinter):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000535
Fred Drakeaee113d2002-04-02 05:08:35 +0000536 def format(self, object, context, maxlevels, level):
537 if isinstance(object, str):
538 if ' ' in object:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000539 return repr(object), 1, 0
Fred Drakeaee113d2002-04-02 05:08:35 +0000540 else:
541 return object, 0, 0
542 else:
543 return pprint.PrettyPrinter.format(
544 self, object, context, maxlevels, level)
545
546
Fred Drake2e2be372001-09-20 21:33:42 +0000547def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000548 test.support.run_unittest(QueryTestCase)
Fred Drake2e2be372001-09-20 21:33:42 +0000549
550
551if __name__ == "__main__":
552 test_main()