blob: f6de893d465efe44c3f83766f6f23f20853df0c5 [file] [log] [blame]
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +02001/*
Jason Rhinelanderb3f3d792016-07-18 16:43:18 -04002 example/example-eval.cpp -- Usage of eval() and eval_file()
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +02003
4 Copyright (c) 2016 Klemens D. Morgenstern
5
6 All rights reserved. Use of this source code is governed by a
7 BSD-style license that can be found in the LICENSE file.
8*/
9
10
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020011#include <pybind11/eval.h>
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020012#include "example.h"
13
Jason Rhinelanderb3f3d792016-07-18 16:43:18 -040014void example_eval() {
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020015 py::module main_module = py::module::import("__main__");
16 py::object main_namespace = main_module.attr("__dict__");
17
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020018 bool ok = false;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020019
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020020 main_module.def("call_test", [&]() -> int {
21 ok = true;
22 return 42;
23 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020024
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020025 cout << "eval_statements test" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020026
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020027 auto result = py::eval<py::eval_statements>(
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020028 "print('Hello World!');\n"
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020029 "x = call_test();", main_namespace);
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020030
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020031 if (ok && result == py::none())
32 cout << "eval_statements passed" << endl;
33 else
34 cout << "eval_statements failed" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020035
36 cout << "eval test" << endl;
37
38 py::object val = py::eval("x", main_namespace);
39
40 if (val.cast<int>() == 42)
41 cout << "eval passed" << endl;
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020042 else
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020043 cout << "eval failed" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020044
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020045 ok = false;
46 cout << "eval_single_statement test" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020047
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020048 py::eval<py::eval_single_statement>(
49 "y = call_test();", main_namespace);
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020050
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020051 if (ok)
52 cout << "eval_single_statement passed" << endl;
53 else
54 cout << "eval_single_statement failed" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020055
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020056 cout << "eval_file test" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020057
58 int val_out;
59 main_module.def("call_test2", [&](int value) {val_out = value;});
60
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020061 try {
Jason Rhinelanderb3f3d792016-07-18 16:43:18 -040062 result = py::eval_file("example-eval_call.py", main_namespace);
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020063 } catch (...) {
Jason Rhinelanderb3f3d792016-07-18 16:43:18 -040064 result = py::eval_file("example/example-eval_call.py", main_namespace);
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020065 }
66
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020067 if (val_out == 42 && result == py::none())
68 cout << "eval_file passed" << endl;
69 else
70 cout << "eval_file failed" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020071
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020072 ok = false;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020073 cout << "eval failure test" << endl;
74 try {
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020075 py::eval("nonsense code ...");
76 } catch (py::error_already_set &) {
77 PyErr_Clear();
78 ok = true;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020079 }
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020080
81 if (ok)
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020082 cout << "eval failure test passed" << endl;
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020083 else
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020084 cout << "eval failure test failed" << endl;
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020085
86 ok = false;
87 cout << "eval_file failure test" << endl;
88 try {
89 py::eval_file("nonexisting file");
90 } catch (std::exception &) {
91 ok = true;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020092 }
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020093
94 if (ok)
95 cout << "eval_file failure test passed" << endl;
96 else
97 cout << "eval_file failure test failed" << endl;
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020098}
99
Jason Rhinelanderb3f3d792016-07-18 16:43:18 -0400100void init_ex_eval(py::module & m) {
101 m.def("example_eval", &example_eval);
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +0200102}