1 //  (C) Copyright Gennadiy Rozental 2001-2015.
2 //  Distributed under the Boost Software License, Version 1.0.
3 //  (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 
6 //  See http://www.boost.org/libs/test for the library home page.
7 //
8 //  File        : $RCSfile$
9 //
10 //  Version     : $Revision$
11 //
12 //  Description : config_file_iterator unit test
13 // *****************************************************************************
14 
15 // Boost.Test
16 #define BOOST_TEST_MODULE config_file_iterator unit test
17 #include <boost/test/unit_test.hpp>
18 namespace utf = boost::unit_test;
19 
20 // Boost.Runtime.Parameter
21 #include <boost/test/utils/runtime/file/config_file_iterator.hpp>
22 #include <boost/test/utils/runtime/env/variable.hpp>
23 
24 namespace rt  = boost::runtime;
25 namespace file = boost::runtime::file;
26 namespace env = boost::runtime::environment;
27 
28 BOOST_TEST_DONT_PRINT_LOG_VALUE(file::config_file_iterator)
29 
30 //____________________________________________________________________________//
31 
BOOST_AUTO_TEST_CASE(test_constructor)32 BOOST_AUTO_TEST_CASE( test_constructor )
33 {
34     {
35     file::config_file_iterator cfi( NULL );
36 
37     BOOST_TEST( cfi == file::config_file_iterator() );
38     }
39 
40     {
41     file::config_file_iterator cfi( "" );
42 
43     BOOST_TEST( cfi == file::config_file_iterator() );
44     }
45 
46     {
47     rt::cstring cs( "" );
48     file::config_file_iterator cfi( cs );
49 
50     BOOST_TEST( cfi == file::config_file_iterator() );
51     }
52 
53     {
54     std::string ds;
55     file::config_file_iterator cfi( ds );
56 
57     BOOST_TEST( cfi == file::config_file_iterator() );
58     }
59 
60     {
61     BOOST_CHECK_THROW( file::config_file_iterator( "!@#%#$%#$^#$^" ), rt::logic_error );
62     }
63 
64     {
65     file::config_file_iterator cfi( "test_files/test_constructor.cfg" );
66 
67     BOOST_TEST( cfi != file::config_file_iterator() );
68     BOOST_TEST( *cfi == "{ abc d }" );
69 
70     cfi = cfi;
71 
72     BOOST_TEST( cfi != file::config_file_iterator() );
73     BOOST_TEST( *cfi == "{ abc d }" );
74 
75     file::config_file_iterator cfi1( cfi );
76 
77     BOOST_TEST( cfi == file::config_file_iterator() );
78     BOOST_TEST( *cfi1 == "{ abc d }" );
79 
80     ++cfi1;
81     BOOST_TEST( *cfi1 == "{ d" );
82 
83     cfi = cfi1;
84     BOOST_TEST( cfi != file::config_file_iterator() );
85     BOOST_TEST( *cfi == "{ d" );
86 
87     ++cfi;
88     BOOST_TEST( *cfi == " dsfg" );
89     }
90 }
91 
92 //____________________________________________________________________________//
93 
BOOST_AUTO_TEST_CASE(test_comments_and_blanks)94 BOOST_AUTO_TEST_CASE( test_comments_and_blanks )
95 {
96     file::config_file_iterator cfi( "test_files/test_comments_and_blanks.cfg" );
97 
98     BOOST_TEST( cfi != file::config_file_iterator() );
99     BOOST_TEST( *cfi == "1" ); ++cfi;
100     BOOST_TEST( *cfi == "2" ); ++cfi;
101     BOOST_TEST( *cfi == "4" ); ++cfi;
102     BOOST_TEST( *cfi == "3" ); ++cfi;
103     BOOST_TEST( cfi == file::config_file_iterator() );
104 }
105 
106 //____________________________________________________________________________//
107 
BOOST_AUTO_TEST_CASE(test_broken_line)108 BOOST_AUTO_TEST_CASE( test_broken_line )
109 {
110     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_incomplete_broken_line.cfg" ), rt::logic_error );
111 
112     {
113     file::config_file_iterator cfi( "test_files/test_broken_line.cfg" );
114 
115     BOOST_TEST( cfi != file::config_file_iterator() );
116     BOOST_TEST( *cfi == "qwerty" ); ++cfi;
117     BOOST_TEST( *cfi == "123 \\11" ); ++cfi;
118     BOOST_TEST( *cfi == "   23" ); ++cfi;
119     BOOST_TEST( *cfi == "xcv \\ dfgsd" ); ++cfi;
120     BOOST_TEST( *cfi == "qwe" ); ++cfi;
121     BOOST_TEST( cfi != file::config_file_iterator() );
122     BOOST_TEST( *cfi == "1 \t23" ); ++cfi;
123     BOOST_TEST( *cfi == "34 34" ); ++cfi;
124     BOOST_TEST( *cfi == "a b c d e f" ); ++cfi;
125     BOOST_TEST( *cfi == "as sa" ); ++cfi;
126     BOOST_TEST( *cfi == "aswe" ); ++cfi;
127     BOOST_TEST( cfi == file::config_file_iterator() );
128     }
129 
130     {
131     file::config_file_iterator cfi( "test_files/test_broken_line.cfg", file::trim_leading_spaces );
132 
133     BOOST_TEST( cfi != file::config_file_iterator() );
134     BOOST_TEST( *cfi == "qwerty" ); ++cfi;
135     BOOST_TEST( *cfi == "123 \\11" ); ++cfi;
136     BOOST_TEST( *cfi == "23" ); ++cfi;
137     BOOST_TEST( *cfi == "xcv \\ dfgsd" ); ++cfi;
138     BOOST_TEST( *cfi == "qwe" ); ++cfi;
139     BOOST_TEST( cfi != file::config_file_iterator() );
140     BOOST_TEST( *cfi == "1 \t23" ); ++cfi;
141     BOOST_TEST( *cfi == "34 34" ); ++cfi;
142     BOOST_TEST( *cfi == "a b c d e f" ); ++cfi;
143     BOOST_TEST( *cfi == "as sa" ); ++cfi;
144     BOOST_TEST( *cfi == "aswe" ); ++cfi;
145     BOOST_TEST( cfi == file::config_file_iterator() );
146     }
147 
148     {
149     file::config_file_iterator cfi( "test_files/test_broken_line.cfg", (!file::trim_leading_spaces,!file::trim_trailing_spaces));
150 
151     BOOST_TEST( cfi != file::config_file_iterator() );
152     BOOST_TEST( *cfi == "qwerty" ); ++cfi;
153     BOOST_TEST( *cfi == "123 \\11" ); ++cfi;
154     BOOST_TEST( *cfi == "   23" ); ++cfi;
155     BOOST_TEST( *cfi == "xcv \\ dfgsd" ); ++cfi;
156     BOOST_TEST( *cfi == "qwe" ); ++cfi;
157     BOOST_TEST( cfi != file::config_file_iterator() );
158     BOOST_TEST( *cfi == "1  " ); ++cfi;
159     BOOST_TEST( *cfi == "\t23" ); ++cfi;
160     BOOST_TEST( *cfi == "34 \\  " ); ++cfi;
161     BOOST_TEST( *cfi == "34" ); ++cfi;
162     BOOST_TEST( *cfi == "a b c d e f " ); ++cfi;
163     BOOST_TEST( *cfi == "as \\ " ); ++cfi;
164     BOOST_TEST( *cfi == "sa" ); ++cfi;
165     BOOST_TEST( *cfi == "aswe" ); ++cfi;
166     BOOST_TEST( cfi == file::config_file_iterator() );
167     }
168 
169     {
170     file::config_file_iterator cfi( "test_files/test_broken_line.cfg", !file::skip_empty_lines );
171 
172     BOOST_TEST( cfi != file::config_file_iterator() );
173     BOOST_TEST( *cfi == "qwerty" ); ++cfi;
174     BOOST_TEST( *cfi == "" ); ++cfi;
175     BOOST_TEST( *cfi == "123 \\11" ); ++cfi;
176     BOOST_TEST( *cfi == "" ); ++cfi;
177     BOOST_TEST( *cfi == "" ); ++cfi;
178     BOOST_TEST( *cfi == "   23" ); ++cfi;
179     BOOST_TEST( *cfi == "" ); ++cfi;
180     BOOST_TEST( *cfi == "xcv \\ dfgsd" ); ++cfi;
181     BOOST_TEST( *cfi == "qwe" ); ++cfi;
182     BOOST_TEST( cfi != file::config_file_iterator() );
183     BOOST_TEST( *cfi == "" ); ++cfi;
184     BOOST_TEST( *cfi == "1 " ); ++cfi;
185     BOOST_TEST( *cfi == "\t23" ); ++cfi;
186     BOOST_TEST( *cfi == "" ); ++cfi;
187     BOOST_TEST( *cfi == "34 34" ); ++cfi;
188     BOOST_TEST( *cfi == "" ); ++cfi;
189     BOOST_TEST( *cfi == "a b c d e f" ); ++cfi;
190     BOOST_TEST( *cfi == "" ); ++cfi;
191     BOOST_TEST( *cfi == "as " ); ++cfi;
192     BOOST_TEST( *cfi == "sa" ); ++cfi;
193     BOOST_TEST( *cfi == "" ); ++cfi;
194     BOOST_TEST( *cfi == "as" ); ++cfi;
195     BOOST_TEST( *cfi == "we" ); ++cfi;
196     BOOST_TEST( *cfi == "" ); ++cfi;
197     BOOST_TEST( cfi == file::config_file_iterator() );
198     }
199 }
200 
201 //____________________________________________________________________________//
202 
BOOST_AUTO_TEST_CASE(test_include)203 BOOST_AUTO_TEST_CASE( test_include )
204 {
205     {
206     file::config_file_iterator cfi( "test_files/test_include1.cfg" );
207     BOOST_TEST( cfi != file::config_file_iterator() );
208     BOOST_TEST( *cfi == "a" ); ++cfi;
209     BOOST_TEST( *cfi == "c" ); ++cfi;
210     BOOST_TEST( *cfi == "b" ); ++cfi;
211     BOOST_TEST( cfi == file::config_file_iterator() );
212     }
213 
214     {
215     file::config_file_iterator cfi( "test_files/test_include2.cfg" );
216     BOOST_TEST( cfi != file::config_file_iterator() );
217     BOOST_TEST( *cfi == "1" ); ++cfi;
218     BOOST_TEST( *cfi == "a" ); ++cfi;
219     BOOST_TEST( *cfi == "c" ); ++cfi;
220     BOOST_TEST( *cfi == "b" ); ++cfi;
221     BOOST_TEST( *cfi == "2" ); ++cfi;
222     BOOST_TEST( cfi == file::config_file_iterator() );
223     }
224 
225     {
226     file::config_file_iterator cfi( "test_files/test_include3.cfg" );
227     BOOST_TEST( cfi != file::config_file_iterator() );
228     BOOST_TEST( *cfi == "c" ); ++cfi;
229     BOOST_TEST( *cfi == "c" ); ++cfi;
230     BOOST_TEST( cfi == file::config_file_iterator() );
231     }
232 }
233 
234 //____________________________________________________________________________//
235 
236 env::variable<> TEST_MACRO( "TEST_MACRO", env::default_value = "test_value" );
237 
BOOST_AUTO_TEST_CASE(test_define)238 BOOST_AUTO_TEST_CASE( test_define )
239 {
240     file::config_file_iterator cfi( "test_files/test_define.cfg" );
241     BOOST_TEST( cfi != file::config_file_iterator() );
242     BOOST_TEST( *cfi == "a123123" ); ++cfi;
243     BOOST_TEST( *cfi == "11232" ); ++cfi;
244     BOOST_TEST( *cfi == "a test_value=11" ); ++cfi;
245     BOOST_TEST( *cfi == "1abc2" ); ++cfi;
246     BOOST_TEST( cfi == file::config_file_iterator() );
247 }
248 
249 //____________________________________________________________________________//
250 
BOOST_AUTO_TEST_CASE(test_macro_subst)251 BOOST_AUTO_TEST_CASE( test_macro_subst )
252 {
253     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_macro_subst1.cfg" ), rt::logic_error );
254     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_macro_subst3.cfg" ), rt::logic_error );
255 
256     {
257     file::config_file_iterator cfi( "test_files/test_macro_subst1.cfg", !file::detect_missing_macro );
258     BOOST_TEST( cfi != file::config_file_iterator() );
259     BOOST_TEST( *cfi == "a" ); ++cfi;
260     BOOST_TEST( cfi == file::config_file_iterator() );
261     }
262 
263     {
264     file::config_file_iterator cfi( "test_files/test_macro_subst2.cfg" );
265     BOOST_TEST( cfi != file::config_file_iterator() );
266     BOOST_TEST( *cfi == "atest_value" ); ++cfi;
267     BOOST_TEST( cfi == file::config_file_iterator() );
268     }
269 
270     {
271     file::config_file_iterator cfi( "test_files/test_macro_subst4.cfg" );
272     BOOST_TEST( cfi != file::config_file_iterator() );
273     BOOST_TEST( *cfi == "abb" ); ++cfi;
274     BOOST_TEST( cfi == file::config_file_iterator() );
275     }
276 }
277 
278 //____________________________________________________________________________//
279 
BOOST_AUTO_TEST_CASE(test_undef)280 BOOST_AUTO_TEST_CASE( test_undef )
281 {
282     {
283     file::config_file_iterator cfi( "test_files/test_undef.cfg", !file::detect_missing_macro );
284     BOOST_TEST( cfi != file::config_file_iterator() );
285     BOOST_TEST( *cfi == "1123" ); ++cfi;
286     BOOST_TEST( *cfi == "1" ); ++cfi;
287     BOOST_TEST( cfi == file::config_file_iterator() );
288     }
289 }
290 
291 //____________________________________________________________________________//
292 
BOOST_AUTO_TEST_CASE(test_ifdef)293 BOOST_AUTO_TEST_CASE( test_ifdef )
294 {
295     {
296     file::config_file_iterator cfi( "test_files/test_ifdef.cfg" );
297     BOOST_TEST( cfi != file::config_file_iterator() );
298     BOOST_TEST( *cfi == "1" ); ++cfi;
299     BOOST_TEST( *cfi == "2" ); ++cfi;
300     BOOST_TEST( *cfi == "1" ); ++cfi;
301     BOOST_TEST( *cfi == "1abc" ); ++cfi;
302     BOOST_TEST( *cfi == "a" ); ++cfi;
303     BOOST_TEST( cfi == file::config_file_iterator() );
304     }
305 
306     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_ifdef1.cfg" ), rt::logic_error );
307     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_ifdef2.cfg" ), rt::logic_error );
308     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_ifdef3.cfg" ), rt::logic_error );
309     BOOST_CHECK_THROW( file::config_file_iterator( "test_files/test_ifdef4.cfg" ), rt::logic_error );
310 }
311 
312 //____________________________________________________________________________//
313 
314 // EOF
315