blob: 5ae05aaa0caec9fac0d9098729ebf5a1537a7dc6 [file] [log] [blame]
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001import pytest
Jason Rhinelander391c7542017-07-25 16:47:36 -04002from pybind11_tests import pickling as m
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01003
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02004try:
5 import cPickle as pickle # Use cPickle on Python 2.7
6except ImportError:
7 import pickle
8
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02009
Dean Moldovan1e5a7da2017-08-24 01:53:15 +020010@pytest.mark.parametrize("cls_name", ["Pickleable", "PickleableNew"])
11def test_roundtrip(cls_name):
12 cls = getattr(m, cls_name)
13 p = cls("test_value")
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020014 p.setExtra1(15)
15 p.setExtra2(48)
16
17 data = pickle.dumps(p, 2) # Must use pickle protocol >= 2
18 p2 = pickle.loads(data)
19 assert p2.value() == p.value()
20 assert p2.extra1() == p.extra1()
21 assert p2.extra2() == p.extra2()
Dean Moldovan6fccf692016-10-11 01:12:48 +020022
23
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +010024@pytest.unsupported_on_pypy
Dean Moldovan1e5a7da2017-08-24 01:53:15 +020025@pytest.mark.parametrize("cls_name", ["PickleableWithDict", "PickleableWithDictNew"])
26def test_roundtrip_with_dict(cls_name):
27 cls = getattr(m, cls_name)
28 p = cls("test_value")
Dean Moldovan6fccf692016-10-11 01:12:48 +020029 p.extra = 15
30 p.dynamic = "Attribute"
31
32 data = pickle.dumps(p, pickle.HIGHEST_PROTOCOL)
33 p2 = pickle.loads(data)
34 assert p2.value == p.value
35 assert p2.extra == p.extra
36 assert p2.dynamic == p.dynamic
Wenzel Jakobf4245182018-09-01 01:20:24 +020037
38
39def test_enum_pickle():
40 from pybind11_tests import enums as e
41 data = pickle.dumps(e.EOne, 2)
42 assert e.EOne == pickle.loads(data)