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
1412391Sjason@lowepower.comTEST_SUBMODULE(eval_, m) {
1512391Sjason@lowepower.com    // test_evals
1612391Sjason@lowepower.com
1711986Sandreas.sandberg@arm.com    auto global = py::dict(py::module::import("__main__").attr("__dict__"));
1811986Sandreas.sandberg@arm.com
1911986Sandreas.sandberg@arm.com    m.def("test_eval_statements", [global]() {
2011986Sandreas.sandberg@arm.com        auto local = py::dict();
2111986Sandreas.sandberg@arm.com        local["call_test"] = py::cpp_function([&]() -> int {
2211986Sandreas.sandberg@arm.com            return 42;
2311986Sandreas.sandberg@arm.com        });
2411986Sandreas.sandberg@arm.com
2512391Sjason@lowepower.com        // Regular string literal
2612391Sjason@lowepower.com        py::exec(
2712391Sjason@lowepower.com            "message = 'Hello World!'\n"
2812391Sjason@lowepower.com            "x = call_test()",
2911986Sandreas.sandberg@arm.com            global, local
3011986Sandreas.sandberg@arm.com        );
3112391Sjason@lowepower.com
3212391Sjason@lowepower.com        // Multi-line raw string literal
3312391Sjason@lowepower.com        py::exec(R"(
3412391Sjason@lowepower.com            if x == 42:
3512391Sjason@lowepower.com                print(message)
3612391Sjason@lowepower.com            else:
3712391Sjason@lowepower.com                raise RuntimeError
3812391Sjason@lowepower.com            )", global, local
3912391Sjason@lowepower.com        );
4011986Sandreas.sandberg@arm.com        auto x = local["x"].cast<int>();
4111986Sandreas.sandberg@arm.com
4212391Sjason@lowepower.com        return x == 42;
4311986Sandreas.sandberg@arm.com    });
4411986Sandreas.sandberg@arm.com
4511986Sandreas.sandberg@arm.com    m.def("test_eval", [global]() {
4611986Sandreas.sandberg@arm.com        auto local = py::dict();
4711986Sandreas.sandberg@arm.com        local["x"] = py::int_(42);
4811986Sandreas.sandberg@arm.com        auto x = py::eval("x", global, local);
4911986Sandreas.sandberg@arm.com        return x.cast<int>() == 42;
5011986Sandreas.sandberg@arm.com    });
5111986Sandreas.sandberg@arm.com
5211986Sandreas.sandberg@arm.com    m.def("test_eval_single_statement", []() {
5311986Sandreas.sandberg@arm.com        auto local = py::dict();
5411986Sandreas.sandberg@arm.com        local["call_test"] = py::cpp_function([&]() -> int {
5511986Sandreas.sandberg@arm.com            return 42;
5611986Sandreas.sandberg@arm.com        });
5711986Sandreas.sandberg@arm.com
5811986Sandreas.sandberg@arm.com        auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local);
5911986Sandreas.sandberg@arm.com        auto x = local["x"].cast<int>();
6012391Sjason@lowepower.com        return result.is_none() && x == 42;
6111986Sandreas.sandberg@arm.com    });
6211986Sandreas.sandberg@arm.com
6311986Sandreas.sandberg@arm.com    m.def("test_eval_file", [global](py::str filename) {
6411986Sandreas.sandberg@arm.com        auto local = py::dict();
6511986Sandreas.sandberg@arm.com        local["y"] = py::int_(43);
6611986Sandreas.sandberg@arm.com
6711986Sandreas.sandberg@arm.com        int val_out;
6811986Sandreas.sandberg@arm.com        local["call_test2"] = py::cpp_function([&](int value) { val_out = value; });
6911986Sandreas.sandberg@arm.com
7011986Sandreas.sandberg@arm.com        auto result = py::eval_file(filename, global, local);
7112391Sjason@lowepower.com        return val_out == 43 && result.is_none();
7211986Sandreas.sandberg@arm.com    });
7311986Sandreas.sandberg@arm.com
7411986Sandreas.sandberg@arm.com    m.def("test_eval_failure", []() {
7511986Sandreas.sandberg@arm.com        try {
7611986Sandreas.sandberg@arm.com            py::eval("nonsense code ...");
7711986Sandreas.sandberg@arm.com        } catch (py::error_already_set &) {
7811986Sandreas.sandberg@arm.com            return true;
7911986Sandreas.sandberg@arm.com        }
8011986Sandreas.sandberg@arm.com        return false;
8111986Sandreas.sandberg@arm.com    });
8211986Sandreas.sandberg@arm.com
8311986Sandreas.sandberg@arm.com    m.def("test_eval_file_failure", []() {
8411986Sandreas.sandberg@arm.com        try {
8511986Sandreas.sandberg@arm.com            py::eval_file("non-existing file");
8611986Sandreas.sandberg@arm.com        } catch (std::exception &) {
8711986Sandreas.sandberg@arm.com            return true;
8811986Sandreas.sandberg@arm.com        }
8911986Sandreas.sandberg@arm.com        return false;
9011986Sandreas.sandberg@arm.com    });
9112391Sjason@lowepower.com}
92