111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com    tests/test_modules.cpp -- nested modules, importing modules, and
311986Sandreas.sandberg@arm.com                            internal references
411986Sandreas.sandberg@arm.com
511986Sandreas.sandberg@arm.com    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
611986Sandreas.sandberg@arm.com
711986Sandreas.sandberg@arm.com    All rights reserved. Use of this source code is governed by a
811986Sandreas.sandberg@arm.com    BSD-style license that can be found in the LICENSE file.
911986Sandreas.sandberg@arm.com*/
1011986Sandreas.sandberg@arm.com
1111986Sandreas.sandberg@arm.com#include "pybind11_tests.h"
1211986Sandreas.sandberg@arm.com#include "constructor_stats.h"
1311986Sandreas.sandberg@arm.com
1412391Sjason@lowepower.comTEST_SUBMODULE(modules, m) {
1512391Sjason@lowepower.com    // test_nested_modules
1612391Sjason@lowepower.com    py::module m_sub = m.def_submodule("subsubmodule");
1712391Sjason@lowepower.com    m_sub.def("submodule_func", []() { return "submodule_func()"; });
1811986Sandreas.sandberg@arm.com
1912391Sjason@lowepower.com    // test_reference_internal
2012391Sjason@lowepower.com    class A {
2112391Sjason@lowepower.com    public:
2212391Sjason@lowepower.com        A(int v) : v(v) { print_created(this, v); }
2312391Sjason@lowepower.com        ~A() { print_destroyed(this); }
2412391Sjason@lowepower.com        A(const A&) { print_copy_created(this); }
2512391Sjason@lowepower.com        A& operator=(const A &copy) { print_copy_assigned(this); v = copy.v; return *this; }
2612391Sjason@lowepower.com        std::string toString() { return "A[" + std::to_string(v) + "]"; }
2712391Sjason@lowepower.com    private:
2812391Sjason@lowepower.com        int v;
2912391Sjason@lowepower.com    };
3011986Sandreas.sandberg@arm.com    py::class_<A>(m_sub, "A")
3111986Sandreas.sandberg@arm.com        .def(py::init<int>())
3211986Sandreas.sandberg@arm.com        .def("__repr__", &A::toString);
3311986Sandreas.sandberg@arm.com
3412391Sjason@lowepower.com    class B {
3512391Sjason@lowepower.com    public:
3612391Sjason@lowepower.com        B() { print_default_created(this); }
3712391Sjason@lowepower.com        ~B() { print_destroyed(this); }
3812391Sjason@lowepower.com        B(const B&) { print_copy_created(this); }
3912391Sjason@lowepower.com        B& operator=(const B &copy) { print_copy_assigned(this); a1 = copy.a1; a2 = copy.a2; return *this; }
4012391Sjason@lowepower.com        A &get_a1() { return a1; }
4112391Sjason@lowepower.com        A &get_a2() { return a2; }
4212391Sjason@lowepower.com
4312391Sjason@lowepower.com        A a1{1};
4412391Sjason@lowepower.com        A a2{2};
4512391Sjason@lowepower.com    };
4611986Sandreas.sandberg@arm.com    py::class_<B>(m_sub, "B")
4711986Sandreas.sandberg@arm.com        .def(py::init<>())
4811986Sandreas.sandberg@arm.com        .def("get_a1", &B::get_a1, "Return the internal A 1", py::return_value_policy::reference_internal)
4911986Sandreas.sandberg@arm.com        .def("get_a2", &B::get_a2, "Return the internal A 2", py::return_value_policy::reference_internal)
5011986Sandreas.sandberg@arm.com        .def_readwrite("a1", &B::a1)  // def_readonly uses an internal reference return policy by default
5111986Sandreas.sandberg@arm.com        .def_readwrite("a2", &B::a2);
5211986Sandreas.sandberg@arm.com
5311986Sandreas.sandberg@arm.com    m.attr("OD") = py::module::import("collections").attr("OrderedDict");
5412391Sjason@lowepower.com
5512391Sjason@lowepower.com    // test_duplicate_registration
5612391Sjason@lowepower.com    // Registering two things with the same name
5712391Sjason@lowepower.com    m.def("duplicate_registration", []() {
5812391Sjason@lowepower.com        class Dupe1 { };
5912391Sjason@lowepower.com        class Dupe2 { };
6012391Sjason@lowepower.com        class Dupe3 { };
6112391Sjason@lowepower.com        class DupeException { };
6212391Sjason@lowepower.com
6312391Sjason@lowepower.com        auto dm = py::module("dummy");
6412391Sjason@lowepower.com        auto failures = py::list();
6512391Sjason@lowepower.com
6612391Sjason@lowepower.com        py::class_<Dupe1>(dm, "Dupe1");
6712391Sjason@lowepower.com        py::class_<Dupe2>(dm, "Dupe2");
6812391Sjason@lowepower.com        dm.def("dupe1_factory", []() { return Dupe1(); });
6912391Sjason@lowepower.com        py::exception<DupeException>(dm, "DupeException");
7012391Sjason@lowepower.com
7112391Sjason@lowepower.com        try {
7212391Sjason@lowepower.com            py::class_<Dupe1>(dm, "Dupe1");
7312391Sjason@lowepower.com            failures.append("Dupe1 class");
7412391Sjason@lowepower.com        } catch (std::runtime_error &) {}
7512391Sjason@lowepower.com        try {
7612391Sjason@lowepower.com            dm.def("Dupe1", []() { return Dupe1(); });
7712391Sjason@lowepower.com            failures.append("Dupe1 function");
7812391Sjason@lowepower.com        } catch (std::runtime_error &) {}
7912391Sjason@lowepower.com        try {
8012391Sjason@lowepower.com            py::class_<Dupe3>(dm, "dupe1_factory");
8112391Sjason@lowepower.com            failures.append("dupe1_factory");
8212391Sjason@lowepower.com        } catch (std::runtime_error &) {}
8312391Sjason@lowepower.com        try {
8412391Sjason@lowepower.com            py::exception<Dupe3>(dm, "Dupe2");
8512391Sjason@lowepower.com            failures.append("Dupe2");
8612391Sjason@lowepower.com        } catch (std::runtime_error &) {}
8712391Sjason@lowepower.com        try {
8812391Sjason@lowepower.com            dm.def("DupeException", []() { return 30; });
8912391Sjason@lowepower.com            failures.append("DupeException1");
9012391Sjason@lowepower.com        } catch (std::runtime_error &) {}
9112391Sjason@lowepower.com        try {
9212391Sjason@lowepower.com            py::class_<DupeException>(dm, "DupeException");
9312391Sjason@lowepower.com            failures.append("DupeException2");
9412391Sjason@lowepower.com        } catch (std::runtime_error &) {}
9512391Sjason@lowepower.com
9612391Sjason@lowepower.com        return failures;
9712391Sjason@lowepower.com    });
9812391Sjason@lowepower.com}
99