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