1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-03 09:09:47 +02:00

config: add tests on reading good and bad configuration files

This commit is contained in:
Anonymous Maarten 2017-02-17 01:17:50 +01:00 committed by Daniel Evans
parent 1dc06d9a35
commit ed185f2526
3 changed files with 89 additions and 12 deletions

View File

@ -183,7 +183,8 @@ bool GameConfig::parseConfig(
auto deft = StringTranslator();
auto boolt = BoolTranslator();
//Add new configuration parameters here.
// Add new configuration parameters here.
// Additionally, add them to the unit test.
// @todo Don't allow path separators and relative directories
read_config("game.path", this->m_gamePath, "/opt/games/Grand Theft Auto 3", deft, false);

View File

@ -8,7 +8,7 @@ else()
add_definitions(-DRW_TEST_WITH_DATA=1)
endif()
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
find_package(Boost COMPONENTS filesystem unit_test_framework REQUIRED)
set(TEST_SOURCES
"main.cpp"

View File

@ -1,28 +1,104 @@
#include <GameConfig.hpp>
#include <boost/filesystem.hpp>
#include <boost/test/unit_test.hpp>
#include <fstream>
#include <map>
namespace fs = boost::filesystem;
typedef std::map<std::string, std::map<std::string, std::string>> config_t;
fs::path getRandomFilePath() {
return fs::unique_path(fs::temp_directory_path() /= "openrw_test_%%%%%%%%%%%%%%%%");
}
config_t getValidConfig() {
config_t result;
result["game"]["\tpath "] = "\t/dev/test \t \r\n";
result["game"]["language\t "] = " american ;american english french german italian spanish.";
result["input"]["invert_y"] = "1 #values != 0 enable input inversion. Optional.";
return result;
}
std::ostream &writeConfig(std::ostream &os, const config_t &config) {
for (auto &section : config) {
os << "[" << section.first << "]" << "\n";
for (auto &keyValue : section.second) {
os << keyValue.first << "=" << keyValue.second << "\n";
}
}
return os;
}
#include <iostream>
BOOST_AUTO_TEST_SUITE(ConfigTests)
BOOST_AUTO_TEST_CASE(test_config_valid) {
auto cfg = getValidConfig();
auto configPath = getRandomFilePath();
BOOST_AUTO_TEST_CASE(test_loading) {
// Write out a temporary file
std::ofstream test_config("/tmp/openrw_test.ini");
test_config << "[game]\n"
<< "\tpath=\t/dev/test\n"
<< " language = american ;Comment\n"
<< ";lineComment\n"
<< "nonexistingkey=somevalue"
<< std::endl;
std::ofstream ofs(configPath.string());
writeConfig(ofs, cfg);
ofs.close();
GameConfig config("openrw_test.ini", "/tmp");
GameConfig config(configPath.filename().string(),
configPath.parent_path().string());
BOOST_CHECK(config.isValid());
BOOST_CHECK_EQUAL(config.getGameDataPath(), "/dev/test");
BOOST_CHECK_EQUAL(config.getGameLanguage(), "american");
BOOST_CHECK_EQUAL(config.getInputInvertY(), true);
}
BOOST_AUTO_TEST_CASE(test_config_valid_modified) {
auto cfg = getValidConfig();
cfg["input"]["invert_y"] = "0";
auto configPath = getRandomFilePath();
std::ofstream ofs(configPath.string());
writeConfig(ofs, cfg);
ofs.close();
GameConfig config(configPath.filename().string(),
configPath.parent_path().string());
BOOST_CHECK(config.isValid());
BOOST_CHECK_EQUAL(config.getInputInvertY(), false);
}
BOOST_AUTO_TEST_CASE(test_config_invalid_duplicate) {
auto cfg = getValidConfig();
cfg["input"]["invert_y "] = "0";
auto configPath = getRandomFilePath();
std::ofstream ofs(configPath.string());
writeConfig(ofs, cfg);
ofs.close();
GameConfig config(configPath.filename().string(),
configPath.parent_path().string());
BOOST_CHECK(!config.isValid());
}
BOOST_AUTO_TEST_CASE(test_config_invalid_empty) {
config_t cfg;
auto configPath = getRandomFilePath();
std::cout << configPath.string() << "\n";
std::ofstream ofs(configPath.string());
writeConfig(ofs, cfg);
ofs.close();
GameConfig config(configPath.filename().string(),
configPath.parent_path().string());
BOOST_CHECK(!config.isValid());
}
BOOST_AUTO_TEST_SUITE_END()