(root)/
Python-3.11.7/
Lib/
test/
test_structseq.py
       1  import copy
       2  import os
       3  import pickle
       4  import time
       5  import unittest
       6  
       7  
       8  class ESC[4;38;5;81mStructSeqTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
       9  
      10      def test_tuple(self):
      11          t = time.gmtime()
      12          self.assertIsInstance(t, tuple)
      13          astuple = tuple(t)
      14          self.assertEqual(len(t), len(astuple))
      15          self.assertEqual(t, astuple)
      16  
      17          # Check that slicing works the same way; at one point, slicing t[i:j] with
      18          # 0 < i < j could produce NULLs in the result.
      19          for i in range(-len(t), len(t)):
      20              self.assertEqual(t[i:], astuple[i:])
      21              for j in range(-len(t), len(t)):
      22                  self.assertEqual(t[i:j], astuple[i:j])
      23  
      24          for j in range(-len(t), len(t)):
      25              self.assertEqual(t[:j], astuple[:j])
      26  
      27          self.assertRaises(IndexError, t.__getitem__, -len(t)-1)
      28          self.assertRaises(IndexError, t.__getitem__, len(t))
      29          for i in range(-len(t), len(t)-1):
      30              self.assertEqual(t[i], astuple[i])
      31  
      32      def test_repr(self):
      33          t = time.gmtime()
      34          self.assertTrue(repr(t))
      35          t = time.gmtime(0)
      36          self.assertEqual(repr(t),
      37              "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, "
      38              "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)")
      39          # os.stat() gives a complicated struct sequence.
      40          st = os.stat(__file__)
      41          rep = repr(st)
      42          self.assertTrue(rep.startswith("os.stat_result"))
      43          self.assertIn("st_mode=", rep)
      44          self.assertIn("st_ino=", rep)
      45          self.assertIn("st_dev=", rep)
      46  
      47      def test_concat(self):
      48          t1 = time.gmtime()
      49          t2 = t1 + tuple(t1)
      50          for i in range(len(t1)):
      51              self.assertEqual(t2[i], t2[i+len(t1)])
      52  
      53      def test_repeat(self):
      54          t1 = time.gmtime()
      55          t2 = 3 * t1
      56          for i in range(len(t1)):
      57              self.assertEqual(t2[i], t2[i+len(t1)])
      58              self.assertEqual(t2[i], t2[i+2*len(t1)])
      59  
      60      def test_contains(self):
      61          t1 = time.gmtime()
      62          for item in t1:
      63              self.assertIn(item, t1)
      64          self.assertNotIn(-42, t1)
      65  
      66      def test_hash(self):
      67          t1 = time.gmtime()
      68          self.assertEqual(hash(t1), hash(tuple(t1)))
      69  
      70      def test_cmp(self):
      71          t1 = time.gmtime()
      72          t2 = type(t1)(t1)
      73          self.assertEqual(t1, t2)
      74          self.assertTrue(not (t1 < t2))
      75          self.assertTrue(t1 <= t2)
      76          self.assertTrue(not (t1 > t2))
      77          self.assertTrue(t1 >= t2)
      78          self.assertTrue(not (t1 != t2))
      79  
      80      def test_fields(self):
      81          t = time.gmtime()
      82          self.assertEqual(len(t), t.n_sequence_fields)
      83          self.assertEqual(t.n_unnamed_fields, 0)
      84          self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS)
      85  
      86      def test_constructor(self):
      87          t = time.struct_time
      88  
      89          self.assertRaises(TypeError, t)
      90          self.assertRaises(TypeError, t, None)
      91          self.assertRaises(TypeError, t, "123")
      92          self.assertRaises(TypeError, t, "123", dict={})
      93          self.assertRaises(TypeError, t, "123456789", dict=None)
      94  
      95          s = "123456789"
      96          self.assertEqual("".join(t(s)), s)
      97  
      98      def test_eviltuple(self):
      99          class ESC[4;38;5;81mExc(ESC[4;38;5;149mException):
     100              pass
     101  
     102          # Devious code could crash structseqs' constructors
     103          class ESC[4;38;5;81mC:
     104              def __getitem__(self, i):
     105                  raise Exc
     106              def __len__(self):
     107                  return 9
     108  
     109          self.assertRaises(Exc, time.struct_time, C())
     110  
     111      def test_pickling(self):
     112          t = time.gmtime()
     113          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     114              p = pickle.dumps(t, proto)
     115              t2 = pickle.loads(p)
     116              self.assertEqual(t2.__class__, t.__class__)
     117              self.assertEqual(t2, t)
     118              self.assertEqual(t2.tm_year, t.tm_year)
     119              self.assertEqual(t2.tm_zone, t.tm_zone)
     120  
     121      def test_pickling_with_unnamed_fields(self):
     122          assert os.stat_result.n_unnamed_fields > 0
     123  
     124          r = os.stat_result(range(os.stat_result.n_sequence_fields),
     125                             {'st_atime': 1.0, 'st_atime_ns': 2.0})
     126          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     127              p = pickle.dumps(r, proto)
     128              r2 = pickle.loads(p)
     129              self.assertEqual(r2.__class__, r.__class__)
     130              self.assertEqual(r2, r)
     131              self.assertEqual(r2.st_mode, r.st_mode)
     132              self.assertEqual(r2.st_atime, r.st_atime)
     133              self.assertEqual(r2.st_atime_ns, r.st_atime_ns)
     134  
     135      def test_copying(self):
     136          n_fields = time.struct_time.n_fields
     137          t = time.struct_time([[i] for i in range(n_fields)])
     138  
     139          t2 = copy.copy(t)
     140          self.assertEqual(t2.__class__, t.__class__)
     141          self.assertEqual(t2, t)
     142          self.assertEqual(t2.tm_year, t.tm_year)
     143          self.assertEqual(t2.tm_zone, t.tm_zone)
     144          self.assertIs(t2[0], t[0])
     145          self.assertIs(t2.tm_year, t.tm_year)
     146  
     147          t3 = copy.deepcopy(t)
     148          self.assertEqual(t3.__class__, t.__class__)
     149          self.assertEqual(t3, t)
     150          self.assertEqual(t3.tm_year, t.tm_year)
     151          self.assertEqual(t3.tm_zone, t.tm_zone)
     152          self.assertIsNot(t3[0], t[0])
     153          self.assertIsNot(t3.tm_year, t.tm_year)
     154  
     155      def test_copying_with_unnamed_fields(self):
     156          assert os.stat_result.n_unnamed_fields > 0
     157  
     158          n_sequence_fields = os.stat_result.n_sequence_fields
     159          r = os.stat_result([[i] for i in range(n_sequence_fields)],
     160                             {'st_atime': [1.0], 'st_atime_ns': [2.0]})
     161  
     162          r2 = copy.copy(r)
     163          self.assertEqual(r2.__class__, r.__class__)
     164          self.assertEqual(r2, r)
     165          self.assertEqual(r2.st_mode, r.st_mode)
     166          self.assertEqual(r2.st_atime, r.st_atime)
     167          self.assertEqual(r2.st_atime_ns, r.st_atime_ns)
     168          self.assertIs(r2[0], r[0])
     169          self.assertIs(r2.st_mode, r.st_mode)
     170          self.assertIs(r2.st_atime, r.st_atime)
     171          self.assertIs(r2.st_atime_ns, r.st_atime_ns)
     172  
     173          r3 = copy.deepcopy(r)
     174          self.assertEqual(r3.__class__, r.__class__)
     175          self.assertEqual(r3, r)
     176          self.assertEqual(r3.st_mode, r.st_mode)
     177          self.assertEqual(r3.st_atime, r.st_atime)
     178          self.assertEqual(r3.st_atime_ns, r.st_atime_ns)
     179          self.assertIsNot(r3[0], r[0])
     180          self.assertIsNot(r3.st_mode, r.st_mode)
     181          self.assertIsNot(r3.st_atime, r.st_atime)
     182          self.assertIsNot(r3.st_atime_ns, r.st_atime_ns)
     183  
     184      def test_extended_getslice(self):
     185          # Test extended slicing by comparing with list slicing.
     186          t = time.gmtime()
     187          L = list(t)
     188          indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
     189          for start in indices:
     190              for stop in indices:
     191                  # Skip step 0 (invalid)
     192                  for step in indices[1:]:
     193                      self.assertEqual(list(t[start:stop:step]),
     194                                       L[start:stop:step])
     195  
     196      def test_match_args(self):
     197          expected_args = ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min',
     198                           'tm_sec', 'tm_wday', 'tm_yday', 'tm_isdst')
     199          self.assertEqual(time.struct_time.__match_args__, expected_args)
     200  
     201      def test_match_args_with_unnamed_fields(self):
     202          expected_args = ('st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid',
     203                           'st_gid', 'st_size')
     204          self.assertEqual(os.stat_result.n_unnamed_fields, 3)
     205          self.assertEqual(os.stat_result.__match_args__, expected_args)
     206  
     207  
     208  if __name__ == "__main__":
     209      unittest.main()