@@ -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 StrTest (string_tests .StringLikeTest ,
59
74
string_tests .MixinStrUnicodeTest ,
60
75
unittest .TestCase ):
@@ -83,6 +98,10 @@ def __repr__(self):
83
98
self .assertEqual (realresult , result )
84
99
self .assertTrue (object is not realresult )
85
100
101
+ def assertTypedEqual (self , actual , expected ):
102
+ self .assertIs (type (actual ), type (expected ))
103
+ self .assertEqual (actual , expected )
104
+
86
105
def test_literals (self ):
87
106
self .assertEqual ('\xff ' , '\u00ff ' )
88
107
self .assertEqual ('\uffff ' , '\U0000ffff ' )
@@ -127,10 +146,13 @@ def test_ascii(self):
127
146
self .assertEqual (ascii ("\U00010000 " * 39 + "\uffff " * 4096 ),
128
147
ascii ("\U00010000 " * 39 + "\uffff " * 4096 ))
129
148
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' ))
134
156
135
157
def test_repr (self ):
136
158
# Test basic sanity of repr()
@@ -168,10 +190,13 @@ def test_repr(self):
168
190
self .assertEqual (repr ("\U00010000 " * 39 + "\uffff " * 4096 ),
169
191
repr ("\U00010000 " * 39 + "\uffff " * 4096 ))
170
192
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' ))
175
200
176
201
def test_iterators (self ):
177
202
# Make sure unicode objects have an __iter__ method
@@ -2367,28 +2392,37 @@ def test_ucs4(self):
2367
2392
2368
2393
def test_conversion (self ):
2369
2394
# 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
2382
2399
return self
2400
+ def __str__ (self ):
2401
+ return self .value
2383
2402
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>' ))
2392
2426
2393
2427
def test_unicode_repr (self ):
2394
2428
class s1 :
0 commit comments