+++ /dev/null
-"""Unit tests for collections.defaultdict."""\r
-\r
-import os\r
-import copy\r
-import tempfile\r
-import unittest\r
-from test import test_support\r
-\r
-from collections import defaultdict\r
-\r
-def foobar():\r
- return list\r
-\r
-class TestDefaultDict(unittest.TestCase):\r
-\r
- def test_basic(self):\r
- d1 = defaultdict()\r
- self.assertEqual(d1.default_factory, None)\r
- d1.default_factory = list\r
- d1[12].append(42)\r
- self.assertEqual(d1, {12: [42]})\r
- d1[12].append(24)\r
- self.assertEqual(d1, {12: [42, 24]})\r
- d1[13]\r
- d1[14]\r
- self.assertEqual(d1, {12: [42, 24], 13: [], 14: []})\r
- self.assertTrue(d1[12] is not d1[13] is not d1[14])\r
- d2 = defaultdict(list, foo=1, bar=2)\r
- self.assertEqual(d2.default_factory, list)\r
- self.assertEqual(d2, {"foo": 1, "bar": 2})\r
- self.assertEqual(d2["foo"], 1)\r
- self.assertEqual(d2["bar"], 2)\r
- self.assertEqual(d2[42], [])\r
- self.assertIn("foo", d2)\r
- self.assertIn("foo", d2.keys())\r
- self.assertIn("bar", d2)\r
- self.assertIn("bar", d2.keys())\r
- self.assertIn(42, d2)\r
- self.assertIn(42, d2.keys())\r
- self.assertNotIn(12, d2)\r
- self.assertNotIn(12, d2.keys())\r
- d2.default_factory = None\r
- self.assertEqual(d2.default_factory, None)\r
- try:\r
- d2[15]\r
- except KeyError, err:\r
- self.assertEqual(err.args, (15,))\r
- else:\r
- self.fail("d2[15] didn't raise KeyError")\r
- self.assertRaises(TypeError, defaultdict, 1)\r
-\r
- def test_missing(self):\r
- d1 = defaultdict()\r
- self.assertRaises(KeyError, d1.__missing__, 42)\r
- d1.default_factory = list\r
- self.assertEqual(d1.__missing__(42), [])\r
-\r
- def test_repr(self):\r
- d1 = defaultdict()\r
- self.assertEqual(d1.default_factory, None)\r
- self.assertEqual(repr(d1), "defaultdict(None, {})")\r
- self.assertEqual(eval(repr(d1)), d1)\r
- d1[11] = 41\r
- self.assertEqual(repr(d1), "defaultdict(None, {11: 41})")\r
- d2 = defaultdict(int)\r
- self.assertEqual(d2.default_factory, int)\r
- d2[12] = 42\r
- self.assertEqual(repr(d2), "defaultdict(<type 'int'>, {12: 42})")\r
- def foo(): return 43\r
- d3 = defaultdict(foo)\r
- self.assertTrue(d3.default_factory is foo)\r
- d3[13]\r
- self.assertEqual(repr(d3), "defaultdict(%s, {13: 43})" % repr(foo))\r
-\r
- def test_print(self):\r
- d1 = defaultdict()\r
- def foo(): return 42\r
- d2 = defaultdict(foo, {1: 2})\r
- # NOTE: We can't use tempfile.[Named]TemporaryFile since this\r
- # code must exercise the tp_print C code, which only gets\r
- # invoked for *real* files.\r
- tfn = tempfile.mktemp()\r
- try:\r
- f = open(tfn, "w+")\r
- try:\r
- print >>f, d1\r
- print >>f, d2\r
- f.seek(0)\r
- self.assertEqual(f.readline(), repr(d1) + "\n")\r
- self.assertEqual(f.readline(), repr(d2) + "\n")\r
- finally:\r
- f.close()\r
- finally:\r
- os.remove(tfn)\r
-\r
- def test_copy(self):\r
- d1 = defaultdict()\r
- d2 = d1.copy()\r
- self.assertEqual(type(d2), defaultdict)\r
- self.assertEqual(d2.default_factory, None)\r
- self.assertEqual(d2, {})\r
- d1.default_factory = list\r
- d3 = d1.copy()\r
- self.assertEqual(type(d3), defaultdict)\r
- self.assertEqual(d3.default_factory, list)\r
- self.assertEqual(d3, {})\r
- d1[42]\r
- d4 = d1.copy()\r
- self.assertEqual(type(d4), defaultdict)\r
- self.assertEqual(d4.default_factory, list)\r
- self.assertEqual(d4, {42: []})\r
- d4[12]\r
- self.assertEqual(d4, {42: [], 12: []})\r
-\r
- # Issue 6637: Copy fails for empty default dict\r
- d = defaultdict()\r
- d['a'] = 42\r
- e = d.copy()\r
- self.assertEqual(e['a'], 42)\r
-\r
- def test_shallow_copy(self):\r
- d1 = defaultdict(foobar, {1: 1})\r
- d2 = copy.copy(d1)\r
- self.assertEqual(d2.default_factory, foobar)\r
- self.assertEqual(d2, d1)\r
- d1.default_factory = list\r
- d2 = copy.copy(d1)\r
- self.assertEqual(d2.default_factory, list)\r
- self.assertEqual(d2, d1)\r
-\r
- def test_deep_copy(self):\r
- d1 = defaultdict(foobar, {1: [1]})\r
- d2 = copy.deepcopy(d1)\r
- self.assertEqual(d2.default_factory, foobar)\r
- self.assertEqual(d2, d1)\r
- self.assertTrue(d1[1] is not d2[1])\r
- d1.default_factory = list\r
- d2 = copy.deepcopy(d1)\r
- self.assertEqual(d2.default_factory, list)\r
- self.assertEqual(d2, d1)\r
-\r
- def test_keyerror_without_factory(self):\r
- d1 = defaultdict()\r
- try:\r
- d1[(1,)]\r
- except KeyError, err:\r
- self.assertEqual(err.args[0], (1,))\r
- else:\r
- self.fail("expected KeyError")\r
-\r
- def test_recursive_repr(self):\r
- # Issue2045: stack overflow when default_factory is a bound method\r
- class sub(defaultdict):\r
- def __init__(self):\r
- self.default_factory = self._factory\r
- def _factory(self):\r
- return []\r
- d = sub()\r
- self.assertTrue(repr(d).startswith(\r
- "defaultdict(<bound method sub._factory of defaultdict(..."))\r
-\r
- # NOTE: printing a subclass of a builtin type does not call its\r
- # tp_print slot. So this part is essentially the same test as above.\r
- tfn = tempfile.mktemp()\r
- try:\r
- f = open(tfn, "w+")\r
- try:\r
- print >>f, d\r
- finally:\r
- f.close()\r
- finally:\r
- os.remove(tfn)\r
-\r
-\r
-def test_main():\r
- test_support.run_unittest(TestDefaultDict)\r
-\r
-if __name__ == "__main__":\r
- test_main()\r