From bbe45082f4e40159eba3e066c66ce415152c677c Mon Sep 17 00:00:00 2001 From: Ben North Date: Thu, 20 Oct 2016 21:19:30 +0100 Subject: [PATCH] Test uncopyable static member Without the previous commit, this test generates a core dump. --- tests/CMakeLists.txt | 1 + tests/test_copy_move_policies.cpp | 41 +++++++++++++++++++++++++++++++ tests/test_copy_move_policies.py | 17 +++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 tests/test_copy_move_policies.cpp create mode 100644 tests/test_copy_move_policies.py diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 684535a40..7470c5d93 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,6 +12,7 @@ set(PYBIND11_TEST_FILES test_chrono.cpp test_class_args.cpp test_constants_and_functions.cpp + test_copy_move_policies.cpp test_eigen.cpp test_enum.cpp test_eval.cpp diff --git a/tests/test_copy_move_policies.cpp b/tests/test_copy_move_policies.cpp new file mode 100644 index 000000000..de1c6e647 --- /dev/null +++ b/tests/test_copy_move_policies.cpp @@ -0,0 +1,41 @@ +/* + tests/test_copy_move_policies.cpp -- 'copy' and 'move' + return value policies + + Copyright (c) 2016 Ben North + + All rights reserved. Use of this source code is governed by a + BSD-style license that can be found in the LICENSE file. +*/ + +#include "pybind11_tests.h" + +template +struct empty { + static const derived& get_one() { return instance_; } + static derived instance_; +}; + +struct lacking_copy_ctor : public empty { + lacking_copy_ctor() {} + lacking_copy_ctor(const lacking_copy_ctor& other) = delete; +}; + +template <> lacking_copy_ctor empty::instance_ {}; + +struct lacking_move_ctor : public empty { + lacking_move_ctor() {} + lacking_move_ctor(const lacking_move_ctor& other) = delete; + lacking_move_ctor(lacking_move_ctor&& other) = delete; +}; + +template <> lacking_move_ctor empty::instance_ {}; + +test_initializer copy_move_policies([](py::module &m) { + py::class_(m, "lacking_copy_ctor") + .def_static("get_one", &lacking_copy_ctor::get_one, + py::return_value_policy::copy); + py::class_(m, "lacking_move_ctor") + .def_static("get_one", &lacking_move_ctor::get_one, + py::return_value_policy::move); +}); diff --git a/tests/test_copy_move_policies.py b/tests/test_copy_move_policies.py new file mode 100644 index 000000000..07f09f693 --- /dev/null +++ b/tests/test_copy_move_policies.py @@ -0,0 +1,17 @@ +import pytest + + +def test_lacking_copy_ctor(): + from pybind11_tests import lacking_copy_ctor + with pytest.raises(RuntimeError) as excinfo: + lacking_copy_ctor.get_one() + assert "the object is non-copyable!" in str(excinfo.value) + + +def test_lacking_move_ctor(): + from pybind11_tests import lacking_move_ctor + with pytest.raises(RuntimeError) as excinfo: + lacking_move_ctor.get_one() + assert "the object is neither movable nor copyable!" in str(excinfo.value) + +