summaryrefslogtreecommitdiff
path: root/Lib/test
diff options
context:
space:
mode:
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 6c466f41e6..cb662355bb 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):