Blame external/pybind11/tests/test_eval.cpp

Packit 534379
/*
Packit 534379
    tests/test_eval.cpp -- Usage of eval() and eval_file()
Packit 534379
Packit 534379
    Copyright (c) 2016 Klemens D. Morgenstern
Packit 534379
Packit 534379
    All rights reserved. Use of this source code is governed by a
Packit 534379
    BSD-style license that can be found in the LICENSE file.
Packit 534379
*/
Packit 534379
Packit 534379
Packit 534379
#include <pybind11/eval.h>
Packit 534379
#include "pybind11_tests.h"
Packit 534379
Packit 534379
TEST_SUBMODULE(eval_, m) {
Packit 534379
    // test_evals
Packit 534379
Packit 534379
    auto global = py::dict(py::module::import("__main__").attr("__dict__"));
Packit 534379
Packit 534379
    m.def("test_eval_statements", [global]() {
Packit 534379
        auto local = py::dict();
Packit 534379
        local["call_test"] = py::cpp_function([&]() -> int {
Packit 534379
            return 42;
Packit 534379
        });
Packit 534379
Packit 534379
        // Regular string literal
Packit 534379
        py::exec(
Packit 534379
            "message = 'Hello World!'\n"
Packit 534379
            "x = call_test()",
Packit 534379
            global, local
Packit 534379
        );
Packit 534379
Packit 534379
        // Multi-line raw string literal
Packit 534379
        py::exec(R"(
Packit 534379
            if x == 42:
Packit 534379
                print(message)
Packit 534379
            else:
Packit 534379
                raise RuntimeError
Packit 534379
            )", global, local
Packit 534379
        );
Packit 534379
        auto x = local["x"].cast<int>();
Packit 534379
Packit 534379
        return x == 42;
Packit 534379
    });
Packit 534379
Packit 534379
    m.def("test_eval", [global]() {
Packit 534379
        auto local = py::dict();
Packit 534379
        local["x"] = py::int_(42);
Packit 534379
        auto x = py::eval("x", global, local);
Packit 534379
        return x.cast<int>() == 42;
Packit 534379
    });
Packit 534379
Packit 534379
    m.def("test_eval_single_statement", []() {
Packit 534379
        auto local = py::dict();
Packit 534379
        local["call_test"] = py::cpp_function([&]() -> int {
Packit 534379
            return 42;
Packit 534379
        });
Packit 534379
Packit 534379
        auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local);
Packit 534379
        auto x = local["x"].cast<int>();
Packit 534379
        return result.is_none() && x == 42;
Packit 534379
    });
Packit 534379
Packit 534379
    m.def("test_eval_file", [global](py::str filename) {
Packit 534379
        auto local = py::dict();
Packit 534379
        local["y"] = py::int_(43);
Packit 534379
Packit 534379
        int val_out;
Packit 534379
        local["call_test2"] = py::cpp_function([&](int value) { val_out = value; });
Packit 534379
Packit 534379
        auto result = py::eval_file(filename, global, local);
Packit 534379
        return val_out == 43 && result.is_none();
Packit 534379
    });
Packit 534379
Packit 534379
    m.def("test_eval_failure", []() {
Packit 534379
        try {
Packit 534379
            py::eval("nonsense code ...");
Packit 534379
        } catch (py::error_already_set &) {
Packit 534379
            return true;
Packit 534379
        }
Packit 534379
        return false;
Packit 534379
    });
Packit 534379
Packit 534379
    m.def("test_eval_file_failure", []() {
Packit 534379
        try {
Packit 534379
            py::eval_file("non-existing file");
Packit 534379
        } catch (std::exception &) {
Packit 534379
            return true;
Packit 534379
        }
Packit 534379
        return false;
Packit 534379
    });
Packit 534379
}