diff options
author | Alexandre Vassalotti <alexandre@peadrop.com> | 2008-05-16 18:15:12 (GMT) |
---|---|---|
committer | Alexandre Vassalotti <alexandre@peadrop.com> | 2008-05-16 18:15:12 (GMT) |
commit | bee325387b21b859054002a052149646399b52de (patch) | |
tree | 76d4edea625f87c01c50e3ac4d63d5582107868c /Lib/test/test_reprlib.py | |
parent | d8b690f7ae57169d95f1cb4b3a0bccf5adfe6a30 (diff) | |
download | cpython-bee325387b21b859054002a052149646399b52de.zip cpython-bee325387b21b859054002a052149646399b52de.tar.gz cpython-bee325387b21b859054002a052149646399b52de.tar.bz2 |
Merged revisions 63361-63373,63375,63377-63380 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r63361 | alexandre.vassalotti | 2008-05-16 03:14:08 -0400 (Fri, 16 May 2008) | 2 lines
Rename the test file of reprlib.
........
r63364 | georg.brandl | 2008-05-16 05:34:48 -0400 (Fri, 16 May 2008) | 2 lines
Make generator repr consistent with function and code object repr.
........
r63365 | georg.brandl | 2008-05-16 05:47:29 -0400 (Fri, 16 May 2008) | 2 lines
#2869: remove parameter from signature.
........
r63366 | christian.heimes | 2008-05-16 06:23:31 -0400 (Fri, 16 May 2008) | 1 line
Fixed #2870: cmathmodule.c compile error
........
r63367 | christian.heimes | 2008-05-16 07:28:56 -0400 (Fri, 16 May 2008) | 1 line
Following Amaury's advice
........
r63368 | georg.brandl | 2008-05-16 09:10:15 -0400 (Fri, 16 May 2008) | 2 lines
#2890: support os.O_ASYNC and fcntl.FASYNC.
........
r63369 | georg.brandl | 2008-05-16 09:18:50 -0400 (Fri, 16 May 2008) | 2 lines
#2845: fix copy2's docs.
........
r63370 | georg.brandl | 2008-05-16 09:24:29 -0400 (Fri, 16 May 2008) | 2 lines
Don't allow keyword arguments to reversed().
........
r63373 | georg.brandl | 2008-05-16 09:41:26 -0400 (Fri, 16 May 2008) | 2 lines
Document O_ASYNC addition.
........
r63380 | georg.brandl | 2008-05-16 13:33:13 -0400 (Fri, 16 May 2008) | 2 lines
Fix reprlib docs.
........
Diffstat (limited to 'Lib/test/test_reprlib.py')
-rw-r--r-- | Lib/test/test_reprlib.py | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py new file mode 100644 index 0000000..442c048 --- /dev/null +++ b/Lib/test/test_reprlib.py @@ -0,0 +1,312 @@ +""" + Test cases for the repr module + Nick Mathewson +""" + +import sys +import os +import shutil +import unittest + +from test.test_support import run_unittest +from reprlib import repr as r # Don't shadow builtin repr +from reprlib import Repr + + +def nestedTuple(nesting): + t = () + for i in range(nesting): + t = (t,) + return t + +class ReprTests(unittest.TestCase): + + def test_string(self): + eq = self.assertEquals + eq(r("abc"), "'abc'") + eq(r("abcdefghijklmnop"),"'abcdefghijklmnop'") + + s = "a"*30+"b"*30 + expected = repr(s)[:13] + "..." + repr(s)[-14:] + eq(r(s), expected) + + eq(r("\"'"), repr("\"'")) + s = "\""*30+"'"*100 + expected = repr(s)[:13] + "..." + repr(s)[-14:] + eq(r(s), expected) + + def test_tuple(self): + eq = self.assertEquals + eq(r((1,)), "(1,)") + + t3 = (1, 2, 3) + eq(r(t3), "(1, 2, 3)") + + r2 = Repr() + r2.maxtuple = 2 + expected = repr(t3)[:-2] + "...)" + eq(r2.repr(t3), expected) + + def test_container(self): + from array import array + from collections import deque + + eq = self.assertEquals + # Tuples give up after 6 elements + eq(r(()), "()") + eq(r((1,)), "(1,)") + eq(r((1, 2, 3)), "(1, 2, 3)") + eq(r((1, 2, 3, 4, 5, 6)), "(1, 2, 3, 4, 5, 6)") + eq(r((1, 2, 3, 4, 5, 6, 7)), "(1, 2, 3, 4, 5, 6, ...)") + + # Lists give up after 6 as well + eq(r([]), "[]") + eq(r([1]), "[1]") + eq(r([1, 2, 3]), "[1, 2, 3]") + eq(r([1, 2, 3, 4, 5, 6]), "[1, 2, 3, 4, 5, 6]") + eq(r([1, 2, 3, 4, 5, 6, 7]), "[1, 2, 3, 4, 5, 6, ...]") + + # Sets give up after 6 as well + eq(r(set([])), "set([])") + eq(r(set([1])), "set([1])") + eq(r(set([1, 2, 3])), "set([1, 2, 3])") + eq(r(set([1, 2, 3, 4, 5, 6])), "set([1, 2, 3, 4, 5, 6])") + eq(r(set([1, 2, 3, 4, 5, 6, 7])), "set([1, 2, 3, 4, 5, 6, ...])") + + # Frozensets give up after 6 as well + eq(r(frozenset([])), "frozenset([])") + eq(r(frozenset([1])), "frozenset([1])") + eq(r(frozenset([1, 2, 3])), "frozenset([1, 2, 3])") + eq(r(frozenset([1, 2, 3, 4, 5, 6])), "frozenset([1, 2, 3, 4, 5, 6])") + eq(r(frozenset([1, 2, 3, 4, 5, 6, 7])), "frozenset([1, 2, 3, 4, 5, 6, ...])") + + # collections.deque after 6 + eq(r(deque([1, 2, 3, 4, 5, 6, 7])), "deque([1, 2, 3, 4, 5, 6, ...])") + + # Dictionaries give up after 4. + eq(r({}), "{}") + d = {'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4} + eq(r(d), "{'alice': 1, 'bob': 2, 'charles': 3, 'dave': 4}") + d['arthur'] = 1 + eq(r(d), "{'alice': 1, 'arthur': 1, 'bob': 2, 'charles': 3, ...}") + + # array.array after 5. + eq(r(array('i')), "array('i', [])") + eq(r(array('i', [1])), "array('i', [1])") + eq(r(array('i', [1, 2])), "array('i', [1, 2])") + eq(r(array('i', [1, 2, 3])), "array('i', [1, 2, 3])") + eq(r(array('i', [1, 2, 3, 4])), "array('i', [1, 2, 3, 4])") + eq(r(array('i', [1, 2, 3, 4, 5])), "array('i', [1, 2, 3, 4, 5])") + eq(r(array('i', [1, 2, 3, 4, 5, 6])), + "array('i', [1, 2, 3, 4, 5, ...])") + + def test_numbers(self): + eq = self.assertEquals + eq(r(123), repr(123)) + eq(r(123), repr(123)) + eq(r(1.0/3), repr(1.0/3)) + + n = 10**100 + expected = repr(n)[:18] + "..." + repr(n)[-19:] + eq(r(n), expected) + + def test_instance(self): + eq = self.assertEquals + i1 = ClassWithRepr("a") + eq(r(i1), repr(i1)) + + i2 = ClassWithRepr("x"*1000) + expected = repr(i2)[:13] + "..." + repr(i2)[-14:] + eq(r(i2), expected) + + i3 = ClassWithFailingRepr() + eq(r(i3), ("<ClassWithFailingRepr instance at %x>"%id(i3))) + + s = r(ClassWithFailingRepr) + self.failUnless(s.startswith("<class ")) + self.failUnless(s.endswith(">")) + self.failUnless(s.find("...") in [12, 13]) + + def test_lambda(self): + self.failUnless(repr(lambda x: x).startswith( + "<function <lambda")) + # XXX anonymous functions? see func_repr + + def test_builtin_function(self): + eq = self.assertEquals + # Functions + eq(repr(hash), '<built-in function hash>') + # Methods + self.failUnless(repr(''.split).startswith( + '<built-in method split of str object at 0x')) + + def test_range(self): + eq = self.assertEquals + eq(repr(range(1)), 'range(0, 1)') + eq(repr(range(1, 2)), 'range(1, 2)') + eq(repr(range(1, 4, 3)), 'range(1, 4, 3)') + + def test_nesting(self): + eq = self.assertEquals + # everything is meant to give up after 6 levels. + eq(r([[[[[[[]]]]]]]), "[[[[[[[]]]]]]]") + eq(r([[[[[[[[]]]]]]]]), "[[[[[[[...]]]]]]]") + + eq(r(nestedTuple(6)), "(((((((),),),),),),)") + eq(r(nestedTuple(7)), "(((((((...),),),),),),)") + + eq(r({ nestedTuple(5) : nestedTuple(5) }), + "{((((((),),),),),): ((((((),),),),),)}") + eq(r({ nestedTuple(6) : nestedTuple(6) }), + "{((((((...),),),),),): ((((((...),),),),),)}") + + eq(r([[[[[[{}]]]]]]), "[[[[[[{}]]]]]]") + eq(r([[[[[[[{}]]]]]]]), "[[[[[[[...]]]]]]]") + + def test_cell(self): + # XXX Hmm? How to get at a cell object? + pass + + def test_descriptors(self): + eq = self.assertEquals + # method descriptors + eq(repr(dict.items), "<method 'items' of 'dict' objects>") + # XXX member descriptors + # XXX attribute descriptors + # XXX slot descriptors + # static and class methods + class C: + def foo(cls): pass + x = staticmethod(C.foo) + self.failUnless(repr(x).startswith('<staticmethod object at 0x')) + x = classmethod(C.foo) + self.failUnless(repr(x).startswith('<classmethod object at 0x')) + + def test_unsortable(self): + # Repr.repr() used to call sorted() on sets, frozensets and dicts + # without taking into account that not all objects are comparable + x = set([1j, 2j, 3j]) + y = frozenset(x) + z = {1j: 1, 2j: 2} + r(x) + r(y) + r(z) + +def touch(path, text=''): + fp = open(path, 'w') + fp.write(text) + fp.close() + +class LongReprTest(unittest.TestCase): + def setUp(self): + longname = 'areallylongpackageandmodulenametotestreprtruncation' + self.pkgname = os.path.join(longname) + self.subpkgname = os.path.join(longname, longname) + # Make the package and subpackage + shutil.rmtree(self.pkgname, ignore_errors=True) + os.mkdir(self.pkgname) + touch(os.path.join(self.pkgname, '__init__.py')) + shutil.rmtree(self.subpkgname, ignore_errors=True) + os.mkdir(self.subpkgname) + touch(os.path.join(self.subpkgname, '__init__.py')) + # Remember where we are + self.here = os.getcwd() + sys.path.insert(0, self.here) + + def tearDown(self): + actions = [] + for dirpath, dirnames, filenames in os.walk(self.pkgname): + for name in dirnames + filenames: + actions.append(os.path.join(dirpath, name)) + actions.append(self.pkgname) + actions.sort() + actions.reverse() + for p in actions: + if os.path.isdir(p): + os.rmdir(p) + else: + os.remove(p) + del sys.path[0] + + def test_module(self): + eq = self.assertEquals + touch(os.path.join(self.subpkgname, self.pkgname + '.py')) + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import areallylongpackageandmodulenametotestreprtruncation + eq(repr(areallylongpackageandmodulenametotestreprtruncation), + "<module '%s' from '%s'>" % (areallylongpackageandmodulenametotestreprtruncation.__name__, areallylongpackageandmodulenametotestreprtruncation.__file__)) + eq(repr(sys), "<module 'sys' (built-in)>") + + def test_type(self): + eq = self.assertEquals + touch(os.path.join(self.subpkgname, 'foo.py'), '''\ +class foo(object): + pass +''') + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo + eq(repr(foo.foo), + "<class '%s.foo'>" % foo.__name__) + + def test_object(self): + # XXX Test the repr of a type with a really long tp_name but with no + # tp_repr. WIBNI we had ::Inline? :) + pass + + def test_class(self): + touch(os.path.join(self.subpkgname, 'bar.py'), '''\ +class bar: + pass +''') + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import bar + # Module name may be prefixed with "test.", depending on how run. + self.assertEquals(repr(bar.bar), "<class '%s.bar'>" % bar.__name__) + + def test_instance(self): + touch(os.path.join(self.subpkgname, 'baz.py'), '''\ +class baz: + pass +''') + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import baz + ibaz = baz.baz() + self.failUnless(repr(ibaz).startswith( + "<%s.baz object at 0x" % baz.__name__)) + + def test_method(self): + eq = self.assertEquals + touch(os.path.join(self.subpkgname, 'qux.py'), '''\ +class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: + def amethod(self): pass +''') + from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux + # Unbound methods first + self.failUnless(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod).startswith( + '<function amethod')) + # Bound method next + iqux = qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + self.failUnless(repr(iqux.amethod).startswith( + '<bound method aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod of <%s.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa object at 0x' \ + % (qux.__name__,) )) + + def test_builtin_function(self): + # XXX test built-in functions and methods with really long names + pass + +class ClassWithRepr: + def __init__(self, s): + self.s = s + def __repr__(self): + return "ClassWithRepr(%r)" % self.s + + +class ClassWithFailingRepr: + def __repr__(self): + raise Exception("This should be caught by Repr.repr_instance") + + +def test_main(): + run_unittest(ReprTests) + if os.name != 'mac': + run_unittest(LongReprTest) + + +if __name__ == "__main__": + test_main() |