]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109956: Also test typing.NamedTuple with copy.replace() (GH-109957)
authorNikita Sobolev <mail@sobolevn.me>
Tue, 3 Oct 2023 11:13:13 +0000 (14:13 +0300)
committerGitHub <noreply@github.com>
Tue, 3 Oct 2023 11:13:13 +0000 (14:13 +0300)
Lib/test/test_copy.py

index c66c6eeb00811e65f781e9c8081136b9eb4fa177..60735ba89a80eef5983c9ea78ae297034f8ab029 100644 (file)
@@ -936,14 +936,24 @@ class TestReplace(unittest.TestCase):
 
     def test_namedtuple(self):
         from collections import namedtuple
-        Point = namedtuple('Point', 'x y', defaults=(0,))
-        p = Point(11, 22)
-        self.assertEqual(copy.replace(p), (11, 22))
-        self.assertEqual(copy.replace(p, x=1), (1, 22))
-        self.assertEqual(copy.replace(p, y=2), (11, 2))
-        self.assertEqual(copy.replace(p, x=1, y=2), (1, 2))
-        with self.assertRaisesRegex(ValueError, 'unexpected field name'):
-            copy.replace(p, x=1, error=2)
+        from typing import NamedTuple
+        PointFromCall = namedtuple('Point', 'x y', defaults=(0,))
+        class PointFromInheritance(PointFromCall):
+            pass
+        class PointFromClass(NamedTuple):
+            x: int
+            y: int = 0
+        for Point in (PointFromCall, PointFromInheritance, PointFromClass):
+            with self.subTest(Point=Point):
+                p = Point(11, 22)
+                self.assertIsInstance(p, Point)
+                self.assertEqual(copy.replace(p), (11, 22))
+                self.assertIsInstance(copy.replace(p), Point)
+                self.assertEqual(copy.replace(p, x=1), (1, 22))
+                self.assertEqual(copy.replace(p, y=2), (11, 2))
+                self.assertEqual(copy.replace(p, x=1, y=2), (1, 2))
+                with self.assertRaisesRegex(ValueError, 'unexpected field name'):
+                    copy.replace(p, x=1, error=2)
 
     def test_dataclass(self):
         from dataclasses import dataclass