mxlib
c++ tools for analyzing astronomical data and other tasks by Jared R. Males. [git repo]
Loading...
Searching...
No Matches
appConfigurator_test.cpp
1#define CATCH_CONFIG_MAIN
2#include "../../catch2/catch.hpp"
3
4#include <fstream>
5
6#include "../../../include/app/appConfigurator.hpp"
7
8using namespace mx::app;
9
10/*namespace test_unit
11{
12namespace appTest
13{
14namespace appConfigurator_test
15{*/
16
17SCENARIO( "config file parsing", "[appConfigurator]" )
18{
19 GIVEN( "a basic config file" )
20 {
21 WHEN( "no sections" )
22 {
23 writeConfigFile( "/tmp/test.conf",
24 { "", "", "", "", "", "" },
25 { "key0", "key1", "key2", "key3", "key4", "key5" },
26 { "val0", "val1", "val2", "val3", "val4", "val5" } );
27
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, "", "" );
35
36 config.readConfig( "/tmp/test.conf" );
37
38 std::string val;
39
40 config( val, "key0" );
41 REQUIRE( val == "val0" );
42
43 config( val, "key1" );
44 REQUIRE( val == "val1" );
45
46 config( val, "key2" );
47 REQUIRE( val == "val2" );
48
49 config( val, "key3" );
50 REQUIRE( val == "val3" );
51
52 config( val, "key4" );
53 REQUIRE( val == "val4" );
54
55 config( val, "key5" );
56 REQUIRE( val == "val5" );
57 }
58
59 WHEN( "sections, unique keys" )
60 {
61 writeConfigFile( "/tmp/test.conf",
62 { "", "", "sect1", "sect1", "sect2", "sect2" },
63 { "key0", "key1", "key2", "key3", "key4", "key5" },
64 { "val0", "val1", "val2", "val3", "val4", "val5" } );
65
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, "", "" );
73
74 config.readConfig( "/tmp/test.conf" );
75
76 std::string val;
77
78 config( val, "key0" );
79 REQUIRE( val == "val0" );
80
81 config( val, "key1" );
82 REQUIRE( val == "val1" );
83
84 config( val, "sect1.key2" );
85 REQUIRE( val == "val2" );
86
87 config( val, "sect1.key3" );
88 REQUIRE( val == "val3" );
89
90 config( val, "sect2.key4" );
91 REQUIRE( val == "val4" );
92
93 config( val, "sect2.key5" );
94 REQUIRE( val == "val5" );
95 }
96
97 WHEN( "sections, repeated keys still unique within sections" )
98 {
99 writeConfigFile( "/tmp/test.conf",
100 { "", "", "sect1", "sect1", "sect2", "sect2" },
101 { "key0", "key1", "key2", "key3", "key2", "key3" },
102 { "val0", "val1", "val2", "val3", "val4", "val5" } );
103
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, "", "" );
111
112 config.readConfig( "/tmp/test.conf" );
113
114 std::string val;
115
116 config( val, "key0" );
117 REQUIRE( val == "val0" );
118
119 config( val, "key1" );
120 REQUIRE( val == "val1" );
121
122 config( val, "sect1.key2" );
123 REQUIRE( val == "val2" );
124
125 config( val, "sect1.key3" );
126 REQUIRE( val == "val3" );
127
128 config( val, "sect2.key2" );
129 REQUIRE( val == "val4" );
130
131 config( val, "sect2.key3" );
132 REQUIRE( val == "val5" );
133 }
134 }
135
136 GIVEN( "a config file with unused entries" )
137 {
138
139 WHEN( "no sections, unused entry in middle" )
140 {
141 writeConfigFile( "/tmp/test.conf",
142 { "", "", "", "", "", "" },
143 { "key0", "key1", "key2", "key3", "key4", "key5" },
144 { "val0", "val1", "val2", "val3", "val4", "val5" } );
145
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, "", "" );
152
153 config.readConfig( "/tmp/test.conf" );
154
155 std::string val;
156
157 // Check normal parsing
158 config( val, "key0" );
159 REQUIRE( val == "val0" );
160
161 config( val, "key1" );
162 REQUIRE( val == "val1" );
163
164 config( val, "key2" );
165 REQUIRE( val == "val2" );
166
167 config( val, "key4" );
168 REQUIRE( val == "val4" );
169
170 config( val, "key5" );
171 REQUIRE( val == "val5" );
172
173 // Check taht the unused on is unused
174 REQUIRE( config.m_unusedConfigs[iniFile::makeKey( "", "key3" )].used == false );
175
176 // Check that the unused one is available.
177 config.configUnused( val, "", "key3" );
178 REQUIRE( val == "val3" );
179
180 // Check taht the unused on is now used
181 REQUIRE( config.m_unusedConfigs[iniFile::makeKey( "", "key3" )].used == true );
182 }
183
184 WHEN( "sections, repeated keys, unused sections" )
185 {
186 writeConfigFile( "/tmp/test.conf",
187 { "", "", "sect1", "sect1", "sect2", "sect2", "sect3" },
188 { "key0", "key1", "key2", "key3", "key2", "key3", "key4" },
189 { "val0", "val1", "val2", "val3", "val4", "val5", "val6" } );
190
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, "", "" );
196
197 config.readConfig( "/tmp/test.conf" );
198
199 std::string val;
200
201 config( val, "key0" );
202 REQUIRE( val == "val0" );
203
204 config( val, "key1" );
205 REQUIRE( val == "val1" );
206
207 config( val, "sect2.key2" );
208 REQUIRE( val == "val4" );
209
210 config( val, "sect2.key3" );
211 REQUIRE( val == "val5" );
212
213 config.configUnused( val, "sect1", "key2" );
214 REQUIRE( val == "val2" );
215
216 config.configUnused( val, "sect1", "key3" );
217 REQUIRE( val == "val3" );
218
219 config.configUnused( val, "sect3", "key4" );
220 REQUIRE( val == "val6" );
221
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" ) );
227 }
228 }
229
230#if 1
231 GIVEN( "a config file with repeated keys within the same section" )
232 {
233 WHEN( "no sections" )
234 {
235 writeConfigFile( "/tmp/test.conf",
236 { "", "", "", "", "", "" },
237 { "key0", "key0", "key2", "key2", "key4", "key4" },
238 { "val0", "val1", "val2", "val3", "val4", "val5" } );
239
241 config.add( "key0", "", "", 0, "", "key0", false, "", "" );
242 config.add( "key2", "", "", 0, "", "key2", false, "", "" );
243 config.add( "key4", "", "", 0, "", "key4", false, "", "" );
244
245 config.readConfig( "/tmp/test.conf" );
246
247 std::string val;
248
249 config( val, "key0" );
250 REQUIRE( val == "val0val1" );
251
252 config( val, "key2" );
253 REQUIRE( val == "val2val3" );
254
255 config( val, "key4" );
256 REQUIRE( val == "val4val5" );
257 }
258
259 WHEN( "repeated sections and keys" )
260 {
261 writeConfigFile( "/tmp/test7.conf",
262 { "", "sect1", "sect2", "sect1", "sect2", "sect2", "sect3" },
263 { "key0", "key1", "key2", "key1", "key2", "key2", "key3" },
264 { "val0", "val1", "val2", "val3", "val4", "val4.1", "val5" } );
265
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, "", "" );
271
272 config.readConfig( "/tmp/test7.conf" );
273
274 std::string val;
275
276 config( val, "key0" );
277 REQUIRE( val == "val0" );
278
279 config( val, "key1" );
280 REQUIRE( val == "val1val3" );
281
282 config( val, "key2" );
283 REQUIRE( val == "val2val4val4.1" );
284
285 config( val, "key3" );
286 REQUIRE( val == "val5" );
287 }
288
289 WHEN( "multi-line keys" )
290 {
291 writeConfigFile( "/tmp/test.conf",
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" } );
295
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, "", "" );
301
302 config.readConfig( "/tmp/test.conf" );
303
304 std::string val;
305
306 config( val, "key0" );
307 REQUIRE( val == "val0val0.1" );
308
309 config( val, "key1" );
310 REQUIRE( val == "val1val3val3.1" );
311
312 config( val, "key2" );
313 REQUIRE( val == "val2val4" );
314
315 config( val, "key3" );
316 REQUIRE( val == "val5" );
317 }
318 }
319
320 GIVEN( "a config file with vectors" )
321 {
322 WHEN( "no sections" )
323 {
324 writeConfigFile( "/tmp/test.conf",
325 { "", "", "" },
326 { "key0", "key1", "key2" },
327 { "val0,val1,val2", " val3, val4, ", "val5" } );
328
330 config.add( "key0", "", "", 0, "", "key0", false, "", "" );
331 config.add( "key1", "", "", 0, "", "key1", false, "", "" );
332 config.add( "key2", "", "", 0, "", "key2", false, "", "" );
333
334 config.readConfig( "/tmp/test.conf" );
335
336 std::vector<std::string> vals;
337
338 config( vals, "key0" );
339 REQUIRE( vals[0] == "val0" );
340 REQUIRE( vals[1] == "val1" );
341 REQUIRE( vals[2] == "val2" );
342
343 config( vals, "key1" );
344 REQUIRE( vals[0] == "val3" );
345 REQUIRE( vals[1] == "val4" );
346 REQUIRE( vals[2] == "" );
347
348 config( vals, "key2" );
349 REQUIRE( vals[0] == "val5" );
350 }
351 }
352#endif
353}
354
355/*
356} // namespace appConfiguratorTest
357} // namespace appTest
358} // namespace testUnit
359 */
SCENARIO("Loading aoAtmosphere config settings", "[ao::analysis::aoAtmosphere]")
void writeConfigFile(const std::string &fname, const std::vector< std::string > &sections, 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 &section, const std::string &name)
Return a key generated from the section and name.
Definition iniFile.hpp:57