@@ -55,6 +55,21 @@ def duplicate_string(text):
55
55
class StrSubclass (str ):
56
56
pass
57
57
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
+
58
73
class UnicodeTest (string_tests .CommonTest ,
59
74
string_tests .MixinStrUnicodeUserStringTest ,
60
75
string_tests .MixinStrUnicodeTest ,
@@ -84,6 +99,10 @@ def __repr__(self):
84
99
self .assertEqual (realresult , result )
85
100
self .assertTrue (object is not realresult )
86
101
102
+ def assertTypedEqual (self , actual , expected ):
103
+ self .assertIs (type (actual ), type (expected ))
104
+ self .assertEqual (actual , expected )
105
+
87
106
def test_literals (self ):
88
107
self .assertEqual ('\xff ' , '\u00ff ' )
89
108
self .assertEqual ('\uffff ' , '\U0000ffff ' )
@@ -128,10 +147,13 @@ def test_ascii(self):
128
147
self .assertEqual (ascii ("\U00010000 " * 39 + "\uffff " * 4096 ),
129
148
ascii ("\U00010000 " * 39 + "\uffff " * 4096 ))
130
149
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' ))
135
157
136
158
def test_repr (self ):
137
159
# Test basic sanity of repr()
@@ -169,10 +191,13 @@ def test_repr(self):
169
191
self .assertEqual (repr ("\U00010000 " * 39 + "\uffff " * 4096 ),
170
192
repr ("\U00010000 " * 39 + "\uffff " * 4096 ))
171
193
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' ))
176
201
177
202
def test_iterators (self ):
178
203
# Make sure unicode objects have an __iter__ method
@@ -2378,28 +2403,37 @@ def test_ucs4(self):
2378
2403
2379
2404
def test_conversion (self ):
2380
2405
# 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
2393
2410
return self
2411
+ def __str__ (self ):
2412
+ return self .value
2394
2413
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>' ))
2403
2437
2404
2438
def test_unicode_repr (self ):
2405
2439
class s1 :
0 commit comments