111986Sandreas.sandberg@arm.com/* 211986Sandreas.sandberg@arm.com tests/test_eval.cpp -- Usage of eval() and eval_file() 311986Sandreas.sandberg@arm.com 411986Sandreas.sandberg@arm.com Copyright (c) 2016 Klemens D. Morgenstern 511986Sandreas.sandberg@arm.com 611986Sandreas.sandberg@arm.com All rights reserved. Use of this source code is governed by a 711986Sandreas.sandberg@arm.com BSD-style license that can be found in the LICENSE file. 811986Sandreas.sandberg@arm.com*/ 911986Sandreas.sandberg@arm.com 1011986Sandreas.sandberg@arm.com 1111986Sandreas.sandberg@arm.com#include <pybind11/eval.h> 1211986Sandreas.sandberg@arm.com#include "pybind11_tests.h" 1311986Sandreas.sandberg@arm.com 1412391Sjason@lowepower.comTEST_SUBMODULE(eval_, m) { 1512391Sjason@lowepower.com // test_evals 1612391Sjason@lowepower.com 1711986Sandreas.sandberg@arm.com auto global = py::dict(py::module::import("__main__").attr("__dict__")); 1811986Sandreas.sandberg@arm.com 1911986Sandreas.sandberg@arm.com m.def("test_eval_statements", [global]() { 2011986Sandreas.sandberg@arm.com auto local = py::dict(); 2111986Sandreas.sandberg@arm.com local["call_test"] = py::cpp_function([&]() -> int { 2211986Sandreas.sandberg@arm.com return 42; 2311986Sandreas.sandberg@arm.com }); 2411986Sandreas.sandberg@arm.com 2512391Sjason@lowepower.com // Regular string literal 2612391Sjason@lowepower.com py::exec( 2712391Sjason@lowepower.com "message = 'Hello World!'\n" 2812391Sjason@lowepower.com "x = call_test()", 2911986Sandreas.sandberg@arm.com global, local 3011986Sandreas.sandberg@arm.com ); 3112391Sjason@lowepower.com 3212391Sjason@lowepower.com // Multi-line raw string literal 3312391Sjason@lowepower.com py::exec(R"( 3412391Sjason@lowepower.com if x == 42: 3512391Sjason@lowepower.com print(message) 3612391Sjason@lowepower.com else: 3712391Sjason@lowepower.com raise RuntimeError 3812391Sjason@lowepower.com )", global, local 3912391Sjason@lowepower.com ); 4011986Sandreas.sandberg@arm.com auto x = local["x"].cast<int>(); 4111986Sandreas.sandberg@arm.com 4212391Sjason@lowepower.com return x == 42; 4311986Sandreas.sandberg@arm.com }); 4411986Sandreas.sandberg@arm.com 4511986Sandreas.sandberg@arm.com m.def("test_eval", [global]() { 4611986Sandreas.sandberg@arm.com auto local = py::dict(); 4711986Sandreas.sandberg@arm.com local["x"] = py::int_(42); 4811986Sandreas.sandberg@arm.com auto x = py::eval("x", global, local); 4911986Sandreas.sandberg@arm.com return x.cast<int>() == 42; 5011986Sandreas.sandberg@arm.com }); 5111986Sandreas.sandberg@arm.com 5211986Sandreas.sandberg@arm.com m.def("test_eval_single_statement", []() { 5311986Sandreas.sandberg@arm.com auto local = py::dict(); 5411986Sandreas.sandberg@arm.com local["call_test"] = py::cpp_function([&]() -> int { 5511986Sandreas.sandberg@arm.com return 42; 5611986Sandreas.sandberg@arm.com }); 5711986Sandreas.sandberg@arm.com 5811986Sandreas.sandberg@arm.com auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local); 5911986Sandreas.sandberg@arm.com auto x = local["x"].cast<int>(); 6012391Sjason@lowepower.com return result.is_none() && x == 42; 6111986Sandreas.sandberg@arm.com }); 6211986Sandreas.sandberg@arm.com 6311986Sandreas.sandberg@arm.com m.def("test_eval_file", [global](py::str filename) { 6411986Sandreas.sandberg@arm.com auto local = py::dict(); 6511986Sandreas.sandberg@arm.com local["y"] = py::int_(43); 6611986Sandreas.sandberg@arm.com 6711986Sandreas.sandberg@arm.com int val_out; 6811986Sandreas.sandberg@arm.com local["call_test2"] = py::cpp_function([&](int value) { val_out = value; }); 6911986Sandreas.sandberg@arm.com 7011986Sandreas.sandberg@arm.com auto result = py::eval_file(filename, global, local); 7112391Sjason@lowepower.com return val_out == 43 && result.is_none(); 7211986Sandreas.sandberg@arm.com }); 7311986Sandreas.sandberg@arm.com 7411986Sandreas.sandberg@arm.com m.def("test_eval_failure", []() { 7511986Sandreas.sandberg@arm.com try { 7611986Sandreas.sandberg@arm.com py::eval("nonsense code ..."); 7711986Sandreas.sandberg@arm.com } catch (py::error_already_set &) { 7811986Sandreas.sandberg@arm.com return true; 7911986Sandreas.sandberg@arm.com } 8011986Sandreas.sandberg@arm.com return false; 8111986Sandreas.sandberg@arm.com }); 8211986Sandreas.sandberg@arm.com 8311986Sandreas.sandberg@arm.com m.def("test_eval_file_failure", []() { 8411986Sandreas.sandberg@arm.com try { 8511986Sandreas.sandberg@arm.com py::eval_file("non-existing file"); 8611986Sandreas.sandberg@arm.com } catch (std::exception &) { 8711986Sandreas.sandberg@arm.com return true; 8811986Sandreas.sandberg@arm.com } 8911986Sandreas.sandberg@arm.com return false; 9011986Sandreas.sandberg@arm.com }); 9112391Sjason@lowepower.com} 92