@@ -50,12 +50,34 @@ class Int:
5050 def __int__ (self ):
5151 return 99
5252
53+ class IntSubclass (int ):
54+ def __int__ (self ):
55+ return 99
56+
57+ class BadInt :
58+ def __int__ (self ):
59+ return 1.0
60+
61+ class BadInt2 :
62+ def __int__ (self ):
63+ return True
64+
65+ class BadInt3 (int ):
66+ def __int__ (self ):
67+ return True
68+
69+
5370class Unsigned_TestCase (unittest .TestCase ):
5471 def test_b (self ):
5572 from _testcapi import getargs_b
5673 # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
5774 self .assertRaises (TypeError , getargs_b , 3.14 )
5875 self .assertEqual (99 , getargs_b (Int ()))
76+ self .assertEqual (0 , getargs_b (IntSubclass ()))
77+ self .assertRaises (TypeError , getargs_b , BadInt ())
78+ with self .assertWarns (DeprecationWarning ):
79+ self .assertEqual (1 , getargs_b (BadInt2 ()))
80+ self .assertEqual (0 , getargs_b (BadInt3 ()))
5981
6082 self .assertRaises (OverflowError , getargs_b , - 1 )
6183 self .assertEqual (0 , getargs_b (0 ))
@@ -70,6 +92,11 @@ def test_B(self):
7092 # B returns 'unsigned char', no range checking
7193 self .assertRaises (TypeError , getargs_B , 3.14 )
7294 self .assertEqual (99 , getargs_B (Int ()))
95+ self .assertEqual (0 , getargs_B (IntSubclass ()))
96+ self .assertRaises (TypeError , getargs_B , BadInt ())
97+ with self .assertWarns (DeprecationWarning ):
98+ self .assertEqual (1 , getargs_B (BadInt2 ()))
99+ self .assertEqual (0 , getargs_B (BadInt3 ()))
73100
74101 self .assertEqual (UCHAR_MAX , getargs_B (- 1 ))
75102 self .assertEqual (0 , getargs_B (0 ))
@@ -84,6 +111,11 @@ def test_H(self):
84111 # H returns 'unsigned short', no range checking
85112 self .assertRaises (TypeError , getargs_H , 3.14 )
86113 self .assertEqual (99 , getargs_H (Int ()))
114+ self .assertEqual (0 , getargs_H (IntSubclass ()))
115+ self .assertRaises (TypeError , getargs_H , BadInt ())
116+ with self .assertWarns (DeprecationWarning ):
117+ self .assertEqual (1 , getargs_H (BadInt2 ()))
118+ self .assertEqual (0 , getargs_H (BadInt3 ()))
87119
88120 self .assertEqual (USHRT_MAX , getargs_H (- 1 ))
89121 self .assertEqual (0 , getargs_H (0 ))
@@ -99,6 +131,11 @@ def test_I(self):
99131 # I returns 'unsigned int', no range checking
100132 self .assertRaises (TypeError , getargs_I , 3.14 )
101133 self .assertEqual (99 , getargs_I (Int ()))
134+ self .assertEqual (0 , getargs_I (IntSubclass ()))
135+ self .assertRaises (TypeError , getargs_I , BadInt ())
136+ with self .assertWarns (DeprecationWarning ):
137+ self .assertEqual (1 , getargs_I (BadInt2 ()))
138+ self .assertEqual (0 , getargs_I (BadInt3 ()))
102139
103140 self .assertEqual (UINT_MAX , getargs_I (- 1 ))
104141 self .assertEqual (0 , getargs_I (0 ))
@@ -115,6 +152,10 @@ def test_k(self):
115152 # it does not accept float, or instances with __int__
116153 self .assertRaises (TypeError , getargs_k , 3.14 )
117154 self .assertRaises (TypeError , getargs_k , Int ())
155+ self .assertEqual (0 , getargs_k (IntSubclass ()))
156+ self .assertRaises (TypeError , getargs_k , BadInt ())
157+ self .assertRaises (TypeError , getargs_k , BadInt2 ())
158+ self .assertEqual (0 , getargs_k (BadInt3 ()))
118159
119160 self .assertEqual (ULONG_MAX , getargs_k (- 1 ))
120161 self .assertEqual (0 , getargs_k (0 ))
@@ -131,6 +172,11 @@ def test_h(self):
131172 # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
132173 self .assertRaises (TypeError , getargs_h , 3.14 )
133174 self .assertEqual (99 , getargs_h (Int ()))
175+ self .assertEqual (0 , getargs_h (IntSubclass ()))
176+ self .assertRaises (TypeError , getargs_h , BadInt ())
177+ with self .assertWarns (DeprecationWarning ):
178+ self .assertEqual (1 , getargs_h (BadInt2 ()))
179+ self .assertEqual (0 , getargs_h (BadInt3 ()))
134180
135181 self .assertRaises (OverflowError , getargs_h , SHRT_MIN - 1 )
136182 self .assertEqual (SHRT_MIN , getargs_h (SHRT_MIN ))
@@ -145,6 +191,11 @@ def test_i(self):
145191 # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
146192 self .assertRaises (TypeError , getargs_i , 3.14 )
147193 self .assertEqual (99 , getargs_i (Int ()))
194+ self .assertEqual (0 , getargs_i (IntSubclass ()))
195+ self .assertRaises (TypeError , getargs_i , BadInt ())
196+ with self .assertWarns (DeprecationWarning ):
197+ self .assertEqual (1 , getargs_i (BadInt2 ()))
198+ self .assertEqual (0 , getargs_i (BadInt3 ()))
148199
149200 self .assertRaises (OverflowError , getargs_i , INT_MIN - 1 )
150201 self .assertEqual (INT_MIN , getargs_i (INT_MIN ))
@@ -159,6 +210,11 @@ def test_l(self):
159210 # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
160211 self .assertRaises (TypeError , getargs_l , 3.14 )
161212 self .assertEqual (99 , getargs_l (Int ()))
213+ self .assertEqual (0 , getargs_l (IntSubclass ()))
214+ self .assertRaises (TypeError , getargs_l , BadInt ())
215+ with self .assertWarns (DeprecationWarning ):
216+ self .assertEqual (1 , getargs_l (BadInt2 ()))
217+ self .assertEqual (0 , getargs_l (BadInt3 ()))
162218
163219 self .assertRaises (OverflowError , getargs_l , LONG_MIN - 1 )
164220 self .assertEqual (LONG_MIN , getargs_l (LONG_MIN ))
@@ -174,6 +230,10 @@ def test_n(self):
174230 # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
175231 self .assertRaises (TypeError , getargs_n , 3.14 )
176232 self .assertRaises (TypeError , getargs_n , Int ())
233+ self .assertEqual (0 , getargs_n (IntSubclass ()))
234+ self .assertRaises (TypeError , getargs_n , BadInt ())
235+ self .assertRaises (TypeError , getargs_n , BadInt2 ())
236+ self .assertEqual (0 , getargs_n (BadInt3 ()))
177237
178238 self .assertRaises (OverflowError , getargs_n , PY_SSIZE_T_MIN - 1 )
179239 self .assertEqual (PY_SSIZE_T_MIN , getargs_n (PY_SSIZE_T_MIN ))
@@ -192,6 +252,11 @@ def test_L(self):
192252 self .assertRaises (TypeError , getargs_L , 3.14 )
193253 self .assertRaises (TypeError , getargs_L , "Hello" )
194254 self .assertEqual (99 , getargs_L (Int ()))
255+ self .assertEqual (0 , getargs_L (IntSubclass ()))
256+ self .assertRaises (TypeError , getargs_L , BadInt ())
257+ with self .assertWarns (DeprecationWarning ):
258+ self .assertEqual (1 , getargs_L (BadInt2 ()))
259+ self .assertEqual (0 , getargs_L (BadInt3 ()))
195260
196261 self .assertRaises (OverflowError , getargs_L , LLONG_MIN - 1 )
197262 self .assertEqual (LLONG_MIN , getargs_L (LLONG_MIN ))
@@ -206,6 +271,11 @@ def test_K(self):
206271 # K return 'unsigned long long', no range checking
207272 self .assertRaises (TypeError , getargs_K , 3.14 )
208273 self .assertRaises (TypeError , getargs_K , Int ())
274+ self .assertEqual (0 , getargs_K (IntSubclass ()))
275+ self .assertRaises (TypeError , getargs_K , BadInt ())
276+ self .assertRaises (TypeError , getargs_K , BadInt2 ())
277+ self .assertEqual (0 , getargs_K (BadInt3 ()))
278+
209279 self .assertEqual (ULLONG_MAX , getargs_K (ULLONG_MAX ))
210280 self .assertEqual (0 , getargs_K (0 ))
211281 self .assertEqual (0 , getargs_K (ULLONG_MAX + 1 ))
0 commit comments