blob: d23cf4d64a1cbebe965a30470ce7705ed906e2d1 [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
Barry Warsaw04f357c2002-07-23 19:04:11 +000011from test.test_support import run_unittest
Tim Petersab9ba272001-08-09 21:40:30 +000012from repr import repr as r # Don't shadow builtin repr
Neal Norwitze99cb232007-06-11 07:34:07 +000013from 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):
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
Neal Norwitze99cb232007-06-11 07:34:07 +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))
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):
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(">"))
128 self.failUnless(s.find("...") == 8)
129
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000130 def test_file(self):
131 fp = open(unittest.__file__)
132 self.failUnless(repr(fp).startswith(
133 "<open file '%s', mode 'r' at 0x" % unittest.__file__))
134 fp.close()
135 self.failUnless(repr(fp).startswith(
136 "<closed file '%s', mode 'r' at 0x" % unittest.__file__))
137
138 def test_lambda(self):
139 self.failUnless(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):
144 eq = self.assertEquals
145 # Functions
146 eq(repr(hash), '<built-in function hash>')
147 # Methods
148 self.failUnless(repr(''.split).startswith(
149 '<built-in method split of str object at 0x'))
150
151 def test_xrange(self):
Tim Petersd3925062002-04-16 01:27:44 +0000152 import warnings
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000153 eq = self.assertEquals
154 eq(repr(xrange(1)), 'xrange(1)')
155 eq(repr(xrange(1, 2)), 'xrange(1, 2)')
156 eq(repr(xrange(1, 2, 3)), 'xrange(1, 4, 3)')
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000157
Fred Drake8e6669a2001-07-19 22:27:56 +0000158 def test_nesting(self):
159 eq = self.assertEquals
160 # everything is meant to give up after 6 levels.
161 eq(r([[[[[[[]]]]]]]), "[[[[[[[]]]]]]]")
162 eq(r([[[[[[[[]]]]]]]]), "[[[[[[[...]]]]]]]")
163
164 eq(r(nestedTuple(6)), "(((((((),),),),),),)")
165 eq(r(nestedTuple(7)), "(((((((...),),),),),),)")
166
167 eq(r({ nestedTuple(5) : nestedTuple(5) }),
168 "{((((((),),),),),): ((((((),),),),),)}")
169 eq(r({ nestedTuple(6) : nestedTuple(6) }),
170 "{((((((...),),),),),): ((((((...),),),),),)}")
171
172 eq(r([[[[[[{}]]]]]]), "[[[[[[{}]]]]]]")
173 eq(r([[[[[[[{}]]]]]]]), "[[[[[[[...]]]]]]]")
174
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000175 def test_buffer(self):
176 # XXX doesn't test buffers with no b_base or read-write buffers (see
177 # bufferobject.c). The test is fairly incomplete too. Sigh.
178 x = buffer('foo')
179 self.failUnless(repr(x).startswith('<read-only buffer for 0x'))
180
181 def test_cell(self):
182 # XXX Hmm? How to get at a cell object?
183 pass
184
185 def test_descriptors(self):
186 eq = self.assertEquals
187 # 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)
196 self.failUnless(repr(x).startswith('<staticmethod object at 0x'))
197 x = classmethod(C.foo)
198 self.failUnless(repr(x).startswith('<classmethod object at 0x'))
199
Georg Brandlfed6bb72007-09-12 19:00:10 +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
215def zap(actions, dirname, names):
216 for name in names:
217 actions.append(os.path.join(dirname, name))
218
219class LongReprTest(unittest.TestCase):
220 def setUp(self):
221 longname = 'areallylongpackageandmodulenametotestreprtruncation'
222 self.pkgname = os.path.join(longname)
223 self.subpkgname = os.path.join(longname, longname)
224 # Make the package and subpackage
Neal Norwitz008b8612006-05-30 07:21:10 +0000225 shutil.rmtree(self.pkgname, ignore_errors=True)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000226 os.mkdir(self.pkgname)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000227 touch(os.path.join(self.pkgname, '__init__'+os.extsep+'py'))
Neal Norwitz008b8612006-05-30 07:21:10 +0000228 shutil.rmtree(self.subpkgname, ignore_errors=True)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000229 os.mkdir(self.subpkgname)
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000230 touch(os.path.join(self.subpkgname, '__init__'+os.extsep+'py'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000231 # Remember where we are
232 self.here = os.getcwd()
233 sys.path.insert(0, self.here)
234
235 def tearDown(self):
236 actions = []
237 os.path.walk(self.pkgname, zap, actions)
238 actions.append(self.pkgname)
239 actions.sort()
240 actions.reverse()
241 for p in actions:
242 if os.path.isdir(p):
243 os.rmdir(p)
244 else:
245 os.remove(p)
246 del sys.path[0]
247
248 def test_module(self):
249 eq = self.assertEquals
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000250 touch(os.path.join(self.subpkgname, self.pkgname + os.extsep + 'py'))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000251 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation
252 eq(repr(areallylongpackageandmodulenametotestreprtruncation),
Mark Hammondd800ae12003-01-16 04:56:52 +0000253 "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__))
Neal Norwitz70769012001-12-29 00:25:42 +0000254 eq(repr(sys), "<module 'sys' (built-in)>")
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000255
256 def test_type(self):
257 eq = self.assertEquals
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000258 touch(os.path.join(self.subpkgname, 'foo'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000259class foo(object):
260 pass
261''')
262 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
263 eq(repr(foo.foo),
Mark Hammondd800ae12003-01-16 04:56:52 +0000264 "<class '%s.foo'>" % foo.__name__)
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000265
266 def test_object(self):
267 # XXX Test the repr of a type with a really long tp_name but with no
268 # tp_repr. WIBNI we had ::Inline? :)
269 pass
270
271 def test_class(self):
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000272 touch(os.path.join(self.subpkgname, 'bar'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000273class bar:
274 pass
275''')
276 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar
Mark Hammondd800ae12003-01-16 04:56:52 +0000277 # Module name may be prefixed with "test.", depending on how run.
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000278 self.failUnless(repr(bar.bar).startswith(
Mark Hammondd800ae12003-01-16 04:56:52 +0000279 "<class %s.bar at 0x" % bar.__name__))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000280
281 def test_instance(self):
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000282 touch(os.path.join(self.subpkgname, 'baz'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000283class baz:
284 pass
285''')
286 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz
287 ibaz = baz.baz()
288 self.failUnless(repr(ibaz).startswith(
Mark Hammondd800ae12003-01-16 04:56:52 +0000289 "<%s.baz instance at 0x" % baz.__name__))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000290
291 def test_method(self):
292 eq = self.assertEquals
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000293 touch(os.path.join(self.subpkgname, 'qux'+os.extsep+'py'), '''\
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000294class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
295 def amethod(self): pass
296''')
297 from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
298 # Unbound methods first
299 eq(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod),
300 '<unbound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod>')
301 # Bound method next
302 iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
303 self.failUnless(repr(iqux.amethod).startswith(
Mark Hammondd800ae12003-01-16 04:56:52 +0000304 '<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa instance at 0x' \
305 % (qux.__name__,) ))
Barry Warsaw0bcf6d82001-08-24 18:37:32 +0000306
307 def test_builtin_function(self):
308 # XXX test built-in functions and methods with really long names
309 pass
Fred Drake8e6669a2001-07-19 22:27:56 +0000310
311class ClassWithRepr:
312 def __init__(self, s):
313 self.s = s
314 def __repr__(self):
315 return "ClassWithLongRepr(%r)" % self.s
316
317
318class ClassWithFailingRepr:
319 def __repr__(self):
320 raise Exception("This should be caught by Repr.repr_instance")
321
322
Fred Drake2e2be372001-09-20 21:33:42 +0000323def test_main():
324 run_unittest(ReprTests)
325 if os.name != 'mac':
326 run_unittest(LongReprTest)
327
328
329if __name__ == "__main__":
330 test_main()