test_eval.cpp revision 11986
111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com    tests/test_eval.cpp -- Usage of eval() and eval_file()
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.com    Copyright (c) 2016 Klemens D. Morgenstern
511986Sandreas.sandberg@arm.com
611986Sandreas.sandberg@arm.com    All rights reserved. Use of this source code is governed by a
711986Sandreas.sandberg@arm.com    BSD-style license that can be found in the LICENSE file.
811986Sandreas.sandberg@arm.com*/
911986Sandreas.sandberg@arm.com
1011986Sandreas.sandberg@arm.com
1111986Sandreas.sandberg@arm.com#include <pybind11/eval.h>
1211986Sandreas.sandberg@arm.com#include "pybind11_tests.h"
1311986Sandreas.sandberg@arm.com
1411986Sandreas.sandberg@arm.comtest_initializer eval([](py::module &m) {
1511986Sandreas.sandberg@arm.com    auto global = py::dict(py::module::import("__main__").attr("__dict__"));
1611986Sandreas.sandberg@arm.com
1711986Sandreas.sandberg@arm.com    m.def("test_eval_statements", [global]() {
1811986Sandreas.sandberg@arm.com        auto local = py::dict();
1911986Sandreas.sandberg@arm.com        local["call_test"] = py::cpp_function([&]() -> int {
2011986Sandreas.sandberg@arm.com            return 42;
2111986Sandreas.sandberg@arm.com        });
2211986Sandreas.sandberg@arm.com
2311986Sandreas.sandberg@arm.com        auto result = py::eval<py::eval_statements>(
2411986Sandreas.sandberg@arm.com            "print('Hello World!');\n"
2511986Sandreas.sandberg@arm.com            "x = call_test();",
2611986Sandreas.sandberg@arm.com            global, local
2711986Sandreas.sandberg@arm.com        );
2811986Sandreas.sandberg@arm.com        auto x = local["x"].cast<int>();
2911986Sandreas.sandberg@arm.com
3011986Sandreas.sandberg@arm.com        return result == py::none() && x == 42;
3111986Sandreas.sandberg@arm.com    });
3211986Sandreas.sandberg@arm.com
3311986Sandreas.sandberg@arm.com    m.def("test_eval", [global]() {
3411986Sandreas.sandberg@arm.com        auto local = py::dict();
3511986Sandreas.sandberg@arm.com        local["x"] = py::int_(42);
3611986Sandreas.sandberg@arm.com        auto x = py::eval("x", global, local);
3711986Sandreas.sandberg@arm.com        return x.cast<int>() == 42;
3811986Sandreas.sandberg@arm.com    });
3911986Sandreas.sandberg@arm.com
4011986Sandreas.sandberg@arm.com    m.def("test_eval_single_statement", []() {
4111986Sandreas.sandberg@arm.com        auto local = py::dict();
4211986Sandreas.sandberg@arm.com        local["call_test"] = py::cpp_function([&]() -> int {
4311986Sandreas.sandberg@arm.com            return 42;
4411986Sandreas.sandberg@arm.com        });
4511986Sandreas.sandberg@arm.com
4611986Sandreas.sandberg@arm.com        auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local);
4711986Sandreas.sandberg@arm.com        auto x = local["x"].cast<int>();
4811986Sandreas.sandberg@arm.com        return result == py::none() && x == 42;
4911986Sandreas.sandberg@arm.com    });
5011986Sandreas.sandberg@arm.com
5111986Sandreas.sandberg@arm.com    m.def("test_eval_file", [global](py::str filename) {
5211986Sandreas.sandberg@arm.com        auto local = py::dict();
5311986Sandreas.sandberg@arm.com        local["y"] = py::int_(43);
5411986Sandreas.sandberg@arm.com
5511986Sandreas.sandberg@arm.com        int val_out;
5611986Sandreas.sandberg@arm.com        local["call_test2"] = py::cpp_function([&](int value) { val_out = value; });
5711986Sandreas.sandberg@arm.com
5811986Sandreas.sandberg@arm.com        auto result = py::eval_file(filename, global, local);
5911986Sandreas.sandberg@arm.com        return val_out == 43 && result == py::none();
6011986Sandreas.sandberg@arm.com    });
6111986Sandreas.sandberg@arm.com
6211986Sandreas.sandberg@arm.com    m.def("test_eval_failure", []() {
6311986Sandreas.sandberg@arm.com        try {
6411986Sandreas.sandberg@arm.com            py::eval("nonsense code ...");
6511986Sandreas.sandberg@arm.com        } catch (py::error_already_set &) {
6611986Sandreas.sandberg@arm.com            return true;
6711986Sandreas.sandberg@arm.com        }
6811986Sandreas.sandberg@arm.com        return false;
6911986Sandreas.sandberg@arm.com    });
7011986Sandreas.sandberg@arm.com
7111986Sandreas.sandberg@arm.com    m.def("test_eval_file_failure", []() {
7211986Sandreas.sandberg@arm.com        try {
7311986Sandreas.sandberg@arm.com            py::eval_file("non-existing file");
7411986Sandreas.sandberg@arm.com        } catch (std::exception &) {
7511986Sandreas.sandberg@arm.com            return true;
7611986Sandreas.sandberg@arm.com        }
7711986Sandreas.sandberg@arm.com        return false;
7811986Sandreas.sandberg@arm.com    });
7911986Sandreas.sandberg@arm.com});
80