@@ -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 UnicodeTest (string_tests .CommonTest ,
5974 string_tests .MixinStrUnicodeUserStringTest ,
6075 string_tests .MixinStrUnicodeTest ,
@@ -84,6 +99,10 @@ def __repr__(self):
8499 self .assertEqual (realresult , result )
85100 self .assertTrue (object is not realresult )
86101
102+ def assertTypedEqual (self , actual , expected ):
103+ self .assertIs (type (actual ), type (expected ))
104+ self .assertEqual (actual , expected )
105+
87106 def test_literals (self ):
88107 self .assertEqual ('\xff ' , '\u00ff ' )
89108 self .assertEqual ('\uffff ' , '\U0000ffff ' )
@@ -128,10 +147,13 @@ def test_ascii(self):
128147 self .assertEqual (ascii ("\U00010000 " * 39 + "\uffff " * 4096 ),
129148 ascii ("\U00010000 " * 39 + "\uffff " * 4096 ))
130149
131- class WrongRepr :
132- def __repr__ (self ):
133- return b'byte-repr'
134- self .assertRaises (TypeError , ascii , WrongRepr ())
150+ self .assertTypedEqual (ascii ('\U0001f40d ' ), r"'\U0001f40d'" )
151+ self .assertTypedEqual (ascii (StrSubclass ('abc' )), "'abc'" )
152+ self .assertTypedEqual (ascii (WithRepr ('<abc>' )), '<abc>' )
153+ self .assertTypedEqual (ascii (WithRepr (StrSubclass ('<abc>' ))), StrSubclass ('<abc>' ))
154+ self .assertTypedEqual (ascii (WithRepr ('<\U0001f40d >' )), r'<\U0001f40d>' )
155+ self .assertTypedEqual (ascii (WithRepr (StrSubclass ('<\U0001f40d >' ))), r'<\U0001f40d>' )
156+ self .assertRaises (TypeError , ascii , WithRepr (b'byte-repr' ))
135157
136158 def test_repr (self ):
137159 # Test basic sanity of repr()
@@ -169,10 +191,13 @@ def test_repr(self):
169191 self .assertEqual (repr ("\U00010000 " * 39 + "\uffff " * 4096 ),
170192 repr ("\U00010000 " * 39 + "\uffff " * 4096 ))
171193
172- class WrongRepr :
173- def __repr__ (self ):
174- return b'byte-repr'
175- self .assertRaises (TypeError , repr , WrongRepr ())
194+ self .assertTypedEqual (repr ('\U0001f40d ' ), "'\U0001f40d '" )
195+ self .assertTypedEqual (repr (StrSubclass ('abc' )), "'abc'" )
196+ self .assertTypedEqual (repr (WithRepr ('<abc>' )), '<abc>' )
197+ self .assertTypedEqual (repr (WithRepr (StrSubclass ('<abc>' ))), StrSubclass ('<abc>' ))
198+ self .assertTypedEqual (repr (WithRepr ('<\U0001f40d >' )), '<\U0001f40d >' )
199+ self .assertTypedEqual (repr (WithRepr (StrSubclass ('<\U0001f40d >' ))), StrSubclass ('<\U0001f40d >' ))
200+ self .assertRaises (TypeError , repr , WithRepr (b'byte-repr' ))
176201
177202 def test_iterators (self ):
178203 # Make sure unicode objects have an __iter__ method
@@ -2378,28 +2403,37 @@ def test_ucs4(self):
23782403
23792404 def test_conversion (self ):
23802405 # Make sure __str__() works properly
2381- class ObjectToStr :
2382- def __str__ (self ):
2383- return "foo"
2384-
2385- class StrSubclassToStr (str ):
2386- def __str__ (self ):
2387- return "foo"
2388-
2389- class StrSubclassToStrSubclass (str ):
2390- def __new__ (cls , content = "" ):
2391- return str .__new__ (cls , 2 * content )
2392- def __str__ (self ):
2406+ class StrWithStr (str ):
2407+ def __new__ (cls , value ):
2408+ self = str .__new__ (cls , "" )
2409+ self .value = value
23932410 return self
2411+ def __str__ (self ):
2412+ return self .value
23942413
2395- self .assertEqual (str (ObjectToStr ()), "foo" )
2396- self .assertEqual (str (StrSubclassToStr ("bar" )), "foo" )
2397- s = str (StrSubclassToStrSubclass ("foo" ))
2398- self .assertEqual (s , "foofoo" )
2399- self .assertIs (type (s ), StrSubclassToStrSubclass )
2400- s = StrSubclass (StrSubclassToStrSubclass ("foo" ))
2401- self .assertEqual (s , "foofoo" )
2402- self .assertIs (type (s ), StrSubclass )
2414+ self .assertTypedEqual (str (WithStr ('abc' )), 'abc' )
2415+ self .assertTypedEqual (str (WithStr (StrSubclass ('abc' ))), StrSubclass ('abc' ))
2416+ self .assertTypedEqual (StrSubclass (WithStr ('abc' )), StrSubclass ('abc' ))
2417+ self .assertTypedEqual (StrSubclass (WithStr (StrSubclass ('abc' ))),
2418+ StrSubclass ('abc' ))
2419+ self .assertTypedEqual (StrSubclass (WithStr (OtherStrSubclass ('abc' ))),
2420+ StrSubclass ('abc' ))
2421+
2422+ self .assertTypedEqual (str (StrWithStr ('abc' )), 'abc' )
2423+ self .assertTypedEqual (str (StrWithStr (StrSubclass ('abc' ))), StrSubclass ('abc' ))
2424+ self .assertTypedEqual (StrSubclass (StrWithStr ('abc' )), StrSubclass ('abc' ))
2425+ self .assertTypedEqual (StrSubclass (StrWithStr (StrSubclass ('abc' ))),
2426+ StrSubclass ('abc' ))
2427+ self .assertTypedEqual (StrSubclass (StrWithStr (OtherStrSubclass ('abc' ))),
2428+ StrSubclass ('abc' ))
2429+
2430+ self .assertTypedEqual (str (WithRepr ('<abc>' )), '<abc>' )
2431+ self .assertTypedEqual (str (WithRepr (StrSubclass ('<abc>' ))), StrSubclass ('<abc>' ))
2432+ self .assertTypedEqual (StrSubclass (WithRepr ('<abc>' )), StrSubclass ('<abc>' ))
2433+ self .assertTypedEqual (StrSubclass (WithRepr (StrSubclass ('<abc>' ))),
2434+ StrSubclass ('<abc>' ))
2435+ self .assertTypedEqual (StrSubclass (WithRepr (OtherStrSubclass ('<abc>' ))),
2436+ StrSubclass ('<abc>' ))
24032437
24042438 def test_unicode_repr (self ):
24052439 class s1 :
0 commit comments