17db96d56Sopenharmony_ciimport pickle
27db96d56Sopenharmony_ciimport pickletools
37db96d56Sopenharmony_cifrom test import support
47db96d56Sopenharmony_cifrom test.pickletester import AbstractPickleTests
57db96d56Sopenharmony_ciimport doctest
67db96d56Sopenharmony_ciimport unittest
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ciclass OptimizedPickleTests(AbstractPickleTests, unittest.TestCase):
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci    def dumps(self, arg, proto=None, **kwargs):
117db96d56Sopenharmony_ci        return pickletools.optimize(pickle.dumps(arg, proto, **kwargs))
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci    def loads(self, buf, **kwds):
147db96d56Sopenharmony_ci        return pickle.loads(buf, **kwds)
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci    # Test relies on precise output of dumps()
177db96d56Sopenharmony_ci    test_pickle_to_2x = None
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci    # Test relies on writing by chunks into a file object.
207db96d56Sopenharmony_ci    test_framed_write_sizes_with_delayed_writer = None
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    def test_optimize_long_binget(self):
237db96d56Sopenharmony_ci        data = [str(i) for i in range(257)]
247db96d56Sopenharmony_ci        data.append(data[-1])
257db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
267db96d56Sopenharmony_ci            pickled = pickle.dumps(data, proto)
277db96d56Sopenharmony_ci            unpickled = pickle.loads(pickled)
287db96d56Sopenharmony_ci            self.assertEqual(unpickled, data)
297db96d56Sopenharmony_ci            self.assertIs(unpickled[-1], unpickled[-2])
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci            pickled2 = pickletools.optimize(pickled)
327db96d56Sopenharmony_ci            unpickled2 = pickle.loads(pickled2)
337db96d56Sopenharmony_ci            self.assertEqual(unpickled2, data)
347db96d56Sopenharmony_ci            self.assertIs(unpickled2[-1], unpickled2[-2])
357db96d56Sopenharmony_ci            self.assertNotIn(pickle.LONG_BINGET, pickled2)
367db96d56Sopenharmony_ci            self.assertNotIn(pickle.LONG_BINPUT, pickled2)
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci    def test_optimize_binput_and_memoize(self):
397db96d56Sopenharmony_ci        pickled = (b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00'
407db96d56Sopenharmony_ci                   b']\x94(\x8c\x04spamq\x01\x8c\x03ham\x94h\x02e.')
417db96d56Sopenharmony_ci        #    0: \x80 PROTO      4
427db96d56Sopenharmony_ci        #    2: \x95 FRAME      21
437db96d56Sopenharmony_ci        #   11: ]    EMPTY_LIST
447db96d56Sopenharmony_ci        #   12: \x94 MEMOIZE
457db96d56Sopenharmony_ci        #   13: (    MARK
467db96d56Sopenharmony_ci        #   14: \x8c     SHORT_BINUNICODE 'spam'
477db96d56Sopenharmony_ci        #   20: q        BINPUT     1
487db96d56Sopenharmony_ci        #   22: \x8c     SHORT_BINUNICODE 'ham'
497db96d56Sopenharmony_ci        #   27: \x94     MEMOIZE
507db96d56Sopenharmony_ci        #   28: h        BINGET     2
517db96d56Sopenharmony_ci        #   30: e        APPENDS    (MARK at 13)
527db96d56Sopenharmony_ci        #   31: .    STOP
537db96d56Sopenharmony_ci        self.assertIn(pickle.BINPUT, pickled)
547db96d56Sopenharmony_ci        unpickled = pickle.loads(pickled)
557db96d56Sopenharmony_ci        self.assertEqual(unpickled, ['spam', 'ham', 'ham'])
567db96d56Sopenharmony_ci        self.assertIs(unpickled[1], unpickled[2])
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci        pickled2 = pickletools.optimize(pickled)
597db96d56Sopenharmony_ci        unpickled2 = pickle.loads(pickled2)
607db96d56Sopenharmony_ci        self.assertEqual(unpickled2, ['spam', 'ham', 'ham'])
617db96d56Sopenharmony_ci        self.assertIs(unpickled2[1], unpickled2[2])
627db96d56Sopenharmony_ci        self.assertNotIn(pickle.BINPUT, pickled2)
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ciclass MiscTestCase(unittest.TestCase):
667db96d56Sopenharmony_ci    def test__all__(self):
677db96d56Sopenharmony_ci        not_exported = {
687db96d56Sopenharmony_ci            'bytes_types',
697db96d56Sopenharmony_ci            'UP_TO_NEWLINE', 'TAKEN_FROM_ARGUMENT1',
707db96d56Sopenharmony_ci            'TAKEN_FROM_ARGUMENT4', 'TAKEN_FROM_ARGUMENT4U',
717db96d56Sopenharmony_ci            'TAKEN_FROM_ARGUMENT8U', 'ArgumentDescriptor',
727db96d56Sopenharmony_ci            'read_uint1', 'read_uint2', 'read_int4', 'read_uint4',
737db96d56Sopenharmony_ci            'read_uint8', 'read_stringnl', 'read_stringnl_noescape',
747db96d56Sopenharmony_ci            'read_stringnl_noescape_pair', 'read_string1',
757db96d56Sopenharmony_ci            'read_string4', 'read_bytes1', 'read_bytes4',
767db96d56Sopenharmony_ci            'read_bytes8', 'read_bytearray8', 'read_unicodestringnl',
777db96d56Sopenharmony_ci            'read_unicodestring1', 'read_unicodestring4',
787db96d56Sopenharmony_ci            'read_unicodestring8', 'read_decimalnl_short',
797db96d56Sopenharmony_ci            'read_decimalnl_long', 'read_floatnl', 'read_float8',
807db96d56Sopenharmony_ci            'read_long1', 'read_long4',
817db96d56Sopenharmony_ci            'uint1', 'uint2', 'int4', 'uint4', 'uint8', 'stringnl',
827db96d56Sopenharmony_ci            'stringnl_noescape', 'stringnl_noescape_pair', 'string1',
837db96d56Sopenharmony_ci            'string4', 'bytes1', 'bytes4', 'bytes8', 'bytearray8',
847db96d56Sopenharmony_ci            'unicodestringnl', 'unicodestring1', 'unicodestring4',
857db96d56Sopenharmony_ci            'unicodestring8', 'decimalnl_short', 'decimalnl_long',
867db96d56Sopenharmony_ci            'floatnl', 'float8', 'long1', 'long4',
877db96d56Sopenharmony_ci            'StackObject',
887db96d56Sopenharmony_ci            'pyint', 'pylong', 'pyinteger_or_bool', 'pybool', 'pyfloat',
897db96d56Sopenharmony_ci            'pybytes_or_str', 'pystring', 'pybytes', 'pybytearray',
907db96d56Sopenharmony_ci            'pyunicode', 'pynone', 'pytuple', 'pylist', 'pydict',
917db96d56Sopenharmony_ci            'pyset', 'pyfrozenset', 'pybuffer', 'anyobject',
927db96d56Sopenharmony_ci            'markobject', 'stackslice', 'OpcodeInfo', 'opcodes',
937db96d56Sopenharmony_ci            'code2op',
947db96d56Sopenharmony_ci        }
957db96d56Sopenharmony_ci        support.check__all__(self, pickletools, not_exported=not_exported)
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_cidef load_tests(loader, tests, pattern):
997db96d56Sopenharmony_ci    tests.addTest(doctest.DocTestSuite(pickletools))
1007db96d56Sopenharmony_ci    return tests
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ciif __name__ == "__main__":
1047db96d56Sopenharmony_ci    unittest.main()
105