summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorRaymond Hettinger <rhettinger@users.noreply.github.com>2018-01-11 05:45:19 (GMT)
committerGitHub <noreply@github.com>2018-01-11 05:45:19 (GMT)
commit3948207c610e931831828d33aaef258185df31db (patch)
tree784b0122b54543b540559d23385a060f9d924d44 /Lib/test
parentd55209d5b1e097cde55fa3f83149d614c8ccaf09 (diff)
downloadcpython-3948207c610e931831828d33aaef258185df31db.zip
cpython-3948207c610e931831828d33aaef258185df31db.tar.gz
cpython-3948207c610e931831828d33aaef258185df31db.tar.bz2
bpo-32320: Add default value support to collections.namedtuple() (#4859)
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_collections.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index 6c466f4..cb66235 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -216,6 +216,57 @@ class TestNamedTuple(unittest.TestCase):
self.assertRaises(TypeError, Point._make, [11]) # catch too few args
self.assertRaises(TypeError, Point._make, [11, 22, 33]) # catch too many args
+ def test_defaults(self):
+ Point = namedtuple('Point', 'x y', defaults=(10, 20)) # 2 defaults
+ self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
+ self.assertEqual(Point(1, 2), (1, 2))
+ self.assertEqual(Point(1), (1, 20))
+ self.assertEqual(Point(), (10, 20))
+
+ Point = namedtuple('Point', 'x y', defaults=(20,)) # 1 default
+ self.assertEqual(Point._fields_defaults, {'y': 20})
+ self.assertEqual(Point(1, 2), (1, 2))
+ self.assertEqual(Point(1), (1, 20))
+
+ Point = namedtuple('Point', 'x y', defaults=()) # 0 defaults
+ self.assertEqual(Point._fields_defaults, {})
+ self.assertEqual(Point(1, 2), (1, 2))
+ with self.assertRaises(TypeError):
+ Point(1)
+
+ with self.assertRaises(TypeError): # catch too few args
+ Point()
+ with self.assertRaises(TypeError): # catch too many args
+ Point(1, 2, 3)
+ with self.assertRaises(TypeError): # too many defaults
+ Point = namedtuple('Point', 'x y', defaults=(10, 20, 30))
+ with self.assertRaises(TypeError): # non-iterable defaults
+ Point = namedtuple('Point', 'x y', defaults=10)
+ with self.assertRaises(TypeError): # another non-iterable default
+ Point = namedtuple('Point', 'x y', defaults=False)
+
+ Point = namedtuple('Point', 'x y', defaults=None) # default is None
+ self.assertEqual(Point._fields_defaults, {})
+ self.assertIsNone(Point.__new__.__defaults__, None)
+ self.assertEqual(Point(10, 20), (10, 20))
+ with self.assertRaises(TypeError): # catch too few args
+ Point(10)
+
+ Point = namedtuple('Point', 'x y', defaults=[10, 20]) # allow non-tuple iterable
+ self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
+ self.assertEqual(Point.__new__.__defaults__, (10, 20))
+ self.assertEqual(Point(1, 2), (1, 2))
+ self.assertEqual(Point(1), (1, 20))
+ self.assertEqual(Point(), (10, 20))
+
+ Point = namedtuple('Point', 'x y', defaults=iter([10, 20])) # allow plain iterator
+ self.assertEqual(Point._fields_defaults, {'x': 10, 'y': 20})
+ self.assertEqual(Point.__new__.__defaults__, (10, 20))
+ self.assertEqual(Point(1, 2), (1, 2))
+ self.assertEqual(Point(1), (1, 20))
+ self.assertEqual(Point(), (10, 20))
+
+
@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_factory_doc_attr(self):