blob: 9aee70505de7acc21ee09623417d35812ae11463 [file] [log] [blame]
Henry Schreinerd8c7ee02020-07-20 13:35:21 -04001# -*- coding: utf-8 -*-
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002import pytest
Henry Schreiner4d9024e2020-08-16 16:02:12 -04003
4import env # noqa: F401
5
Jason Rhinelander391c7542017-07-25 16:47:36 -04006from pybind11_tests import pickling as m
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01007
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02008try:
9 import cPickle as pickle # Use cPickle on Python 2.7
10except ImportError:
11 import pickle
12
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020013
Dean Moldovan1e5a7da2017-08-24 01:53:15 +020014@pytest.mark.parametrize("cls_name", ["Pickleable", "PickleableNew"])
15def test_roundtrip(cls_name):
16 cls = getattr(m, cls_name)
17 p = cls("test_value")
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020018 p.setExtra1(15)
19 p.setExtra2(48)
20
21 data = pickle.dumps(p, 2) # Must use pickle protocol >= 2
22 p2 = pickle.loads(data)
23 assert p2.value() == p.value()
24 assert p2.extra1() == p.extra1()
25 assert p2.extra2() == p.extra2()
Dean Moldovan6fccf692016-10-11 01:12:48 +020026
27
Henry Schreiner4d9024e2020-08-16 16:02:12 -040028@pytest.mark.xfail("env.PYPY")
Dean Moldovan1e5a7da2017-08-24 01:53:15 +020029@pytest.mark.parametrize("cls_name", ["PickleableWithDict", "PickleableWithDictNew"])
30def test_roundtrip_with_dict(cls_name):
31 cls = getattr(m, cls_name)
32 p = cls("test_value")
Dean Moldovan6fccf692016-10-11 01:12:48 +020033 p.extra = 15
34 p.dynamic = "Attribute"
35
36 data = pickle.dumps(p, pickle.HIGHEST_PROTOCOL)
37 p2 = pickle.loads(data)
38 assert p2.value == p.value
39 assert p2.extra == p.extra
40 assert p2.dynamic == p.dynamic
Wenzel Jakobf4245182018-09-01 01:20:24 +020041
42
43def test_enum_pickle():
44 from pybind11_tests import enums as e
45 data = pickle.dumps(e.EOne, 2)
46 assert e.EOne == pickle.loads(data)