14
14
15
15
"""Tests for clif.testing.python.classes."""
16
16
17
+ import abc
17
18
from unittest import mock
18
19
19
20
from absl .testing import absltest
20
21
from absl .testing import parameterized
21
22
23
+ from clif .python import abc_utils
22
24
from clif .testing .python import classes
23
25
24
26
@@ -35,6 +37,20 @@ def testKlass(self):
35
37
# AttributeError on CPython; TypeError on PyPy.
36
38
with self .assertRaises ((AttributeError , TypeError )):
37
39
k .i2 = 0
40
+ self .assertEqual (classes .Klass .C , 1 )
41
+ self .assertEqual (k .C , 1 )
42
+ with self .assertRaisesRegex (AttributeError , 'read-only' ):
43
+ k .C = 0
44
+
45
+ # UNDESIRABLE but long established behavior.
46
+ classes .Klass .C = 0 # C++ const but not read-only in Python.
47
+ self .assertEqual (classes .Klass .C , 0 )
48
+ self .assertEqual (k .C , 0 )
49
+ # Restore original value, to minimize the potential for surprises,
50
+ # just in case.
51
+ classes .Klass .C = 1
52
+ self .assertEqual (classes .Klass .C , 1 )
53
+ self .assertEqual (k .C , 1 )
38
54
39
55
def testMockIsRejected (self ):
40
56
k_inst = classes .Klass (3 )
@@ -212,6 +228,42 @@ def testNestedUnproperty(self, attr, expected, new_value, new_expected):
212
228
ret = getattr (obj , getter )()
213
229
self .assertEqual (ret , new_expected )
214
230
231
+ def testABCMeta (self ):
232
+ # Purely to help the linter.
233
+ ABCMeta = abc .ABCMeta # pylint: disable=unused-variable
234
+
235
+ if abc_utils .PyCLIFMeta is type :
236
+
237
+ class KlassABCMeta (classes .Klass , metaclass = ABCMeta ):
238
+ pass
239
+
240
+ self .assertEqual (type (classes .Klass ).__name__ , 'type' )
241
+ km = KlassABCMeta (5 )
242
+ self .assertEqual (km .i , 5 )
243
+
244
+ else :
245
+ self .assertEqual (classes .__pyclif_codegen_mode__ , 'pybind11' )
246
+ with self .assertRaisesRegex (TypeError , 'metaclass conflict' ):
247
+
248
+ class KlassABCMeta (classes .Klass , metaclass = ABCMeta ):
249
+ pass
250
+
251
+ def testPyCLIFABCMeta (self ):
252
+ # Purely to help the linter.
253
+ PyCLIFABCMeta = abc_utils .PyCLIFABCMeta # pylint: disable=unused-variable,invalid-name
254
+
255
+ class KlassPyCLIFABCMeta (classes .Klass , metaclass = PyCLIFABCMeta ):
256
+ pass
257
+
258
+ if abc_utils .PyCLIFMeta is type :
259
+ expected_type_name = 'type'
260
+ else :
261
+ self .assertEqual (classes .__pyclif_codegen_mode__ , 'pybind11' )
262
+ expected_type_name = 'pybind11_type'
263
+ self .assertEqual (type (classes .Klass ).__name__ , expected_type_name )
264
+ km = KlassPyCLIFABCMeta (5 )
265
+ self .assertEqual (km .i , 5 )
266
+
215
267
216
268
if __name__ == '__main__' :
217
269
absltest .main ()
0 commit comments