blob: e0948219117df7d8fd64dba3130d36e1307f272b [file] [log] [blame]
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +02001/*
Dean Moldovana0c1ccf2016-08-12 13:50:00 +02002 tests/test_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>
Dean Moldovana0c1ccf2016-08-12 13:50:00 +020012#include "pybind11_tests.h"
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020013
Jason Rhinelander391c7542017-07-25 16:47:36 -040014TEST_SUBMODULE(eval_, m) {
15 // test_evals
16
Dean Moldovan3b44dae2016-08-18 16:55:26 +020017 auto global = py::dict(py::module::import("__main__").attr("__dict__"));
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020018
Dean Moldovan3b44dae2016-08-18 16:55:26 +020019 m.def("test_eval_statements", [global]() {
20 auto local = py::dict();
21 local["call_test"] = py::cpp_function([&]() -> int {
22 return 42;
23 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020024
Dean Moldovan194d8b92017-03-29 00:27:56 +020025 // Regular string literal
Dean Moldovan076c7382017-04-30 01:53:06 +020026 py::exec(
Dean Moldovan194d8b92017-03-29 00:27:56 +020027 "message = 'Hello World!'\n"
28 "x = call_test()",
Dean Moldovan3b44dae2016-08-18 16:55:26 +020029 global, local
30 );
Dean Moldovan194d8b92017-03-29 00:27:56 +020031
32 // Multi-line raw string literal
Dean Moldovan076c7382017-04-30 01:53:06 +020033 py::exec(R"(
Dean Moldovan194d8b92017-03-29 00:27:56 +020034 if x == 42:
35 print(message)
36 else:
37 raise RuntimeError
38 )", global, local
39 );
Dean Moldovan3b44dae2016-08-18 16:55:26 +020040 auto x = local["x"].cast<int>();
41
Dean Moldovan076c7382017-04-30 01:53:06 +020042 return x == 42;
Wenzel Jakob0d3fc352016-07-08 10:52:10 +020043 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020044
Dean Moldovan3b44dae2016-08-18 16:55:26 +020045 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 Morgensternc6ad2c42016-06-09 16:10:26 +020051
Dean Moldovan3b44dae2016-08-18 16:55:26 +020052 m.def("test_eval_single_statement", []() {
53 auto local = py::dict();
54 local["call_test"] = py::cpp_function([&]() -> int {
55 return 42;
56 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020057
Dean Moldovan3b44dae2016-08-18 16:55:26 +020058 auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local);
59 auto x = local["x"].cast<int>();
Dean Moldovan36f0a152017-02-08 01:01:56 +010060 return result.is_none() && x == 42;
Dean Moldovan3b44dae2016-08-18 16:55:26 +020061 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020062
Dean Moldovan3b44dae2016-08-18 16:55:26 +020063 m.def("test_eval_file", [global](py::str filename) {
64 auto local = py::dict();
65 local["y"] = py::int_(43);
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020066
Dean Moldovan3b44dae2016-08-18 16:55:26 +020067 int val_out;
68 local["call_test2"] = py::cpp_function([&](int value) { val_out = value; });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020069
Dean Moldovan3b44dae2016-08-18 16:55:26 +020070 auto result = py::eval_file(filename, global, local);
Dean Moldovan36f0a152017-02-08 01:01:56 +010071 return val_out == 43 && result.is_none();
Dean Moldovan3b44dae2016-08-18 16:55:26 +020072 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020073
Dean Moldovan3b44dae2016-08-18 16:55:26 +020074 m.def("test_eval_failure", []() {
75 try {
76 py::eval("nonsense code ...");
77 } catch (py::error_already_set &) {
Dean Moldovan3b44dae2016-08-18 16:55:26 +020078 return true;
79 }
80 return false;
81 });
Klemens Morgensternc6ad2c42016-06-09 16:10:26 +020082
Dean Moldovan3b44dae2016-08-18 16:55:26 +020083 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 Rhinelander391c7542017-07-25 16:47:36 -040091}