diff --git a/tests/parser/EmbeddedPython.cpp b/tests/parser/EmbeddedPython.cpp index 70f95d6d2..f4fe9ffcf 100644 --- a/tests/parser/EmbeddedPython.cpp +++ b/tests/parser/EmbeddedPython.cpp @@ -17,36 +17,44 @@ along with OPM. If not, see . */ -#include -#include - #define BOOST_TEST_MODULE EMBEDDED_PYTHON #include #include -#include -#include + #include -#include + #include -#include -#include -#include #include +#include +#include #include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include + using namespace Opm; #ifndef EMBEDDED_PYTHON -BOOST_AUTO_TEST_CASE(INSTANTIATE) { +BOOST_AUTO_TEST_CASE(INSTANTIATE) +{ Python python; - BOOST_CHECK(!python.enabled()); - BOOST_CHECK_THROW(python.exec("print('Hello world')"), std::logic_error); - BOOST_CHECK(! Python::supported() ); + BOOST_CHECK_MESSAGE(!python.enabled(), "Python must not be enabled in a default-constructed Python object unless we have Embedded Python support"); + BOOST_CHECK_MESSAGE(!python.exec("print('Hello world')"), "Default-constructed Python object must not run Python code unless we have Embedded Python support"); + BOOST_CHECK_MESSAGE(!Python::supported(), "Python must not be supported unless we have Embedded Python support"); - BOOST_CHECK_THROW( Python{Python::Enable::ON}, std::logic_error ); Python python_cond(Python::Enable::TRY); BOOST_CHECK(!python_cond.enabled()); @@ -54,68 +62,76 @@ BOOST_AUTO_TEST_CASE(INSTANTIATE) { BOOST_CHECK(!python_off.enabled()); } -#else +#else // EMBEDDED_PYTHON -BOOST_AUTO_TEST_CASE(INSTANTIATE) { +BOOST_AUTO_TEST_CASE(INSTANTIATE) +{ auto python = std::make_shared(); - BOOST_CHECK(Python::supported()); - BOOST_CHECK(python->enabled()); + BOOST_CHECK_MESSAGE(Python::supported(), "Python interpreter must be available when we have Embedded Python support"); + BOOST_CHECK_MESSAGE(python->enabled(), "Python interpreter must be enabled in a default-constructed Python object when we have Embedded Python support"); BOOST_CHECK_NO_THROW(python->exec("import sys")); Parser parser; Deck deck; - std::string python_code = R"( + const std::string python_code = R"( print('Parser: {}'.format(context.parser)) print('Deck: {}'.format(context.deck)) kw = context.DeckKeyword( context.parser['FIELD'] ) context.deck.add(kw) )"; - BOOST_CHECK_NO_THROW( python->exec(python_code, parser, deck)); - BOOST_CHECK( deck.hasKeyword("FIELD") ); + BOOST_CHECK_NO_THROW(python->exec(python_code, parser, deck)); + BOOST_CHECK(deck.hasKeyword("FIELD")); } +BOOST_AUTO_TEST_CASE(PYINPUT_BASIC) +{ + const auto deck = Parser{}.parseString(R"(RUNSPEC +START -- 0 +31 AUG 1993 / +PYINPUT +kw = context.DeckKeyword(context.parser['FIELD']) +context.deck.add(kw) +PYEND -BOOST_AUTO_TEST_CASE(PYINPUT_BASIC) { +DIMENS +2 2 1 / - Parser parser; - std::string input = R"( - START -- 0 - 31 AUG 1993 / - RUNSPEC - PYINPUT - kw = context.DeckKeyword( context.parser['FIELD'] ) - context.deck.add(kw) - PYEND - DIMENS - 2 2 1 / - PYINPUT - import numpy as np - dx = np.array([0.25, 0.25, 0.25, 0.25]) - active_unit_system = context.deck.active_unit_system() - default_unit_system = context.deck.default_unit_system() - kw = context.DeckKeyword( context.parser['DX'], dx, active_unit_system, default_unit_system ) - context.deck.add(kw) - PYEND - DY - 4*0.25 / - )"; +PYINPUT +try: + import numpy as np + dx = np.array([0.25, 0.25, 0.25, 0.25]) + active_unit_system = context.deck.active_unit_system() + default_unit_system = context.deck.default_unit_system() + kw = context.DeckKeyword(context.parser['DX'], dx, active_unit_system, default_unit_system) + context.deck.add(kw) +except ImportError: + # NumPy might not be available on host. Nothing to do in this case. + pass +PYEND - Deck deck = parser.parseString(input); - BOOST_CHECK( deck.hasKeyword("START") ); - BOOST_CHECK( deck.hasKeyword("FIELD") ); - BOOST_CHECK( deck.hasKeyword("DIMENS") ); - BOOST_CHECK( deck.hasKeyword("DX") ); - auto DX = deck["DX"].back(); - std::vector dx_data = DX.getSIDoubleData(); - BOOST_CHECK_EQUAL( dx_data.size(), 4 ); - BOOST_CHECK_EQUAL( dx_data[2], 0.25 * 0.3048 ); - BOOST_CHECK( deck.hasKeyword("DY") ); +DY +4*0.25 / +END +)"); + + BOOST_CHECK_MESSAGE(deck.hasKeyword("START"), "START keyword must be present"); + BOOST_CHECK_MESSAGE(deck.hasKeyword("FIELD"), "FIELD keyword must be present"); + BOOST_CHECK_MESSAGE(deck.hasKeyword("DIMENS"), "DIMENS keyword must be present"); + + if (deck.hasKeyword("DX")) { + auto DX = deck["DX"].back(); + std::vector dx_data = DX.getSIDoubleData(); + BOOST_CHECK_EQUAL(dx_data.size(), 4); + BOOST_CHECK_EQUAL(dx_data[2], 0.25 * 0.3048); + } + + BOOST_CHECK_MESSAGE(deck.hasKeyword("DY"), "DY keyword must be present"); } - -BOOST_AUTO_TEST_CASE(PYACTION) { +BOOST_AUTO_TEST_CASE(PYACTION) +{ Parser parser; auto python = std::make_shared(Python::Enable::ON); auto deck = parser.parseFile("EMBEDDED_PYTHON.DATA"); @@ -172,8 +188,8 @@ BOOST_AUTO_TEST_CASE(PYACTION) { BOOST_CHECK( actions.pending_python(action_state).size() == 2); } - -BOOST_AUTO_TEST_CASE(Python_Constructor) { +BOOST_AUTO_TEST_CASE(Python_Constructor) +{ Python python_off(Python::Enable::OFF); BOOST_CHECK(!python_off.enabled()); @@ -184,7 +200,8 @@ BOOST_AUTO_TEST_CASE(Python_Constructor) { BOOST_CHECK_THROW(Python python_throw(Python::Enable::ON), std::logic_error); } -BOOST_AUTO_TEST_CASE(Python_Constructor2) { +BOOST_AUTO_TEST_CASE(Python_Constructor2) +{ Python python_cond1(Python::Enable::TRY); BOOST_CHECK(python_cond1.enabled()); @@ -192,9 +209,4 @@ BOOST_AUTO_TEST_CASE(Python_Constructor2) { BOOST_CHECK(!python_cond2.enabled()); } -#endif - - - - - +#endif // EMBEDDED_PYTHON