xref: /netbsd-src/external/bsd/atf/dist/tools/parser_test.cpp (revision d780102efefa02003390cc43ea410dbd0ebb4a85)
1*d780102eSjmmv //
2*d780102eSjmmv // Automated Testing Framework (atf)
3*d780102eSjmmv //
4*d780102eSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*d780102eSjmmv // All rights reserved.
6*d780102eSjmmv //
7*d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8*d780102eSjmmv // modification, are permitted provided that the following conditions
9*d780102eSjmmv // are met:
10*d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11*d780102eSjmmv //    notice, this list of conditions and the following disclaimer.
12*d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13*d780102eSjmmv //    notice, this list of conditions and the following disclaimer in the
14*d780102eSjmmv //    documentation and/or other materials provided with the distribution.
15*d780102eSjmmv //
16*d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*d780102eSjmmv //
29*d780102eSjmmv 
30*d780102eSjmmv #include <sstream>
31*d780102eSjmmv 
32*d780102eSjmmv #include <atf-c++.hpp>
33*d780102eSjmmv 
34*d780102eSjmmv #include "parser.hpp"
35*d780102eSjmmv #include "test_helpers.hpp"
36*d780102eSjmmv 
37*d780102eSjmmv // ------------------------------------------------------------------------
38*d780102eSjmmv // Tests for the "parse_error" class.
39*d780102eSjmmv // ------------------------------------------------------------------------
40*d780102eSjmmv 
41*d780102eSjmmv ATF_TEST_CASE(parse_error_to_string);
ATF_TEST_CASE_HEAD(parse_error_to_string)42*d780102eSjmmv ATF_TEST_CASE_HEAD(parse_error_to_string)
43*d780102eSjmmv {
44*d780102eSjmmv     set_md_var("descr", "Tests the parse_error conversion to strings");
45*d780102eSjmmv }
ATF_TEST_CASE_BODY(parse_error_to_string)46*d780102eSjmmv ATF_TEST_CASE_BODY(parse_error_to_string)
47*d780102eSjmmv {
48*d780102eSjmmv     using tools::parser::parse_error;
49*d780102eSjmmv 
50*d780102eSjmmv     const parse_error e(123, "This is the message");
51*d780102eSjmmv     ATF_REQUIRE_EQ("123: This is the message", std::string(e));
52*d780102eSjmmv }
53*d780102eSjmmv 
54*d780102eSjmmv // ------------------------------------------------------------------------
55*d780102eSjmmv // Tests for the "parse_errors" class.
56*d780102eSjmmv // ------------------------------------------------------------------------
57*d780102eSjmmv 
58*d780102eSjmmv ATF_TEST_CASE(parse_errors_what);
ATF_TEST_CASE_HEAD(parse_errors_what)59*d780102eSjmmv ATF_TEST_CASE_HEAD(parse_errors_what)
60*d780102eSjmmv {
61*d780102eSjmmv     set_md_var("descr", "Tests the parse_errors description");
62*d780102eSjmmv }
ATF_TEST_CASE_BODY(parse_errors_what)63*d780102eSjmmv ATF_TEST_CASE_BODY(parse_errors_what)
64*d780102eSjmmv {
65*d780102eSjmmv     using tools::parser::parse_error;
66*d780102eSjmmv     using tools::parser::parse_errors;
67*d780102eSjmmv 
68*d780102eSjmmv     parse_errors es;
69*d780102eSjmmv     es.push_back(parse_error(2, "Second error"));
70*d780102eSjmmv     es.push_back(parse_error(1, "First error"));
71*d780102eSjmmv 
72*d780102eSjmmv     ATF_REQUIRE_EQ("2: Second error\n1: First error", std::string(es.what()));
73*d780102eSjmmv }
74*d780102eSjmmv 
75*d780102eSjmmv // ------------------------------------------------------------------------
76*d780102eSjmmv // Tests for the "token" class.
77*d780102eSjmmv // ------------------------------------------------------------------------
78*d780102eSjmmv 
79*d780102eSjmmv ATF_TEST_CASE(token_getters);
ATF_TEST_CASE_HEAD(token_getters)80*d780102eSjmmv ATF_TEST_CASE_HEAD(token_getters)
81*d780102eSjmmv {
82*d780102eSjmmv     set_md_var("descr", "Tests the token getters");
83*d780102eSjmmv }
ATF_TEST_CASE_BODY(token_getters)84*d780102eSjmmv ATF_TEST_CASE_BODY(token_getters)
85*d780102eSjmmv {
86*d780102eSjmmv     using tools::parser::token;
87*d780102eSjmmv 
88*d780102eSjmmv     {
89*d780102eSjmmv         token t(10, 0);
90*d780102eSjmmv         ATF_REQUIRE_EQ(t.lineno(), 10);
91*d780102eSjmmv         ATF_REQUIRE_EQ(t.type(), 0);
92*d780102eSjmmv         ATF_REQUIRE(t.text().empty());
93*d780102eSjmmv     }
94*d780102eSjmmv 
95*d780102eSjmmv     {
96*d780102eSjmmv         token t(10, 0, "foo");
97*d780102eSjmmv         ATF_REQUIRE_EQ(t.lineno(), 10);
98*d780102eSjmmv         ATF_REQUIRE_EQ(t.type(), 0);
99*d780102eSjmmv         ATF_REQUIRE_EQ(t.text(), "foo");
100*d780102eSjmmv     }
101*d780102eSjmmv 
102*d780102eSjmmv     {
103*d780102eSjmmv         token t(20, 1);
104*d780102eSjmmv         ATF_REQUIRE_EQ(t.lineno(), 20);
105*d780102eSjmmv         ATF_REQUIRE_EQ(t.type(), 1);
106*d780102eSjmmv         ATF_REQUIRE(t.text().empty());
107*d780102eSjmmv     }
108*d780102eSjmmv 
109*d780102eSjmmv     {
110*d780102eSjmmv         token t(20, 1, "bar");
111*d780102eSjmmv         ATF_REQUIRE_EQ(t.lineno(), 20);
112*d780102eSjmmv         ATF_REQUIRE_EQ(t.type(), 1);
113*d780102eSjmmv         ATF_REQUIRE_EQ(t.text(), "bar");
114*d780102eSjmmv     }
115*d780102eSjmmv }
116*d780102eSjmmv 
117*d780102eSjmmv // ------------------------------------------------------------------------
118*d780102eSjmmv // Tests for the "tokenizer" class.
119*d780102eSjmmv // ------------------------------------------------------------------------
120*d780102eSjmmv 
121*d780102eSjmmv #define EXPECT(tkz, ttype, ttext) \
122*d780102eSjmmv     do { \
123*d780102eSjmmv         tools::parser::token t = tkz.next(); \
124*d780102eSjmmv         ATF_REQUIRE(t.type() == ttype); \
125*d780102eSjmmv         ATF_REQUIRE_EQ(t.text(), ttext); \
126*d780102eSjmmv     } while (false);
127*d780102eSjmmv 
128*d780102eSjmmv namespace minimal {
129*d780102eSjmmv 
130*d780102eSjmmv     static const tools::parser::token_type eof_type = 0;
131*d780102eSjmmv     static const tools::parser::token_type nl_type = 1;
132*d780102eSjmmv     static const tools::parser::token_type word_type = 2;
133*d780102eSjmmv 
134*d780102eSjmmv     class tokenizer : public tools::parser::tokenizer< std::istream > {
135*d780102eSjmmv     public:
tokenizer(std::istream & is,bool skipws)136*d780102eSjmmv         tokenizer(std::istream& is, bool skipws) :
137*d780102eSjmmv             tools::parser::tokenizer< std::istream >
138*d780102eSjmmv                 (is, skipws, eof_type, nl_type, word_type)
139*d780102eSjmmv         {
140*d780102eSjmmv         }
141*d780102eSjmmv     };
142*d780102eSjmmv 
143*d780102eSjmmv }
144*d780102eSjmmv 
145*d780102eSjmmv namespace delims {
146*d780102eSjmmv 
147*d780102eSjmmv     static const tools::parser::token_type eof_type = 0;
148*d780102eSjmmv     static const tools::parser::token_type nl_type = 1;
149*d780102eSjmmv     static const tools::parser::token_type word_type = 2;
150*d780102eSjmmv     static const tools::parser::token_type plus_type = 3;
151*d780102eSjmmv     static const tools::parser::token_type minus_type = 4;
152*d780102eSjmmv     static const tools::parser::token_type equal_type = 5;
153*d780102eSjmmv 
154*d780102eSjmmv     class tokenizer : public tools::parser::tokenizer< std::istream > {
155*d780102eSjmmv     public:
tokenizer(std::istream & is,bool skipws)156*d780102eSjmmv         tokenizer(std::istream& is, bool skipws) :
157*d780102eSjmmv             tools::parser::tokenizer< std::istream >
158*d780102eSjmmv                 (is, skipws, eof_type, nl_type, word_type)
159*d780102eSjmmv         {
160*d780102eSjmmv             add_delim('+', plus_type);
161*d780102eSjmmv             add_delim('-', minus_type);
162*d780102eSjmmv             add_delim('=', equal_type);
163*d780102eSjmmv         }
164*d780102eSjmmv     };
165*d780102eSjmmv 
166*d780102eSjmmv }
167*d780102eSjmmv 
168*d780102eSjmmv namespace keywords {
169*d780102eSjmmv 
170*d780102eSjmmv     static const tools::parser::token_type eof_type = 0;
171*d780102eSjmmv     static const tools::parser::token_type nl_type = 1;
172*d780102eSjmmv     static const tools::parser::token_type word_type = 2;
173*d780102eSjmmv     static const tools::parser::token_type var_type = 3;
174*d780102eSjmmv     static const tools::parser::token_type loop_type = 4;
175*d780102eSjmmv     static const tools::parser::token_type endloop_type = 5;
176*d780102eSjmmv 
177*d780102eSjmmv     class tokenizer : public tools::parser::tokenizer< std::istream > {
178*d780102eSjmmv     public:
tokenizer(std::istream & is,bool skipws)179*d780102eSjmmv         tokenizer(std::istream& is, bool skipws) :
180*d780102eSjmmv             tools::parser::tokenizer< std::istream >
181*d780102eSjmmv                 (is, skipws, eof_type, nl_type, word_type)
182*d780102eSjmmv         {
183*d780102eSjmmv             add_keyword("var", var_type);
184*d780102eSjmmv             add_keyword("loop", loop_type);
185*d780102eSjmmv             add_keyword("endloop", endloop_type);
186*d780102eSjmmv         }
187*d780102eSjmmv     };
188*d780102eSjmmv 
189*d780102eSjmmv }
190*d780102eSjmmv 
191*d780102eSjmmv namespace quotes {
192*d780102eSjmmv 
193*d780102eSjmmv     static const tools::parser::token_type eof_type = 0;
194*d780102eSjmmv     static const tools::parser::token_type nl_type = 1;
195*d780102eSjmmv     static const tools::parser::token_type word_type = 2;
196*d780102eSjmmv     static const tools::parser::token_type dblquote_type = 3;
197*d780102eSjmmv 
198*d780102eSjmmv     class tokenizer : public tools::parser::tokenizer< std::istream > {
199*d780102eSjmmv     public:
tokenizer(std::istream & is,bool skipws)200*d780102eSjmmv         tokenizer(std::istream& is, bool skipws) :
201*d780102eSjmmv             tools::parser::tokenizer< std::istream >
202*d780102eSjmmv                 (is, skipws, eof_type, nl_type, word_type)
203*d780102eSjmmv         {
204*d780102eSjmmv             add_quote('"', dblquote_type);
205*d780102eSjmmv         }
206*d780102eSjmmv     };
207*d780102eSjmmv 
208*d780102eSjmmv }
209*d780102eSjmmv 
210*d780102eSjmmv ATF_TEST_CASE(tokenizer_minimal_nows);
ATF_TEST_CASE_HEAD(tokenizer_minimal_nows)211*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_minimal_nows)
212*d780102eSjmmv {
213*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a minimal parser "
214*d780102eSjmmv                "and not skipping whitespace");
215*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_minimal_nows)216*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_minimal_nows)
217*d780102eSjmmv {
218*d780102eSjmmv     using namespace minimal;
219*d780102eSjmmv 
220*d780102eSjmmv     {
221*d780102eSjmmv         std::istringstream iss("");
222*d780102eSjmmv         tokenizer mt(iss, false);
223*d780102eSjmmv 
224*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
225*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
226*d780102eSjmmv     }
227*d780102eSjmmv 
228*d780102eSjmmv     {
229*d780102eSjmmv         std::istringstream iss("\n");
230*d780102eSjmmv         tokenizer mt(iss, false);
231*d780102eSjmmv 
232*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
233*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
234*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
235*d780102eSjmmv     }
236*d780102eSjmmv 
237*d780102eSjmmv     {
238*d780102eSjmmv         std::istringstream iss("\n\n\n");
239*d780102eSjmmv         tokenizer mt(iss, false);
240*d780102eSjmmv 
241*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
242*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
243*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
244*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
245*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
246*d780102eSjmmv     }
247*d780102eSjmmv 
248*d780102eSjmmv     {
249*d780102eSjmmv         std::istringstream iss("line 1");
250*d780102eSjmmv         tokenizer mt(iss, false);
251*d780102eSjmmv 
252*d780102eSjmmv         EXPECT(mt, word_type, "line 1");
253*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
254*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
255*d780102eSjmmv     }
256*d780102eSjmmv 
257*d780102eSjmmv     {
258*d780102eSjmmv         std::istringstream iss("line 1\n");
259*d780102eSjmmv         tokenizer mt(iss, false);
260*d780102eSjmmv 
261*d780102eSjmmv         EXPECT(mt, word_type, "line 1");
262*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
263*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
264*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
265*d780102eSjmmv     }
266*d780102eSjmmv 
267*d780102eSjmmv     {
268*d780102eSjmmv         std::istringstream iss("line 1\nline 2");
269*d780102eSjmmv         tokenizer mt(iss, false);
270*d780102eSjmmv 
271*d780102eSjmmv         EXPECT(mt, word_type, "line 1");
272*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
273*d780102eSjmmv         EXPECT(mt, word_type, "line 2");
274*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
275*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
276*d780102eSjmmv     }
277*d780102eSjmmv 
278*d780102eSjmmv     {
279*d780102eSjmmv         std::istringstream iss("line 1\nline 2\nline 3\n");
280*d780102eSjmmv         tokenizer mt(iss, false);
281*d780102eSjmmv 
282*d780102eSjmmv         EXPECT(mt, word_type, "line 1");
283*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
284*d780102eSjmmv         EXPECT(mt, word_type, "line 2");
285*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
286*d780102eSjmmv         EXPECT(mt, word_type, "line 3");
287*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
288*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
289*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
290*d780102eSjmmv     }
291*d780102eSjmmv }
292*d780102eSjmmv 
293*d780102eSjmmv ATF_TEST_CASE(tokenizer_minimal_ws);
ATF_TEST_CASE_HEAD(tokenizer_minimal_ws)294*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_minimal_ws)
295*d780102eSjmmv {
296*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a minimal parser "
297*d780102eSjmmv                "and skipping whitespace");
298*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_minimal_ws)299*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_minimal_ws)
300*d780102eSjmmv {
301*d780102eSjmmv     using namespace minimal;
302*d780102eSjmmv 
303*d780102eSjmmv     {
304*d780102eSjmmv         std::istringstream iss("");
305*d780102eSjmmv         minimal::tokenizer mt(iss, true);
306*d780102eSjmmv 
307*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
308*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
309*d780102eSjmmv     }
310*d780102eSjmmv 
311*d780102eSjmmv     {
312*d780102eSjmmv         std::istringstream iss(" \t ");
313*d780102eSjmmv         tokenizer mt(iss, true);
314*d780102eSjmmv 
315*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
316*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
317*d780102eSjmmv     }
318*d780102eSjmmv 
319*d780102eSjmmv     {
320*d780102eSjmmv         std::istringstream iss("\n");
321*d780102eSjmmv         tokenizer mt(iss, true);
322*d780102eSjmmv 
323*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
324*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
325*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
326*d780102eSjmmv     }
327*d780102eSjmmv 
328*d780102eSjmmv     {
329*d780102eSjmmv         std::istringstream iss(" \t \n \t ");
330*d780102eSjmmv         tokenizer mt(iss, true);
331*d780102eSjmmv 
332*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
333*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
334*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
335*d780102eSjmmv     }
336*d780102eSjmmv 
337*d780102eSjmmv     {
338*d780102eSjmmv         std::istringstream iss("\n\n\n");
339*d780102eSjmmv         tokenizer mt(iss, true);
340*d780102eSjmmv 
341*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
342*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
343*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
344*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
345*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
346*d780102eSjmmv     }
347*d780102eSjmmv 
348*d780102eSjmmv     {
349*d780102eSjmmv         std::istringstream iss("line 1");
350*d780102eSjmmv         tokenizer mt(iss, true);
351*d780102eSjmmv 
352*d780102eSjmmv         EXPECT(mt, word_type, "line");
353*d780102eSjmmv         EXPECT(mt, word_type, "1");
354*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
355*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
356*d780102eSjmmv     }
357*d780102eSjmmv 
358*d780102eSjmmv     {
359*d780102eSjmmv         std::istringstream iss("   \tline\t   1\t");
360*d780102eSjmmv         tokenizer mt(iss, true);
361*d780102eSjmmv 
362*d780102eSjmmv         EXPECT(mt, word_type, "line");
363*d780102eSjmmv         EXPECT(mt, word_type, "1");
364*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
365*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
366*d780102eSjmmv     }
367*d780102eSjmmv 
368*d780102eSjmmv     {
369*d780102eSjmmv         std::istringstream iss("line 1\n");
370*d780102eSjmmv         tokenizer mt(iss, true);
371*d780102eSjmmv 
372*d780102eSjmmv         EXPECT(mt, word_type, "line");
373*d780102eSjmmv         EXPECT(mt, word_type, "1");
374*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
375*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
376*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
377*d780102eSjmmv     }
378*d780102eSjmmv 
379*d780102eSjmmv     {
380*d780102eSjmmv         std::istringstream iss("line 1\nline 2");
381*d780102eSjmmv         tokenizer mt(iss, true);
382*d780102eSjmmv 
383*d780102eSjmmv         EXPECT(mt, word_type, "line");
384*d780102eSjmmv         EXPECT(mt, word_type, "1");
385*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
386*d780102eSjmmv         EXPECT(mt, word_type, "line");
387*d780102eSjmmv         EXPECT(mt, word_type, "2");
388*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
389*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
390*d780102eSjmmv     }
391*d780102eSjmmv 
392*d780102eSjmmv     {
393*d780102eSjmmv         std::istringstream iss("line 1\nline 2\nline 3\n");
394*d780102eSjmmv         tokenizer mt(iss, true);
395*d780102eSjmmv 
396*d780102eSjmmv         EXPECT(mt, word_type, "line");
397*d780102eSjmmv         EXPECT(mt, word_type, "1");
398*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
399*d780102eSjmmv         EXPECT(mt, word_type, "line");
400*d780102eSjmmv         EXPECT(mt, word_type, "2");
401*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
402*d780102eSjmmv         EXPECT(mt, word_type, "line");
403*d780102eSjmmv         EXPECT(mt, word_type, "3");
404*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
405*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
406*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
407*d780102eSjmmv     }
408*d780102eSjmmv 
409*d780102eSjmmv     {
410*d780102eSjmmv         std::istringstream iss(" \t line \t 1\n\tline\t2\n line 3 \n");
411*d780102eSjmmv         tokenizer mt(iss, true);
412*d780102eSjmmv 
413*d780102eSjmmv         EXPECT(mt, word_type, "line");
414*d780102eSjmmv         EXPECT(mt, word_type, "1");
415*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
416*d780102eSjmmv         EXPECT(mt, word_type, "line");
417*d780102eSjmmv         EXPECT(mt, word_type, "2");
418*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
419*d780102eSjmmv         EXPECT(mt, word_type, "line");
420*d780102eSjmmv         EXPECT(mt, word_type, "3");
421*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
422*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
423*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
424*d780102eSjmmv     }
425*d780102eSjmmv }
426*d780102eSjmmv 
427*d780102eSjmmv ATF_TEST_CASE(tokenizer_delims_nows);
ATF_TEST_CASE_HEAD(tokenizer_delims_nows)428*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_delims_nows)
429*d780102eSjmmv {
430*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a parser with some "
431*d780102eSjmmv                "additional delimiters and not skipping whitespace");
432*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_delims_nows)433*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_delims_nows)
434*d780102eSjmmv {
435*d780102eSjmmv     using namespace delims;
436*d780102eSjmmv 
437*d780102eSjmmv     {
438*d780102eSjmmv         std::istringstream iss("+-=");
439*d780102eSjmmv         tokenizer mt(iss, false);
440*d780102eSjmmv 
441*d780102eSjmmv         EXPECT(mt, plus_type, "+");
442*d780102eSjmmv         EXPECT(mt, minus_type, "-");
443*d780102eSjmmv         EXPECT(mt, equal_type, "=");
444*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
445*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
446*d780102eSjmmv     }
447*d780102eSjmmv 
448*d780102eSjmmv     {
449*d780102eSjmmv         std::istringstream iss("+++");
450*d780102eSjmmv         tokenizer mt(iss, false);
451*d780102eSjmmv 
452*d780102eSjmmv         EXPECT(mt, plus_type, "+");
453*d780102eSjmmv         EXPECT(mt, plus_type, "+");
454*d780102eSjmmv         EXPECT(mt, plus_type, "+");
455*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
456*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
457*d780102eSjmmv     }
458*d780102eSjmmv 
459*d780102eSjmmv     {
460*d780102eSjmmv         std::istringstream iss("\n+\n++\n");
461*d780102eSjmmv         tokenizer mt(iss, false);
462*d780102eSjmmv 
463*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
464*d780102eSjmmv         EXPECT(mt, plus_type, "+");
465*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
466*d780102eSjmmv         EXPECT(mt, plus_type, "+");
467*d780102eSjmmv         EXPECT(mt, plus_type, "+");
468*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
469*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
470*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
471*d780102eSjmmv     }
472*d780102eSjmmv 
473*d780102eSjmmv     {
474*d780102eSjmmv         std::istringstream iss("foo+bar=baz");
475*d780102eSjmmv         tokenizer mt(iss, false);
476*d780102eSjmmv 
477*d780102eSjmmv         EXPECT(mt, word_type, "foo");
478*d780102eSjmmv         EXPECT(mt, plus_type, "+");
479*d780102eSjmmv         EXPECT(mt, word_type, "bar");
480*d780102eSjmmv         EXPECT(mt, equal_type, "=");
481*d780102eSjmmv         EXPECT(mt, word_type, "baz");
482*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
483*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
484*d780102eSjmmv     }
485*d780102eSjmmv 
486*d780102eSjmmv     {
487*d780102eSjmmv         std::istringstream iss(" foo\t+\tbar = baz ");
488*d780102eSjmmv         tokenizer mt(iss, false);
489*d780102eSjmmv 
490*d780102eSjmmv         EXPECT(mt, word_type, " foo\t");
491*d780102eSjmmv         EXPECT(mt, plus_type, "+");
492*d780102eSjmmv         EXPECT(mt, word_type, "\tbar ");
493*d780102eSjmmv         EXPECT(mt, equal_type, "=");
494*d780102eSjmmv         EXPECT(mt, word_type, " baz ");
495*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
496*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
497*d780102eSjmmv     }
498*d780102eSjmmv }
499*d780102eSjmmv 
500*d780102eSjmmv ATF_TEST_CASE(tokenizer_delims_ws);
ATF_TEST_CASE_HEAD(tokenizer_delims_ws)501*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_delims_ws)
502*d780102eSjmmv {
503*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a parser with some "
504*d780102eSjmmv                "additional delimiters and skipping whitespace");
505*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_delims_ws)506*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_delims_ws)
507*d780102eSjmmv {
508*d780102eSjmmv     using namespace delims;
509*d780102eSjmmv 
510*d780102eSjmmv     {
511*d780102eSjmmv         std::istringstream iss(" foo\t+\tbar = baz ");
512*d780102eSjmmv         tokenizer mt(iss, true);
513*d780102eSjmmv 
514*d780102eSjmmv         EXPECT(mt, word_type, "foo");
515*d780102eSjmmv         EXPECT(mt, plus_type, "+");
516*d780102eSjmmv         EXPECT(mt, word_type, "bar");
517*d780102eSjmmv         EXPECT(mt, equal_type, "=");
518*d780102eSjmmv         EXPECT(mt, word_type, "baz");
519*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
520*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
521*d780102eSjmmv     }
522*d780102eSjmmv }
523*d780102eSjmmv 
524*d780102eSjmmv ATF_TEST_CASE(tokenizer_keywords_nows);
ATF_TEST_CASE_HEAD(tokenizer_keywords_nows)525*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_keywords_nows)
526*d780102eSjmmv {
527*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a parser with some "
528*d780102eSjmmv                "additional keywords and not skipping whitespace");
529*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_keywords_nows)530*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_keywords_nows)
531*d780102eSjmmv {
532*d780102eSjmmv     using namespace keywords;
533*d780102eSjmmv 
534*d780102eSjmmv     {
535*d780102eSjmmv         std::istringstream iss("var");
536*d780102eSjmmv         tokenizer mt(iss, false);
537*d780102eSjmmv 
538*d780102eSjmmv         EXPECT(mt, var_type, "var");
539*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
540*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
541*d780102eSjmmv     }
542*d780102eSjmmv 
543*d780102eSjmmv     {
544*d780102eSjmmv         std::istringstream iss("va");
545*d780102eSjmmv         tokenizer mt(iss, false);
546*d780102eSjmmv 
547*d780102eSjmmv         EXPECT(mt, word_type, "va");
548*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
549*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
550*d780102eSjmmv     }
551*d780102eSjmmv 
552*d780102eSjmmv     {
553*d780102eSjmmv         std::istringstream iss("vara");
554*d780102eSjmmv         tokenizer mt(iss, false);
555*d780102eSjmmv 
556*d780102eSjmmv         EXPECT(mt, word_type, "vara");
557*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
558*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
559*d780102eSjmmv     }
560*d780102eSjmmv 
561*d780102eSjmmv     {
562*d780102eSjmmv         std::istringstream iss("var ");
563*d780102eSjmmv         tokenizer mt(iss, false);
564*d780102eSjmmv 
565*d780102eSjmmv         EXPECT(mt, word_type, "var ");
566*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
567*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
568*d780102eSjmmv     }
569*d780102eSjmmv 
570*d780102eSjmmv     {
571*d780102eSjmmv         std::istringstream iss("var\nloop\nendloop");
572*d780102eSjmmv         tokenizer mt(iss, false);
573*d780102eSjmmv 
574*d780102eSjmmv         EXPECT(mt, var_type, "var");
575*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
576*d780102eSjmmv         EXPECT(mt, loop_type, "loop");
577*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
578*d780102eSjmmv         EXPECT(mt, endloop_type, "endloop");
579*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
580*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
581*d780102eSjmmv     }
582*d780102eSjmmv }
583*d780102eSjmmv 
584*d780102eSjmmv ATF_TEST_CASE(tokenizer_keywords_ws);
ATF_TEST_CASE_HEAD(tokenizer_keywords_ws)585*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_keywords_ws)
586*d780102eSjmmv {
587*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a parser with some "
588*d780102eSjmmv                "additional keywords and not skipping whitespace");
589*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_keywords_ws)590*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_keywords_ws)
591*d780102eSjmmv {
592*d780102eSjmmv     using namespace keywords;
593*d780102eSjmmv 
594*d780102eSjmmv     {
595*d780102eSjmmv         std::istringstream iss("var ");
596*d780102eSjmmv         tokenizer mt(iss, true);
597*d780102eSjmmv 
598*d780102eSjmmv         EXPECT(mt, var_type, "var");
599*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
600*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
601*d780102eSjmmv     }
602*d780102eSjmmv 
603*d780102eSjmmv     {
604*d780102eSjmmv         std::istringstream iss(" var \n\tloop\t\n \tendloop \t");
605*d780102eSjmmv         tokenizer mt(iss, true);
606*d780102eSjmmv 
607*d780102eSjmmv         EXPECT(mt, var_type, "var");
608*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
609*d780102eSjmmv         EXPECT(mt, loop_type, "loop");
610*d780102eSjmmv         EXPECT(mt, nl_type, "<<NEWLINE>>");
611*d780102eSjmmv         EXPECT(mt, endloop_type, "endloop");
612*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
613*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
614*d780102eSjmmv     }
615*d780102eSjmmv 
616*d780102eSjmmv     {
617*d780102eSjmmv         std::istringstream iss("var loop endloop");
618*d780102eSjmmv         tokenizer mt(iss, true);
619*d780102eSjmmv 
620*d780102eSjmmv         EXPECT(mt, var_type, "var");
621*d780102eSjmmv         EXPECT(mt, loop_type, "loop");
622*d780102eSjmmv         EXPECT(mt, endloop_type, "endloop");
623*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
624*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
625*d780102eSjmmv     }
626*d780102eSjmmv }
627*d780102eSjmmv 
628*d780102eSjmmv ATF_TEST_CASE(tokenizer_quotes_nows);
ATF_TEST_CASE_HEAD(tokenizer_quotes_nows)629*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_quotes_nows)
630*d780102eSjmmv {
631*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a parser with "
632*d780102eSjmmv                "quoted strings and not skipping whitespace");
633*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_quotes_nows)634*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_quotes_nows)
635*d780102eSjmmv {
636*d780102eSjmmv     using namespace quotes;
637*d780102eSjmmv 
638*d780102eSjmmv     {
639*d780102eSjmmv         std::istringstream iss("var");
640*d780102eSjmmv         tokenizer mt(iss, false);
641*d780102eSjmmv 
642*d780102eSjmmv         EXPECT(mt, word_type, "var");
643*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
644*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
645*d780102eSjmmv     }
646*d780102eSjmmv 
647*d780102eSjmmv     {
648*d780102eSjmmv         std::istringstream iss("\"var\"");
649*d780102eSjmmv         tokenizer mt(iss, false);
650*d780102eSjmmv 
651*d780102eSjmmv         EXPECT(mt, word_type, "var");
652*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
653*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
654*d780102eSjmmv     }
655*d780102eSjmmv 
656*d780102eSjmmv     {
657*d780102eSjmmv         std::istringstream iss("var1\"var2\"");
658*d780102eSjmmv         tokenizer mt(iss, false);
659*d780102eSjmmv 
660*d780102eSjmmv         EXPECT(mt, word_type, "var1");
661*d780102eSjmmv         EXPECT(mt, word_type, "var2");
662*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
663*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
664*d780102eSjmmv     }
665*d780102eSjmmv 
666*d780102eSjmmv     {
667*d780102eSjmmv         std::istringstream iss("var1\"  var2  \"");
668*d780102eSjmmv         tokenizer mt(iss, false);
669*d780102eSjmmv 
670*d780102eSjmmv         EXPECT(mt, word_type, "var1");
671*d780102eSjmmv         EXPECT(mt, word_type, "  var2  ");
672*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
673*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
674*d780102eSjmmv     }
675*d780102eSjmmv }
676*d780102eSjmmv 
677*d780102eSjmmv ATF_TEST_CASE(tokenizer_quotes_ws);
ATF_TEST_CASE_HEAD(tokenizer_quotes_ws)678*d780102eSjmmv ATF_TEST_CASE_HEAD(tokenizer_quotes_ws)
679*d780102eSjmmv {
680*d780102eSjmmv     set_md_var("descr", "Tests the tokenizer class using a parser with "
681*d780102eSjmmv                "quoted strings and skipping whitespace");
682*d780102eSjmmv }
ATF_TEST_CASE_BODY(tokenizer_quotes_ws)683*d780102eSjmmv ATF_TEST_CASE_BODY(tokenizer_quotes_ws)
684*d780102eSjmmv {
685*d780102eSjmmv     using namespace quotes;
686*d780102eSjmmv 
687*d780102eSjmmv     {
688*d780102eSjmmv         std::istringstream iss("  var  ");
689*d780102eSjmmv         tokenizer mt(iss, true);
690*d780102eSjmmv 
691*d780102eSjmmv         EXPECT(mt, word_type, "var");
692*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
693*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
694*d780102eSjmmv     }
695*d780102eSjmmv 
696*d780102eSjmmv     {
697*d780102eSjmmv         std::istringstream iss("  \"var\"  ");
698*d780102eSjmmv         tokenizer mt(iss, true);
699*d780102eSjmmv 
700*d780102eSjmmv         EXPECT(mt, word_type, "var");
701*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
702*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
703*d780102eSjmmv     }
704*d780102eSjmmv 
705*d780102eSjmmv     {
706*d780102eSjmmv         std::istringstream iss("  var1  \"var2\"  ");
707*d780102eSjmmv         tokenizer mt(iss, true);
708*d780102eSjmmv 
709*d780102eSjmmv         EXPECT(mt, word_type, "var1");
710*d780102eSjmmv         EXPECT(mt, word_type, "var2");
711*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
712*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
713*d780102eSjmmv     }
714*d780102eSjmmv 
715*d780102eSjmmv     {
716*d780102eSjmmv         std::istringstream iss("  var1  \"  var2  \"  ");
717*d780102eSjmmv         tokenizer mt(iss, true);
718*d780102eSjmmv 
719*d780102eSjmmv         EXPECT(mt, word_type, "var1");
720*d780102eSjmmv         EXPECT(mt, word_type, "  var2  ");
721*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
722*d780102eSjmmv         EXPECT(mt, eof_type, "<<EOF>>");
723*d780102eSjmmv     }
724*d780102eSjmmv }
725*d780102eSjmmv 
726*d780102eSjmmv // ------------------------------------------------------------------------
727*d780102eSjmmv // Tests for the headers parser.
728*d780102eSjmmv // ------------------------------------------------------------------------
729*d780102eSjmmv 
730*d780102eSjmmv class header_reader {
731*d780102eSjmmv     std::istream& m_is;
732*d780102eSjmmv 
733*d780102eSjmmv public:
header_reader(std::istream & is)734*d780102eSjmmv     header_reader(std::istream& is) :
735*d780102eSjmmv         m_is(is)
736*d780102eSjmmv     {
737*d780102eSjmmv     }
738*d780102eSjmmv 
739*d780102eSjmmv     void
read(void)740*d780102eSjmmv     read(void)
741*d780102eSjmmv     {
742*d780102eSjmmv         std::pair< size_t, tools::parser::headers_map > hml =
743*d780102eSjmmv             tools::parser::read_headers(m_is, 1);
744*d780102eSjmmv         tools::parser::validate_content_type(hml.second,
745*d780102eSjmmv             "application/X-atf-headers-test", 1234);
746*d780102eSjmmv     }
747*d780102eSjmmv 
748*d780102eSjmmv     std::vector< std::string > m_calls;
749*d780102eSjmmv };
750*d780102eSjmmv 
751*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_1);
ATF_TEST_CASE_BODY(headers_1)752*d780102eSjmmv ATF_TEST_CASE_BODY(headers_1)
753*d780102eSjmmv {
754*d780102eSjmmv     const char* input =
755*d780102eSjmmv         ""
756*d780102eSjmmv     ;
757*d780102eSjmmv 
758*d780102eSjmmv     const char* exp_calls[] = {
759*d780102eSjmmv         NULL
760*d780102eSjmmv     };
761*d780102eSjmmv 
762*d780102eSjmmv     const char* exp_errors[] = {
763*d780102eSjmmv         "1: Unexpected token `<<EOF>>'; expected a header name",
764*d780102eSjmmv         NULL
765*d780102eSjmmv     };
766*d780102eSjmmv 
767*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
768*d780102eSjmmv }
769*d780102eSjmmv 
770*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_2);
ATF_TEST_CASE_BODY(headers_2)771*d780102eSjmmv ATF_TEST_CASE_BODY(headers_2)
772*d780102eSjmmv {
773*d780102eSjmmv     const char* input =
774*d780102eSjmmv         "Content-Type\n"
775*d780102eSjmmv     ;
776*d780102eSjmmv 
777*d780102eSjmmv     const char* exp_calls[] = {
778*d780102eSjmmv         NULL
779*d780102eSjmmv     };
780*d780102eSjmmv 
781*d780102eSjmmv     const char* exp_errors[] = {
782*d780102eSjmmv         "1: Unexpected token `<<NEWLINE>>'; expected `:'",
783*d780102eSjmmv         NULL
784*d780102eSjmmv     };
785*d780102eSjmmv 
786*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
787*d780102eSjmmv }
788*d780102eSjmmv 
789*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_3);
ATF_TEST_CASE_BODY(headers_3)790*d780102eSjmmv ATF_TEST_CASE_BODY(headers_3)
791*d780102eSjmmv {
792*d780102eSjmmv     const char* input =
793*d780102eSjmmv         "Content-Type:\n"
794*d780102eSjmmv     ;
795*d780102eSjmmv 
796*d780102eSjmmv     const char* exp_calls[] = {
797*d780102eSjmmv         NULL
798*d780102eSjmmv     };
799*d780102eSjmmv 
800*d780102eSjmmv     const char* exp_errors[] = {
801*d780102eSjmmv         "1: Unexpected token `<<NEWLINE>>'; expected a textual value",
802*d780102eSjmmv         NULL
803*d780102eSjmmv     };
804*d780102eSjmmv 
805*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
806*d780102eSjmmv }
807*d780102eSjmmv 
808*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_4);
ATF_TEST_CASE_BODY(headers_4)809*d780102eSjmmv ATF_TEST_CASE_BODY(headers_4)
810*d780102eSjmmv {
811*d780102eSjmmv     const char* input =
812*d780102eSjmmv         "Content-Type: application/X-atf-headers-test\n"
813*d780102eSjmmv     ;
814*d780102eSjmmv 
815*d780102eSjmmv     const char* exp_calls[] = {
816*d780102eSjmmv         NULL
817*d780102eSjmmv     };
818*d780102eSjmmv 
819*d780102eSjmmv     const char* exp_errors[] = {
820*d780102eSjmmv         "2: Unexpected token `<<EOF>>'; expected a header name",
821*d780102eSjmmv         NULL
822*d780102eSjmmv     };
823*d780102eSjmmv 
824*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
825*d780102eSjmmv }
826*d780102eSjmmv 
827*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_5);
ATF_TEST_CASE_BODY(headers_5)828*d780102eSjmmv ATF_TEST_CASE_BODY(headers_5)
829*d780102eSjmmv {
830*d780102eSjmmv     const char* input =
831*d780102eSjmmv         "Content-Type: application/X-atf-headers-test;\n"
832*d780102eSjmmv     ;
833*d780102eSjmmv 
834*d780102eSjmmv     const char* exp_calls[] = {
835*d780102eSjmmv         NULL
836*d780102eSjmmv     };
837*d780102eSjmmv 
838*d780102eSjmmv     const char* exp_errors[] = {
839*d780102eSjmmv         "1: Unexpected token `<<NEWLINE>>'; expected an attribute name",
840*d780102eSjmmv         NULL
841*d780102eSjmmv     };
842*d780102eSjmmv 
843*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
844*d780102eSjmmv }
845*d780102eSjmmv 
846*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_6);
ATF_TEST_CASE_BODY(headers_6)847*d780102eSjmmv ATF_TEST_CASE_BODY(headers_6)
848*d780102eSjmmv {
849*d780102eSjmmv     const char* input =
850*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version\n"
851*d780102eSjmmv     ;
852*d780102eSjmmv 
853*d780102eSjmmv     const char* exp_calls[] = {
854*d780102eSjmmv         NULL
855*d780102eSjmmv     };
856*d780102eSjmmv 
857*d780102eSjmmv     const char* exp_errors[] = {
858*d780102eSjmmv         "1: Unexpected token `<<NEWLINE>>'; expected `='",
859*d780102eSjmmv         NULL
860*d780102eSjmmv     };
861*d780102eSjmmv 
862*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
863*d780102eSjmmv }
864*d780102eSjmmv 
865*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_7);
ATF_TEST_CASE_BODY(headers_7)866*d780102eSjmmv ATF_TEST_CASE_BODY(headers_7)
867*d780102eSjmmv {
868*d780102eSjmmv     const char* input =
869*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version=\n"
870*d780102eSjmmv     ;
871*d780102eSjmmv 
872*d780102eSjmmv     const char* exp_calls[] = {
873*d780102eSjmmv         NULL
874*d780102eSjmmv     };
875*d780102eSjmmv 
876*d780102eSjmmv     const char* exp_errors[] = {
877*d780102eSjmmv         "1: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
878*d780102eSjmmv         NULL
879*d780102eSjmmv     };
880*d780102eSjmmv 
881*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
882*d780102eSjmmv }
883*d780102eSjmmv 
884*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_8);
ATF_TEST_CASE_BODY(headers_8)885*d780102eSjmmv ATF_TEST_CASE_BODY(headers_8)
886*d780102eSjmmv {
887*d780102eSjmmv     const char* input =
888*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version=\"1234\n"
889*d780102eSjmmv     ;
890*d780102eSjmmv 
891*d780102eSjmmv     const char* exp_calls[] = {
892*d780102eSjmmv         NULL
893*d780102eSjmmv     };
894*d780102eSjmmv 
895*d780102eSjmmv     const char* exp_errors[] = {
896*d780102eSjmmv         "1: Missing double quotes before end of line",
897*d780102eSjmmv         NULL
898*d780102eSjmmv     };
899*d780102eSjmmv 
900*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
901*d780102eSjmmv }
902*d780102eSjmmv 
903*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_9);
ATF_TEST_CASE_BODY(headers_9)904*d780102eSjmmv ATF_TEST_CASE_BODY(headers_9)
905*d780102eSjmmv {
906*d780102eSjmmv     const char* input =
907*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version=1234\"\n"
908*d780102eSjmmv     ;
909*d780102eSjmmv 
910*d780102eSjmmv     const char* exp_calls[] = {
911*d780102eSjmmv         NULL
912*d780102eSjmmv     };
913*d780102eSjmmv 
914*d780102eSjmmv     const char* exp_errors[] = {
915*d780102eSjmmv         "1: Missing double quotes before end of line",
916*d780102eSjmmv         NULL
917*d780102eSjmmv     };
918*d780102eSjmmv 
919*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
920*d780102eSjmmv }
921*d780102eSjmmv 
922*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_10);
ATF_TEST_CASE_BODY(headers_10)923*d780102eSjmmv ATF_TEST_CASE_BODY(headers_10)
924*d780102eSjmmv {
925*d780102eSjmmv     const char* input =
926*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version=1234\n"
927*d780102eSjmmv     ;
928*d780102eSjmmv 
929*d780102eSjmmv     const char* exp_calls[] = {
930*d780102eSjmmv         NULL
931*d780102eSjmmv     };
932*d780102eSjmmv 
933*d780102eSjmmv     const char* exp_errors[] = {
934*d780102eSjmmv         "2: Unexpected token `<<EOF>>'; expected a header name",
935*d780102eSjmmv         NULL
936*d780102eSjmmv     };
937*d780102eSjmmv 
938*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
939*d780102eSjmmv }
940*d780102eSjmmv 
941*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_11);
ATF_TEST_CASE_BODY(headers_11)942*d780102eSjmmv ATF_TEST_CASE_BODY(headers_11)
943*d780102eSjmmv {
944*d780102eSjmmv     const char* input =
945*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version=\"1234\"\n"
946*d780102eSjmmv     ;
947*d780102eSjmmv 
948*d780102eSjmmv     const char* exp_calls[] = {
949*d780102eSjmmv         NULL
950*d780102eSjmmv     };
951*d780102eSjmmv 
952*d780102eSjmmv     const char* exp_errors[] = {
953*d780102eSjmmv         "2: Unexpected token `<<EOF>>'; expected a header name",
954*d780102eSjmmv         NULL
955*d780102eSjmmv     };
956*d780102eSjmmv 
957*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
958*d780102eSjmmv }
959*d780102eSjmmv 
960*d780102eSjmmv ATF_TEST_CASE_WITHOUT_HEAD(headers_12);
ATF_TEST_CASE_BODY(headers_12)961*d780102eSjmmv ATF_TEST_CASE_BODY(headers_12)
962*d780102eSjmmv {
963*d780102eSjmmv     const char* input =
964*d780102eSjmmv         "Content-Type: application/X-atf-headers-test; version=\"1234\"\n"
965*d780102eSjmmv         "a b\n"
966*d780102eSjmmv         "a-b:\n"
967*d780102eSjmmv         "a-b: foo;\n"
968*d780102eSjmmv         "a-b: foo; var\n"
969*d780102eSjmmv         "a-b: foo; var=\n"
970*d780102eSjmmv         "a-b: foo; var=\"a\n"
971*d780102eSjmmv         "a-b: foo; var=a\"\n"
972*d780102eSjmmv         "a-b: foo; var=\"a\";\n"
973*d780102eSjmmv         "a-b: foo; var=\"a\"; second\n"
974*d780102eSjmmv         "a-b: foo; var=\"a\"; second=\n"
975*d780102eSjmmv         "a-b: foo; var=\"a\"; second=\"b\n"
976*d780102eSjmmv         "a-b: foo; var=\"a\"; second=b\"\n"
977*d780102eSjmmv         "a-b: foo; var=\"a\"; second=\"b\"\n"
978*d780102eSjmmv     ;
979*d780102eSjmmv 
980*d780102eSjmmv     const char* exp_calls[] = {
981*d780102eSjmmv         NULL
982*d780102eSjmmv     };
983*d780102eSjmmv 
984*d780102eSjmmv     const char* exp_errors[] = {
985*d780102eSjmmv         "2: Unexpected token `b'; expected `:'",
986*d780102eSjmmv         "3: Unexpected token `<<NEWLINE>>'; expected a textual value",
987*d780102eSjmmv         "4: Unexpected token `<<NEWLINE>>'; expected an attribute name",
988*d780102eSjmmv         "5: Unexpected token `<<NEWLINE>>'; expected `='",
989*d780102eSjmmv         "6: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
990*d780102eSjmmv         "7: Missing double quotes before end of line",
991*d780102eSjmmv         "8: Missing double quotes before end of line",
992*d780102eSjmmv         "9: Unexpected token `<<NEWLINE>>'; expected an attribute name",
993*d780102eSjmmv         "10: Unexpected token `<<NEWLINE>>'; expected `='",
994*d780102eSjmmv         "11: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
995*d780102eSjmmv         "12: Missing double quotes before end of line",
996*d780102eSjmmv         "13: Missing double quotes before end of line",
997*d780102eSjmmv         NULL
998*d780102eSjmmv     };
999*d780102eSjmmv 
1000*d780102eSjmmv     do_parser_test< header_reader >(input, exp_calls, exp_errors);
1001*d780102eSjmmv }
1002*d780102eSjmmv 
1003*d780102eSjmmv // ------------------------------------------------------------------------
1004*d780102eSjmmv // Main.
1005*d780102eSjmmv // ------------------------------------------------------------------------
1006*d780102eSjmmv 
ATF_INIT_TEST_CASES(tcs)1007*d780102eSjmmv ATF_INIT_TEST_CASES(tcs)
1008*d780102eSjmmv {
1009*d780102eSjmmv     // Add test cases for the "parse_error" class.
1010*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, parse_error_to_string);
1011*d780102eSjmmv 
1012*d780102eSjmmv     // Add test cases for the "parse_errors" class.
1013*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, parse_errors_what);
1014*d780102eSjmmv 
1015*d780102eSjmmv     // Add test cases for the "token" class.
1016*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, token_getters);
1017*d780102eSjmmv 
1018*d780102eSjmmv     // Add test cases for the "tokenizer" class.
1019*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_minimal_nows);
1020*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_minimal_ws);
1021*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_delims_nows);
1022*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_delims_ws);
1023*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_keywords_nows);
1024*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_keywords_ws);
1025*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_quotes_nows);
1026*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, tokenizer_quotes_ws);
1027*d780102eSjmmv 
1028*d780102eSjmmv     // Add the tests for the headers parser.
1029*d780102eSjmmv 
1030*d780102eSjmmv     // Add the test cases for the header file.
1031*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_1);
1032*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_2);
1033*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_3);
1034*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_4);
1035*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_5);
1036*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_6);
1037*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_7);
1038*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_8);
1039*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_9);
1040*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_10);
1041*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_11);
1042*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, headers_12);
1043*d780102eSjmmv }
1044