blob: 8b20acdc8ed2a6d1660e7568018f6a018e131d3a [file] [log] [blame]
Fred Drake8e6669a2001-07-19 22:27:56 +00001"""
2 Test cases for the repr module
3 Nick Mathewson
4"""
5
Barry Warsaw0bcf6d82001-08-24 18:37:32 +00006import sys
7import os
Neal Norwitz008b8612006-05-30 07:21:10 +00008import shutil
Fred Drake8e6669a2001-07-19 22:27:56 +00009import unittest
Barry Warsaw0bcf6d82001-08-24 18:37:32 +000010
Ezio Melottid80b4bf2010-03-17 13:52:48 +000011from test.test_support import run_unittest, check_py3k_warnings
Brett Cannon2ee0e8e2008-05-23 05:03:59 +000012from repr import repr as r # Don't shadow builtin repr
13from repr import Repr
Fred Drake8e6669a2001-07-19 22:27:56 +000014
15
16def nestedTuple(nesting):
17 t = ()
18 for i in range(nesting):
19 t = (t,)
20 return t
21
22class ReprTests(unittest.TestCase):
23
24 def test_string(self):
Ezio Melotti2623a372010-11-21 13:34:58 +000025 eq = self.assertEqual
Fred Drake8e6669a2001-07-19 22:27:56 +000026 eq(r("abc"), "'abc'")
27 eq(r("abcdefghijklmnop"),"'abcdefghijklmnop'")
28
29 s = "a"*30+"b"*30
Walter Dörwald70a6b492004-02-12 17:35:32 +000030 expected = repr(s)[:13] + "..." + repr(s)[-14:]
Fred Drake8e6669a2001-07-19 22:27:56 +000031 eq(r(s), expected)
Tim Petersab9ba272001-08-09 21:40:30 +000032
Fred Drake8e6669a2001-07-19 22:27:56 +000033 eq(r("\"'"), repr("\"'"))
34 s = "\""*30+"'"*100
Walter Dörwald70a6b492004-02-12 17:35:32 +000035 expected = repr(s)[:13] + "..." + repr(s)[-14:]
Fred Drake8e6669a2001-07-19 22:27:56 +000036 eq(r(s), expected)
37
Neal Norwitzc161cb92007-06-11 07:29:43 +000038 def test_tuple(self):
Ezio Melotti2623a372010-11-21 13:34:58 +000039 eq = self.assertEqual
Neal Norwitzc161cb92007-06-11 07:29:43 +000040 eq(r((1,)), "(1,)")
41
42 t3 = (1, 2, 3)
43 eq(r(t3), "(1, 2, 3)")
44
45 r2 = Repr()
46 r2.maxtuple = 2
47 expected = repr(t3)[:-2] + "...)"
48 eq(r2.repr(t3), expected)
49
Fred Drake8e6669a2001-07-19 22:27:56 +000050 def test_container(self):
Tim Peters6ee04802003-02-05 18:29:34 +000051 from array import array
Raymond Hettinger1453e4a2004-05-21 23:01:18 +000052 from collections import deque
Tim Peters6ee04802003-02-05 18:29:34 +000053
Ezio Melotti2623a372010-11-21 13:34:58 +000054 eq = self.assertEqual
Fred Drake8e6669a2001-07-19 22:27:56 +000055 # Tuples give up after 6 elements
56 eq(r(()), "()")
57 eq(r((1,)), "(1,)")
58 eq(r((1, 2, 3)), "(1, 2, 3)")
59 eq(r((1, 2, 3, 4, 5, 6)), "(1, 2, 3, 4, 5, 6)")
60 eq(r((1, 2, 3, 4, 5, 6, 7)), "(1, 2, 3, 4, 5, 6, ...)")
61
62 # Lists give up after 6 as well
63 eq(r([]), "[]")
64 eq(r([1]), "[1]")
65 eq(r([1, 2, 3]), "[1, 2, 3]")
66 eq(r([1, 2, 3, 4, 5, 6]), "[1, 2, 3, 4, 5, 6]")
67 eq(r([1, 2, 3, 4, 5, 6, 7]), "[1, 2, 3, 4, 5, 6, ...]")
68
Raymond Hettingerba6cd362004-05-21 10:00:15 +000069 # Sets give up after 6 as well
70 eq(r(set([])), "set([])")
71 eq(r(set([1])), "set([1])")
72 eq(r(set([1, 2, 3])), "set([1, 2, 3])")
73 eq(r(set([1, 2, 3, 4, 5, 6])), "set([1, 2, 3, 4, 5, 6])")
74 eq(r(set([1, 2, 3, 4, 5, 6, 7])), "set([1, 2, 3, 4, 5, 6, ...])")
75
76 # Frozensets give up after 6 as well
77 eq(r(frozenset([])), "frozenset([])")
78 eq(r(frozenset([1])), "frozenset([1])")
79 eq(r(frozenset([1, 2, 3])), "frozenset([1, 2, 3])")
80 eq(r(frozenset([1, 2, 3, 4, 5, 6])), "frozenset([1, 2, 3, 4, 5, 6])")
81 eq(r(frozenset([1, 2, 3, 4, 5, 6, 7])), "frozenset([1, 2, 3, 4, 5, 6, ...])")
82
Raymond Hettinger1453e4a2004-05-21 23:01:18 +000083 # collections.deque after 6
84 eq(r(deque([1, 2, 3, 4, 5, 6, 7])), "deque([1, 2, 3, 4, 5, 6, ...])")
85
Fred Drake8e6669a2001-07-19 22:27:56 +000086 # Dictionaries give up after 4.
87 eq(r({}), "{}")
88 d = {'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}
89 eq(r(d), "{'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}")
90 d['arthur'] = 1
91 eq(r(d), "{'alice': 1, 'arthur': 1, 'bob': 2, 'charles': 3, ...}")
92
Tim Peters6ee04802003-02-05 18:29:34 +000093 # array.array after 5.
94 eq(r(array('i')), "array('i', [])")
95 eq(r(array('i', [1])), "array('i', [1])")
96 eq(r(array('i', [1, 2])), "array('i', [1, 2])")
97 eq(r(array('i', [1, 2, 3])), "array('i', [1, 2, 3])")
98 eq(r(array('i', [1, 2, 3, 4])), "array('i', [1, 2, 3, 4])")
99 eq(r(array('i', [1, 2, 3, 4, 5])), "array('i', [1, 2, 3, 4, 5])")
100 eq(r(array('i', [1, 2, 3, 4, 5, 6])),
101 "array('i', [1, 2, 3, 4, 5, ...])")
102
Fred Drake8e6669a2001-07-19 22:27:56 +0000103 def test_numbers(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000104 eq = self.assertEqual
Fred Drake8e6669a2001-07-19 22:27:56 +0000105 eq(r(123), repr(123))
106 eq(r(123L), repr(123L))
107 eq(r(1.0/3), repr(1.0/3))
108
109 n = 10L**100
Walter Dörwald70a6b492004-02-12 17:35:32 +0000110 expected = repr(n)[:18] + "..." + repr(n)[-19:]
Fred Drake8e6669a2001-07-19 22:27:56 +0000111 eq(r(n), expected)
112
113 def test_instance(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000114 eq = self.assertEqual
Fred Drake8e6669a2001-07-19 22:27:56 +0000115 i1 = ClassWithRepr("a")
116 eq(r(i1), repr(i1))
Tim Petersab9ba272001-08-09 21:40:30 +0000117
Fred Drake8e6669a2001-07-19 22:27:56 +0000118 i2 = ClassWithRepr("x"*1000)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000119 expected = repr(i2)[:13] + "..." + repr(i2)[-14:]
Fred Drake8e6669a2001-07-19 22:27:56 +0000120 eq(r(i2), expected)
121
122 i3 = ClassWithFailingRepr()
123 eq(r(i3), ("<ClassWithFailingRepr instance at %x>"%id(i3)))
124
Guido van Rossumcf856f92001-09-05 02:26:26 +0000125 s = r(ClassWithFailingRepr)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000126 self.assertTrue(s.startswith("<class "))
127 self.assertTrue(s.endswith(">"))
128 self.assertTrue(s.find("...") == 8)
Guido van Rossumcf856f92001-09-05 02:26:26 +0000129
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000130 def test_file(self):
131 fp = open(unittest.__file__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000132 self.assertTrue(repr(fp).startswith(
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000133 "<open file '%s', mode 'r' at 0x" % unittest.__file__))
134 fp.close()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000135 self.assertTrue(repr(fp).startswith(
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000136 "<closed file '%s', mode 'r' at 0x" % unittest.__file__))
137
138 def test_lambda(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000139 self.assertTrue(repr(lambda x: x).startswith(
Neil Schemenauerab541bb2005-10-21 18:11:40 +0000140 "<function <lambda"))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000141 # XXX anonymous functions? see func_repr
142
143 def test_builtin_function(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000144 eq = self.assertEqual
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000145 # Functions
146 eq(repr(hash), '<built-in function hash>')
147 # Methods
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000148 self.assertTrue(repr(''.split).startswith(
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000149 '<built-in method split of str object at 0x'))
150
151 def test_xrange(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000152 eq = self.assertEqual
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000153 eq(repr(xrange(1)), 'xrange(1)')
154 eq(repr(xrange(1, 2)), 'xrange(1, 2)')
155 eq(repr(xrange(1, 2, 3)), 'xrange(1, 4, 3)')
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000156
Fred Drake8e6669a2001-07-19 22:27:56 +0000157 def test_nesting(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000158 eq = self.assertEqual
Fred Drake8e6669a2001-07-19 22:27:56 +0000159 # everything is meant to give up after 6 levels.
160 eq(r([[[[[[[]]]]]]]), "[[[[[[[]]]]]]]")
161 eq(r([[[[[[[[]]]]]]]]), "[[[[[[[...]]]]]]]")
162
163 eq(r(nestedTuple(6)), "(((((((),),),),),),)")
164 eq(r(nestedTuple(7)), "(((((((...),),),),),),)")
165
166 eq(r({ nestedTuple(5) : nestedTuple(5) }),
167 "{((((((),),),),),): ((((((),),),),),)}")
168 eq(r({ nestedTuple(6) : nestedTuple(6) }),
169 "{((((((...),),),),),): ((((((...),),),),),)}")
170
171 eq(r([[[[[[{}]]]]]]), "[[[[[[{}]]]]]]")
172 eq(r([[[[[[[{}]]]]]]]), "[[[[[[[...]]]]]]]")
173
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000174 def test_buffer(self):
175 # XXX doesn't test buffers with no b_base or read-write buffers (see
176 # bufferobject.c). The test is fairly incomplete too. Sigh.
Ezio Melottid80b4bf2010-03-17 13:52:48 +0000177 with check_py3k_warnings():
178 x = buffer('foo')
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000179 self.assertTrue(repr(x).startswith('<read-only buffer for 0x'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000180
181 def test_cell(self):
182 # XXX Hmm? How to get at a cell object?
183 pass
184
185 def test_descriptors(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000186 eq = self.assertEqual
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000187 # method descriptors
Tim Petersa427a2b2001-10-29 22:25:45 +0000188 eq(repr(dict.items), "<method 'items' of 'dict' objects>")
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000189 # XXX member descriptors
190 # XXX attribute descriptors
191 # XXX slot descriptors
192 # static and class methods
193 class C:
194 def foo(cls): pass
195 x = staticmethod(C.foo)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000196 self.assertTrue(repr(x).startswith('<staticmethod object at 0x'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000197 x = classmethod(C.foo)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000198 self.assertTrue(repr(x).startswith('<classmethod object at 0x'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000199
Georg Brandl8fd3ecf2007-09-12 19:00:07 +0000200 def test_unsortable(self):
201 # Repr.repr() used to call sorted() on sets, frozensets and dicts
202 # without taking into account that not all objects are comparable
203 x = set([1j, 2j, 3j])
204 y = frozenset(x)
205 z = {1j: 1, 2j: 2}
206 r(x)
207 r(y)
208 r(z)
209
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000210def touch(path, text=''):
211 fp = open(path, 'w')
212 fp.write(text)
213 fp.close()
214
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000215class LongReprTest(unittest.TestCase):
216 def setUp(self):
217 longname = 'areallylongpackageandmodulenametotestreprtruncation'
218 self.pkgname = os.path.join(longname)
219 self.subpkgname = os.path.join(longname, longname)
220 # Make the package and subpackage
Neal Norwitz008b8612006-05-30 07:21:10 +0000221 shutil.rmtree(self.pkgname, ignore_errors=True)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000222 os.mkdir(self.pkgname)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000223 touch(os.path.join(self.pkgname, '__init__'+os.extsep+'py'))
Neal Norwitz008b8612006-05-30 07:21:10 +0000224 shutil.rmtree(self.subpkgname, ignore_errors=True)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000225 os.mkdir(self.subpkgname)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000226 touch(os.path.join(self.subpkgname, '__init__'+os.extsep+'py'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000227 # Remember where we are
228 self.here = os.getcwd()
229 sys.path.insert(0, self.here)
230
231 def tearDown(self):
232 actions = []
Benjamin Peterson9ec4aa02008-05-08 22:09:54 +0000233 for dirpath, dirnames, filenames in os.walk(self.pkgname):
234 for name in dirnames + filenames:
235 actions.append(os.path.join(dirpath, name))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000236 actions.append(self.pkgname)
237 actions.sort()
238 actions.reverse()
239 for p in actions:
240 if os.path.isdir(p):
241 os.rmdir(p)
242 else:
243 os.remove(p)
244 del sys.path[0]
245
246 def test_module(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000247 eq = self.assertEqual
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000248 touch(os.path.join(self.subpkgname, self.pkgname + os.extsep + 'py'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000249 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation
250 eq(repr(areallylongpackageandmodulenametotestreprtruncation),
Mark Hammondd800ae12003-01-16 04:56:52 +0000251 "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__))
Neal Norwitz70769012001-12-29 00:25:42 +0000252 eq(repr(sys), "<module 'sys' (built-in)>")
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000253
254 def test_type(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000255 eq = self.assertEqual
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000256 touch(os.path.join(self.subpkgname, 'foo'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000257class foo(object):
258 pass
259''')
260 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
261 eq(repr(foo.foo),
Mark Hammondd800ae12003-01-16 04:56:52 +0000262 "<class '%s.foo'>" % foo.__name__)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000263
264 def test_object(self):
265 # XXX Test the repr of a type with a really long tp_name but with no
266 # tp_repr. WIBNI we had ::Inline? :)
267 pass
268
269 def test_class(self):
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000270 touch(os.path.join(self.subpkgname, 'bar'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000271class bar:
272 pass
273''')
274 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar
Mark Hammondd800ae12003-01-16 04:56:52 +0000275 # Module name may be prefixed with "test.", depending on how run.
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000276 self.assertTrue(repr(bar.bar).startswith(
Mark Hammondd800ae12003-01-16 04:56:52 +0000277 "<class %s.bar at 0x" % bar.__name__))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000278
279 def test_instance(self):
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280 touch(os.path.join(self.subpkgname, 'baz'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000281class baz:
282 pass
283''')
284 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz
285 ibaz = baz.baz()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000286 self.assertTrue(repr(ibaz).startswith(
Mark Hammondd800ae12003-01-16 04:56:52 +0000287 "<%s.baz instance at 0x" % baz.__name__))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000288
289 def test_method(self):
Ezio Melotti2623a372010-11-21 13:34:58 +0000290 eq = self.assertEqual
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000291 touch(os.path.join(self.subpkgname, 'qux'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000292class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
293 def amethod(self): pass
294''')
295 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
296 # Unbound methods first
297 eq(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod),
298 '<unbound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod>')
299 # Bound method next
300 iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000301 self.assertTrue(repr(iqux.amethod).startswith(
Mark Hammondd800ae12003-01-16 04:56:52 +0000302 '<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa instance at 0x' \
303 % (qux.__name__,) ))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000304
305 def test_builtin_function(self):
306 # XXX test built-in functions and methods with really long names
307 pass
Fred Drake8e6669a2001-07-19 22:27:56 +0000308
309class ClassWithRepr:
310 def __init__(self, s):
311 self.s = s
312 def __repr__(self):
313 return "ClassWithLongRepr(%r)" % self.s
314
315
316class ClassWithFailingRepr:
317 def __repr__(self):
318 raise Exception("This should be caught by Repr.repr_instance")
319
320
Fred Drake2e2be372001-09-20 21:33:42 +0000321def test_main():
322 run_unittest(ReprTests)
Ronald Oussoren9545a232010-05-05 19:09:31 +0000323 run_unittest(LongReprTest)
Fred Drake2e2be372001-09-20 21:33:42 +0000324
325
326if __name__ == "__main__":
327 test_main()