/Lib/test/test_copy_reg.py

http://unladen-swallow.googlecode.com/ · Python · 121 lines · 83 code · 24 blank · 14 comment · 8 complexity · 0838e0312ca54de750beefd6fca2fa2c MD5 · raw file

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