test_structseq.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import os
  2. import time
  3. import unittest
  4. class StructSeqTest(unittest.TestCase):
  5. def test_tuple(self):
  6. t = time.gmtime()
  7. self.assertIsInstance(t, tuple)
  8. astuple = tuple(t)
  9. self.assertEqual(len(t), len(astuple))
  10. self.assertEqual(t, astuple)
  11. # Check that slicing works the same way; at one point, slicing t[i:j] with
  12. # 0 < i < j could produce NULLs in the result.
  13. for i in range(-len(t), len(t)):
  14. self.assertEqual(t[i:], astuple[i:])
  15. for j in range(-len(t), len(t)):
  16. self.assertEqual(t[i:j], astuple[i:j])
  17. for j in range(-len(t), len(t)):
  18. self.assertEqual(t[:j], astuple[:j])
  19. self.assertRaises(IndexError, t.__getitem__, -len(t)-1)
  20. self.assertRaises(IndexError, t.__getitem__, len(t))
  21. for i in range(-len(t), len(t)-1):
  22. self.assertEqual(t[i], astuple[i])
  23. def test_repr(self):
  24. t = time.gmtime()
  25. self.assertTrue(repr(t))
  26. t = time.gmtime(0)
  27. self.assertEqual(repr(t),
  28. "time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, "
  29. "tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)")
  30. # os.stat() gives a complicated struct sequence.
  31. st = os.stat(__file__)
  32. rep = repr(st)
  33. self.assertTrue(rep.startswith("os.stat_result"))
  34. self.assertIn("st_mode=", rep)
  35. self.assertIn("st_ino=", rep)
  36. self.assertIn("st_dev=", rep)
  37. def test_concat(self):
  38. t1 = time.gmtime()
  39. t2 = t1 + tuple(t1)
  40. for i in range(len(t1)):
  41. self.assertEqual(t2[i], t2[i+len(t1)])
  42. def test_repeat(self):
  43. t1 = time.gmtime()
  44. t2 = 3 * t1
  45. for i in range(len(t1)):
  46. self.assertEqual(t2[i], t2[i+len(t1)])
  47. self.assertEqual(t2[i], t2[i+2*len(t1)])
  48. def test_contains(self):
  49. t1 = time.gmtime()
  50. for item in t1:
  51. self.assertIn(item, t1)
  52. self.assertNotIn(-42, t1)
  53. def test_hash(self):
  54. t1 = time.gmtime()
  55. self.assertEqual(hash(t1), hash(tuple(t1)))
  56. def test_cmp(self):
  57. t1 = time.gmtime()
  58. t2 = type(t1)(t1)
  59. self.assertEqual(t1, t2)
  60. self.assertTrue(not (t1 < t2))
  61. self.assertTrue(t1 <= t2)
  62. self.assertTrue(not (t1 > t2))
  63. self.assertTrue(t1 >= t2)
  64. self.assertTrue(not (t1 != t2))
  65. def test_fields(self):
  66. t = time.gmtime()
  67. self.assertEqual(len(t), t.n_sequence_fields)
  68. self.assertEqual(t.n_unnamed_fields, 0)
  69. self.assertEqual(t.n_fields, time._STRUCT_TM_ITEMS)
  70. def test_constructor(self):
  71. t = time.struct_time
  72. self.assertRaises(TypeError, t)
  73. self.assertRaises(TypeError, t, None)
  74. self.assertRaises(TypeError, t, "123")
  75. self.assertRaises(TypeError, t, "123", dict={})
  76. self.assertRaises(TypeError, t, "123456789", dict=None)
  77. s = "123456789"
  78. self.assertEqual("".join(t(s)), s)
  79. def test_eviltuple(self):
  80. class Exc(Exception):
  81. pass
  82. # Devious code could crash structseqs' constructors
  83. class C:
  84. def __getitem__(self, i):
  85. raise Exc
  86. def __len__(self):
  87. return 9
  88. self.assertRaises(Exc, time.struct_time, C())
  89. def test_reduce(self):
  90. t = time.gmtime()
  91. x = t.__reduce__()
  92. def test_extended_getslice(self):
  93. # Test extended slicing by comparing with list slicing.
  94. t = time.gmtime()
  95. L = list(t)
  96. indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
  97. for start in indices:
  98. for stop in indices:
  99. # Skip step 0 (invalid)
  100. for step in indices[1:]:
  101. self.assertEqual(list(t[start:stop:step]),
  102. L[start:stop:step])
  103. def test_match_args(self):
  104. expected_args = ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min',
  105. 'tm_sec', 'tm_wday', 'tm_yday', 'tm_isdst')
  106. self.assertEqual(time.struct_time.__match_args__, expected_args)
  107. def test_match_args_with_unnamed_fields(self):
  108. expected_args = ('st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid',
  109. 'st_gid', 'st_size')
  110. self.assertEqual(os.stat_result.n_unnamed_fields, 3)
  111. self.assertEqual(os.stat_result.__match_args__, expected_args)
  112. if __name__ == "__main__":
  113. unittest.main()