Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 1 | /* |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 2 | tests/test_eval.cpp -- Usage of eval() and eval_file() |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 3 | |
| 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 Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 11 | #include <pybind11/eval.h> |
Dean Moldovan | a0c1ccf | 2016-08-12 13:50:00 +0200 | [diff] [blame] | 12 | #include "pybind11_tests.h" |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 13 | |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 14 | test_initializer eval([](py::module &m) { |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 15 | auto global = py::dict(py::module::import("__main__").attr("__dict__")); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 16 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 17 | m.def("test_eval_statements", [global]() { |
| 18 | auto local = py::dict(); |
| 19 | local["call_test"] = py::cpp_function([&]() -> int { |
| 20 | return 42; |
| 21 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 22 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 23 | auto result = py::eval<py::eval_statements>( |
| 24 | "print('Hello World!');\n" |
| 25 | "x = call_test();", |
| 26 | global, local |
| 27 | ); |
| 28 | auto x = local["x"].cast<int>(); |
| 29 | |
| 30 | return result == py::none() && x == 42; |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 31 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 32 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 33 | m.def("test_eval", [global]() { |
| 34 | auto local = py::dict(); |
| 35 | local["x"] = py::int_(42); |
| 36 | auto x = py::eval("x", global, local); |
| 37 | return x.cast<int>() == 42; |
| 38 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 39 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 40 | m.def("test_eval_single_statement", []() { |
| 41 | auto local = py::dict(); |
| 42 | local["call_test"] = py::cpp_function([&]() -> int { |
| 43 | return 42; |
| 44 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 45 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 46 | auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local); |
| 47 | auto x = local["x"].cast<int>(); |
| 48 | return result == py::none() && x == 42; |
| 49 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 50 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 51 | m.def("test_eval_file", [global](py::str filename) { |
| 52 | auto local = py::dict(); |
| 53 | local["y"] = py::int_(43); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 54 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 55 | int val_out; |
| 56 | local["call_test2"] = py::cpp_function([&](int value) { val_out = value; }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 57 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 58 | auto result = py::eval_file(filename, global, local); |
| 59 | return val_out == 43 && result == py::none(); |
| 60 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 61 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 62 | m.def("test_eval_failure", []() { |
| 63 | try { |
| 64 | py::eval("nonsense code ..."); |
| 65 | } catch (py::error_already_set &) { |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 66 | return true; |
| 67 | } |
| 68 | return false; |
| 69 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 70 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 71 | m.def("test_eval_file_failure", []() { |
| 72 | try { |
| 73 | py::eval_file("non-existing file"); |
| 74 | } catch (std::exception &) { |
| 75 | return true; |
| 76 | } |
| 77 | return false; |
| 78 | }); |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 79 | }); |