(root)/
Python-3.12.0/
Lib/
test/
test_capi/
test_structmembers.py
       1  import unittest
       2  from test.support import import_helper
       3  from test.support import warnings_helper
       4  
       5  # Skip this test if the _testcapi module isn't available.
       6  import_helper.import_module('_testcapi')
       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 ESC[4;38;5;81mReadWriteTests:
      38      def setUp(self):
      39          self.ts = _make_test_object(self.cls)
      40  
      41      def test_bool(self):
      42          ts = self.ts
      43          ts.T_BOOL = True
      44          self.assertEqual(ts.T_BOOL, True)
      45          ts.T_BOOL = False
      46          self.assertEqual(ts.T_BOOL, False)
      47          self.assertRaises(TypeError, setattr, ts, 'T_BOOL', 1)
      48  
      49      def test_byte(self):
      50          ts = self.ts
      51          ts.T_BYTE = CHAR_MAX
      52          self.assertEqual(ts.T_BYTE, CHAR_MAX)
      53          ts.T_BYTE = CHAR_MIN
      54          self.assertEqual(ts.T_BYTE, CHAR_MIN)
      55          ts.T_UBYTE = UCHAR_MAX
      56          self.assertEqual(ts.T_UBYTE, UCHAR_MAX)
      57  
      58      def test_short(self):
      59          ts = self.ts
      60          ts.T_SHORT = SHRT_MAX
      61          self.assertEqual(ts.T_SHORT, SHRT_MAX)
      62          ts.T_SHORT = SHRT_MIN
      63          self.assertEqual(ts.T_SHORT, SHRT_MIN)
      64          ts.T_USHORT = USHRT_MAX
      65          self.assertEqual(ts.T_USHORT, USHRT_MAX)
      66  
      67      def test_int(self):
      68          ts = self.ts
      69          ts.T_INT = INT_MAX
      70          self.assertEqual(ts.T_INT, INT_MAX)
      71          ts.T_INT = INT_MIN
      72          self.assertEqual(ts.T_INT, INT_MIN)
      73          ts.T_UINT = UINT_MAX
      74          self.assertEqual(ts.T_UINT, UINT_MAX)
      75  
      76      def test_long(self):
      77          ts = self.ts
      78          ts.T_LONG = LONG_MAX
      79          self.assertEqual(ts.T_LONG, LONG_MAX)
      80          ts.T_LONG = LONG_MIN
      81          self.assertEqual(ts.T_LONG, LONG_MIN)
      82          ts.T_ULONG = ULONG_MAX
      83          self.assertEqual(ts.T_ULONG, ULONG_MAX)
      84  
      85      def test_py_ssize_t(self):
      86          ts = self.ts
      87          ts.T_PYSSIZET = PY_SSIZE_T_MAX
      88          self.assertEqual(ts.T_PYSSIZET, PY_SSIZE_T_MAX)
      89          ts.T_PYSSIZET = PY_SSIZE_T_MIN
      90          self.assertEqual(ts.T_PYSSIZET, PY_SSIZE_T_MIN)
      91  
      92      def test_longlong(self):
      93          ts = self.ts
      94          if not hasattr(ts, "T_LONGLONG"):
      95              self.skipTest("long long not present")
      96  
      97          ts.T_LONGLONG = LLONG_MAX
      98          self.assertEqual(ts.T_LONGLONG, LLONG_MAX)
      99          ts.T_LONGLONG = LLONG_MIN
     100          self.assertEqual(ts.T_LONGLONG, LLONG_MIN)
     101  
     102          ts.T_ULONGLONG = ULLONG_MAX
     103          self.assertEqual(ts.T_ULONGLONG, ULLONG_MAX)
     104  
     105          ## make sure these will accept a plain int as well as a long
     106          ts.T_LONGLONG = 3
     107          self.assertEqual(ts.T_LONGLONG, 3)
     108          ts.T_ULONGLONG = 4
     109          self.assertEqual(ts.T_ULONGLONG, 4)
     110  
     111      def test_bad_assignments(self):
     112          ts = self.ts
     113          integer_attributes = [
     114              'T_BOOL',
     115              'T_BYTE', 'T_UBYTE',
     116              'T_SHORT', 'T_USHORT',
     117              'T_INT', 'T_UINT',
     118              'T_LONG', 'T_ULONG',
     119              'T_PYSSIZET'
     120              ]
     121          if hasattr(ts, 'T_LONGLONG'):
     122              integer_attributes.extend(['T_LONGLONG', 'T_ULONGLONG'])
     123  
     124          # issue8014: this produced 'bad argument to internal function'
     125          # internal error
     126          for nonint in None, 3.2j, "full of eels", {}, []:
     127              for attr in integer_attributes:
     128                  self.assertRaises(TypeError, setattr, ts, attr, nonint)
     129  
     130      def test_inplace_string(self):
     131          ts = self.ts
     132          self.assertEqual(ts.T_STRING_INPLACE, "hi")
     133          self.assertRaises(TypeError, setattr, ts, "T_STRING_INPLACE", "s")
     134          self.assertRaises(TypeError, delattr, ts, "T_STRING_INPLACE")
     135  
     136  class ESC[4;38;5;81mReadWriteTests_OldAPI(ESC[4;38;5;149mReadWriteTests, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     137      cls = _test_structmembersType_OldAPI
     138  
     139  class ESC[4;38;5;81mReadWriteTests_NewAPI(ESC[4;38;5;149mReadWriteTests, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     140      cls = _test_structmembersType_NewAPI
     141  
     142  class ESC[4;38;5;81mTestWarnings:
     143      def setUp(self):
     144          self.ts = _make_test_object(self.cls)
     145  
     146      def test_byte_max(self):
     147          ts = self.ts
     148          with warnings_helper.check_warnings(('', RuntimeWarning)):
     149              ts.T_BYTE = CHAR_MAX+1
     150  
     151      def test_byte_min(self):
     152          ts = self.ts
     153          with warnings_helper.check_warnings(('', RuntimeWarning)):
     154              ts.T_BYTE = CHAR_MIN-1
     155  
     156      def test_ubyte_max(self):
     157          ts = self.ts
     158          with warnings_helper.check_warnings(('', RuntimeWarning)):
     159              ts.T_UBYTE = UCHAR_MAX+1
     160  
     161      def test_short_max(self):
     162          ts = self.ts
     163          with warnings_helper.check_warnings(('', RuntimeWarning)):
     164              ts.T_SHORT = SHRT_MAX+1
     165  
     166      def test_short_min(self):
     167          ts = self.ts
     168          with warnings_helper.check_warnings(('', RuntimeWarning)):
     169              ts.T_SHORT = SHRT_MIN-1
     170  
     171      def test_ushort_max(self):
     172          ts = self.ts
     173          with warnings_helper.check_warnings(('', RuntimeWarning)):
     174              ts.T_USHORT = USHRT_MAX+1
     175  
     176  class ESC[4;38;5;81mTestWarnings_OldAPI(ESC[4;38;5;149mTestWarnings, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     177      cls = _test_structmembersType_OldAPI
     178  
     179  class ESC[4;38;5;81mTestWarnings_NewAPI(ESC[4;38;5;149mTestWarnings, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     180      cls = _test_structmembersType_NewAPI
     181  
     182  
     183  if __name__ == "__main__":
     184      unittest.main()