123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- /*
- Minetest
- Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- This program 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 Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- #include "test.h"
- #include <cmath>
- #include "settings.h"
- #include "defaultsettings.h"
- #include "noise.h"
- class TestSettings : public TestBase {
- public:
- TestSettings() { TestManager::registerTestModule(this); }
- const char *getName() { return "TestSettings"; }
- void runTests(IGameDef *gamedef);
- void testAllSettings();
- void testDefaults();
- void testFlagDesc();
- static const char *config_text_before;
- static const std::string config_text_after;
- };
- static TestSettings g_test_instance;
- void TestSettings::runTests(IGameDef *gamedef)
- {
- TEST(testAllSettings);
- TEST(testDefaults);
- TEST(testFlagDesc);
- }
- ////////////////////////////////////////////////////////////////////////////////
- const char *TestSettings::config_text_before =
- "leet = 1337\n"
- "leetleet = 13371337\n"
- "leetleet_neg = -13371337\n"
- "floaty_thing = 1.1\n"
- "stringy_thing = asd /( ¤%&(/\" BLÖÄRP\n"
- "coord = (1, 2, 4.5)\n"
- " # this is just a comment\n"
- "this is an invalid line\n"
- "asdf = {\n"
- " a = 5\n"
- " bb = 2.5\n"
- " ccc = \"\"\"\n"
- "testy\n"
- " testa \n"
- "\"\"\"\n"
- "\n"
- "}\n"
- "blarg = \"\"\" \n"
- "some multiline text\n"
- " with leading whitespace!\n"
- "\"\"\"\n"
- "np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.700012505, 2.40012503\n"
- "zoop = true\n"
- "[dummy_eof_end_tag]\n";
- const std::string TestSettings::config_text_after =
- "leet = 1337\n"
- "leetleet = 13371337\n"
- "leetleet_neg = -13371337\n"
- "floaty_thing = 1.1\n"
- "stringy_thing = asd /( ¤%&(/\" BLÖÄRP\n"
- "coord = (1, 2, 4.5)\n"
- " # this is just a comment\n"
- "this is an invalid line\n"
- "asdf = {\n"
- " a = 5\n"
- " bb = 2.5\n"
- " ccc = \"\"\"\n"
- "testy\n"
- " testa \n"
- "\"\"\"\n"
- "\n"
- "}\n"
- "blarg = \"\"\" \n"
- "some multiline text\n"
- " with leading whitespace!\n"
- "\"\"\"\n"
- "np_terrain = {\n"
- " flags = defaults\n"
- " lacunarity = 2.40012503\n"
- " octaves = 6\n"
- " offset = 3.5\n"
- " persistence = 0.700012505\n"
- " scale = 40\n"
- " seed = 12341\n"
- " spread = (250,250,250)\n"
- "}\n"
- "zoop = true\n"
- "coord2 = (1,2,3.3)\n"
- "floaty_thing_2 = 1.25\n"
- "groupy_thing = {\n"
- " animals = cute\n"
- " num_apples = 4\n"
- " num_oranges = 53\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("[dummy_eof_end_tag]");
- // Test reading of settings
- std::istringstream is(config_text_before);
- s.parseConfigLines(is);
- UASSERT(s.getS32("leet") == 1337);
- UASSERT(s.getS16("leetleet") == 32767);
- UASSERT(s.getS16("leetleet_neg") == -32768);
- // Not sure if 1.1 is an exact value as a float, but doesn't matter
- UASSERT(fabs(s.getFloat("floaty_thing") - 1.1) < 0.001);
- UASSERT(s.get("stringy_thing") == "asd /( ¤%&(/\" BLÖÄRP");
- UASSERT(fabs(s.getV3F("coord").X - 1.0) < 0.001);
- UASSERT(fabs(s.getV3F("coord").Y - 2.0) < 0.001);
- UASSERT(fabs(s.getV3F("coord").Z - 4.5) < 0.001);
- // Test the setting of settings too
- s.setFloat("floaty_thing_2", 1.25);
- s.setV3F("coord2", v3f(1, 2, 3.3));
- UASSERT(s.get("floaty_thing_2").substr(0,4) == "1.25");
- UASSERT(fabs(s.getFloat("floaty_thing_2") - 1.25) < 0.001);
- UASSERT(fabs(s.getV3F("coord2").X - 1.0) < 0.001);
- UASSERT(fabs(s.getV3F("coord2").Y - 2.0) < 0.001);
- UASSERT(fabs(s.getV3F("coord2").Z - 3.3) < 0.001);
- // Test settings groups
- Settings *group = s.getGroup("asdf");
- UASSERT(group != NULL);
- UASSERT(s.getGroupNoEx("zoop", group) == false);
- UASSERT(group->getS16("a") == 5);
- UASSERT(fabs(group->getFloat("bb") - 2.5) < 0.001);
- Settings group3;
- group3.set("cat", "meow");
- group3.set("dog", "woof");
- Settings group2;
- group2.setS16("num_apples", 4);
- group2.setS16("num_oranges", 53);
- group2.setGroup("animals", group3);
- group2.set("animals", "cute"); //destroys group 3
- s.setGroup("groupy_thing", group2);
- // Test set failure conditions
- UASSERT(s.set("Zoop = Poop\nsome_other_setting", "false") == false);
- UASSERT(s.set("sneaky", "\"\"\"\njabberwocky = false") == false);
- UASSERT(s.set("hehe", "asdfasdf\n\"\"\"\nsomething = false") == false);
- // Test multiline settings
- UASSERT(group->get("ccc") == "testy\n testa ");
- UASSERT(s.get("blarg") ==
- "some multiline text\n"
- " with leading whitespace!");
- // Test NoiseParams
- UASSERT(s.getEntry("np_terrain").is_group == false);
- NoiseParams np;
- UASSERT(s.getNoiseParams("np_terrain", np) == true);
- UASSERT(std::fabs(np.offset - 5) < 0.001f);
- UASSERT(std::fabs(np.scale - 40) < 0.001f);
- UASSERT(std::fabs(np.spread.X - 250) < 0.001f);
- UASSERT(std::fabs(np.spread.Y - 250) < 0.001f);
- UASSERT(std::fabs(np.spread.Z - 250) < 0.001f);
- UASSERT(np.seed == 12341);
- UASSERT(np.octaves == 5);
- UASSERT(std::fabs(np.persist - 0.7) < 0.001f);
- np.offset = 3.5;
- np.octaves = 6;
- s.setNoiseParams("np_terrain", np);
- UASSERT(s.getEntry("np_terrain").is_group == true);
- // Test writing
- std::ostringstream os(std::ios_base::binary);
- is.clear();
- is.seekg(0);
- 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);
- UASSERT(s2.parseConfigLines(is) == true);
- 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::createLayer(SL_GAME);
- FlagDesc flagdesc[] = {
- { "biomes", 0x01 },
- { "trees", 0x02 },
- { "jungles", 0x04 },
- { "oranges", 0x08 },
- { "tables", 0x10 },
- { nullptr, 0 }
- };
- // Enabled: biomes, jungles, oranges (default)
- s.setDefault("test_desc", flagdesc, readFlagString(
- "biomes,notrees,jungles,oranges", flagdesc, nullptr));
- UASSERT(s.getFlagStr("test_desc", flagdesc, nullptr) == (0x01 | 0x04 | 0x08));
- // Enabled: jungles, oranges, tables
- s.set("test_desc", "nobiomes,tables");
- UASSERT(s.getFlagStr("test_desc", flagdesc, nullptr) == (0x04 | 0x08 | 0x10));
- // Enabled: (nothing)
- s.set("test_desc", "nobiomes,nojungles,nooranges,notables");
- UASSERT(s.getFlagStr("test_desc", flagdesc, nullptr) == 0x00);
- // Numeric flag tests (override)
- // Enabled: trees, tables
- s.setDefault("test_flags", flagdesc, 0x02 | 0x10);
- UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == (0x02 | 0x10));
- // Enabled: tables
- s.set("test_flags", "16");
- UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == 0x10);
- delete &s;
- }
|