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 | 194d8b9 | 2017-03-29 00:27:56 +0200 | [diff] [blame] | 23 | // Regular string literal |
Dean Moldovan | 076c738 | 2017-04-30 01:53:06 +0200 | [diff] [blame] | 24 | py::exec( |
Dean Moldovan | 194d8b9 | 2017-03-29 00:27:56 +0200 | [diff] [blame] | 25 | "message = 'Hello World!'\n" |
| 26 | "x = call_test()", |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 27 | global, local |
| 28 | ); |
Dean Moldovan | 194d8b9 | 2017-03-29 00:27:56 +0200 | [diff] [blame] | 29 | |
| 30 | // Multi-line raw string literal |
Dean Moldovan | 076c738 | 2017-04-30 01:53:06 +0200 | [diff] [blame] | 31 | py::exec(R"( |
Dean Moldovan | 194d8b9 | 2017-03-29 00:27:56 +0200 | [diff] [blame] | 32 | if x == 42: |
| 33 | print(message) |
| 34 | else: |
| 35 | raise RuntimeError |
| 36 | )", global, local |
| 37 | ); |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 38 | auto x = local["x"].cast<int>(); |
| 39 | |
Dean Moldovan | 076c738 | 2017-04-30 01:53:06 +0200 | [diff] [blame] | 40 | return x == 42; |
Wenzel Jakob | 0d3fc35 | 2016-07-08 10:52:10 +0200 | [diff] [blame] | 41 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 42 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 43 | m.def("test_eval", [global]() { |
| 44 | auto local = py::dict(); |
| 45 | local["x"] = py::int_(42); |
| 46 | auto x = py::eval("x", global, local); |
| 47 | return x.cast<int>() == 42; |
| 48 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 49 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 50 | m.def("test_eval_single_statement", []() { |
| 51 | auto local = py::dict(); |
| 52 | local["call_test"] = py::cpp_function([&]() -> int { |
| 53 | return 42; |
| 54 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 55 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 56 | auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local); |
| 57 | auto x = local["x"].cast<int>(); |
Dean Moldovan | 36f0a15 | 2017-02-08 01:01:56 +0100 | [diff] [blame] | 58 | return result.is_none() && x == 42; |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 59 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 60 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 61 | m.def("test_eval_file", [global](py::str filename) { |
| 62 | auto local = py::dict(); |
| 63 | local["y"] = py::int_(43); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 64 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 65 | int val_out; |
| 66 | local["call_test2"] = py::cpp_function([&](int value) { val_out = value; }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 67 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 68 | auto result = py::eval_file(filename, global, local); |
Dean Moldovan | 36f0a15 | 2017-02-08 01:01:56 +0100 | [diff] [blame] | 69 | return val_out == 43 && result.is_none(); |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 70 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 71 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 72 | m.def("test_eval_failure", []() { |
| 73 | try { |
| 74 | py::eval("nonsense code ..."); |
| 75 | } catch (py::error_already_set &) { |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 76 | return true; |
| 77 | } |
| 78 | return false; |
| 79 | }); |
Klemens Morgenstern | c6ad2c4 | 2016-06-09 16:10:26 +0200 | [diff] [blame] | 80 | |
Dean Moldovan | 3b44dae | 2016-08-18 16:55:26 +0200 | [diff] [blame] | 81 | m.def("test_eval_file_failure", []() { |
| 82 | try { |
| 83 | py::eval_file("non-existing file"); |
| 84 | } catch (std::exception &) { |
| 85 | return true; |
| 86 | } |
| 87 | return false; |
| 88 | }); |
Jason Rhinelander | 52f4be8 | 2016-09-03 14:54:22 -0400 | [diff] [blame] | 89 | }); |