test_eval.cpp revision 11986
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 1411986Sandreas.sandberg@arm.comtest_initializer eval([](py::module &m) { 1511986Sandreas.sandberg@arm.com auto global = py::dict(py::module::import("__main__").attr("__dict__")); 1611986Sandreas.sandberg@arm.com 1711986Sandreas.sandberg@arm.com m.def("test_eval_statements", [global]() { 1811986Sandreas.sandberg@arm.com auto local = py::dict(); 1911986Sandreas.sandberg@arm.com local["call_test"] = py::cpp_function([&]() -> int { 2011986Sandreas.sandberg@arm.com return 42; 2111986Sandreas.sandberg@arm.com }); 2211986Sandreas.sandberg@arm.com 2311986Sandreas.sandberg@arm.com auto result = py::eval<py::eval_statements>( 2411986Sandreas.sandberg@arm.com "print('Hello World!');\n" 2511986Sandreas.sandberg@arm.com "x = call_test();", 2611986Sandreas.sandberg@arm.com global, local 2711986Sandreas.sandberg@arm.com ); 2811986Sandreas.sandberg@arm.com auto x = local["x"].cast<int>(); 2911986Sandreas.sandberg@arm.com 3011986Sandreas.sandberg@arm.com return result == py::none() && x == 42; 3111986Sandreas.sandberg@arm.com }); 3211986Sandreas.sandberg@arm.com 3311986Sandreas.sandberg@arm.com m.def("test_eval", [global]() { 3411986Sandreas.sandberg@arm.com auto local = py::dict(); 3511986Sandreas.sandberg@arm.com local["x"] = py::int_(42); 3611986Sandreas.sandberg@arm.com auto x = py::eval("x", global, local); 3711986Sandreas.sandberg@arm.com return x.cast<int>() == 42; 3811986Sandreas.sandberg@arm.com }); 3911986Sandreas.sandberg@arm.com 4011986Sandreas.sandberg@arm.com m.def("test_eval_single_statement", []() { 4111986Sandreas.sandberg@arm.com auto local = py::dict(); 4211986Sandreas.sandberg@arm.com local["call_test"] = py::cpp_function([&]() -> int { 4311986Sandreas.sandberg@arm.com return 42; 4411986Sandreas.sandberg@arm.com }); 4511986Sandreas.sandberg@arm.com 4611986Sandreas.sandberg@arm.com auto result = py::eval<py::eval_single_statement>("x = call_test()", py::dict(), local); 4711986Sandreas.sandberg@arm.com auto x = local["x"].cast<int>(); 4811986Sandreas.sandberg@arm.com return result == py::none() && x == 42; 4911986Sandreas.sandberg@arm.com }); 5011986Sandreas.sandberg@arm.com 5111986Sandreas.sandberg@arm.com m.def("test_eval_file", [global](py::str filename) { 5211986Sandreas.sandberg@arm.com auto local = py::dict(); 5311986Sandreas.sandberg@arm.com local["y"] = py::int_(43); 5411986Sandreas.sandberg@arm.com 5511986Sandreas.sandberg@arm.com int val_out; 5611986Sandreas.sandberg@arm.com local["call_test2"] = py::cpp_function([&](int value) { val_out = value; }); 5711986Sandreas.sandberg@arm.com 5811986Sandreas.sandberg@arm.com auto result = py::eval_file(filename, global, local); 5911986Sandreas.sandberg@arm.com return val_out == 43 && result == py::none(); 6011986Sandreas.sandberg@arm.com }); 6111986Sandreas.sandberg@arm.com 6211986Sandreas.sandberg@arm.com m.def("test_eval_failure", []() { 6311986Sandreas.sandberg@arm.com try { 6411986Sandreas.sandberg@arm.com py::eval("nonsense code ..."); 6511986Sandreas.sandberg@arm.com } catch (py::error_already_set &) { 6611986Sandreas.sandberg@arm.com return true; 6711986Sandreas.sandberg@arm.com } 6811986Sandreas.sandberg@arm.com return false; 6911986Sandreas.sandberg@arm.com }); 7011986Sandreas.sandberg@arm.com 7111986Sandreas.sandberg@arm.com m.def("test_eval_file_failure", []() { 7211986Sandreas.sandberg@arm.com try { 7311986Sandreas.sandberg@arm.com py::eval_file("non-existing file"); 7411986Sandreas.sandberg@arm.com } catch (std::exception &) { 7511986Sandreas.sandberg@arm.com return true; 7611986Sandreas.sandberg@arm.com } 7711986Sandreas.sandberg@arm.com return false; 7811986Sandreas.sandberg@arm.com }); 7911986Sandreas.sandberg@arm.com}); 80