@@ -55,6 +55,21 @@ def duplicate_string(text):
5555class StrSubclass (str ):
5656 pass
5757
58+ class OtherStrSubclass (str ):
59+ pass
60+
61+ class WithStr :
62+ def __init__ (self , value ):
63+ self .value = value
64+ def __str__ (self ):
65+ return self .value
66+
67+ class WithRepr :
68+ def __init__ (self , value ):
69+ self .value = value
70+ def __repr__ (self ):
71+ return self .value
72+
5873class StrTest (string_tests .StringLikeTest ,
5974 string_tests .MixinStrUnicodeTest ,
6075 unittest .TestCase ):
@@ -83,6 +98,10 @@ def __repr__(self):
8398 self .assertEqual (realresult , result )
8499 self .assertTrue (object is not realresult )
85100
101+ def assertTypedEqual (self , actual , expected ):
102+ self .assertIs (type (actual ), type (expected ))
103+ self .assertEqual (actual , expected )
104+
86105 def test_literals (self ):
87106 self .assertEqual ('\xff ' , '\u00ff ' )
88107 self .assertEqual ('\uffff ' , '\U0000ffff ' )
@@ -127,10 +146,13 @@ def test_ascii(self):
127146 self .assertEqual (ascii ("\U00010000 " * 39 + "\uffff " * 4096 ),
128147 ascii ("\U00010000 " * 39 + "\uffff " * 4096 ))
129148
130- class WrongRepr :
131- def __repr__ (self ):
132- return b'byte-repr'
133- self .assertRaises (TypeError , ascii , WrongRepr ())
149+ self .assertTypedEqual (ascii ('\U0001f40d ' ), r"'\U0001f40d'" )
150+ self .assertTypedEqual (ascii (StrSubclass ('abc' )), "'abc'" )
151+ self .assertTypedEqual (ascii (WithRepr ('<abc>' )), '<abc>' )
152+ self .assertTypedEqual (ascii (WithRepr (StrSubclass ('<abc>' ))), StrSubclass ('<abc>' ))
153+ self .assertTypedEqual (ascii (WithRepr ('<\U0001f40d >' )), r'<\U0001f40d>' )
154+ self .assertTypedEqual (ascii (WithRepr (StrSubclass ('<\U0001f40d >' ))), r'<\U0001f40d>' )
155+ self .assertRaises (TypeError , ascii , WithRepr (b'byte-repr' ))
134156
135157 def test_repr (self ):
136158 # Test basic sanity of repr()
@@ -168,10 +190,13 @@ def test_repr(self):
168190 self .assertEqual (repr ("\U00010000 " * 39 + "\uffff " * 4096 ),
169191 repr ("\U00010000 " * 39 + "\uffff " * 4096 ))
170192
171- class WrongRepr :
172- def __repr__ (self ):
173- return b'byte-repr'
174- self .assertRaises (TypeError , repr , WrongRepr ())
193+ self .assertTypedEqual (repr ('\U0001f40d ' ), "'\U0001f40d '" )
194+ self .assertTypedEqual (repr (StrSubclass ('abc' )), "'abc'" )
195+ self .assertTypedEqual (repr (WithRepr ('<abc>' )), '<abc>' )
196+ self .assertTypedEqual (repr (WithRepr (StrSubclass ('<abc>' ))), StrSubclass ('<abc>' ))
197+ self .assertTypedEqual (repr (WithRepr ('<\U0001f40d >' )), '<\U0001f40d >' )
198+ self .assertTypedEqual (repr (WithRepr (StrSubclass ('<\U0001f40d >' ))), StrSubclass ('<\U0001f40d >' ))
199+ self .assertRaises (TypeError , repr , WithRepr (b'byte-repr' ))
175200
176201 def test_iterators (self ):
177202 # Make sure unicode objects have an __iter__ method
@@ -2367,28 +2392,37 @@ def test_ucs4(self):
23672392
23682393 def test_conversion (self ):
23692394 # Make sure __str__() works properly
2370- class ObjectToStr :
2371- def __str__ (self ):
2372- return "foo"
2373-
2374- class StrSubclassToStr (str ):
2375- def __str__ (self ):
2376- return "foo"
2377-
2378- class StrSubclassToStrSubclass (str ):
2379- def __new__ (cls , content = "" ):
2380- return str .__new__ (cls , 2 * content )
2381- def __str__ (self ):
2395+ class StrWithStr (str ):
2396+ def __new__ (cls , value ):
2397+ self = str .__new__ (cls , "" )
2398+ self .value = value
23822399 return self
2400+ def __str__ (self ):
2401+ return self .value
23832402
2384- self .assertEqual (str (ObjectToStr ()), "foo" )
2385- self .assertEqual (str (StrSubclassToStr ("bar" )), "foo" )
2386- s = str (StrSubclassToStrSubclass ("foo" ))
2387- self .assertEqual (s , "foofoo" )
2388- self .assertIs (type (s ), StrSubclassToStrSubclass )
2389- s = StrSubclass (StrSubclassToStrSubclass ("foo" ))
2390- self .assertEqual (s , "foofoo" )
2391- self .assertIs (type (s ), StrSubclass )
2403+ self .assertTypedEqual (str (WithStr ('abc' )), 'abc' )
2404+ self .assertTypedEqual (str (WithStr (StrSubclass ('abc' ))), StrSubclass ('abc' ))
2405+ self .assertTypedEqual (StrSubclass (WithStr ('abc' )), StrSubclass ('abc' ))
2406+ self .assertTypedEqual (StrSubclass (WithStr (StrSubclass ('abc' ))),
2407+ StrSubclass ('abc' ))
2408+ self .assertTypedEqual (StrSubclass (WithStr (OtherStrSubclass ('abc' ))),
2409+ StrSubclass ('abc' ))
2410+
2411+ self .assertTypedEqual (str (StrWithStr ('abc' )), 'abc' )
2412+ self .assertTypedEqual (str (StrWithStr (StrSubclass ('abc' ))), StrSubclass ('abc' ))
2413+ self .assertTypedEqual (StrSubclass (StrWithStr ('abc' )), StrSubclass ('abc' ))
2414+ self .assertTypedEqual (StrSubclass (StrWithStr (StrSubclass ('abc' ))),
2415+ StrSubclass ('abc' ))
2416+ self .assertTypedEqual (StrSubclass (StrWithStr (OtherStrSubclass ('abc' ))),
2417+ StrSubclass ('abc' ))
2418+
2419+ self .assertTypedEqual (str (WithRepr ('<abc>' )), '<abc>' )
2420+ self .assertTypedEqual (str (WithRepr (StrSubclass ('<abc>' ))), StrSubclass ('<abc>' ))
2421+ self .assertTypedEqual (StrSubclass (WithRepr ('<abc>' )), StrSubclass ('<abc>' ))
2422+ self .assertTypedEqual (StrSubclass (WithRepr (StrSubclass ('<abc>' ))),
2423+ StrSubclass ('<abc>' ))
2424+ self .assertTypedEqual (StrSubclass (WithRepr (OtherStrSubclass ('<abc>' ))),
2425+ StrSubclass ('<abc>' ))
23922426
23932427 def test_unicode_repr (self ):
23942428 class s1 :
0 commit comments