Skip to content

Commit 2d4865d

Browse files
authored
gh-110267: Add tests for pickling and copying PyStructSequence objects (GH-110272)
1 parent f1663a4 commit 2d4865d

File tree

2 files changed

+75
-2
lines changed

2 files changed

+75
-2
lines changed

Lib/test/test_structseq.py

+73-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import copy
12
import os
3+
import pickle
24
import time
35
import unittest
46

@@ -106,9 +108,78 @@ def __len__(self):
106108

107109
self.assertRaises(Exc, time.struct_time, C())
108110

109-
def test_reduce(self):
111+
def test_pickling(self):
110112
t = time.gmtime()
111-
x = t.__reduce__()
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)
112183

113184
def test_extended_getslice(self):
114185
# Test extended slicing by comparing with list slicing.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Add tests for pickling and copying PyStructSequence objects.
2+
Patched by Xuehai Pan.

0 commit comments

Comments
 (0)