18e6669ad05fa58226f36379857d8789319c6c496Fred Drake"""
28e6669ad05fa58226f36379857d8789319c6c496Fred Drake  Test cases for the repr module
38e6669ad05fa58226f36379857d8789319c6c496Fred Drake  Nick Mathewson
48e6669ad05fa58226f36379857d8789319c6c496Fred Drake"""
58e6669ad05fa58226f36379857d8789319c6c496Fred Drake
60bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawimport sys
70bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawimport os
8008b861bf03f515b19ced29b1138a7c9fc910d82Neal Norwitzimport shutil
98e6669ad05fa58226f36379857d8789319c6c496Fred Drakeimport unittest
100bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
11d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melottifrom test.test_support import run_unittest, check_py3k_warnings
122ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannonfrom repr import repr as r # Don't shadow builtin repr
132ee0e8eaec7f6e87664c2c9297633623cbd28868Brett Cannonfrom repr import Repr
148e6669ad05fa58226f36379857d8789319c6c496Fred Drake
158e6669ad05fa58226f36379857d8789319c6c496Fred Drake
168e6669ad05fa58226f36379857d8789319c6c496Fred Drakedef nestedTuple(nesting):
178e6669ad05fa58226f36379857d8789319c6c496Fred Drake    t = ()
188e6669ad05fa58226f36379857d8789319c6c496Fred Drake    for i in range(nesting):
198e6669ad05fa58226f36379857d8789319c6c496Fred Drake        t = (t,)
208e6669ad05fa58226f36379857d8789319c6c496Fred Drake    return t
218e6669ad05fa58226f36379857d8789319c6c496Fred Drake
228e6669ad05fa58226f36379857d8789319c6c496Fred Drakeclass ReprTests(unittest.TestCase):
238e6669ad05fa58226f36379857d8789319c6c496Fred Drake
248e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_string(self):
252623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
268e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r("abc"), "'abc'")
278e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r("abcdefghijklmnop"),"'abcdefghijklmnop'")
288e6669ad05fa58226f36379857d8789319c6c496Fred Drake
298e6669ad05fa58226f36379857d8789319c6c496Fred Drake        s = "a"*30+"b"*30
3070a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald        expected = repr(s)[:13] + "..." + repr(s)[-14:]
318e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(s), expected)
32ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
338e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r("\"'"), repr("\"'"))
348e6669ad05fa58226f36379857d8789319c6c496Fred Drake        s = "\""*30+"'"*100
3570a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald        expected = repr(s)[:13] + "..." + repr(s)[-14:]
368e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(s), expected)
378e6669ad05fa58226f36379857d8789319c6c496Fred Drake
38c161cb995530521711e47425170524921fc1b559Neal Norwitz    def test_tuple(self):
392623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
40c161cb995530521711e47425170524921fc1b559Neal Norwitz        eq(r((1,)), "(1,)")
41c161cb995530521711e47425170524921fc1b559Neal Norwitz
42c161cb995530521711e47425170524921fc1b559Neal Norwitz        t3 = (1, 2, 3)
43c161cb995530521711e47425170524921fc1b559Neal Norwitz        eq(r(t3), "(1, 2, 3)")
44c161cb995530521711e47425170524921fc1b559Neal Norwitz
45c161cb995530521711e47425170524921fc1b559Neal Norwitz        r2 = Repr()
46c161cb995530521711e47425170524921fc1b559Neal Norwitz        r2.maxtuple = 2
47c161cb995530521711e47425170524921fc1b559Neal Norwitz        expected = repr(t3)[:-2] + "...)"
48c161cb995530521711e47425170524921fc1b559Neal Norwitz        eq(r2.repr(t3), expected)
49c161cb995530521711e47425170524921fc1b559Neal Norwitz
508e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_container(self):
516ee0480521901d3e84769d1590603f89efd456a4Tim Peters        from array import array
521453e4aa7587898954acc49e7680a9d65c5d2c74Raymond Hettinger        from collections import deque
536ee0480521901d3e84769d1590603f89efd456a4Tim Peters
542623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
558e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Tuples give up after 6 elements
568e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(()), "()")
578e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1,)), "(1,)")
588e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1, 2, 3)), "(1, 2, 3)")
598e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1, 2, 3, 4, 5, 6)), "(1, 2, 3, 4, 5, 6)")
608e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1, 2, 3, 4, 5, 6, 7)), "(1, 2, 3, 4, 5, 6, ...)")
618e6669ad05fa58226f36379857d8789319c6c496Fred Drake
628e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Lists give up after 6 as well
638e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([]), "[]")
648e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1]), "[1]")
658e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1, 2, 3]), "[1, 2, 3]")
668e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1, 2, 3, 4, 5, 6]), "[1, 2, 3, 4, 5, 6]")
678e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1, 2, 3, 4, 5, 6, 7]), "[1, 2, 3, 4, 5, 6, ...]")
688e6669ad05fa58226f36379857d8789319c6c496Fred Drake
69ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        # Sets give up after 6 as well
70ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(set([])), "set([])")
71ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(set([1])), "set([1])")
72ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(set([1, 2, 3])), "set([1, 2, 3])")
73ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(set([1, 2, 3, 4, 5, 6])), "set([1, 2, 3, 4, 5, 6])")
74ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(set([1, 2, 3, 4, 5, 6, 7])), "set([1, 2, 3, 4, 5, 6, ...])")
75ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger
76ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        # Frozensets give up after 6 as well
77ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(frozenset([])), "frozenset([])")
78ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(frozenset([1])), "frozenset([1])")
79ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(frozenset([1, 2, 3])), "frozenset([1, 2, 3])")
80ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(frozenset([1, 2, 3, 4, 5, 6])), "frozenset([1, 2, 3, 4, 5, 6])")
81ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger        eq(r(frozenset([1, 2, 3, 4, 5, 6, 7])), "frozenset([1, 2, 3, 4, 5, 6, ...])")
82ba6cd3647ff5bd0415dcdb4649a5e6a7a88c0e72Raymond Hettinger
831453e4aa7587898954acc49e7680a9d65c5d2c74Raymond Hettinger        # collections.deque after 6
841453e4aa7587898954acc49e7680a9d65c5d2c74Raymond Hettinger        eq(r(deque([1, 2, 3, 4, 5, 6, 7])), "deque([1, 2, 3, 4, 5, 6, ...])")
851453e4aa7587898954acc49e7680a9d65c5d2c74Raymond Hettinger
868e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Dictionaries give up after 4.
878e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r({}), "{}")
888e6669ad05fa58226f36379857d8789319c6c496Fred Drake        d = {'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}
898e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(d), "{'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}")
908e6669ad05fa58226f36379857d8789319c6c496Fred Drake        d['arthur'] = 1
918e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(d), "{'alice': 1, 'arthur': 1, 'bob': 2, 'charles': 3, ...}")
928e6669ad05fa58226f36379857d8789319c6c496Fred Drake
936ee0480521901d3e84769d1590603f89efd456a4Tim Peters        # array.array after 5.
946ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i')), "array('i', [])")
956ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i', [1])), "array('i', [1])")
966ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i', [1, 2])), "array('i', [1, 2])")
976ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i', [1, 2, 3])), "array('i', [1, 2, 3])")
986ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i', [1, 2, 3, 4])), "array('i', [1, 2, 3, 4])")
996ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i', [1, 2, 3, 4, 5])), "array('i', [1, 2, 3, 4, 5])")
1006ee0480521901d3e84769d1590603f89efd456a4Tim Peters        eq(r(array('i', [1, 2, 3, 4, 5, 6])),
1016ee0480521901d3e84769d1590603f89efd456a4Tim Peters                   "array('i', [1, 2, 3, 4, 5, ...])")
1026ee0480521901d3e84769d1590603f89efd456a4Tim Peters
1038e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_numbers(self):
1042623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
1058e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(123), repr(123))
1068e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(123L), repr(123L))
1078e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(1.0/3), repr(1.0/3))
1088e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1098e6669ad05fa58226f36379857d8789319c6c496Fred Drake        n = 10L**100
11070a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald        expected = repr(n)[:18] + "..." + repr(n)[-19:]
1118e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(n), expected)
1128e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1138e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_instance(self):
1142623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
1158e6669ad05fa58226f36379857d8789319c6c496Fred Drake        i1 = ClassWithRepr("a")
1168e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(i1), repr(i1))
117ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1188e6669ad05fa58226f36379857d8789319c6c496Fred Drake        i2 = ClassWithRepr("x"*1000)
11970a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald        expected = repr(i2)[:13] + "..." + repr(i2)[-14:]
1208e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(i2), expected)
1218e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1228e6669ad05fa58226f36379857d8789319c6c496Fred Drake        i3 = ClassWithFailingRepr()
1238e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(i3), ("<ClassWithFailingRepr instance at %x>"%id(i3)))
1248e6669ad05fa58226f36379857d8789319c6c496Fred Drake
125cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum        s = r(ClassWithFailingRepr)
1265c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(s.startswith("<class "))
1275c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(s.endswith(">"))
1285c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(s.find("...") == 8)
129cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum
1300bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_file(self):
1310bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        fp = open(unittest.__file__)
1325c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(fp).startswith(
133b60156e809038ab5f8c59152ddeaa0d44ad9ed6aEzio Melotti            "<open file %r, mode 'r' at 0x" % unittest.__file__))
1340bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        fp.close()
1355c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(fp).startswith(
136b60156e809038ab5f8c59152ddeaa0d44ad9ed6aEzio Melotti            "<closed file %r, mode 'r' at 0x" % unittest.__file__))
1370bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1380bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_lambda(self):
1395c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(lambda x: x).startswith(
140ab541bb98e4b0deebc7baaaf6e9e231cd499b77cNeil Schemenauer            "<function <lambda"))
1410bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX anonymous functions?  see func_repr
1420bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1430bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_builtin_function(self):
1442623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
1450bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Functions
1460bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(hash), '<built-in function hash>')
1470bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Methods
1485c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(''.split).startswith(
1490bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            '<built-in method split of str object at 0x'))
1500bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1510bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_xrange(self):
1522623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
1530bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(xrange(1)), 'xrange(1)')
1540bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(xrange(1, 2)), 'xrange(1, 2)')
1550bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(xrange(1, 2, 3)), 'xrange(1, 4, 3)')
1560bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1578e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_nesting(self):
1582623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
1598e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # everything is meant to give up after 6 levels.
1608e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([[[[[[[]]]]]]]), "[[[[[[[]]]]]]]")
1618e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([[[[[[[[]]]]]]]]), "[[[[[[[...]]]]]]]")
1628e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1638e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(nestedTuple(6)), "(((((((),),),),),),)")
1648e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(nestedTuple(7)), "(((((((...),),),),),),)")
1658e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1668e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r({ nestedTuple(5) : nestedTuple(5) }),
1678e6669ad05fa58226f36379857d8789319c6c496Fred Drake           "{((((((),),),),),): ((((((),),),),),)}")
1688e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r({ nestedTuple(6) : nestedTuple(6) }),
1698e6669ad05fa58226f36379857d8789319c6c496Fred Drake           "{((((((...),),),),),): ((((((...),),),),),)}")
1708e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1718e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([[[[[[{}]]]]]]), "[[[[[[{}]]]]]]")
1728e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([[[[[[[{}]]]]]]]), "[[[[[[[...]]]]]]]")
1738e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1740bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_buffer(self):
1750bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX doesn't test buffers with no b_base or read-write buffers (see
1760bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # bufferobject.c).  The test is fairly incomplete too.  Sigh.
177d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti        with check_py3k_warnings():
178d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti            x = buffer('foo')
1795c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(x).startswith('<read-only buffer for 0x'))
1800bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1810bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_cell(self):
18295d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka        def get_cell():
18395d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka            x = 42
18495d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka            def inner():
18595d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka                return x
18695d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka            return inner
18795d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka        x = get_cell().__closure__[0]
188227c01a194ff4c83ba395ccf175cd72d882b3da2Zachary Ware        self.assertRegexpMatches(repr(x), r'<cell at 0x[0-9A-Fa-f]+: '
189227c01a194ff4c83ba395ccf175cd72d882b3da2Zachary Ware                                          r'int object at 0x[0-9A-Fa-f]+>')
19095d721927a4e4c5acb4a7d23bd15a3af1ce26bd2Serhiy Storchaka        self.assertRegexpMatches(r(x), r'<cell at.*\.\.\..*>')
1910bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1920bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_descriptors(self):
1932623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
1940bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # method descriptors
195a427a2b8d09a756119d424efac85159a0270b503Tim Peters        eq(repr(dict.items), "<method 'items' of 'dict' objects>")
1960bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX member descriptors
1970bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX attribute descriptors
1980bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX slot descriptors
1990bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # static and class methods
2000bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        class C:
2010bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            def foo(cls): pass
2020bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        x = staticmethod(C.foo)
2035c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(x).startswith('<staticmethod object at 0x'))
2040bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        x = classmethod(C.foo)
2055c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(x).startswith('<classmethod object at 0x'))
2060bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2078fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl    def test_unsortable(self):
2088fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        # Repr.repr() used to call sorted() on sets, frozensets and dicts
2098fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        # without taking into account that not all objects are comparable
2108fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        x = set([1j, 2j, 3j])
2118fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        y = frozenset(x)
2128fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        z = {1j: 1, 2j: 2}
2138fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        r(x)
2148fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        r(y)
2158fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl        r(z)
2168fd3ecf9289942d5544c3943be9bc4e9386908b7Georg Brandl
2170bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawdef touch(path, text=''):
2180bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    fp = open(path, 'w')
2190bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    fp.write(text)
2200bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    fp.close()
2210bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2220bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass LongReprTest(unittest.TestCase):
2230bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def setUp(self):
2240bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        longname = 'areallylongpackageandmodulenametotestreprtruncation'
2250bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.pkgname = os.path.join(longname)
2260bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.subpkgname = os.path.join(longname, longname)
2270bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Make the package and subpackage
228008b861bf03f515b19ced29b1138a7c9fc910d82Neal Norwitz        shutil.rmtree(self.pkgname, ignore_errors=True)
2290bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        os.mkdir(self.pkgname)
230e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.pkgname, '__init__'+os.extsep+'py'))
231008b861bf03f515b19ced29b1138a7c9fc910d82Neal Norwitz        shutil.rmtree(self.subpkgname, ignore_errors=True)
2320bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        os.mkdir(self.subpkgname)
233e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.subpkgname, '__init__'+os.extsep+'py'))
2340bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Remember where we are
2350bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.here = os.getcwd()
2360bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        sys.path.insert(0, self.here)
2370bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2380bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def tearDown(self):
2390bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions = []
2409ec4aa01f9e1b5f0d8ed94005ac5b14d6ff94ebcBenjamin Peterson        for dirpath, dirnames, filenames in os.walk(self.pkgname):
2419ec4aa01f9e1b5f0d8ed94005ac5b14d6ff94ebcBenjamin Peterson            for name in dirnames + filenames:
2429ec4aa01f9e1b5f0d8ed94005ac5b14d6ff94ebcBenjamin Peterson                actions.append(os.path.join(dirpath, name))
2430bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.append(self.pkgname)
2440bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.sort()
2450bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.reverse()
2460bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        for p in actions:
2470bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            if os.path.isdir(p):
2480bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw                os.rmdir(p)
2490bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            else:
2500bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw                os.remove(p)
2510bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        del sys.path[0]
2520bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2530bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_module(self):
2542623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
255e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.subpkgname, self.pkgname + os.extsep + 'py'))
2560bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation
2570bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(areallylongpackageandmodulenametotestreprtruncation),
258d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond           "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__))
259707690132fc28773843eb154c8c8c1599c4fe5c8Neal Norwitz        eq(repr(sys), "<module 'sys' (built-in)>")
2600bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2610bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_type(self):
2622623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
263e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.subpkgname, 'foo'+os.extsep+'py'), '''\
2640bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass foo(object):
2650bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    pass
2660bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw''')
2670bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
2680bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(foo.foo),
269d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond               "<class '%s.foo'>" % foo.__name__)
2700bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2711f70221b861a3714735251d57695b2f472d0599bZachary Ware    @unittest.skip('need a suitable object')
2720bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_object(self):
2730bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX Test the repr of a type with a really long tp_name but with no
2740bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # tp_repr.  WIBNI we had ::Inline? :)
2750bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        pass
2760bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2770bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_class(self):
278e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.subpkgname, 'bar'+os.extsep+'py'), '''\
2790bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass bar:
2800bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    pass
2810bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw''')
2820bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar
283d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond        # Module name may be prefixed with "test.", depending on how run.
2845c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(bar.bar).startswith(
285d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond            "<class %s.bar at 0x" % bar.__name__))
2860bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2870bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_instance(self):
288e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.subpkgname, 'baz'+os.extsep+'py'), '''\
2890bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass baz:
2900bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    pass
2910bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw''')
2920bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz
2930bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        ibaz = baz.baz()
2945c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(ibaz).startswith(
295d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond            "<%s.baz instance at 0x" % baz.__name__))
2960bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2970bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_method(self):
2982623a37852153363335956afab010cb0beb7e74eEzio Melotti        eq = self.assertEqual
299e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum        touch(os.path.join(self.subpkgname, 'qux'+os.extsep+'py'), '''\
3000bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
3010bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def amethod(self): pass
3020bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw''')
3030bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
3040bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Unbound methods first
3050bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod),
3060bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        '<unbound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod>')
3070bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Bound method next
3080bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
3095c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(repr(iqux.amethod).startswith(
310d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond            '<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa instance at 0x' \
311d800ae12f2efa048ee4e9c2558e646c9f3304022Mark Hammond            % (qux.__name__,) ))
3120bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
3131f70221b861a3714735251d57695b2f472d0599bZachary Ware    @unittest.skip('needs a built-in function with a really long name')
3140bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_builtin_function(self):
3150bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX test built-in functions and methods with really long names
3160bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        pass
3178e6669ad05fa58226f36379857d8789319c6c496Fred Drake
3188e6669ad05fa58226f36379857d8789319c6c496Fred Drakeclass ClassWithRepr:
3198e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def __init__(self, s):
3208e6669ad05fa58226f36379857d8789319c6c496Fred Drake        self.s = s
3218e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def __repr__(self):
3228e6669ad05fa58226f36379857d8789319c6c496Fred Drake        return "ClassWithLongRepr(%r)" % self.s
3238e6669ad05fa58226f36379857d8789319c6c496Fred Drake
3248e6669ad05fa58226f36379857d8789319c6c496Fred Drake
3258e6669ad05fa58226f36379857d8789319c6c496Fred Drakeclass ClassWithFailingRepr:
3268e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def __repr__(self):
3278e6669ad05fa58226f36379857d8789319c6c496Fred Drake        raise Exception("This should be caught by Repr.repr_instance")
3288e6669ad05fa58226f36379857d8789319c6c496Fred Drake
3298e6669ad05fa58226f36379857d8789319c6c496Fred Drake
3302e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drakedef test_main():
3312e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake    run_unittest(ReprTests)
3329545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren    run_unittest(LongReprTest)
3332e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake
3342e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake
3352e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drakeif __name__ == "__main__":
3362e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake    test_main()
337