1#define CATCH_CONFIG_MAIN
2#include "../../catch2/catch.hpp"
6#include "../../../include/app/appConfigurator.hpp"
8using namespace mx::app;
17SCENARIO(
"config file parsing",
"[appConfigurator]" )
19 GIVEN(
"a basic config file" )
24 {
"",
"",
"",
"",
"",
"" },
25 {
"key0",
"key1",
"key2",
"key3",
"key4",
"key5" },
26 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val5" } );
29 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
30 config.add(
"key1",
"",
"", 0,
"",
"key1",
false,
"",
"" );
31 config.add(
"key2",
"",
"", 0,
"",
"key2",
false,
"",
"" );
32 config.add(
"key3",
"",
"", 0,
"",
"key3",
false,
"",
"" );
33 config.add(
"key4",
"",
"", 0,
"",
"key4",
false,
"",
"" );
34 config.add(
"key5",
"",
"", 0,
"",
"key5",
false,
"",
"" );
36 config.readConfig(
"/tmp/test.conf" );
40 config( val,
"key0" );
41 REQUIRE( val ==
"val0" );
43 config( val,
"key1" );
44 REQUIRE( val ==
"val1" );
46 config( val,
"key2" );
47 REQUIRE( val ==
"val2" );
49 config( val,
"key3" );
50 REQUIRE( val ==
"val3" );
52 config( val,
"key4" );
53 REQUIRE( val ==
"val4" );
55 config( val,
"key5" );
56 REQUIRE( val ==
"val5" );
59 WHEN(
"sections, unique keys" )
62 {
"",
"",
"sect1",
"sect1",
"sect2",
"sect2" },
63 {
"key0",
"key1",
"key2",
"key3",
"key4",
"key5" },
64 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val5" } );
67 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
68 config.add(
"key1",
"",
"", 0,
"",
"key1",
false,
"",
"" );
69 config.add(
"sect1.key2",
"",
"", 0,
"sect1",
"key2",
false,
"",
"" );
70 config.add(
"sect1.key3",
"",
"", 0,
"sect1",
"key3",
false,
"",
"" );
71 config.add(
"sect2.key4",
"",
"", 0,
"sect2",
"key4",
false,
"",
"" );
72 config.add(
"sect2.key5",
"",
"", 0,
"sect2",
"key5",
false,
"",
"" );
74 config.readConfig(
"/tmp/test.conf" );
78 config( val,
"key0" );
79 REQUIRE( val ==
"val0" );
81 config( val,
"key1" );
82 REQUIRE( val ==
"val1" );
84 config( val,
"sect1.key2" );
85 REQUIRE( val ==
"val2" );
87 config( val,
"sect1.key3" );
88 REQUIRE( val ==
"val3" );
90 config( val,
"sect2.key4" );
91 REQUIRE( val ==
"val4" );
93 config( val,
"sect2.key5" );
94 REQUIRE( val ==
"val5" );
97 WHEN(
"sections, repeated keys still unique within sections" )
100 {
"",
"",
"sect1",
"sect1",
"sect2",
"sect2" },
101 {
"key0",
"key1",
"key2",
"key3",
"key2",
"key3" },
102 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val5" } );
105 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
106 config.add(
"key1",
"",
"", 0,
"",
"key1",
false,
"",
"" );
107 config.add(
"sect1.key2",
"",
"", 0,
"sect1",
"key2",
false,
"",
"" );
108 config.add(
"sect1.key3",
"",
"", 0,
"sect1",
"key3",
false,
"",
"" );
109 config.add(
"sect2.key2",
"",
"", 0,
"sect2",
"key2",
false,
"",
"" );
110 config.add(
"sect2.key3",
"",
"", 0,
"sect2",
"key3",
false,
"",
"" );
112 config.readConfig(
"/tmp/test.conf" );
116 config( val,
"key0" );
117 REQUIRE( val ==
"val0" );
119 config( val,
"key1" );
120 REQUIRE( val ==
"val1" );
122 config( val,
"sect1.key2" );
123 REQUIRE( val ==
"val2" );
125 config( val,
"sect1.key3" );
126 REQUIRE( val ==
"val3" );
128 config( val,
"sect2.key2" );
129 REQUIRE( val ==
"val4" );
131 config( val,
"sect2.key3" );
132 REQUIRE( val ==
"val5" );
136 GIVEN(
"a config file with unused entries" )
139 WHEN(
"no sections, unused entry in middle" )
142 {
"",
"",
"",
"",
"",
"" },
143 {
"key0",
"key1",
"key2",
"key3",
"key4",
"key5" },
144 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val5" } );
147 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
148 config.add(
"key1",
"",
"", 0,
"",
"key1",
false,
"",
"" );
149 config.add(
"key2",
"",
"", 0,
"",
"key2",
false,
"",
"" );
150 config.add(
"key4",
"",
"", 0,
"",
"key4",
false,
"",
"" );
151 config.add(
"key5",
"",
"", 0,
"",
"key5",
false,
"",
"" );
153 config.readConfig(
"/tmp/test.conf" );
158 config( val,
"key0" );
159 REQUIRE( val ==
"val0" );
161 config( val,
"key1" );
162 REQUIRE( val ==
"val1" );
164 config( val,
"key2" );
165 REQUIRE( val ==
"val2" );
167 config( val,
"key4" );
168 REQUIRE( val ==
"val4" );
170 config( val,
"key5" );
171 REQUIRE( val ==
"val5" );
174 REQUIRE( config.m_unusedConfigs[
iniFile::makeKey(
"",
"key3" )].used ==
false );
177 config.configUnused( val,
"",
"key3" );
178 REQUIRE( val ==
"val3" );
181 REQUIRE( config.m_unusedConfigs[
iniFile::makeKey(
"",
"key3" )].used ==
true );
184 WHEN(
"sections, repeated keys, unused sections" )
187 {
"",
"",
"sect1",
"sect1",
"sect2",
"sect2",
"sect3" },
188 {
"key0",
"key1",
"key2",
"key3",
"key2",
"key3",
"key4" },
189 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val5",
"val6" } );
192 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
193 config.add(
"key1",
"",
"", 0,
"",
"key1",
false,
"",
"" );
194 config.add(
"sect2.key2",
"",
"", 0,
"sect2",
"key2",
false,
"",
"" );
195 config.add(
"sect2.key3",
"",
"", 0,
"sect2",
"key3",
false,
"",
"" );
197 config.readConfig(
"/tmp/test.conf" );
201 config( val,
"key0" );
202 REQUIRE( val ==
"val0" );
204 config( val,
"key1" );
205 REQUIRE( val ==
"val1" );
207 config( val,
"sect2.key2" );
208 REQUIRE( val ==
"val4" );
210 config( val,
"sect2.key3" );
211 REQUIRE( val ==
"val5" );
213 config.configUnused( val,
"sect1",
"key2" );
214 REQUIRE( val ==
"val2" );
216 config.configUnused( val,
"sect1",
"key3" );
217 REQUIRE( val ==
"val3" );
219 config.configUnused( val,
"sect3",
"key4" );
220 REQUIRE( val ==
"val6" );
222 std::vector<std::string> sections;
223 config.unusedSections( sections );
224 REQUIRE( sections.size() == 2 );
225 REQUIRE( ( sections[0] ==
"sect1" || sections[1] ==
"sect1" ) );
226 REQUIRE( ( sections[0] ==
"sect3" || sections[1] ==
"sect3" ) );
231 GIVEN(
"a config file with repeated keys within the same section" )
233 WHEN(
"no sections" )
236 {
"",
"",
"",
"",
"",
"" },
237 {
"key0",
"key0",
"key2",
"key2",
"key4",
"key4" },
238 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val5" } );
241 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
242 config.add(
"key2",
"",
"", 0,
"",
"key2",
false,
"",
"" );
243 config.add(
"key4",
"",
"", 0,
"",
"key4",
false,
"",
"" );
245 config.readConfig(
"/tmp/test.conf" );
249 config( val,
"key0" );
250 REQUIRE( val ==
"val0val1" );
252 config( val,
"key2" );
253 REQUIRE( val ==
"val2val3" );
255 config( val,
"key4" );
256 REQUIRE( val ==
"val4val5" );
259 WHEN(
"repeated sections and keys" )
262 {
"",
"sect1",
"sect2",
"sect1",
"sect2",
"sect2",
"sect3" },
263 {
"key0",
"key1",
"key2",
"key1",
"key2",
"key2",
"key3" },
264 {
"val0",
"val1",
"val2",
"val3",
"val4",
"val4.1",
"val5" } );
267 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
268 config.add(
"key1",
"",
"", 0,
"sect1",
"key1",
false,
"",
"" );
269 config.add(
"key2",
"",
"", 0,
"sect2",
"key2",
false,
"",
"" );
270 config.add(
"key3",
"",
"", 0,
"sect3",
"key3",
false,
"",
"" );
272 config.readConfig(
"/tmp/test7.conf" );
276 config( val,
"key0" );
277 REQUIRE( val ==
"val0" );
279 config( val,
"key1" );
280 REQUIRE( val ==
"val1val3" );
282 config( val,
"key2" );
283 REQUIRE( val ==
"val2val4val4.1" );
285 config( val,
"key3" );
286 REQUIRE( val ==
"val5" );
289 WHEN(
"multi-line keys" )
292 {
"",
"sect1",
"sect2",
"sect1",
"sect2",
"sect3" },
293 {
"key0",
"key1",
"key2",
"key1",
"key2",
"key3" },
294 {
"val0\n val0.1",
"val1",
"val2",
"val3\n val3.1",
"val4",
"val5" } );
297 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
298 config.add(
"key1",
"",
"", 0,
"sect1",
"key1",
false,
"",
"" );
299 config.add(
"key2",
"",
"", 0,
"sect2",
"key2",
false,
"",
"" );
300 config.add(
"key3",
"",
"", 0,
"sect3",
"key3",
false,
"",
"" );
302 config.readConfig(
"/tmp/test.conf" );
306 config( val,
"key0" );
307 REQUIRE( val ==
"val0val0.1" );
309 config( val,
"key1" );
310 REQUIRE( val ==
"val1val3val3.1" );
312 config( val,
"key2" );
313 REQUIRE( val ==
"val2val4" );
315 config( val,
"key3" );
316 REQUIRE( val ==
"val5" );
320 GIVEN(
"a config file with vectors" )
322 WHEN(
"no sections" )
326 {
"key0",
"key1",
"key2" },
327 {
"val0,val1,val2",
" val3, val4, ",
"val5" } );
330 config.
add(
"key0",
"",
"", 0,
"",
"key0",
false,
"",
"" );
331 config.add(
"key1",
"",
"", 0,
"",
"key1",
false,
"",
"" );
332 config.add(
"key2",
"",
"", 0,
"",
"key2",
false,
"",
"" );
334 config.readConfig(
"/tmp/test.conf" );
336 std::vector<std::string> vals;
338 config( vals,
"key0" );
339 REQUIRE( vals[0] ==
"val0" );
340 REQUIRE( vals[1] ==
"val1" );
341 REQUIRE( vals[2] ==
"val2" );
343 config( vals,
"key1" );
344 REQUIRE( vals[0] ==
"val3" );
345 REQUIRE( vals[1] ==
"val4" );
346 REQUIRE( vals[2] ==
"" );
348 config( vals,
"key2" );
349 REQUIRE( vals[0] ==
"val5" );
SCENARIO("Loading aoAtmosphere config settings", "[ao::analysis::aoAtmosphere]")
void writeConfigFile(const std::string &fname, const std::vector< std::string > §ions, const std::vector< std::string > &keywords, const std::vector< std::string > &values)
A simple config file writing function, useful for testing.
Class to manage a set of configurable values, and read their values from config/ini files and the com...
void add(const configTarget &tgt)
Add a configTarget.
static std::string makeKey(const std::string §ion, const std::string &name)
Return a key generated from the section and name.