17db96d56Sopenharmony_ciimport copyreg 27db96d56Sopenharmony_ciimport unittest 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_cifrom test.pickletester import ExtensionSaver 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ciclass C: 77db96d56Sopenharmony_ci pass 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciclass WithoutSlots(object): 117db96d56Sopenharmony_ci pass 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciclass WithWeakref(object): 147db96d56Sopenharmony_ci __slots__ = ('__weakref__',) 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ciclass WithPrivate(object): 177db96d56Sopenharmony_ci __slots__ = ('__spam',) 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ciclass _WithLeadingUnderscoreAndPrivate(object): 207db96d56Sopenharmony_ci __slots__ = ('__spam',) 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciclass ___(object): 237db96d56Sopenharmony_ci __slots__ = ('__spam',) 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ciclass WithSingleString(object): 267db96d56Sopenharmony_ci __slots__ = 'spam' 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ciclass WithInherited(WithSingleString): 297db96d56Sopenharmony_ci __slots__ = ('eggs',) 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ciclass CopyRegTestCase(unittest.TestCase): 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci def test_class(self): 357db96d56Sopenharmony_ci self.assertRaises(TypeError, copyreg.pickle, 367db96d56Sopenharmony_ci C, None, None) 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci def test_noncallable_reduce(self): 397db96d56Sopenharmony_ci self.assertRaises(TypeError, copyreg.pickle, 407db96d56Sopenharmony_ci type(1), "not a callable") 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci def test_noncallable_constructor(self): 437db96d56Sopenharmony_ci self.assertRaises(TypeError, copyreg.pickle, 447db96d56Sopenharmony_ci type(1), int, "not a callable") 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci def test_bool(self): 477db96d56Sopenharmony_ci import copy 487db96d56Sopenharmony_ci self.assertEqual(True, copy.copy(True)) 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci def test_extension_registry(self): 517db96d56Sopenharmony_ci mod, func, code = 'junk1 ', ' junk2', 0xabcd 527db96d56Sopenharmony_ci e = ExtensionSaver(code) 537db96d56Sopenharmony_ci try: 547db96d56Sopenharmony_ci # Shouldn't be in registry now. 557db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.remove_extension, 567db96d56Sopenharmony_ci mod, func, code) 577db96d56Sopenharmony_ci copyreg.add_extension(mod, func, code) 587db96d56Sopenharmony_ci # Should be in the registry. 597db96d56Sopenharmony_ci self.assertTrue(copyreg._extension_registry[mod, func] == code) 607db96d56Sopenharmony_ci self.assertTrue(copyreg._inverted_registry[code] == (mod, func)) 617db96d56Sopenharmony_ci # Shouldn't be in the cache. 627db96d56Sopenharmony_ci self.assertNotIn(code, copyreg._extension_cache) 637db96d56Sopenharmony_ci # Redundant registration should be OK. 647db96d56Sopenharmony_ci copyreg.add_extension(mod, func, code) # shouldn't blow up 657db96d56Sopenharmony_ci # Conflicting code. 667db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.add_extension, 677db96d56Sopenharmony_ci mod, func, code + 1) 687db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.remove_extension, 697db96d56Sopenharmony_ci mod, func, code + 1) 707db96d56Sopenharmony_ci # Conflicting module name. 717db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.add_extension, 727db96d56Sopenharmony_ci mod[1:], func, code ) 737db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.remove_extension, 747db96d56Sopenharmony_ci mod[1:], func, code ) 757db96d56Sopenharmony_ci # Conflicting function name. 767db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.add_extension, 777db96d56Sopenharmony_ci mod, func[1:], code) 787db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.remove_extension, 797db96d56Sopenharmony_ci mod, func[1:], code) 807db96d56Sopenharmony_ci # Can't remove one that isn't registered at all. 817db96d56Sopenharmony_ci if code + 1 not in copyreg._inverted_registry: 827db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.remove_extension, 837db96d56Sopenharmony_ci mod[1:], func[1:], code + 1) 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci finally: 867db96d56Sopenharmony_ci e.restore() 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci # Shouldn't be there anymore. 897db96d56Sopenharmony_ci self.assertNotIn((mod, func), copyreg._extension_registry) 907db96d56Sopenharmony_ci # The code *may* be in copyreg._extension_registry, though, if 917db96d56Sopenharmony_ci # we happened to pick on a registered code. So don't check for 927db96d56Sopenharmony_ci # that. 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci # Check valid codes at the limits. 957db96d56Sopenharmony_ci for code in 1, 0x7fffffff: 967db96d56Sopenharmony_ci e = ExtensionSaver(code) 977db96d56Sopenharmony_ci try: 987db96d56Sopenharmony_ci copyreg.add_extension(mod, func, code) 997db96d56Sopenharmony_ci copyreg.remove_extension(mod, func, code) 1007db96d56Sopenharmony_ci finally: 1017db96d56Sopenharmony_ci e.restore() 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci # Ensure invalid codes blow up. 1047db96d56Sopenharmony_ci for code in -1, 0, 0x80000000: 1057db96d56Sopenharmony_ci self.assertRaises(ValueError, copyreg.add_extension, 1067db96d56Sopenharmony_ci mod, func, code) 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci def test_slotnames(self): 1097db96d56Sopenharmony_ci self.assertEqual(copyreg._slotnames(WithoutSlots), []) 1107db96d56Sopenharmony_ci self.assertEqual(copyreg._slotnames(WithWeakref), []) 1117db96d56Sopenharmony_ci expected = ['_WithPrivate__spam'] 1127db96d56Sopenharmony_ci self.assertEqual(copyreg._slotnames(WithPrivate), expected) 1137db96d56Sopenharmony_ci expected = ['_WithLeadingUnderscoreAndPrivate__spam'] 1147db96d56Sopenharmony_ci self.assertEqual(copyreg._slotnames(_WithLeadingUnderscoreAndPrivate), 1157db96d56Sopenharmony_ci expected) 1167db96d56Sopenharmony_ci self.assertEqual(copyreg._slotnames(___), ['__spam']) 1177db96d56Sopenharmony_ci self.assertEqual(copyreg._slotnames(WithSingleString), ['spam']) 1187db96d56Sopenharmony_ci expected = ['eggs', 'spam'] 1197db96d56Sopenharmony_ci expected.sort() 1207db96d56Sopenharmony_ci result = copyreg._slotnames(WithInherited) 1217db96d56Sopenharmony_ci result.sort() 1227db96d56Sopenharmony_ci self.assertEqual(result, expected) 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ciif __name__ == "__main__": 1267db96d56Sopenharmony_ci unittest.main() 127