blob: 58d67a6339ae3830234fdec72adecff9b1ea0a32 [file] [log] [blame]
Henry Schreinerd8c7ee02020-07-20 13:35:21 -04001# -*- coding: utf-8 -*-
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002import pytest
Jason Rhinelander391c7542017-07-25 16:47:36 -04003from pybind11_tests import pickling as m
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01004
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02005try:
6 import cPickle as pickle # Use cPickle on Python 2.7
7except ImportError:
8 import pickle
9
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020010
Dean Moldovan1e5a7da2017-08-24 01:53:15 +020011@pytest.mark.parametrize("cls_name", ["Pickleable", "PickleableNew"])
12def test_roundtrip(cls_name):
13 cls = getattr(m, cls_name)
14 p = cls("test_value")
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020015 p.setExtra1(15)
16 p.setExtra2(48)
17
18 data = pickle.dumps(p, 2) # Must use pickle protocol >= 2
19 p2 = pickle.loads(data)
20 assert p2.value() == p.value()
21 assert p2.extra1() == p.extra1()
22 assert p2.extra2() == p.extra2()
Dean Moldovan6fccf692016-10-11 01:12:48 +020023
24
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +010025@pytest.unsupported_on_pypy
Dean Moldovan1e5a7da2017-08-24 01:53:15 +020026@pytest.mark.parametrize("cls_name", ["PickleableWithDict", "PickleableWithDictNew"])
27def test_roundtrip_with_dict(cls_name):
28 cls = getattr(m, cls_name)
29 p = cls("test_value")
Dean Moldovan6fccf692016-10-11 01:12:48 +020030 p.extra = 15
31 p.dynamic = "Attribute"
32
33 data = pickle.dumps(p, pickle.HIGHEST_PROTOCOL)
34 p2 = pickle.loads(data)
35 assert p2.value == p.value
36 assert p2.extra == p.extra
37 assert p2.dynamic == p.dynamic
Wenzel Jakobf4245182018-09-01 01:20:24 +020038
39
40def test_enum_pickle():
41 from pybind11_tests import enums as e
42 data = pickle.dumps(e.EOne, 2)
43 assert e.EOne == pickle.loads(data)