mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-27 17:28:41 +00:00
Settings: Proper priority hierarchy
Remove old defaults system Introduce priority-based fallback list Use new functions for map_meta special functions Change groups to use end tags Unittest changes: * Adapt unittest to the new code * Compare Settings objects
This commit is contained in:
parent
5e9dd1667b
commit
37a05ec8d6
21 changed files with 358 additions and 298 deletions
|
@ -30,7 +30,7 @@ public:
|
|||
TestMapSettingsManager() { TestManager::registerTestModule(this); }
|
||||
const char *getName() { return "TestMapSettingsManager"; }
|
||||
|
||||
void makeUserConfig(Settings *conf);
|
||||
void makeUserConfig();
|
||||
std::string makeMetaFile(bool make_corrupt);
|
||||
|
||||
void runTests(IGameDef *gamedef);
|
||||
|
@ -65,8 +65,11 @@ void check_noise_params(const NoiseParams *np1, const NoiseParams *np2)
|
|||
}
|
||||
|
||||
|
||||
void TestMapSettingsManager::makeUserConfig(Settings *conf)
|
||||
void TestMapSettingsManager::makeUserConfig()
|
||||
{
|
||||
delete Settings::getLayer(SL_GLOBAL);
|
||||
Settings *conf = Settings::createLayer(SL_GLOBAL);
|
||||
|
||||
conf->set("mg_name", "v7");
|
||||
conf->set("seed", "5678");
|
||||
conf->set("water_level", "20");
|
||||
|
@ -103,12 +106,11 @@ std::string TestMapSettingsManager::makeMetaFile(bool make_corrupt)
|
|||
|
||||
void TestMapSettingsManager::testMapSettingsManager()
|
||||
{
|
||||
Settings user_settings;
|
||||
makeUserConfig(&user_settings);
|
||||
makeUserConfig();
|
||||
|
||||
std::string test_mapmeta_path = makeMetaFile(false);
|
||||
|
||||
MapSettingsManager mgr(&user_settings, test_mapmeta_path);
|
||||
MapSettingsManager mgr(test_mapmeta_path);
|
||||
std::string value;
|
||||
|
||||
UASSERT(mgr.getMapSetting("mg_name", &value));
|
||||
|
@ -140,6 +142,12 @@ void TestMapSettingsManager::testMapSettingsManager()
|
|||
mgr.setMapSettingNoiseParams("mgv5_np_height", &script_np_height);
|
||||
mgr.setMapSettingNoiseParams("mgv5_np_factor", &script_np_factor);
|
||||
|
||||
{
|
||||
NoiseParams dummy;
|
||||
mgr.getMapSettingNoiseParams("mgv5_np_factor", &dummy);
|
||||
check_noise_params(&dummy, &script_np_factor);
|
||||
}
|
||||
|
||||
// Now make our Params and see if the values are correctly sourced
|
||||
MapgenParams *params = mgr.makeMapgenParams();
|
||||
UASSERT(params->mgtype == MAPGEN_V5);
|
||||
|
@ -188,50 +196,66 @@ void TestMapSettingsManager::testMapSettingsManager()
|
|||
|
||||
void TestMapSettingsManager::testMapMetaSaveLoad()
|
||||
{
|
||||
Settings conf;
|
||||
std::string path = getTestTempDirectory()
|
||||
+ DIR_DELIM + "foobar" + DIR_DELIM + "map_meta.txt";
|
||||
|
||||
makeUserConfig();
|
||||
Settings &conf = *Settings::getLayer(SL_GLOBAL);
|
||||
|
||||
// There cannot be two MapSettingsManager
|
||||
// copy the mapgen params to compare them
|
||||
MapgenParams params1, params2;
|
||||
// Create a set of mapgen params and save them to map meta
|
||||
conf.set("seed", "12345");
|
||||
conf.set("water_level", "5");
|
||||
MapSettingsManager mgr1(&conf, path);
|
||||
MapgenParams *params1 = mgr1.makeMapgenParams();
|
||||
UASSERT(params1);
|
||||
UASSERT(mgr1.saveMapMeta());
|
||||
{
|
||||
conf.set("seed", "12345");
|
||||
conf.set("water_level", "5");
|
||||
MapSettingsManager mgr(path);
|
||||
MapgenParams *params = mgr.makeMapgenParams();
|
||||
UASSERT(params);
|
||||
params1 = *params;
|
||||
params1.bparams = nullptr; // No double-free
|
||||
UASSERT(mgr.saveMapMeta());
|
||||
}
|
||||
|
||||
// Now try loading the map meta to mapgen params
|
||||
conf.set("seed", "67890");
|
||||
conf.set("water_level", "32");
|
||||
MapSettingsManager mgr2(&conf, path);
|
||||
UASSERT(mgr2.loadMapMeta());
|
||||
MapgenParams *params2 = mgr2.makeMapgenParams();
|
||||
UASSERT(params2);
|
||||
{
|
||||
conf.set("seed", "67890");
|
||||
conf.set("water_level", "32");
|
||||
MapSettingsManager mgr(path);
|
||||
UASSERT(mgr.loadMapMeta());
|
||||
MapgenParams *params = mgr.makeMapgenParams();
|
||||
UASSERT(params);
|
||||
params2 = *params;
|
||||
params2.bparams = nullptr; // No double-free
|
||||
}
|
||||
|
||||
// Check that both results are correct
|
||||
UASSERTEQ(u64, params1->seed, 12345);
|
||||
UASSERTEQ(s16, params1->water_level, 5);
|
||||
UASSERTEQ(u64, params2->seed, 12345);
|
||||
UASSERTEQ(s16, params2->water_level, 5);
|
||||
UASSERTEQ(u64, params1.seed, 12345);
|
||||
UASSERTEQ(s16, params1.water_level, 5);
|
||||
UASSERTEQ(u64, params2.seed, 12345);
|
||||
UASSERTEQ(s16, params2.water_level, 5);
|
||||
}
|
||||
|
||||
|
||||
void TestMapSettingsManager::testMapMetaFailures()
|
||||
{
|
||||
std::string test_mapmeta_path;
|
||||
Settings conf;
|
||||
|
||||
// Check to see if it'll fail on a non-existent map meta file
|
||||
test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt";
|
||||
UASSERT(!fs::PathExists(test_mapmeta_path));
|
||||
{
|
||||
test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt";
|
||||
UASSERT(!fs::PathExists(test_mapmeta_path));
|
||||
|
||||
MapSettingsManager mgr1(&conf, test_mapmeta_path);
|
||||
UASSERT(!mgr1.loadMapMeta());
|
||||
MapSettingsManager mgr1(test_mapmeta_path);
|
||||
UASSERT(!mgr1.loadMapMeta());
|
||||
}
|
||||
|
||||
// Check to see if it'll fail on a corrupt map meta file
|
||||
test_mapmeta_path = makeMetaFile(true);
|
||||
UASSERT(fs::PathExists(test_mapmeta_path));
|
||||
{
|
||||
test_mapmeta_path = makeMetaFile(true);
|
||||
UASSERT(fs::PathExists(test_mapmeta_path));
|
||||
|
||||
MapSettingsManager mgr2(&conf, test_mapmeta_path);
|
||||
UASSERT(!mgr2.loadMapMeta());
|
||||
MapSettingsManager mgr2(test_mapmeta_path);
|
||||
UASSERT(!mgr2.loadMapMeta());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
#include <cmath>
|
||||
#include "settings.h"
|
||||
#include "defaultsettings.h"
|
||||
#include "noise.h"
|
||||
|
||||
class TestSettings : public TestBase {
|
||||
|
@ -31,6 +32,7 @@ public:
|
|||
void runTests(IGameDef *gamedef);
|
||||
|
||||
void testAllSettings();
|
||||
void testDefaults();
|
||||
void testFlagDesc();
|
||||
|
||||
static const char *config_text_before;
|
||||
|
@ -42,6 +44,7 @@ static TestSettings g_test_instance;
|
|||
void TestSettings::runTests(IGameDef *gamedef)
|
||||
{
|
||||
TEST(testAllSettings);
|
||||
TEST(testDefaults);
|
||||
TEST(testFlagDesc);
|
||||
}
|
||||
|
||||
|
@ -70,7 +73,8 @@ const char *TestSettings::config_text_before =
|
|||
" with leading whitespace!\n"
|
||||
"\"\"\"\n"
|
||||
"np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n"
|
||||
"zoop = true";
|
||||
"zoop = true\n"
|
||||
"[dummy_eof_end_tag]\n";
|
||||
|
||||
const std::string TestSettings::config_text_after =
|
||||
"leet = 1337\n"
|
||||
|
@ -111,12 +115,34 @@ const std::string TestSettings::config_text_after =
|
|||
" animals = cute\n"
|
||||
" num_apples = 4\n"
|
||||
" num_oranges = 53\n"
|
||||
"}\n";
|
||||
"}\n"
|
||||
"[dummy_eof_end_tag]";
|
||||
|
||||
void compare_settings(const std::string &name, Settings *a, Settings *b)
|
||||
{
|
||||
auto keys = a->getNames();
|
||||
Settings *group1, *group2;
|
||||
std::string value1, value2;
|
||||
for (auto &key : keys) {
|
||||
if (a->getGroupNoEx(key, group1)) {
|
||||
UASSERT(b->getGroupNoEx(key, group2));
|
||||
|
||||
compare_settings(name + "->" + key, group1, group2);
|
||||
continue;
|
||||
}
|
||||
|
||||
UASSERT(b->getNoEx(key, value1));
|
||||
// For identification
|
||||
value1 = name + "->" + key + "=" + value1;
|
||||
value2 = name + "->" + key + "=" + a->get(key);
|
||||
UASSERTCMP(std::string, ==, value2, value1);
|
||||
}
|
||||
}
|
||||
|
||||
void TestSettings::testAllSettings()
|
||||
{
|
||||
try {
|
||||
Settings s;
|
||||
Settings s("[dummy_eof_end_tag]");
|
||||
|
||||
// Test reading of settings
|
||||
std::istringstream is(config_text_before);
|
||||
|
@ -197,21 +223,44 @@ void TestSettings::testAllSettings()
|
|||
is.clear();
|
||||
is.seekg(0);
|
||||
|
||||
UASSERT(s.updateConfigObject(is, os, "", 0) == true);
|
||||
//printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER);
|
||||
//printf(">>>> actual config:\n%s\n", os.str().c_str());
|
||||
#if __cplusplus < 201103L
|
||||
// This test only works in older C++ versions than C++11 because we use unordered_map
|
||||
UASSERT(os.str() == config_text_after);
|
||||
#endif
|
||||
UASSERT(s.updateConfigObject(is, os, 0) == true);
|
||||
|
||||
{
|
||||
// Confirm settings
|
||||
Settings s2("[dummy_eof_end_tag]");
|
||||
std::istringstream is(config_text_after, std::ios_base::binary);
|
||||
s2.parseConfigLines(is);
|
||||
|
||||
compare_settings("(main)", &s, &s2);
|
||||
}
|
||||
|
||||
} catch (SettingNotFoundException &e) {
|
||||
UASSERT(!"Setting not found!");
|
||||
}
|
||||
}
|
||||
|
||||
void TestSettings::testDefaults()
|
||||
{
|
||||
Settings *game = Settings::createLayer(SL_GAME);
|
||||
Settings *def = Settings::getLayer(SL_DEFAULTS);
|
||||
|
||||
def->set("name", "FooBar");
|
||||
UASSERT(def->get("name") == "FooBar");
|
||||
UASSERT(game->get("name") == "FooBar");
|
||||
|
||||
game->set("name", "Baz");
|
||||
UASSERT(game->get("name") == "Baz");
|
||||
|
||||
delete game;
|
||||
|
||||
// Restore default settings
|
||||
delete Settings::getLayer(SL_DEFAULTS);
|
||||
set_default_settings();
|
||||
}
|
||||
|
||||
void TestSettings::testFlagDesc()
|
||||
{
|
||||
Settings s;
|
||||
Settings &s = *Settings::createLayer(SL_GAME);
|
||||
FlagDesc flagdesc[] = {
|
||||
{ "biomes", 0x01 },
|
||||
{ "trees", 0x02 },
|
||||
|
@ -242,4 +291,6 @@ void TestSettings::testFlagDesc()
|
|||
// Enabled: tables
|
||||
s.set("test_flags", "16");
|
||||
UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == 0x10);
|
||||
|
||||
delete &s;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue