test_repr.py revision ab541bb98e4b0deebc7baaaf6e9e231cd499b77c
18e6669ad05fa58226f36379857d8789319c6c496Fred Drake"""
28e6669ad05fa58226f36379857d8789319c6c496Fred Drake  Test cases for the repr module
38e6669ad05fa58226f36379857d8789319c6c496Fred Drake  Nick Mathewson
48e6669ad05fa58226f36379857d8789319c6c496Fred Drake"""
58e6669ad05fa58226f36379857d8789319c6c496Fred Drake
60bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawimport sys
70bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawimport os
88e6669ad05fa58226f36379857d8789319c6c496Fred Drakeimport unittest
90bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
108e6669ad05fa58226f36379857d8789319c6c496Fred Drakefrom test.test_support import run_unittest
11ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Petersfrom repr import repr as r # Don't shadow builtin repr
128e6669ad05fa58226f36379857d8789319c6c496Fred Drake
138e6669ad05fa58226f36379857d8789319c6c496Fred Drake
148e6669ad05fa58226f36379857d8789319c6c496Fred Drakedef nestedTuple(nesting):
158e6669ad05fa58226f36379857d8789319c6c496Fred Drake    t = ()
168e6669ad05fa58226f36379857d8789319c6c496Fred Drake    for i in range(nesting):
178e6669ad05fa58226f36379857d8789319c6c496Fred Drake        t = (t,)
188e6669ad05fa58226f36379857d8789319c6c496Fred Drake    return t
198e6669ad05fa58226f36379857d8789319c6c496Fred Drake
208e6669ad05fa58226f36379857d8789319c6c496Fred Drakeclass ReprTests(unittest.TestCase):
218e6669ad05fa58226f36379857d8789319c6c496Fred Drake
228e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_string(self):
238e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq = self.assertEquals
248e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r("abc"), "'abc'")
258e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r("abcdefghijklmnop"),"'abcdefghijklmnop'")
268e6669ad05fa58226f36379857d8789319c6c496Fred Drake
278e6669ad05fa58226f36379857d8789319c6c496Fred Drake        s = "a"*30+"b"*30
288e6669ad05fa58226f36379857d8789319c6c496Fred Drake        expected = repr(s)[:13] + "..." + repr(s)[-14:]
298e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(s), expected)
30ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
318e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r("\"'"), repr("\"'"))
328e6669ad05fa58226f36379857d8789319c6c496Fred Drake        s = "\""*30+"'"*100
338e6669ad05fa58226f36379857d8789319c6c496Fred Drake        expected = repr(s)[:13] + "..." + repr(s)[-14:]
348e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(s), expected)
358e6669ad05fa58226f36379857d8789319c6c496Fred Drake
368e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_container(self):
378e6669ad05fa58226f36379857d8789319c6c496Fred Drake        from array import array
388e6669ad05fa58226f36379857d8789319c6c496Fred Drake        from collections import deque
398e6669ad05fa58226f36379857d8789319c6c496Fred Drake
408e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq = self.assertEquals
418e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Tuples give up after 6 elements
428e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(()), "()")
438e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1,)), "(1,)")
448e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1, 2, 3)), "(1, 2, 3)")
458e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1, 2, 3, 4, 5, 6)), "(1, 2, 3, 4, 5, 6)")
468e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r((1, 2, 3, 4, 5, 6, 7)), "(1, 2, 3, 4, 5, 6, ...)")
478e6669ad05fa58226f36379857d8789319c6c496Fred Drake
488e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Lists give up after 6 as well
498e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([]), "[]")
508e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1]), "[1]")
518e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1, 2, 3]), "[1, 2, 3]")
528e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1, 2, 3, 4, 5, 6]), "[1, 2, 3, 4, 5, 6]")
538e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r([1, 2, 3, 4, 5, 6, 7]), "[1, 2, 3, 4, 5, 6, ...]")
548e6669ad05fa58226f36379857d8789319c6c496Fred Drake
558e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Sets give up after 6 as well
568e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(set([])), "set([])")
578e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(set([1])), "set([1])")
588e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(set([1, 2, 3])), "set([1, 2, 3])")
598e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(set([1, 2, 3, 4, 5, 6])), "set([1, 2, 3, 4, 5, 6])")
608e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(set([1, 2, 3, 4, 5, 6, 7])), "set([1, 2, 3, 4, 5, 6, ...])")
618e6669ad05fa58226f36379857d8789319c6c496Fred Drake
628e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Frozensets give up after 6 as well
638e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(frozenset([])), "frozenset([])")
648e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(frozenset([1])), "frozenset([1])")
658e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(frozenset([1, 2, 3])), "frozenset([1, 2, 3])")
668e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(frozenset([1, 2, 3, 4, 5, 6])), "frozenset([1, 2, 3, 4, 5, 6])")
678e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(frozenset([1, 2, 3, 4, 5, 6, 7])), "frozenset([1, 2, 3, 4, 5, 6, ...])")
688e6669ad05fa58226f36379857d8789319c6c496Fred Drake
698e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # collections.deque after 6
708e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(deque([1, 2, 3, 4, 5, 6, 7])), "deque([1, 2, 3, 4, 5, 6, ...])")
718e6669ad05fa58226f36379857d8789319c6c496Fred Drake
728e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Dictionaries give up after 4.
73ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(r({}), "{}")
748e6669ad05fa58226f36379857d8789319c6c496Fred Drake        d = {'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}
758e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(d), "{'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}")
768e6669ad05fa58226f36379857d8789319c6c496Fred Drake        d['arthur'] = 1
778e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(d), "{'alice': 1, 'arthur': 1, 'bob': 2, 'charles': 3, ...}")
788e6669ad05fa58226f36379857d8789319c6c496Fred Drake
798e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # array.array after 5.
808e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(r(array('i')), "array('i', [])")
81cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum        eq(r(array('i', [1])), "array('i', [1])")
82cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum        eq(r(array('i', [1, 2])), "array('i', [1, 2])")
83cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum        eq(r(array('i', [1, 2, 3])), "array('i', [1, 2, 3])")
84cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum        eq(r(array('i', [1, 2, 3, 4])), "array('i', [1, 2, 3, 4])")
85cf856f9f28e4a2806fa835fb4e0e54582c0a2eddGuido van Rossum        eq(r(array('i', [1, 2, 3, 4, 5])), "array('i', [1, 2, 3, 4, 5])")
860bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(array('i', [1, 2, 3, 4, 5, 6])),
870bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw                   "array('i', [1, 2, 3, 4, 5, ...])")
880bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
890bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_numbers(self):
900bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
910bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(123), repr(123))
920bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(123L), repr(123L))
930bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(1.0/3), repr(1.0/3))
940bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
950bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        n = 10L**100
96dd32138e7dc66633b8804cd8e59ada5f9f5472c1Jeremy Hylton        expected = repr(n)[:18] + "..." + repr(n)[-19:]
970bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(n), expected)
980bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
990bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_instance(self):
1000bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
1010bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        i1 = ClassWithRepr("a")
1020bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(i1), repr(i1))
1030bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1040bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        i2 = ClassWithRepr("x"*1000)
1050bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        expected = repr(i2)[:13] + "..." + repr(i2)[-14:]
1060bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(i2), expected)
1070bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1080bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        i3 = ClassWithFailingRepr()
1090bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(i3), ("<ClassWithFailingRepr instance at %x>"%id(i3)))
1100bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1110bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        s = r(ClassWithFailingRepr)
1120bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(s.startswith("<class "))
1130bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(s.endswith(">"))
1140bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(s.find("...") == 8)
1150bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1160bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_file(self):
1170bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        fp = open(unittest.__file__)
1188e6669ad05fa58226f36379857d8789319c6c496Fred Drake        self.failUnless(repr(fp).startswith(
1198e6669ad05fa58226f36379857d8789319c6c496Fred Drake            "<open file '%s', mode 'r' at 0x" % unittest.__file__))
1208e6669ad05fa58226f36379857d8789319c6c496Fred Drake        fp.close()
1218e6669ad05fa58226f36379857d8789319c6c496Fred Drake        self.failUnless(repr(fp).startswith(
1228e6669ad05fa58226f36379857d8789319c6c496Fred Drake            "<closed file '%s', mode 'r' at 0x" % unittest.__file__))
1238e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1248e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_lambda(self):
1258e6669ad05fa58226f36379857d8789319c6c496Fred Drake        self.failUnless(repr(lambda x: x).startswith(
1268e6669ad05fa58226f36379857d8789319c6c496Fred Drake            "<function <lambda"))
1278e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # XXX anonymous functions?  see func_repr
1288e6669ad05fa58226f36379857d8789319c6c496Fred Drake
1298e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_builtin_function(self):
1308e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq = self.assertEquals
1318e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Functions
1328e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq(repr(hash), '<built-in function hash>')
1338e6669ad05fa58226f36379857d8789319c6c496Fred Drake        # Methods
1348e6669ad05fa58226f36379857d8789319c6c496Fred Drake        self.failUnless(repr(''.split).startswith(
1350bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            '<built-in method split of str object at 0x'))
1360bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1370bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_xrange(self):
1380bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        import warnings
1390bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
1400bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(xrange(1)), 'xrange(1)')
1410bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(xrange(1, 2)), 'xrange(1, 2)')
1420bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(xrange(1, 2, 3)), 'xrange(1, 4, 3)')
1430bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1440bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_nesting(self):
1450bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
1460bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # everything is meant to give up after 6 levels.
1470bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r([[[[[[[]]]]]]]), "[[[[[[[]]]]]]]")
1480bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r([[[[[[[[]]]]]]]]), "[[[[[[[...]]]]]]]")
1490bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1500bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(nestedTuple(6)), "(((((((),),),),),),)")
1510bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r(nestedTuple(7)), "(((((((...),),),),),),)")
1520bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1530bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r({ nestedTuple(5) : nestedTuple(5) }),
1540bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw           "{((((((),),),),),): ((((((),),),),),)}")
1550bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r({ nestedTuple(6) : nestedTuple(6) }),
1560bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw           "{((((((...),),),),),): ((((((...),),),),),)}")
1570bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1580bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r([[[[[[{}]]]]]]), "[[[[[[{}]]]]]]")
1590bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(r([[[[[[[{}]]]]]]]), "[[[[[[[...]]]]]]]")
1600bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1610bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_buffer(self):
1620bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX doesn't test buffers with no b_base or read-write buffers (see
1630bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # bufferobject.c).  The test is fairly incomplete too.  Sigh.
1640bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        x = buffer('foo')
1650bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(repr(x).startswith('<read-only buffer for 0x'))
1660bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1670bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_cell(self):
1680bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX Hmm? How to get at a cell object?
1690bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        pass
1700bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1710bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_descriptors(self):
1720bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
1730bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # method descriptors
1740bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(dict.items), "<method 'items' of 'dict' objects>")
1750bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX member descriptors
1760bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX attribute descriptors
1770bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX slot descriptors
1780bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # static and class methods
1790bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        class C:
1800bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            def foo(cls): pass
1810bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        x = staticmethod(C.foo)
1820bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(repr(x).startswith('<staticmethod object at 0x'))
1830bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        x = classmethod(C.foo)
1840bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(repr(x).startswith('<classmethod object at 0x'))
1850bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1860bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawdef touch(path, text=''):
1870bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    fp = open(path, 'w')
1880bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    fp.write(text)
1890bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    fp.close()
1900bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1910bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawdef zap(actions, dirname, names):
1920bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    for name in names:
1930bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.append(os.path.join(dirname, name))
1940bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
1950bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass LongReprTest(unittest.TestCase):
1960bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def setUp(self):
1970bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        longname = 'areallylongpackageandmodulenametotestreprtruncation'
1980bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.pkgname = os.path.join(longname)
1990bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.subpkgname = os.path.join(longname, longname)
2000bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Make the package and subpackage
2010bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        os.mkdir(self.pkgname)
2020bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        touch(os.path.join(self.pkgname, '__init__'+os.extsep+'py'))
2030bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        os.mkdir(self.subpkgname)
2040bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        touch(os.path.join(self.subpkgname, '__init__'+os.extsep+'py'))
2050bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Remember where we are
2060bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.here = os.getcwd()
2070bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        sys.path.insert(0, self.here)
2080bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2090bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def tearDown(self):
2100bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions = []
2110bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        os.path.walk(self.pkgname, zap, actions)
2120bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.append(self.pkgname)
2130bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.sort()
2140bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        actions.reverse()
2150bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        for p in actions:
2160bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            if os.path.isdir(p):
2170bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw                os.rmdir(p)
2180bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            else:
2190bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw                os.remove(p)
2200bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        del sys.path[0]
2210bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2220bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_module(self):
2230bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
2240bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        touch(os.path.join(self.subpkgname, self.pkgname + os.extsep + 'py'))
2250bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation
2260bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(areallylongpackageandmodulenametotestreprtruncation),
2270bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw           "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__))
2280bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(sys), "<module 'sys' (built-in)>")
2290bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2300bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_type(self):
2310bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq = self.assertEquals
2320bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        touch(os.path.join(self.subpkgname, 'foo'+os.extsep+'py'), '''\
2330bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass foo(object):
2340bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    pass
2350bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw''')
2360bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
2370bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        eq(repr(foo.foo),
2380bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw               "<class '%s.foo'>" % foo.__name__)
2390bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2400bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_object(self):
2410bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # XXX Test the repr of a type with a really long tp_name but with no
2420bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # tp_repr.  WIBNI we had ::Inline? :)
2430bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        pass
2440bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2450bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    def test_class(self):
2460bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        touch(os.path.join(self.subpkgname, 'bar'+os.extsep+'py'), '''\
2470bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsawclass bar:
2480bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw    pass
2490bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw''')
2500bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar
2510bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        # Module name may be prefixed with "test.", depending on how run.
2520bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw        self.failUnless(repr(bar.bar).startswith(
2530bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw            "<class %s.bar at 0x" % bar.__name__))
2540bcf6d8d5436e9223f795a2040e330f43ebc1ce6Barry Warsaw
2558e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_instance(self):
2568e6669ad05fa58226f36379857d8789319c6c496Fred Drake        touch(os.path.join(self.subpkgname, 'baz'+os.extsep+'py'), '''\
2578e6669ad05fa58226f36379857d8789319c6c496Fred Drakeclass baz:
2588e6669ad05fa58226f36379857d8789319c6c496Fred Drake    pass
2598e6669ad05fa58226f36379857d8789319c6c496Fred Drake''')
2608e6669ad05fa58226f36379857d8789319c6c496Fred Drake        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz
2618e6669ad05fa58226f36379857d8789319c6c496Fred Drake        ibaz = baz.baz()
2628e6669ad05fa58226f36379857d8789319c6c496Fred Drake        self.failUnless(repr(ibaz).startswith(
2638e6669ad05fa58226f36379857d8789319c6c496Fred Drake            "<%s.baz instance at 0x" % baz.__name__))
2648e6669ad05fa58226f36379857d8789319c6c496Fred Drake
2658e6669ad05fa58226f36379857d8789319c6c496Fred Drake    def test_method(self):
2668e6669ad05fa58226f36379857d8789319c6c496Fred Drake        eq = self.assertEquals
2678e6669ad05fa58226f36379857d8789319c6c496Fred Drake        touch(os.path.join(self.subpkgname, 'qux'+os.extsep+'py'), '''\
2682e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drakeclass aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
2692e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake    def amethod(self): pass
2702e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake''')
2712e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake        from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
2722e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake        # Unbound methods first
2732e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake        eq(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod),
2742e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake        '<unbound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod>')
2752e2be3760ccdfd4bdde4afdd66f4078022ba3b61Fred Drake        # Bound method next
276        iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
277        self.failUnless(repr(iqux.amethod).startswith(
278            '<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa instance at 0x' \
279            % (qux.__name__,) ))
280
281    def test_builtin_function(self):
282        # XXX test built-in functions and methods with really long names
283        pass
284
285class ClassWithRepr:
286    def __init__(self, s):
287        self.s = s
288    def __repr__(self):
289        return "ClassWithLongRepr(%r)" % self.s
290
291
292class ClassWithFailingRepr:
293    def __repr__(self):
294        raise Exception("This should be caught by Repr.repr_instance")
295
296
297def test_main():
298    run_unittest(ReprTests)
299    if os.name != 'mac':
300        run_unittest(LongReprTest)
301
302
303if __name__ == "__main__":
304    test_main()
305