test_eval.cpp 2.49 KB
Newer Older
Klemens Morgenstern's avatar
Klemens Morgenstern committed
1
/*
Dean Moldovan's avatar
Dean Moldovan committed
2
    tests/test_eval.cpp -- Usage of eval() and eval_file()
Klemens Morgenstern's avatar
Klemens Morgenstern committed
3
4
5
6
7
8
9
10

    Copyright (c) 2016 Klemens D. Morgenstern

    All rights reserved. Use of this source code is governed by a
    BSD-style license that can be found in the LICENSE file.
*/


11
#include <pybind11/eval.h>
Dean Moldovan's avatar
Dean Moldovan committed
12
#include "pybind11_tests.h"
Klemens Morgenstern's avatar
Klemens Morgenstern committed
13

14
void example_eval() {
Klemens Morgenstern's avatar
Klemens Morgenstern committed
15
16
17
    py::module main_module = py::module::import("__main__");
    py::object main_namespace = main_module.attr("__dict__");

18
    bool ok = false;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
19

20
21
22
23
    main_module.def("call_test", [&]() -> int {
        ok = true;
        return 42;
    });
Klemens Morgenstern's avatar
Klemens Morgenstern committed
24

25
    cout << "eval_statements test" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
26

27
    auto result = py::eval<py::eval_statements>(
Klemens Morgenstern's avatar
Klemens Morgenstern committed
28
            "print('Hello World!');\n"
29
            "x = call_test();", main_namespace);
Klemens Morgenstern's avatar
Klemens Morgenstern committed
30

31
32
33
34
    if (ok && result == py::none())
        cout << "eval_statements passed" << endl;
    else
        cout << "eval_statements failed" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
35
36
37
38
39
40
41

    cout << "eval test" << endl;

    py::object val = py::eval("x", main_namespace);

    if (val.cast<int>() == 42)
        cout << "eval passed" << endl;
42
    else
Klemens Morgenstern's avatar
Klemens Morgenstern committed
43
44
        cout << "eval failed" << endl;

45
46
    ok = false;
    cout << "eval_single_statement test" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
47

48
49
    py::eval<py::eval_single_statement>(
        "y = call_test();", main_namespace);
Klemens Morgenstern's avatar
Klemens Morgenstern committed
50

51
52
53
54
    if (ok)
        cout << "eval_single_statement passed" << endl;
    else
        cout << "eval_single_statement failed" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
55

56
    cout << "eval_file test" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
57
58
59
60
61

    int val_out;
    main_module.def("call_test2", [&](int value) {val_out = value;});

    try {
Dean Moldovan's avatar
Dean Moldovan committed
62
        result = py::eval_file("test_eval_call.py", main_namespace);
63
    } catch (...) {
Dean Moldovan's avatar
Dean Moldovan committed
64
        result = py::eval_file("tests/test_eval_call.py", main_namespace);
Klemens Morgenstern's avatar
Klemens Morgenstern committed
65
66
    }

67
68
69
70
    if (val_out == 42 && result == py::none())
        cout << "eval_file passed" << endl;
    else
        cout << "eval_file failed" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
71

72
    ok = false;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
73
74
    cout << "eval failure test" << endl;
    try {
75
76
77
78
        py::eval("nonsense code ...");
    } catch (py::error_already_set &) {
        PyErr_Clear();
        ok = true;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
79
    }
80
81

    if (ok)
Klemens Morgenstern's avatar
Klemens Morgenstern committed
82
        cout << "eval failure test passed" << endl;
83
    else
Klemens Morgenstern's avatar
Klemens Morgenstern committed
84
        cout << "eval failure test failed" << endl;
85
86
87
88
89
90
91

    ok = false;
    cout << "eval_file failure test" << endl;
    try {
        py::eval_file("nonexisting file");
    } catch (std::exception &) {
        ok = true;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
92
    }
93
94
95
96
97

    if (ok)
        cout << "eval_file failure test passed" << endl;
    else
        cout << "eval_file failure test failed" << endl;
Klemens Morgenstern's avatar
Klemens Morgenstern committed
98
99
}

100
101
void init_ex_eval(py::module & m) {
    m.def("example_eval", &example_eval);
Klemens Morgenstern's avatar
Klemens Morgenstern committed
102
}