]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | import copy_reg\r |
2 | import unittest\r | |
3 | \r | |
4 | from test import test_support\r | |
5 | from test.pickletester import ExtensionSaver\r | |
6 | \r | |
7 | class C:\r | |
8 | pass\r | |
9 | \r | |
10 | \r | |
11 | class WithoutSlots(object):\r | |
12 | pass\r | |
13 | \r | |
14 | class WithWeakref(object):\r | |
15 | __slots__ = ('__weakref__',)\r | |
16 | \r | |
17 | class WithPrivate(object):\r | |
18 | __slots__ = ('__spam',)\r | |
19 | \r | |
20 | class WithSingleString(object):\r | |
21 | __slots__ = 'spam'\r | |
22 | \r | |
23 | class WithInherited(WithSingleString):\r | |
24 | __slots__ = ('eggs',)\r | |
25 | \r | |
26 | \r | |
27 | class CopyRegTestCase(unittest.TestCase):\r | |
28 | \r | |
29 | def test_class(self):\r | |
30 | self.assertRaises(TypeError, copy_reg.pickle,\r | |
31 | C, None, None)\r | |
32 | \r | |
33 | def test_noncallable_reduce(self):\r | |
34 | self.assertRaises(TypeError, copy_reg.pickle,\r | |
35 | type(1), "not a callable")\r | |
36 | \r | |
37 | def test_noncallable_constructor(self):\r | |
38 | self.assertRaises(TypeError, copy_reg.pickle,\r | |
39 | type(1), int, "not a callable")\r | |
40 | \r | |
41 | def test_bool(self):\r | |
42 | import copy\r | |
43 | self.assertEqual(True, copy.copy(True))\r | |
44 | \r | |
45 | def test_extension_registry(self):\r | |
46 | mod, func, code = 'junk1 ', ' junk2', 0xabcd\r | |
47 | e = ExtensionSaver(code)\r | |
48 | try:\r | |
49 | # Shouldn't be in registry now.\r | |
50 | self.assertRaises(ValueError, copy_reg.remove_extension,\r | |
51 | mod, func, code)\r | |
52 | copy_reg.add_extension(mod, func, code)\r | |
53 | # Should be in the registry.\r | |
54 | self.assertTrue(copy_reg._extension_registry[mod, func] == code)\r | |
55 | self.assertTrue(copy_reg._inverted_registry[code] == (mod, func))\r | |
56 | # Shouldn't be in the cache.\r | |
57 | self.assertNotIn(code, copy_reg._extension_cache)\r | |
58 | # Redundant registration should be OK.\r | |
59 | copy_reg.add_extension(mod, func, code) # shouldn't blow up\r | |
60 | # Conflicting code.\r | |
61 | self.assertRaises(ValueError, copy_reg.add_extension,\r | |
62 | mod, func, code + 1)\r | |
63 | self.assertRaises(ValueError, copy_reg.remove_extension,\r | |
64 | mod, func, code + 1)\r | |
65 | # Conflicting module name.\r | |
66 | self.assertRaises(ValueError, copy_reg.add_extension,\r | |
67 | mod[1:], func, code )\r | |
68 | self.assertRaises(ValueError, copy_reg.remove_extension,\r | |
69 | mod[1:], func, code )\r | |
70 | # Conflicting function name.\r | |
71 | self.assertRaises(ValueError, copy_reg.add_extension,\r | |
72 | mod, func[1:], code)\r | |
73 | self.assertRaises(ValueError, copy_reg.remove_extension,\r | |
74 | mod, func[1:], code)\r | |
75 | # Can't remove one that isn't registered at all.\r | |
76 | if code + 1 not in copy_reg._inverted_registry:\r | |
77 | self.assertRaises(ValueError, copy_reg.remove_extension,\r | |
78 | mod[1:], func[1:], code + 1)\r | |
79 | \r | |
80 | finally:\r | |
81 | e.restore()\r | |
82 | \r | |
83 | # Shouldn't be there anymore.\r | |
84 | self.assertNotIn((mod, func), copy_reg._extension_registry)\r | |
85 | # The code *may* be in copy_reg._extension_registry, though, if\r | |
86 | # we happened to pick on a registered code. So don't check for\r | |
87 | # that.\r | |
88 | \r | |
89 | # Check valid codes at the limits.\r | |
90 | for code in 1, 0x7fffffff:\r | |
91 | e = ExtensionSaver(code)\r | |
92 | try:\r | |
93 | copy_reg.add_extension(mod, func, code)\r | |
94 | copy_reg.remove_extension(mod, func, code)\r | |
95 | finally:\r | |
96 | e.restore()\r | |
97 | \r | |
98 | # Ensure invalid codes blow up.\r | |
99 | for code in -1, 0, 0x80000000L:\r | |
100 | self.assertRaises(ValueError, copy_reg.add_extension,\r | |
101 | mod, func, code)\r | |
102 | \r | |
103 | def test_slotnames(self):\r | |
104 | self.assertEqual(copy_reg._slotnames(WithoutSlots), [])\r | |
105 | self.assertEqual(copy_reg._slotnames(WithWeakref), [])\r | |
106 | expected = ['_WithPrivate__spam']\r | |
107 | self.assertEqual(copy_reg._slotnames(WithPrivate), expected)\r | |
108 | self.assertEqual(copy_reg._slotnames(WithSingleString), ['spam'])\r | |
109 | expected = ['eggs', 'spam']\r | |
110 | expected.sort()\r | |
111 | result = copy_reg._slotnames(WithInherited)\r | |
112 | result.sort()\r | |
113 | self.assertEqual(result, expected)\r | |
114 | \r | |
115 | \r | |
116 | def test_main():\r | |
117 | test_support.run_unittest(CopyRegTestCase)\r | |
118 | \r | |
119 | \r | |
120 | if __name__ == "__main__":\r | |
121 | test_main()\r |