|
4 | 4 | import copyreg
|
5 | 5 | import weakref
|
6 | 6 | import abc
|
| 7 | +import os |
| 8 | +import time |
7 | 9 | from operator import le, lt, ge, gt, eq, ne, attrgetter
|
8 | 10 |
|
9 | 11 | import unittest
|
@@ -945,6 +947,28 @@ def test_namedtuple(self):
|
945 | 947 | with self.assertRaisesRegex(ValueError, 'unexpected field name'):
|
946 | 948 | copy.replace(p, x=1, error=2)
|
947 | 949 |
|
| 950 | + def test_structseq(self): |
| 951 | + t = time.gmtime(0) |
| 952 | + self.assertEqual(copy.replace(t), (1970, 1, 1, 0, 0, 0, 3, 1, 0)) |
| 953 | + self.assertEqual(copy.replace(t, tm_year=2000), |
| 954 | + (2000, 1, 1, 0, 0, 0, 3, 1, 0)) |
| 955 | + self.assertEqual(copy.replace(t, tm_mon=2), |
| 956 | + (1970, 2, 1, 0, 0, 0, 3, 1, 0)) |
| 957 | + self.assertEqual(copy.replace(t, tm_year=2000, tm_mon=2), |
| 958 | + (2000, 2, 1, 0, 0, 0, 3, 1, 0)) |
| 959 | + with self.assertRaisesRegex(ValueError, 'unexpected field name'): |
| 960 | + copy.replace(t, tm_year=2000, error=2) |
| 961 | + |
| 962 | + assert os.stat_result.n_unnamed_fields > 0 |
| 963 | + r = os.stat_result(range(os.stat_result.n_sequence_fields), {'st_atime_ns': -1}) |
| 964 | + self.assertHasAttr(r, 'st_atime_ns') |
| 965 | + self.assertEqual(r.st_atime_ns, -1) |
| 966 | + with self.assertRaisesRegex(AttributeError, 'readonly attribute'): |
| 967 | + r.st_atime_ns = -2 |
| 968 | + r2 = copy.replace(r, st_atime_ns=-3) |
| 969 | + self.assertHasAttr(r2, 'st_atime_ns') |
| 970 | + self.assertEqual(r2.st_atime_ns, -3) |
| 971 | + |
948 | 972 | def test_dataclass(self):
|
949 | 973 | from dataclasses import dataclass
|
950 | 974 | @dataclass
|
|
0 commit comments