/*
Copyright 2013 Statoil ASA.
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
#include
#define BOOST_TEST_MODULE ParserTests
#include
#include
#include
#include
#include
#include
#include
#include
using namespace Opm;
std::unique_ptr< ParserKeyword > createDynamicSized(const std::string& kw) {
std::unique_ptr< ParserKeyword > pkw( new ParserKeyword( kw ) );
pkw->setSizeType(SLASH_TERMINATED);
return pkw;
}
/************************Basic structural tests**********************'*/
BOOST_AUTO_TEST_CASE(Initializing) {
BOOST_CHECK_NO_THROW(Parser parser);
BOOST_CHECK_NO_THROW(Parser parser);
BOOST_CHECK_NO_THROW(ParserPtr parserPtr(new Parser()));
BOOST_CHECK_NO_THROW(ParserConstPtr parserConstPtr(new Parser()));
}
BOOST_AUTO_TEST_CASE(addKeyword_keyword_doesntfail) {
Parser parser;
parser.addParserKeyword( createDynamicSized( "EQUIL" ) );
}
BOOST_AUTO_TEST_CASE(canParseDeckKeyword_returnstrue) {
ParserPtr parser(new Parser());
parser->addParserKeyword(createDynamicSized("FJAS"));
BOOST_CHECK(parser->isRecognizedKeyword("FJAS"));
}
BOOST_AUTO_TEST_CASE(getKeyword_haskeyword_returnskeyword) {
ParserPtr parser(new Parser());
parser->addParserKeyword( createDynamicSized( "FJAS" ) );
BOOST_CHECK_EQUAL("FJAS", parser->getParserKeywordFromDeckName("FJAS")->getName());
}
BOOST_AUTO_TEST_CASE(getKeyword_hasnotkeyword_getKeywordThrowsException) {
ParserPtr parser(new Parser());
parser->addParserKeyword( createDynamicSized( "FJAS" ) );
BOOST_CHECK_THROW(parser->getParserKeywordFromDeckName("FJASS"), std::invalid_argument);
}
BOOST_AUTO_TEST_CASE(getAllDeckNames_hasTwoKeywords_returnsCompleteList) {
ParserPtr parser(new Parser(false));
std::cout << parser->getAllDeckNames().size() << std::endl;
parser->addParserKeyword( createDynamicSized( "FJAS" ) );
parser->addParserKeyword( createDynamicSized( "SAJF" ) );
BOOST_CHECK_EQUAL(2U, parser->getAllDeckNames().size());
}
BOOST_AUTO_TEST_CASE(getAllDeckNames_hasNoKeywords_returnsEmptyList) {
ParserPtr parser(new Parser(false));
BOOST_CHECK_EQUAL(0U, parser->getAllDeckNames().size());
}
/************************ JSON config related tests **********************'*/
BOOST_AUTO_TEST_CASE(addParserKeywordJSON_isRecognizedKeyword_returnstrue) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig("{\"name\": \"BPR\", \"sections\":[\"SUMMARY\"], \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}");
parser->addParserKeyword( jsonConfig );
BOOST_CHECK(parser->isRecognizedKeyword("BPR"));
}
BOOST_AUTO_TEST_CASE(addParserKeywordJSON_size_isObject_allGood) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig("{\"name\": \"EQUIXL\", \"sections\":[], \"size\" : {\"keyword\":\"EQLDIMS\" , \"item\" : \"NTEQUL\"}, \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}");
parser->addParserKeyword( jsonConfig );
BOOST_CHECK(parser->isRecognizedKeyword("EQUIXL"));
}
BOOST_AUTO_TEST_CASE(loadKeywordsJSON_notArray_throw) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig( "{\"name\" : \"BPR\" , \"size\" : 100, \"sections\":[\"SUMMARY\"]}");
BOOST_CHECK_THROW(parser->loadKeywords( jsonConfig ) , std::invalid_argument);
}
BOOST_AUTO_TEST_CASE(loadKeywordsJSON_noSectionsItem_throw) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig( "[{\"name\" : \"BPR\" , \"size\" : 100, \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}]");
BOOST_CHECK_THROW(parser->loadKeywords( jsonConfig ) , std::invalid_argument);
}
BOOST_AUTO_TEST_CASE(loadKeywordsJSON_isRecognizedKeyword_returnstrue) {
ParserPtr parser(new Parser());
Json::JsonObject jsonConfig( "[{\"name\" : \"BPR\" , \"size\" : 100, \"sections\":[\"SUMMARY\"], \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}]");
parser->loadKeywords( jsonConfig );
BOOST_CHECK(parser->isRecognizedKeyword("BPR"));
}
BOOST_AUTO_TEST_CASE(empty_sizeReturns0) {
ParserPtr parser(new Parser( false ));
BOOST_CHECK_EQUAL( 0U , parser->size());
}
BOOST_AUTO_TEST_CASE(loadKeywordsJSON_manyKeywords_returnstrue) {
ParserPtr parser(new Parser( false ));
Json::JsonObject jsonConfig( "[{\"name\" : \"BPR\" , \"size\" : 100, \"sections\":[\"SUMMARY\"] , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"DOUBLE\"}]}, {\"name\" : \"WWCT\", \"sections\":[\"SUMMARY\"], \"size\" : 0} , {\"name\" : \"EQUIL\", \"sections\":[\"PROPS\"], \"size\" : 0}]");
parser->loadKeywords( jsonConfig );
BOOST_CHECK(parser->isRecognizedKeyword("BPR"));
BOOST_CHECK(parser->isRecognizedKeyword("WWCT"));
BOOST_CHECK(parser->isRecognizedKeyword("EQUIL"));
BOOST_CHECK_EQUAL( 3U , parser->size() );
}
/*****************************************************************/
BOOST_AUTO_TEST_CASE(loadKeywordFromFile_fileDoesNotExist_returnsFalse) {
ParserPtr parser(new Parser());
boost::filesystem::path configFile("File/does/not/exist");
BOOST_CHECK_EQUAL( false , parser->loadKeywordFromFile( configFile ));
}
BOOST_AUTO_TEST_CASE(loadKeywordFromFile_invalidJson_returnsFalse) {
ParserPtr parser(new Parser());
boost::filesystem::path configFile("testdata/json/example_invalid_json");
BOOST_CHECK_EQUAL( false , parser->loadKeywordFromFile( configFile ));
}
BOOST_AUTO_TEST_CASE(loadKeywordFromFile_invalidConfig_returnsFalse) {
ParserPtr parser(new Parser());
boost::filesystem::path configFile("testdata/json/example_missing_name.json");
BOOST_CHECK_EQUAL( false , parser->loadKeywordFromFile( configFile ));
}
BOOST_AUTO_TEST_CASE(loadKeywordFromFile_validKeyword_returnsTrueHasKeyword) {
ParserPtr parser(new Parser( false ));
boost::filesystem::path configFile("testdata/json/BPR");
BOOST_CHECK_EQUAL( true , parser->loadKeywordFromFile( configFile ));
BOOST_CHECK_EQUAL( 1U , parser->size() );
BOOST_CHECK_EQUAL( true , parser->isRecognizedKeyword("BPR") );
}
BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_directoryDoesNotexist_throws) {
ParserPtr parser(new Parser(false));
boost::filesystem::path configPath("path/does/not/exist");
BOOST_CHECK_THROW(parser->loadKeywordsFromDirectory( configPath), std::invalid_argument);
}
BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_notRecursive_allNames) {
ParserPtr parser(new Parser(false));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("BPR"));
boost::filesystem::path configPath("testdata/config/directory1");
BOOST_CHECK_NO_THROW(parser->loadKeywordsFromDirectory( configPath, false));
BOOST_CHECK(parser->isRecognizedKeyword("WWCT"));
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("BPR"));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("DIMENS"));
}
BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_notRecursive_strictNames) {
ParserPtr parser(new Parser(false));
boost::filesystem::path configPath("testdata/config/directory1");
BOOST_CHECK_NO_THROW(parser->loadKeywordsFromDirectory( configPath, false));
BOOST_CHECK(parser->isRecognizedKeyword("WWCT"));
// the file name for the following keyword is "Bpr", but that
// does not matter
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("BPR"));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("DIMENS"));
}
BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_Recursive_allNames) {
ParserPtr parser(new Parser(false));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("BPR"));
boost::filesystem::path configPath("testdata/config/directory1");
BOOST_CHECK_NO_THROW(parser->loadKeywordsFromDirectory( configPath, true));
BOOST_CHECK(parser->isRecognizedKeyword("WWCT"));
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("BPR"));
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("DIMENS"));
}
BOOST_AUTO_TEST_CASE(loadConfigFromDirectory_default) {
ParserPtr parser(new Parser(false));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("BPR"));
boost::filesystem::path configPath("testdata/config/directory1");
BOOST_CHECK_NO_THROW(parser->loadKeywordsFromDirectory( configPath ));
BOOST_CHECK(parser->isRecognizedKeyword("WWCT"));
// the file name for the following keyword is "Bpr", but that
// does not matter
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("BPR"));
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("DIMENS"));
}
BOOST_AUTO_TEST_CASE(DropKeyword) {
ParserPtr parser(new Parser());
BOOST_CHECK_EQUAL(false , parser->dropParserKeyword("DoesNotHaveThis"));
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("BPR"));
BOOST_CHECK_EQUAL(true , parser->dropParserKeyword("BLOCK_PROBE"));
BOOST_CHECK_EQUAL(false , parser->dropParserKeyword("BLOCK_PROBE"));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("BPR"));
BOOST_CHECK_EQUAL(true , parser->isRecognizedKeyword("TVDPX"));
BOOST_CHECK_EQUAL(true , parser->dropParserKeyword("TVDP"));
BOOST_CHECK_EQUAL(false , parser->isRecognizedKeyword("TVDPX"));
}
BOOST_AUTO_TEST_CASE(ReplaceKeyword) {
ParserPtr parser(new Parser());
const auto* eqldims = parser->getParserKeywordFromDeckName("EQLDIMS");
BOOST_CHECK( parser->loadKeywordFromFile( "testdata/parser/EQLDIMS2" ) );
eqldims = parser->getParserKeywordFromDeckName("EQLDIMS");
auto record = eqldims->getRecord(0);
BOOST_CHECK(record->hasItem("NEW"));
}
BOOST_AUTO_TEST_CASE(WildCardTest) {
ParserPtr parser(new Parser());
BOOST_CHECK(!parser->isRecognizedKeyword("TVDP*"));
BOOST_CHECK(!parser->isRecognizedKeyword("TVDP"));
BOOST_CHECK(parser->isRecognizedKeyword("TVDPXXX"));
BOOST_CHECK(!parser->isRecognizedKeyword("TVDPIAMTOOLONG"));
BOOST_CHECK(!parser->isRecognizedKeyword("TVD"));
BOOST_CHECK(!parser->isRecognizedKeyword("TVDP"));
const auto* keyword1 = parser->getParserKeywordFromDeckName("TVDPA");
const auto* keyword2 = parser->getParserKeywordFromDeckName("TVDPBC");
const auto* keyword3 = parser->getParserKeywordFromDeckName("TVDPXXX");
BOOST_CHECK_EQUAL( keyword1 , keyword2 );
BOOST_CHECK_EQUAL( keyword1 , keyword3 );
}
BOOST_AUTO_TEST_CASE( quoted_comments ) {
BOOST_CHECK_EQUAL( Parser::stripComments( "ABC" ) , "ABC");
BOOST_CHECK_EQUAL( Parser::stripComments( "--ABC") , "");
BOOST_CHECK_EQUAL( Parser::stripComments( "ABC--DEF") , "ABC");
BOOST_CHECK_EQUAL( Parser::stripComments( "'ABC'--DEF") , "'ABC'");
BOOST_CHECK_EQUAL( Parser::stripComments( "\"ABC\"--DEF") , "\"ABC\"");
BOOST_CHECK_EQUAL( Parser::stripComments( "ABC--'DEF'") , "ABC");
BOOST_CHECK_EQUAL( Parser::stripComments("ABC'--'DEF") , "ABC'--'DEF");
BOOST_CHECK_EQUAL( Parser::stripComments("ABC'--'DEF\"--\"GHI") , "ABC'--'DEF\"--\"GHI");
BOOST_CHECK_EQUAL( Parser::stripComments("ABC'--'DEF'GHI") , "ABC'--'DEF'GHI");
BOOST_CHECK_EQUAL( Parser::stripComments("ABC'--'DEF'--GHI") , "ABC'--'DEF'--GHI");
}
BOOST_AUTO_TEST_CASE( PATHS_has_global_scope ) {
Parser parser;
parser.newDeckFromFile( "testdata/parser/PATHSInInclude.data", ParseMode() );
BOOST_CHECK_THROW( parser.newDeckFromFile( "testdata/parser/PATHSInIncludeInvalid.data", ParseMode() ), std::runtime_error );
}