blob: 869890714d35e9ee8d11c04d7e0a14731c506f5f [file] [log] [blame]
Tim Petersa814db52001-05-14 07:05:58 +00001import pprint
Fred Drakeb456e4f2002-12-31 07:16:16 +00002import test.test_support
Fred Drake43913dd2001-05-14 17:41:20 +00003import unittest
Tim Petersa814db52001-05-14 07:05:58 +00004
Walter Dörwald7a7ede52003-12-03 20:15:28 +00005# list, tuple and dict subclasses that do or don't overwrite __repr__
6class list2(list):
7 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00008
Walter Dörwald7a7ede52003-12-03 20:15:28 +00009class list3(list):
10 def __repr__(self):
11 return list.__repr__(self)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000012
Walter Dörwald7a7ede52003-12-03 20:15:28 +000013class tuple2(tuple):
14 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000015
Walter Dörwald7a7ede52003-12-03 20:15:28 +000016class tuple3(tuple):
17 def __repr__(self):
18 return tuple.__repr__(self)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000019
Walter Dörwald7a7ede52003-12-03 20:15:28 +000020class dict2(dict):
21 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000022
Walter Dörwald7a7ede52003-12-03 20:15:28 +000023class dict3(dict):
24 def __repr__(self):
25 return dict.__repr__(self)
Tim Petersa814db52001-05-14 07:05:58 +000026
Fred Drake43913dd2001-05-14 17:41:20 +000027class QueryTestCase(unittest.TestCase):
Tim Petersa814db52001-05-14 07:05:58 +000028
Fred Drake43913dd2001-05-14 17:41:20 +000029 def setUp(self):
Guido van Rossum805365e2007-05-07 22:24:25 +000030 self.a = list(range(100))
31 self.b = list(range(200))
Fred Drake43913dd2001-05-14 17:41:20 +000032 self.a[-12] = self.b
Tim Petersa814db52001-05-14 07:05:58 +000033
Fred Drake43913dd2001-05-14 17:41:20 +000034 def test_basic(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000035 # Verify .isrecursive() and .isreadable() w/o recursion
Fred Drake43913dd2001-05-14 17:41:20 +000036 verify = self.assert_
Fred Drakeb456e4f2002-12-31 07:16:16 +000037 pp = pprint.PrettyPrinter()
Walter Dörwald5de48bd2007-06-11 21:38:39 +000038 for safe in (2, 2.0, 2j, "abc", [3], (2,2), {3: 3}, "yaddayadda",
Fred Drake43913dd2001-05-14 17:41:20 +000039 self.a, self.b):
Fred Drakeb456e4f2002-12-31 07:16:16 +000040 # module-level convenience functions
Fred Drake43913dd2001-05-14 17:41:20 +000041 verify(not pprint.isrecursive(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000042 "expected not isrecursive for %r" % (safe,))
Fred Drake43913dd2001-05-14 17:41:20 +000043 verify(pprint.isreadable(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000044 "expected isreadable for %r" % (safe,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000045 # PrettyPrinter methods
46 verify(not pp.isrecursive(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000047 "expected not isrecursive for %r" % (safe,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000048 verify(pp.isreadable(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000049 "expected isreadable for %r" % (safe,))
Tim Petersa814db52001-05-14 07:05:58 +000050
Fred Drake43913dd2001-05-14 17:41:20 +000051 def test_knotted(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000052 # Verify .isrecursive() and .isreadable() w/ recursion
Fred Drake43913dd2001-05-14 17:41:20 +000053 # Tie a knot.
54 self.b[67] = self.a
55 # Messy dict.
56 self.d = {}
57 self.d[0] = self.d[1] = self.d[2] = self.d
Tim Petersa814db52001-05-14 07:05:58 +000058
Fred Drake43913dd2001-05-14 17:41:20 +000059 verify = self.assert_
Fred Drakeb456e4f2002-12-31 07:16:16 +000060 pp = pprint.PrettyPrinter()
Tim Petersa814db52001-05-14 07:05:58 +000061
Fred Drake43913dd2001-05-14 17:41:20 +000062 for icky in self.a, self.b, self.d, (self.d, self.d):
63 verify(pprint.isrecursive(icky), "expected isrecursive")
64 verify(not pprint.isreadable(icky), "expected not isreadable")
Fred Drakeb456e4f2002-12-31 07:16:16 +000065 verify(pp.isrecursive(icky), "expected isrecursive")
66 verify(not pp.isreadable(icky), "expected not isreadable")
Fred Drake43913dd2001-05-14 17:41:20 +000067
68 # Break the cycles.
69 self.d.clear()
70 del self.a[:]
71 del self.b[:]
72
73 for safe in self.a, self.b, self.d, (self.d, self.d):
Fred Drakeb456e4f2002-12-31 07:16:16 +000074 # module-level convenience functions
Fred Drake43913dd2001-05-14 17:41:20 +000075 verify(not pprint.isrecursive(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000076 "expected not isrecursive for %r" % (safe,))
Fred Drake43913dd2001-05-14 17:41:20 +000077 verify(pprint.isreadable(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000078 "expected isreadable for %r" % (safe,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000079 # PrettyPrinter methods
80 verify(not pp.isrecursive(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000081 "expected not isrecursive for %r" % (safe,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000082 verify(pp.isreadable(safe),
Walter Dörwald70a6b492004-02-12 17:35:32 +000083 "expected isreadable for %r" % (safe,))
Fred Drake43913dd2001-05-14 17:41:20 +000084
85 def test_unreadable(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000086 # Not recursive but not readable anyway
Fred Drake43913dd2001-05-14 17:41:20 +000087 verify = self.assert_
Fred Drakeb456e4f2002-12-31 07:16:16 +000088 pp = pprint.PrettyPrinter()
Fred Drake43913dd2001-05-14 17:41:20 +000089 for unreadable in type(3), pprint, pprint.isrecursive:
Fred Drakeb456e4f2002-12-31 07:16:16 +000090 # module-level convenience functions
Fred Drake43913dd2001-05-14 17:41:20 +000091 verify(not pprint.isrecursive(unreadable),
Walter Dörwald70a6b492004-02-12 17:35:32 +000092 "expected not isrecursive for %r" % (unreadable,))
Fred Drake43913dd2001-05-14 17:41:20 +000093 verify(not pprint.isreadable(unreadable),
Walter Dörwald70a6b492004-02-12 17:35:32 +000094 "expected not isreadable for %r" % (unreadable,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000095 # PrettyPrinter methods
96 verify(not pp.isrecursive(unreadable),
Walter Dörwald70a6b492004-02-12 17:35:32 +000097 "expected not isrecursive for %r" % (unreadable,))
Fred Drakeb456e4f2002-12-31 07:16:16 +000098 verify(not pp.isreadable(unreadable),
Walter Dörwald70a6b492004-02-12 17:35:32 +000099 "expected not isreadable for %r" % (unreadable,))
Fred Drake43913dd2001-05-14 17:41:20 +0000100
Tim Peters95b3f782001-05-14 18:39:41 +0000101 def test_same_as_repr(self):
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000102 # Simple objects, small containers and classes that overwrite __repr__
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000103 # For those the result should be the same as repr().
104 # Ahem. The docs don't say anything about that -- this appears to
105 # be testing an implementation quirk. Starting in Python 2.5, it's
106 # not true for dicts: pprint always sorts dicts by key now; before,
107 # it sorted a dict display if and only if the display required
108 # multiple lines. For that reason, dicts with more than one element
109 # aren't tested here.
Tim Peters95b3f782001-05-14 18:39:41 +0000110 verify = self.assert_
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000111 for simple in (0, 0, 0+0j, 0.0, "", b"",
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000112 (), tuple2(), tuple3(),
113 [], list2(), list3(),
114 {}, dict2(), dict3(),
115 verify, pprint,
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000116 -6, -6, -6-6j, -1.5, "x", b"x", (3,), [3], {3: 6},
Tim Peters95b3f782001-05-14 18:39:41 +0000117 (1,2), [3,4], {5: 6, 7: 8},
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000118 tuple2((1,2)), tuple3((1,2)), tuple3(range(100)),
119 [3,4], list2([3,4]), list3([3,4]), list3(range(100)),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000120 {5: 6, 7: 8}, dict2({5: 6}), dict3({5: 6}),
Tim Peters95b3f782001-05-14 18:39:41 +0000121 range(10, -11, -1)
122 ):
123 native = repr(simple)
124 for function in "pformat", "saferepr":
125 f = getattr(pprint, function)
126 got = f(simple)
127 verify(native == got, "expected %s got %s from pprint.%s" %
128 (native, got, function))
Fred Drake43913dd2001-05-14 17:41:20 +0000129
Barry Warsaw00859c02001-11-28 05:49:39 +0000130 def test_basic_line_wrap(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000131 # verify basic line-wrapping operation
Barry Warsaw00859c02001-11-28 05:49:39 +0000132 o = {'RPM_cal': 0,
133 'RPM_cal2': 48059,
134 'Speed_cal': 0,
135 'controldesk_runtime_us': 0,
136 'main_code_runtime_us': 0,
137 'read_io_runtime_us': 0,
138 'write_io_runtime_us': 43690}
139 exp = """\
140{'RPM_cal': 0,
141 'RPM_cal2': 48059,
142 'Speed_cal': 0,
143 'controldesk_runtime_us': 0,
144 'main_code_runtime_us': 0,
145 'read_io_runtime_us': 0,
146 'write_io_runtime_us': 43690}"""
Walter Dörwald7a7ede52003-12-03 20:15:28 +0000147 for type in [dict, dict2]:
148 self.assertEqual(pprint.pformat(type(o)), exp)
149
150 o = range(100)
151 exp = '[%s]' % ',\n '.join(map(str, o))
152 for type in [list, list2]:
153 self.assertEqual(pprint.pformat(type(o)), exp)
154
155 o = tuple(range(100))
156 exp = '(%s)' % ',\n '.join(map(str, o))
157 for type in [tuple, tuple2]:
158 self.assertEqual(pprint.pformat(type(o)), exp)
Barry Warsaw00859c02001-11-28 05:49:39 +0000159
Walter Dörwaldc8de4582003-12-03 20:26:05 +0000160 # indent parameter
161 o = range(100)
162 exp = '[ %s]' % ',\n '.join(map(str, o))
163 for type in [list, list2]:
164 self.assertEqual(pprint.pformat(type(o), indent=4), exp)
165
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000166 def test_sorted_dict(self):
167 # Starting in Python 2.5, pprint sorts dict displays by key regardless
168 # of how small the dictionary may be.
169 # Before the change, on 32-bit Windows pformat() gave order
170 # 'a', 'c', 'b' here, so this test failed.
171 d = {'a': 1, 'b': 1, 'c': 1}
172 self.assertEqual(pprint.pformat(d), "{'a': 1, 'b': 1, 'c': 1}")
173 self.assertEqual(pprint.pformat([d, d]),
174 "[{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 1}]")
175
176 # The next one is kind of goofy. The sorted order depends on the
177 # alphabetic order of type names: "int" < "str" < "tuple". Before
178 # Python 2.5, this was in the test_same_as_repr() test. It's worth
179 # keeping around for now because it's one of few tests of pprint
180 # against a crazy mix of types.
181 self.assertEqual(pprint.pformat({"xy\tab\n": (3,), 5: [[]], (): {}}),
182 r"{5: [[]], 'xy\tab\n': (3,), (): {}}")
183
Fred Drakeaee113d2002-04-02 05:08:35 +0000184 def test_subclassing(self):
185 o = {'names with spaces': 'should be presented using repr()',
186 'others.should.not.be': 'like.this'}
187 exp = """\
188{'names with spaces': 'should be presented using repr()',
189 others.should.not.be: like.this}"""
190 self.assertEqual(DottedPrettyPrinter().pformat(o), exp)
191
192
193class DottedPrettyPrinter(pprint.PrettyPrinter):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000194
Fred Drakeaee113d2002-04-02 05:08:35 +0000195 def format(self, object, context, maxlevels, level):
196 if isinstance(object, str):
197 if ' ' in object:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000198 return repr(object), 1, 0
Fred Drakeaee113d2002-04-02 05:08:35 +0000199 else:
200 return object, 0, 0
201 else:
202 return pprint.PrettyPrinter.format(
203 self, object, context, maxlevels, level)
204
205
Fred Drake2e2be372001-09-20 21:33:42 +0000206def test_main():
Fred Drakeb456e4f2002-12-31 07:16:16 +0000207 test.test_support.run_unittest(QueryTestCase)
Fred Drake2e2be372001-09-20 21:33:42 +0000208
209
210if __name__ == "__main__":
211 test_main()