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