summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXuehai Pan <XuehaiPan@pku.edu.cn>2023-10-03 14:09:49 (GMT)
committerGitHub <noreply@github.com>2023-10-03 14:09:49 (GMT)
commit2d4865d775123e8889c7a79fc49b4bf627176c4b (patch)
treed44fd4182ea90858a648c951addd9fb5548724db
parentf1663a492e14c80c30cb9741fdc36fa221d5e30a (diff)
downloadcpython-2d4865d775123e8889c7a79fc49b4bf627176c4b.zip
cpython-2d4865d775123e8889c7a79fc49b4bf627176c4b.tar.gz
cpython-2d4865d775123e8889c7a79fc49b4bf627176c4b.tar.bz2
gh-110267: Add tests for pickling and copying PyStructSequence objects (GH-110272)
-rw-r--r--Lib/test/test_structseq.py75
-rw-r--r--Misc/NEWS.d/next/Tests/2023-10-03-10-54-09.gh-issue-110267.O-c47G.rst2
2 files changed, 75 insertions, 2 deletions
diff --git a/Lib/test/test_structseq.py b/Lib/test/test_structseq.py
index a9fe193..c6c0afa 100644
--- a/Lib/test/test_structseq.py
+++ b/Lib/test/test_structseq.py
@@ -1,4 +1,6 @@
+import copy
import os
+import pickle
import time
import unittest
@@ -106,9 +108,78 @@ class StructSeqTest(unittest.TestCase):
self.assertRaises(Exc, time.struct_time, C())
- def test_reduce(self):
+ def test_pickling(self):
t = time.gmtime()
- x = t.__reduce__()
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ p = pickle.dumps(t, proto)
+ t2 = pickle.loads(p)
+ self.assertEqual(t2.__class__, t.__class__)
+ self.assertEqual(t2, t)
+ self.assertEqual(t2.tm_year, t.tm_year)
+ self.assertEqual(t2.tm_zone, t.tm_zone)
+
+ def test_pickling_with_unnamed_fields(self):
+ assert os.stat_result.n_unnamed_fields > 0
+
+ r = os.stat_result(range(os.stat_result.n_sequence_fields),
+ {'st_atime': 1.0, 'st_atime_ns': 2.0})
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ p = pickle.dumps(r, proto)
+ r2 = pickle.loads(p)
+ self.assertEqual(r2.__class__, r.__class__)
+ self.assertEqual(r2, r)
+ self.assertEqual(r2.st_mode, r.st_mode)
+ self.assertEqual(r2.st_atime, r.st_atime)
+ self.assertEqual(r2.st_atime_ns, r.st_atime_ns)
+
+ def test_copying(self):
+ n_fields = time.struct_time.n_fields
+ t = time.struct_time([[i] for i in range(n_fields)])
+
+ t2 = copy.copy(t)
+ self.assertEqual(t2.__class__, t.__class__)
+ self.assertEqual(t2, t)
+ self.assertEqual(t2.tm_year, t.tm_year)
+ self.assertEqual(t2.tm_zone, t.tm_zone)
+ self.assertIs(t2[0], t[0])
+ self.assertIs(t2.tm_year, t.tm_year)
+
+ t3 = copy.deepcopy(t)
+ self.assertEqual(t3.__class__, t.__class__)
+ self.assertEqual(t3, t)
+ self.assertEqual(t3.tm_year, t.tm_year)
+ self.assertEqual(t3.tm_zone, t.tm_zone)
+ self.assertIsNot(t3[0], t[0])
+ self.assertIsNot(t3.tm_year, t.tm_year)
+
+ def test_copying_with_unnamed_fields(self):
+ assert os.stat_result.n_unnamed_fields > 0
+
+ n_sequence_fields = os.stat_result.n_sequence_fields
+ r = os.stat_result([[i] for i in range(n_sequence_fields)],
+ {'st_atime': [1.0], 'st_atime_ns': [2.0]})
+
+ r2 = copy.copy(r)
+ self.assertEqual(r2.__class__, r.__class__)
+ self.assertEqual(r2, r)
+ self.assertEqual(r2.st_mode, r.st_mode)
+ self.assertEqual(r2.st_atime, r.st_atime)
+ self.assertEqual(r2.st_atime_ns, r.st_atime_ns)
+ self.assertIs(r2[0], r[0])
+ self.assertIs(r2.st_mode, r.st_mode)
+ self.assertIs(r2.st_atime, r.st_atime)
+ self.assertIs(r2.st_atime_ns, r.st_atime_ns)
+
+ r3 = copy.deepcopy(r)
+ self.assertEqual(r3.__class__, r.__class__)
+ self.assertEqual(r3, r)
+ self.assertEqual(r3.st_mode, r.st_mode)
+ self.assertEqual(r3.st_atime, r.st_atime)
+ self.assertEqual(r3.st_atime_ns, r.st_atime_ns)
+ self.assertIsNot(r3[0], r[0])
+ self.assertIsNot(r3.st_mode, r.st_mode)
+ self.assertIsNot(r3.st_atime, r.st_atime)
+ self.assertIsNot(r3.st_atime_ns, r.st_atime_ns)
def test_extended_getslice(self):
# Test extended slicing by comparing with list slicing.
diff --git a/Misc/NEWS.d/next/Tests/2023-10-03-10-54-09.gh-issue-110267.O-c47G.rst b/Misc/NEWS.d/next/Tests/2023-10-03-10-54-09.gh-issue-110267.O-c47G.rst
new file mode 100644
index 0000000..2bae771
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2023-10-03-10-54-09.gh-issue-110267.O-c47G.rst
@@ -0,0 +1,2 @@
+Add tests for pickling and copying PyStructSequence objects.
+Patched by Xuehai Pan.