blob: 8bd0ccf91125268065d89549de83137781cb6d40 [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
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00008import shutil
Fred Drake8e6669a2001-07-19 22:27:56 +00009import unittest
Barry Warsaw0bcf6d82001-08-24 18:37:32 +000010
Benjamin Petersonee8712c2008-05-20 21:35:26 +000011from test.support import run_unittest
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +000012from reprlib import repr as r # Don't shadow builtin repr
13from reprlib 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):
25 eq = self.assertEquals
26 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
Guido van Rossumcd16bf62007-06-13 18:07:49 +000038 def test_tuple(self):
39 eq = self.assertEquals
40 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
Fred Drake8e6669a2001-07-19 22:27:56 +000054 eq = self.assertEquals
55 # 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):
104 eq = self.assertEquals
105 eq(r(123), repr(123))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000106 eq(r(123), repr(123))
Fred Drake8e6669a2001-07-19 22:27:56 +0000107 eq(r(1.0/3), repr(1.0/3))
108
Guido van Rossume2a383d2007-01-15 16:59:06 +0000109 n = 10**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):
114 eq = self.assertEquals
115 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)
126 self.failUnless(s.startswith("<class "))
127 self.failUnless(s.endswith(">"))
Guido van Rossuma48a3b42006-04-20 16:07:39 +0000128 self.failUnless(s.find("...") in [12, 13])
Guido van Rossumcf856f92001-09-05 02:26:26 +0000129
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000130 def test_lambda(self):
131 self.failUnless(repr(lambda x: x).startswith(
Neil Schemenauerab541bb2005-10-21 18:11:40 +0000132 "<function <lambda"))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000133 # XXX anonymous functions? see func_repr
134
135 def test_builtin_function(self):
136 eq = self.assertEquals
137 # Functions
138 eq(repr(hash), '<built-in function hash>')
139 # Methods
140 self.failUnless(repr(''.split).startswith(
141 '<built-in method split of str object at 0x'))
142
Guido van Rossum805365e2007-05-07 22:24:25 +0000143 def test_range(self):
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000144 eq = self.assertEquals
Guido van Rossum3353a2e2007-05-21 18:14:54 +0000145 eq(repr(range(1)), 'range(0, 1)')
Guido van Rossum805365e2007-05-07 22:24:25 +0000146 eq(repr(range(1, 2)), 'range(1, 2)')
147 eq(repr(range(1, 4, 3)), 'range(1, 4, 3)')
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000148
Fred Drake8e6669a2001-07-19 22:27:56 +0000149 def test_nesting(self):
150 eq = self.assertEquals
151 # everything is meant to give up after 6 levels.
152 eq(r([[[[[[[]]]]]]]), "[[[[[[[]]]]]]]")
153 eq(r([[[[[[[[]]]]]]]]), "[[[[[[[...]]]]]]]")
154
155 eq(r(nestedTuple(6)), "(((((((),),),),),),)")
156 eq(r(nestedTuple(7)), "(((((((...),),),),),),)")
157
158 eq(r({ nestedTuple(5) : nestedTuple(5) }),
159 "{((((((),),),),),): ((((((),),),),),)}")
160 eq(r({ nestedTuple(6) : nestedTuple(6) }),
161 "{((((((...),),),),),): ((((((...),),),),),)}")
162
163 eq(r([[[[[[{}]]]]]]), "[[[[[[{}]]]]]]")
164 eq(r([[[[[[[{}]]]]]]]), "[[[[[[[...]]]]]]]")
165
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000166 def test_cell(self):
167 # XXX Hmm? How to get at a cell object?
168 pass
169
170 def test_descriptors(self):
171 eq = self.assertEquals
172 # method descriptors
Tim Petersa427a2b2001-10-29 22:25:45 +0000173 eq(repr(dict.items), "<method 'items' of 'dict' objects>")
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000174 # XXX member descriptors
175 # XXX attribute descriptors
176 # XXX slot descriptors
177 # static and class methods
178 class C:
179 def foo(cls): pass
180 x = staticmethod(C.foo)
181 self.failUnless(repr(x).startswith('<staticmethod object at 0x'))
182 x = classmethod(C.foo)
183 self.failUnless(repr(x).startswith('<classmethod object at 0x'))
184
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000185 def test_unsortable(self):
186 # Repr.repr() used to call sorted() on sets, frozensets and dicts
187 # without taking into account that not all objects are comparable
188 x = set([1j, 2j, 3j])
189 y = frozenset(x)
190 z = {1j: 1, 2j: 2}
191 r(x)
192 r(y)
193 r(z)
194
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000195def touch(path, text=''):
196 fp = open(path, 'w')
197 fp.write(text)
198 fp.close()
199
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000200class LongReprTest(unittest.TestCase):
201 def setUp(self):
202 longname = 'areallylongpackageandmodulenametotestreprtruncation'
203 self.pkgname = os.path.join(longname)
204 self.subpkgname = os.path.join(longname, longname)
205 # Make the package and subpackage
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000206 shutil.rmtree(self.pkgname, ignore_errors=True)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000207 os.mkdir(self.pkgname)
Skip Montanaro7a98be22007-08-16 14:35:24 +0000208 touch(os.path.join(self.pkgname, '__init__.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000209 shutil.rmtree(self.subpkgname, ignore_errors=True)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000210 os.mkdir(self.subpkgname)
Skip Montanaro7a98be22007-08-16 14:35:24 +0000211 touch(os.path.join(self.subpkgname, '__init__.py'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000212 # Remember where we are
213 self.here = os.getcwd()
214 sys.path.insert(0, self.here)
215
216 def tearDown(self):
217 actions = []
Benjamin Peterson699adb92008-05-08 22:27:58 +0000218 for dirpath, dirnames, filenames in os.walk(self.pkgname):
219 for name in dirnames + filenames:
220 actions.append(os.path.join(dirpath, name))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000221 actions.append(self.pkgname)
222 actions.sort()
223 actions.reverse()
224 for p in actions:
225 if os.path.isdir(p):
226 os.rmdir(p)
227 else:
228 os.remove(p)
229 del sys.path[0]
230
231 def test_module(self):
232 eq = self.assertEquals
Skip Montanaro7a98be22007-08-16 14:35:24 +0000233 touch(os.path.join(self.subpkgname, self.pkgname + '.py'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000234 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation
235 eq(repr(areallylongpackageandmodulenametotestreprtruncation),
Mark Hammondd800ae12003-01-16 04:56:52 +0000236 "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__))
Neal Norwitz70769012001-12-29 00:25:42 +0000237 eq(repr(sys), "<module 'sys' (built-in)>")
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000238
239 def test_type(self):
240 eq = self.assertEquals
Skip Montanaro7a98be22007-08-16 14:35:24 +0000241 touch(os.path.join(self.subpkgname, 'foo.py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000242class foo(object):
243 pass
244''')
245 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
246 eq(repr(foo.foo),
Mark Hammondd800ae12003-01-16 04:56:52 +0000247 "<class '%s.foo'>" % foo.__name__)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000248
249 def test_object(self):
250 # XXX Test the repr of a type with a really long tp_name but with no
251 # tp_repr. WIBNI we had ::Inline? :)
252 pass
253
254 def test_class(self):
Skip Montanaro7a98be22007-08-16 14:35:24 +0000255 touch(os.path.join(self.subpkgname, 'bar.py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000256class bar:
257 pass
258''')
259 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar
Mark Hammondd800ae12003-01-16 04:56:52 +0000260 # Module name may be prefixed with "test.", depending on how run.
Guido van Rossuma48a3b42006-04-20 16:07:39 +0000261 self.assertEquals(repr(bar.bar), "<class '%s.bar'>" % bar.__name__)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000262
263 def test_instance(self):
Skip Montanaro7a98be22007-08-16 14:35:24 +0000264 touch(os.path.join(self.subpkgname, 'baz.py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000265class baz:
266 pass
267''')
268 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz
269 ibaz = baz.baz()
270 self.failUnless(repr(ibaz).startswith(
Guido van Rossuma48a3b42006-04-20 16:07:39 +0000271 "<%s.baz object at 0x" % baz.__name__))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000272
273 def test_method(self):
274 eq = self.assertEquals
Skip Montanaro7a98be22007-08-16 14:35:24 +0000275 touch(os.path.join(self.subpkgname, 'qux.py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000276class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
277 def amethod(self): pass
278''')
279 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
280 # Unbound methods first
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000281 self.failUnless(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod).startswith(
282 '<function amethod'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000283 # Bound method next
284 iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
285 self.failUnless(repr(iqux.amethod).startswith(
Guido van Rossuma48a3b42006-04-20 16:07:39 +0000286 '<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa object at 0x' \
Mark Hammondd800ae12003-01-16 04:56:52 +0000287 % (qux.__name__,) ))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000288
289 def test_builtin_function(self):
290 # XXX test built-in functions and methods with really long names
291 pass
Fred Drake8e6669a2001-07-19 22:27:56 +0000292
293class ClassWithRepr:
294 def __init__(self, s):
295 self.s = s
296 def __repr__(self):
Guido van Rossuma48a3b42006-04-20 16:07:39 +0000297 return "ClassWithRepr(%r)" % self.s
Fred Drake8e6669a2001-07-19 22:27:56 +0000298
299
300class ClassWithFailingRepr:
301 def __repr__(self):
302 raise Exception("This should be caught by Repr.repr_instance")
303
304
Fred Drake2e2be372001-09-20 21:33:42 +0000305def test_main():
306 run_unittest(ReprTests)
307 if os.name != 'mac':
308 run_unittest(LongReprTest)
309
310
311if __name__ == "__main__":
312 test_main()