/*
Copyright 2024 Equinor.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see .
*/
#include
#include
#define BOOST_TEST_MODULE ParameterSystemTest
#include
namespace Opm::Parameters {
struct SimpleParamBool { static constexpr bool value = false; };
struct SimpleParamDouble { static constexpr double value = 1.0; };
struct SimpleParamFloat { static constexpr float value = 2.0; };
struct SimpleParamInt { static constexpr int value = 1; };
struct SimpleParamString { static constexpr auto value = "foo"; };
struct SimpleParamBoolN2
{
static constexpr auto name = "SimpleB2";
static constexpr bool value = true;
};
}
namespace {
class Setting
{
public:
Setting(const std::string& k, const std::string& v)
: key(k), value(v)
{}
friend std::ostream& operator<<(std::ostream& os, const Setting& setting)
{
os << setting.key << "=" << setting.value << '\n';
return os;
}
bool operator==(const Setting& setting) const
{
return setting.key == key
&& setting.value == value;
}
bool operator !=(const Setting& setting) const
{
return !(*this == setting);
}
private:
std::string key;
std::string value;
};
struct Fixture
{
Fixture()
{
Opm::Parameters::reset();
Opm::Parameters::Register("Simple bool parameter");
Opm::Parameters::Register("Simpler bool parameter");
Opm::Parameters::Register("Simple double parameter");
Opm::Parameters::Register("Simple float parameter");
Opm::Parameters::Register("Simple int parameter");
Opm::Parameters::Register("Simple string parameter");
Opm::Parameters::SetDefault(10);
Opm::Parameters::Hide();
Opm::Parameters::endRegistration();
}
};
std::string trimString(const std::string& input)
{
std::string result(input);
result.erase(std::remove(result.begin(), result.end(), ' '), result.end());
result.erase(std::remove(result.begin(), result.end(), '\n'), result.end());
return result;
}
}
BOOST_FIXTURE_TEST_CASE(GetLists, Fixture)
{
const char* argv[] = {
"test_parametersystem",
"--simple-param-bool=true",
"--simple-param-float=3.0",
"--simple-param-string=bar",
"--unused-param=foo",
};
Opm::Parameters::parseCommandLineOptions(5, argv, "",
Opm::Parameters::noPositionalParameters_);
BOOST_CHECK_EQUAL(Opm::Parameters::IsSet(), true);
BOOST_CHECK_EQUAL(Opm::Parameters::IsSet(), true);
BOOST_CHECK_EQUAL(Opm::Parameters::IsSet(), true);
BOOST_CHECK_EQUAL(Opm::Parameters::IsSet(), false);
BOOST_CHECK_EQUAL(Opm::Parameters::IsSet(), false);
BOOST_CHECK_EQUAL(Opm::Parameters::IsSet(), false);
using SettingMap = std::vector;
const SettingMap set_ref = {
{"SimpleParamBool", "true"},
{"SimpleParamFloat", "3.0"},
{"SimpleParamString", "bar"},
};
const SettingMap unused_ref = {
{"UnusedParam", "foo"},
};
SettingMap set, unused;
Opm::Parameters::getLists(set, unused);
BOOST_CHECK_EQUAL_COLLECTIONS(set.begin(), set.end(),
set_ref.begin(), set_ref.end());
BOOST_CHECK_EQUAL_COLLECTIONS(unused.begin(), unused.end(),
unused_ref.begin(), unused_ref.end());
}
BOOST_FIXTURE_TEST_CASE(ParseParameterFile, Fixture)
{
Opm::Parameters::parseParameterFile("parametersystem.ini", true);
BOOST_CHECK_EQUAL(Opm::Parameters::Get(), true);
BOOST_CHECK_EQUAL(Opm::Parameters::Get(), 3.f);
BOOST_CHECK_EQUAL(Opm::Parameters::Get(), "bar");
BOOST_CHECK_EQUAL(Opm::Parameters::Get(), true);
BOOST_CHECK_EQUAL(Opm::Parameters::Get(), 1.0);
BOOST_CHECK_EQUAL(Opm::Parameters::Get(), 10);
}
BOOST_FIXTURE_TEST_CASE(PrintUsage, Fixture)
{
std::stringstream usage;
Opm::Parameters::printUsage("", "", usage);
BOOST_CHECK_EQUAL(trimString(usage.str()),
trimString(R"(
Recognized options:
--simple-b2=BOOLEAN Simpler bool parameter. Default: true
--simple-param-bool=BOOLEAN Simple bool parameter. Default: false
--simple-param-double=SCALAR Simple double parameter. Default: 1
--simple-param-float=SCALAR Simple float parameter. Default: 2
--simple-param-string=STRING Simple string parameter. Default: "foo"
)"));
}
BOOST_FIXTURE_TEST_CASE(PrintUsageAll, Fixture)
{
std::stringstream usage;
Opm::Parameters::printUsage("===foobar===", "", usage, true);
BOOST_CHECK_EQUAL(trimString(usage.str()),
trimString(R"(===foobar===
Recognized options:
-h,--help Print this help message and exit
--help-all Print all parameters, including obsolete, hidden and deprecated ones.
--simple-b2=BOOLEAN Simpler bool parameter. Default: true
--simple-param-bool=BOOLEAN Simple bool parameter. Default: false
--simple-param-double=SCALAR Simple double parameter. Default: 1
--simple-param-float=SCALAR Simple float parameter. Default: 2
--simple-param-int=INTEGER Simple int parameter. Default: 10
--simple-param-string=STRING Simple string parameter. Default: "foo"
)"));
}
BOOST_FIXTURE_TEST_CASE(PrintValues, Fixture)
{
std::stringstream values;
Opm::Parameters::printValues(values);
BOOST_CHECK_EQUAL(trimString(values.str()),
trimString(R"(# [parameters which were specified at compile-time]
SimpleB2="1"
SimpleParamBool="0"
SimpleParamDouble="1"
SimpleParamFloat="2"
SimpleParamInt="10"
SimpleParamString="foo"
)"));
}