μHAL (v2.8.17)
Part of the IPbus software repository
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
test_eval.cpp
Go to the documentation of this file.
1/*
2 tests/test_eval.cpp -- Usage of eval() and eval_file()
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#include <pybind11/eval.h>
11
12#include "pybind11_tests.h"
13
14#include <utility>
15
16TEST_SUBMODULE(eval_, m) {
17 // test_evals
18
19 auto global = py::dict(py::module_::import("__main__").attr("__dict__"));
20
21 m.def("test_eval_statements", [global]() {
22 auto local = py::dict();
23 local["call_test"] = py::cpp_function([&]() -> int { return 42; });
24
25 // Regular string literal
26 py::exec("message = 'Hello World!'\n"
27 "x = call_test()",
28 global,
29 local);
30
31 // Multi-line raw string literal
32 py::exec(R"(
33 if x == 42:
34 print(message)
35 else:
36 raise RuntimeError
37 )",
38 global,
39 local);
40 auto x = local["x"].cast<int>();
41
42 return x == 42;
43 });
44
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 });
51
52 m.def("test_eval_single_statement", []() {
53 auto local = py::dict();
54 local["call_test"] = py::cpp_function([&]() -> int { return 42; });
55
56 auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local);
57 auto x = local["x"].cast<int>();
58 return result.is_none() && x == 42;
59 });
60
61 m.def("test_eval_file", [global](py::str filename) {
62 auto local = py::dict();
63 local["y"] = py::int_(43);
64
65 int val_out = 0;
66 local["call_test2"] = py::cpp_function([&](int value) { val_out = value; });
67
68 auto result = py::eval_file(std::move(filename), global, local);
69 return val_out == 43 && result.is_none();
70 });
71
72 m.def("test_eval_failure", []() {
73 try {
74 py::eval("nonsense code ...");
75 } catch (py::error_already_set &) {
76 return true;
77 }
78 return false;
79 });
80
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 });
89
90 // test_eval_empty_globals
91 m.def("eval_empty_globals", [](py::object global) {
92 if (global.is_none()) {
93 global = py::dict();
94 }
95 auto int_class = py::eval("isinstance(42, int)", global);
96 return global;
97 });
98
99 // test_eval_closure
100 m.def("test_eval_closure", []() {
101 py::dict global;
102 global["closure_value"] = 42;
103 py::dict local;
104 local["closure_value"] = 0;
105 py::exec(R"(
106 local_value = closure_value
107
108 def func_global():
109 return closure_value
110
111 def func_local():
112 return local_value
113 )",
114 global,
115 local);
116 return std::make_pair(global, local);
117 });
118}
#define TEST_SUBMODULE(name, variable)