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