Henry Schreiner | d8c7ee0 | 2020-07-20 13:35:21 -0400 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
Wenzel Jakob | 1d1f81b | 2016-12-16 15:00:46 +0100 | [diff] [blame] | 2 | import pytest |
Henry Schreiner | 4d9024e | 2020-08-16 16:02:12 -0400 | [diff] [blame] | 3 | |
| 4 | import env # noqa: F401 |
| 5 | |
Jason Rhinelander | 391c754 | 2017-07-25 16:47:36 -0400 | [diff] [blame] | 6 | from pybind11_tests import pickling as m |
Wenzel Jakob | 1d1f81b | 2016-12-16 15:00:46 +0100 | [diff] [blame] | 7 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 8 | try: |
| 9 | import cPickle as pickle # Use cPickle on Python 2.7 |
| 10 | except ImportError: |
| 11 | import pickle |
| 12 | |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 13 | |
Dean Moldovan | 1e5a7da | 2017-08-24 01:53:15 +0200 | [diff] [blame] | 14 | @pytest.mark.parametrize("cls_name", ["Pickleable", "PickleableNew"]) |
| 15 | def test_roundtrip(cls_name): |
| 16 | cls = getattr(m, cls_name) |
| 17 | p = cls("test_value") |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 18 | 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 Moldovan | 6fccf69 | 2016-10-11 01:12:48 +0200 | [diff] [blame] | 26 | |
| 27 | |
Henry Schreiner | 4d9024e | 2020-08-16 16:02:12 -0400 | [diff] [blame] | 28 | @pytest.mark.xfail("env.PYPY") |
Dean Moldovan | 1e5a7da | 2017-08-24 01:53:15 +0200 | [diff] [blame] | 29 | @pytest.mark.parametrize("cls_name", ["PickleableWithDict", "PickleableWithDictNew"]) |
| 30 | def test_roundtrip_with_dict(cls_name): |
| 31 | cls = getattr(m, cls_name) |
| 32 | p = cls("test_value") |
Dean Moldovan | 6fccf69 | 2016-10-11 01:12:48 +0200 | [diff] [blame] | 33 | 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 Jakob | f424518 | 2018-09-01 01:20:24 +0200 | [diff] [blame] | 41 | |
| 42 | |
| 43 | def 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) |