@@ -77,6 +77,36 @@ def __lt__(self, o):
7777 d [1337 ] = "true.dat"
7878 self .assertEqual (self .dumps (d , sort_keys = True ), '{"1337": "true.dat"}' )
7979
80+ def test_dumps_str_subclass (self ):
81+ # Don't call obj.__str__() on str subclasses
82+
83+ # str subclass which returns a different string on str(obj)
84+ class StrSubclass (str ):
85+ def __str__ (self ):
86+ return "StrSubclass"
87+
88+ obj = StrSubclass ('ascii' )
89+ self .assertEqual (self .dumps (obj ), '"ascii"' )
90+ self .assertEqual (self .dumps ([obj ]), '["ascii"]' )
91+ self .assertEqual (self .dumps ({'key' : obj }), '{"key": "ascii"}' )
92+
93+ obj = StrSubclass ('escape\n ' )
94+ self .assertEqual (self .dumps (obj ), '"escape\\ n"' )
95+ self .assertEqual (self .dumps ([obj ]), '["escape\\ n"]' )
96+ self .assertEqual (self .dumps ({'key' : obj }), '{"key": "escape\\ n"}' )
97+
98+ obj = StrSubclass ('nonascii:é' )
99+ self .assertEqual (self .dumps (obj , ensure_ascii = False ),
100+ '"nonascii:é"' )
101+ self .assertEqual (self .dumps ([obj ], ensure_ascii = False ),
102+ '["nonascii:é"]' )
103+ self .assertEqual (self .dumps ({'key' : obj }, ensure_ascii = False ),
104+ '{"key": "nonascii:é"}' )
105+ self .assertEqual (self .dumps (obj ), '"nonascii:\\ u00e9"' )
106+ self .assertEqual (self .dumps ([obj ]), '["nonascii:\\ u00e9"]' )
107+ self .assertEqual (self .dumps ({'key' : obj }),
108+ '{"key": "nonascii:\\ u00e9"}' )
109+
80110
81111class TestPyDump (TestDump , PyTest ): pass
82112
0 commit comments