Merge pull request #3564 from bska/fix-embedded-python-test

Fix Embedded Python Test
This commit is contained in:
Arne Morten Kvarving
2023-06-08 11:47:18 +02:00
committed by GitHub

View File

@@ -17,36 +17,44 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdexcept>
#include <memory>
#define BOOST_TEST_MODULE EMBEDDED_PYTHON
#include <boost/test/unit_test.hpp>
#include <opm/input/eclipse/Python/Python.hpp>
#include <opm/input/eclipse/Parser/Parser.hpp>
#include <opm/input/eclipse/Deck/Deck.hpp>
#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
#include <opm/input/eclipse/Parser/ParserKeywords/P.hpp>
#include <opm/input/eclipse/Schedule/Action/Actions.hpp>
#include <opm/input/eclipse/Schedule/SummaryState.hpp>
#include <opm/input/eclipse/Schedule/Schedule.hpp>
#include <opm/common/utility/TimeService.hpp>
#include <opm/input/eclipse/Schedule/Action/State.hpp>
#include <opm/input/eclipse/Schedule/Schedule.hpp>
#include <opm/input/eclipse/Schedule/SummaryState.hpp>
#include <opm/input/eclipse/Schedule/Well/Well.hpp>
#include <opm/common/utility/TimeService.hpp>
#include <opm/input/eclipse/Deck/Deck.hpp>
#include <opm/input/eclipse/Parser/Parser.hpp>
#include <opm/input/eclipse/Parser/ParserKeywords/P.hpp>
#include <map>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
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<Python>();
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<double> 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<double> 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>(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