3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 class TestSettings : public TestBase {
28 TestSettings() { TestManager::registerTestModule(this); }
29 const char *getName() { return "TestSettings"; }
31 void runTests(IGameDef *gamedef);
33 void testAllSettings();
36 static const char *config_text_before;
37 static const std::string config_text_after;
40 static TestSettings g_test_instance;
42 void TestSettings::runTests(IGameDef *gamedef)
44 TEST(testAllSettings);
48 ////////////////////////////////////////////////////////////////////////////////
50 const char *TestSettings::config_text_before =
52 "leetleet = 13371337\n"
53 "leetleet_neg = -13371337\n"
54 "floaty_thing = 1.1\n"
55 "stringy_thing = asd /( ¤%&(/\" BLÖÄRP\n"
56 "coord = (1, 2, 4.5)\n"
57 " # this is just a comment\n"
58 "this is an invalid line\n"
69 "some multiline text\n"
70 " with leading whitespace!\n"
72 "np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n"
75 const std::string TestSettings::config_text_after =
77 "leetleet = 13371337\n"
78 "leetleet_neg = -13371337\n"
79 "floaty_thing = 1.1\n"
80 "stringy_thing = asd /( ¤%&(/\" BLÖÄRP\n"
81 "coord = (1, 2, 4.5)\n"
82 " # this is just a comment\n"
83 "this is an invalid line\n"
94 "some multiline text\n"
95 " with leading whitespace!\n"
102 " persistence = 0.7\n"
105 " spread = (250,250,250)\n"
108 "coord2 = (1,2,3.3)\n"
109 "floaty_thing_2 = 1.2\n"
113 " num_oranges = 53\n"
116 void TestSettings::testAllSettings()
121 // Test reading of settings
122 std::istringstream is(config_text_before);
123 s.parseConfigLines(is);
125 UASSERT(s.getS32("leet") == 1337);
126 UASSERT(s.getS16("leetleet") == 32767);
127 UASSERT(s.getS16("leetleet_neg") == -32768);
129 // Not sure if 1.1 is an exact value as a float, but doesn't matter
130 UASSERT(fabs(s.getFloat("floaty_thing") - 1.1) < 0.001);
131 UASSERT(s.get("stringy_thing") == "asd /( ¤%&(/\" BLÖÄRP");
132 UASSERT(fabs(s.getV3F("coord").X - 1.0) < 0.001);
133 UASSERT(fabs(s.getV3F("coord").Y - 2.0) < 0.001);
134 UASSERT(fabs(s.getV3F("coord").Z - 4.5) < 0.001);
136 // Test the setting of settings too
137 s.setFloat("floaty_thing_2", 1.2);
138 s.setV3F("coord2", v3f(1, 2, 3.3));
139 UASSERT(s.get("floaty_thing_2").substr(0,3) == "1.2");
140 UASSERT(fabs(s.getFloat("floaty_thing_2") - 1.2) < 0.001);
141 UASSERT(fabs(s.getV3F("coord2").X - 1.0) < 0.001);
142 UASSERT(fabs(s.getV3F("coord2").Y - 2.0) < 0.001);
143 UASSERT(fabs(s.getV3F("coord2").Z - 3.3) < 0.001);
145 // Test settings groups
146 Settings *group = s.getGroup("asdf");
147 UASSERT(group != NULL);
148 UASSERT(s.getGroupNoEx("zoop", group) == false);
149 UASSERT(group->getS16("a") == 5);
150 UASSERT(fabs(group->getFloat("bb") - 2.5) < 0.001);
152 Settings *group3 = new Settings;
153 group3->set("cat", "meow");
154 group3->set("dog", "woof");
156 Settings *group2 = new Settings;
157 group2->setS16("num_apples", 4);
158 group2->setS16("num_oranges", 53);
159 group2->setGroup("animals", group3);
160 group2->set("animals", "cute"); //destroys group 3
161 s.setGroup("groupy_thing", group2);
163 // Test set failure conditions
164 UASSERT(s.set("Zoop = Poop\nsome_other_setting", "false") == false);
165 UASSERT(s.set("sneaky", "\"\"\"\njabberwocky = false") == false);
166 UASSERT(s.set("hehe", "asdfasdf\n\"\"\"\nsomething = false") == false);
168 // Test multiline settings
169 UASSERT(group->get("ccc") == "testy\n testa ");
171 UASSERT(s.get("blarg") ==
172 "some multiline text\n"
173 " with leading whitespace!");
176 UASSERT(s.getEntry("np_terrain").is_group == false);
179 UASSERT(s.getNoiseParams("np_terrain", np) == true);
180 UASSERT(std::fabs(np.offset - 5) < 0.001f);
181 UASSERT(std::fabs(np.scale - 40) < 0.001f);
182 UASSERT(std::fabs(np.spread.X - 250) < 0.001f);
183 UASSERT(std::fabs(np.spread.Y - 250) < 0.001f);
184 UASSERT(std::fabs(np.spread.Z - 250) < 0.001f);
185 UASSERT(np.seed == 12341);
186 UASSERT(np.octaves == 5);
187 UASSERT(std::fabs(np.persist - 0.7) < 0.001f);
191 s.setNoiseParams("np_terrain", np);
193 UASSERT(s.getEntry("np_terrain").is_group == true);
196 std::ostringstream os(std::ios_base::binary);
200 UASSERT(s.updateConfigObject(is, os, "", 0) == true);
201 //printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER);
202 //printf(">>>> actual config:\n%s\n", os.str().c_str());
203 #if __cplusplus < 201103L
204 // This test only works in older C++ versions than C++11 because we use unordered_map
205 UASSERT(os.str() == config_text_after);
207 } catch (SettingNotFoundException &e) {
208 UASSERT(!"Setting not found!");
212 void TestSettings::testFlagDesc()
215 FlagDesc flagdesc[] = {
224 // Enabled: biomes, jungles, oranges (default)
225 s.setDefault("test_desc", flagdesc, readFlagString(
226 "biomes,notrees,jungles,oranges", flagdesc, nullptr));
227 UASSERT(s.getFlagStr("test_desc", flagdesc, nullptr) == (0x01 | 0x04 | 0x08));
229 // Enabled: jungles, oranges, tables
230 s.set("test_desc", "nobiomes,tables");
231 UASSERT(s.getFlagStr("test_desc", flagdesc, nullptr) == (0x04 | 0x08 | 0x10));
233 // Enabled: (nothing)
234 s.set("test_desc", "nobiomes,nojungles,nooranges,notables");
235 UASSERT(s.getFlagStr("test_desc", flagdesc, nullptr) == 0x00);
237 // Numeric flag tests (override)
238 // Enabled: trees, tables
239 s.setDefault("test_flags", flagdesc, 0x02 | 0x10);
240 UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == (0x02 | 0x10));
243 s.set("test_flags", "16");
244 UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == 0x10);