4
4
5
5
# Skip this test if the _testcapi module isn't available.
6
6
import_helper .import_module ('_testcapi' )
7
- from _testcapi import _test_structmembersType , \
8
- CHAR_MAX , CHAR_MIN , UCHAR_MAX , \
9
- SHRT_MAX , SHRT_MIN , USHRT_MAX , \
10
- INT_MAX , INT_MIN , UINT_MAX , \
11
- LONG_MAX , LONG_MIN , ULONG_MAX , \
12
- LLONG_MAX , LLONG_MIN , ULLONG_MAX , \
13
- PY_SSIZE_T_MAX , PY_SSIZE_T_MIN
14
-
15
- ts = _test_structmembersType (False , # T_BOOL
16
- 1 , # T_BYTE
17
- 2 , # T_UBYTE
18
- 3 , # T_SHORT
19
- 4 , # T_USHORT
20
- 5 , # T_INT
21
- 6 , # T_UINT
22
- 7 , # T_LONG
23
- 8 , # T_ULONG
24
- 23 , # T_PYSSIZET
25
- 9.99999 ,# T_FLOAT
26
- 10.1010101010 , # T_DOUBLE
27
- "hi" # T_STRING_INPLACE
28
- )
29
-
30
- class ReadWriteTests (unittest .TestCase ):
7
+ from _testcapi import (_test_structmembersType_OldAPI ,
8
+ _test_structmembersType_NewAPI ,
9
+ CHAR_MAX , CHAR_MIN , UCHAR_MAX ,
10
+ SHRT_MAX , SHRT_MIN , USHRT_MAX ,
11
+ INT_MAX , INT_MIN , UINT_MAX ,
12
+ LONG_MAX , LONG_MIN , ULONG_MAX ,
13
+ LLONG_MAX , LLONG_MIN , ULLONG_MAX ,
14
+ PY_SSIZE_T_MAX , PY_SSIZE_T_MIN ,
15
+ )
16
+
17
+ # There are two classes: one using <structmember.h> and another using
18
+ # `Py_`-prefixed API. They should behave the same in Python
19
+
20
+ def _make_test_object (cls ):
21
+ return cls (False , # T_BOOL
22
+ 1 , # T_BYTE
23
+ 2 , # T_UBYTE
24
+ 3 , # T_SHORT
25
+ 4 , # T_USHORT
26
+ 5 , # T_INT
27
+ 6 , # T_UINT
28
+ 7 , # T_LONG
29
+ 8 , # T_ULONG
30
+ 23 , # T_PYSSIZET
31
+ 9.99999 ,# T_FLOAT
32
+ 10.1010101010 , # T_DOUBLE
33
+ "hi" , # T_STRING_INPLACE
34
+ )
35
+
36
+
37
+ class ReadWriteTests :
38
+ def setUp (self ):
39
+ self .ts = _make_test_object (self .cls )
31
40
32
41
def test_bool (self ):
42
+ ts = self .ts
33
43
ts .T_BOOL = True
34
44
self .assertEqual (ts .T_BOOL , True )
35
45
ts .T_BOOL = False
36
46
self .assertEqual (ts .T_BOOL , False )
37
47
self .assertRaises (TypeError , setattr , ts , 'T_BOOL' , 1 )
38
48
39
49
def test_byte (self ):
50
+ ts = self .ts
40
51
ts .T_BYTE = CHAR_MAX
41
52
self .assertEqual (ts .T_BYTE , CHAR_MAX )
42
53
ts .T_BYTE = CHAR_MIN
@@ -45,6 +56,7 @@ def test_byte(self):
45
56
self .assertEqual (ts .T_UBYTE , UCHAR_MAX )
46
57
47
58
def test_short (self ):
59
+ ts = self .ts
48
60
ts .T_SHORT = SHRT_MAX
49
61
self .assertEqual (ts .T_SHORT , SHRT_MAX )
50
62
ts .T_SHORT = SHRT_MIN
@@ -53,6 +65,7 @@ def test_short(self):
53
65
self .assertEqual (ts .T_USHORT , USHRT_MAX )
54
66
55
67
def test_int (self ):
68
+ ts = self .ts
56
69
ts .T_INT = INT_MAX
57
70
self .assertEqual (ts .T_INT , INT_MAX )
58
71
ts .T_INT = INT_MIN
@@ -61,6 +74,7 @@ def test_int(self):
61
74
self .assertEqual (ts .T_UINT , UINT_MAX )
62
75
63
76
def test_long (self ):
77
+ ts = self .ts
64
78
ts .T_LONG = LONG_MAX
65
79
self .assertEqual (ts .T_LONG , LONG_MAX )
66
80
ts .T_LONG = LONG_MIN
@@ -69,13 +83,17 @@ def test_long(self):
69
83
self .assertEqual (ts .T_ULONG , ULONG_MAX )
70
84
71
85
def test_py_ssize_t (self ):
86
+ ts = self .ts
72
87
ts .T_PYSSIZET = PY_SSIZE_T_MAX
73
88
self .assertEqual (ts .T_PYSSIZET , PY_SSIZE_T_MAX )
74
89
ts .T_PYSSIZET = PY_SSIZE_T_MIN
75
90
self .assertEqual (ts .T_PYSSIZET , PY_SSIZE_T_MIN )
76
91
77
- @unittest .skipUnless (hasattr (ts , "T_LONGLONG" ), "long long not present" )
78
92
def test_longlong (self ):
93
+ ts = self .ts
94
+ if not hasattr (ts , "T_LONGLONG" ):
95
+ self .skipTest ("long long not present" )
96
+
79
97
ts .T_LONGLONG = LLONG_MAX
80
98
self .assertEqual (ts .T_LONGLONG , LLONG_MAX )
81
99
ts .T_LONGLONG = LLONG_MIN
@@ -91,6 +109,7 @@ def test_longlong(self):
91
109
self .assertEqual (ts .T_ULONGLONG , 4 )
92
110
93
111
def test_bad_assignments (self ):
112
+ ts = self .ts
94
113
integer_attributes = [
95
114
'T_BOOL' ,
96
115
'T_BYTE' , 'T_UBYTE' ,
@@ -109,37 +128,57 @@ def test_bad_assignments(self):
109
128
self .assertRaises (TypeError , setattr , ts , attr , nonint )
110
129
111
130
def test_inplace_string (self ):
131
+ ts = self .ts
112
132
self .assertEqual (ts .T_STRING_INPLACE , "hi" )
113
133
self .assertRaises (TypeError , setattr , ts , "T_STRING_INPLACE" , "s" )
114
134
self .assertRaises (TypeError , delattr , ts , "T_STRING_INPLACE" )
115
135
136
+ class ReadWriteTests_OldAPI (ReadWriteTests , unittest .TestCase ):
137
+ cls = _test_structmembersType_OldAPI
138
+
139
+ class ReadWriteTests_NewAPI (ReadWriteTests , unittest .TestCase ):
140
+ cls = _test_structmembersType_NewAPI
116
141
117
- class TestWarnings (unittest .TestCase ):
142
+ class TestWarnings :
143
+ def setUp (self ):
144
+ self .ts = _make_test_object (self .cls )
118
145
119
146
def test_byte_max (self ):
147
+ ts = self .ts
120
148
with warnings_helper .check_warnings (('' , RuntimeWarning )):
121
149
ts .T_BYTE = CHAR_MAX + 1
122
150
123
151
def test_byte_min (self ):
152
+ ts = self .ts
124
153
with warnings_helper .check_warnings (('' , RuntimeWarning )):
125
154
ts .T_BYTE = CHAR_MIN - 1
126
155
127
156
def test_ubyte_max (self ):
157
+ ts = self .ts
128
158
with warnings_helper .check_warnings (('' , RuntimeWarning )):
129
159
ts .T_UBYTE = UCHAR_MAX + 1
130
160
131
161
def test_short_max (self ):
162
+ ts = self .ts
132
163
with warnings_helper .check_warnings (('' , RuntimeWarning )):
133
164
ts .T_SHORT = SHRT_MAX + 1
134
165
135
166
def test_short_min (self ):
167
+ ts = self .ts
136
168
with warnings_helper .check_warnings (('' , RuntimeWarning )):
137
169
ts .T_SHORT = SHRT_MIN - 1
138
170
139
171
def test_ushort_max (self ):
172
+ ts = self .ts
140
173
with warnings_helper .check_warnings (('' , RuntimeWarning )):
141
174
ts .T_USHORT = USHRT_MAX + 1
142
175
176
+ class TestWarnings_OldAPI (TestWarnings , unittest .TestCase ):
177
+ cls = _test_structmembersType_OldAPI
178
+
179
+ class TestWarnings_NewAPI (TestWarnings , unittest .TestCase ):
180
+ cls = _test_structmembersType_NewAPI
181
+
143
182
144
183
if __name__ == "__main__" :
145
184
unittest .main ()
0 commit comments