Remove building with NOCRYPTO option
[minix3.git] / external / bsd / atf / dist / tools / parser_test.cpp
blob434a1a6780c4bad46dc145e7efcf47f7e4806a3d
1 //
2 // Automated Testing Framework (atf)
3 //
4 // Copyright (c) 2007 The NetBSD Foundation, Inc.
5 // All rights reserved.
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 // 1. Redistributions of source code must retain the above copyright
11 // notice, this list of conditions and the following disclaimer.
12 // 2. Redistributions in binary form must reproduce the above copyright
13 // notice, this list of conditions and the following disclaimer in the
14 // documentation and/or other materials provided with the distribution.
16 // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17 // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23 // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include <sstream>
32 #include <atf-c++.hpp>
34 #include "parser.hpp"
35 #include "test_helpers.hpp"
37 // ------------------------------------------------------------------------
38 // Tests for the "parse_error" class.
39 // ------------------------------------------------------------------------
41 ATF_TEST_CASE(parse_error_to_string);
42 ATF_TEST_CASE_HEAD(parse_error_to_string)
44 set_md_var("descr", "Tests the parse_error conversion to strings");
46 ATF_TEST_CASE_BODY(parse_error_to_string)
48 using tools::parser::parse_error;
50 const parse_error e(123, "This is the message");
51 ATF_REQUIRE_EQ("123: This is the message", std::string(e));
54 // ------------------------------------------------------------------------
55 // Tests for the "parse_errors" class.
56 // ------------------------------------------------------------------------
58 ATF_TEST_CASE(parse_errors_what);
59 ATF_TEST_CASE_HEAD(parse_errors_what)
61 set_md_var("descr", "Tests the parse_errors description");
63 ATF_TEST_CASE_BODY(parse_errors_what)
65 using tools::parser::parse_error;
66 using tools::parser::parse_errors;
68 parse_errors es;
69 es.push_back(parse_error(2, "Second error"));
70 es.push_back(parse_error(1, "First error"));
72 ATF_REQUIRE_EQ("2: Second error\n1: First error", std::string(es.what()));
75 // ------------------------------------------------------------------------
76 // Tests for the "token" class.
77 // ------------------------------------------------------------------------
79 ATF_TEST_CASE(token_getters);
80 ATF_TEST_CASE_HEAD(token_getters)
82 set_md_var("descr", "Tests the token getters");
84 ATF_TEST_CASE_BODY(token_getters)
86 using tools::parser::token;
89 token t(10, 0);
90 ATF_REQUIRE_EQ(t.lineno(), 10);
91 ATF_REQUIRE_EQ(t.type(), 0);
92 ATF_REQUIRE(t.text().empty());
96 token t(10, 0, "foo");
97 ATF_REQUIRE_EQ(t.lineno(), 10);
98 ATF_REQUIRE_EQ(t.type(), 0);
99 ATF_REQUIRE_EQ(t.text(), "foo");
103 token t(20, 1);
104 ATF_REQUIRE_EQ(t.lineno(), 20);
105 ATF_REQUIRE_EQ(t.type(), 1);
106 ATF_REQUIRE(t.text().empty());
110 token t(20, 1, "bar");
111 ATF_REQUIRE_EQ(t.lineno(), 20);
112 ATF_REQUIRE_EQ(t.type(), 1);
113 ATF_REQUIRE_EQ(t.text(), "bar");
117 // ------------------------------------------------------------------------
118 // Tests for the "tokenizer" class.
119 // ------------------------------------------------------------------------
121 #define EXPECT(tkz, ttype, ttext) \
122 do { \
123 tools::parser::token t = tkz.next(); \
124 ATF_REQUIRE(t.type() == ttype); \
125 ATF_REQUIRE_EQ(t.text(), ttext); \
126 } while (false);
128 namespace minimal {
130 static const tools::parser::token_type eof_type = 0;
131 static const tools::parser::token_type nl_type = 1;
132 static const tools::parser::token_type word_type = 2;
134 class tokenizer : public tools::parser::tokenizer< std::istream > {
135 public:
136 tokenizer(std::istream& is, bool skipws) :
137 tools::parser::tokenizer< std::istream >
138 (is, skipws, eof_type, nl_type, word_type)
145 namespace delims {
147 static const tools::parser::token_type eof_type = 0;
148 static const tools::parser::token_type nl_type = 1;
149 static const tools::parser::token_type word_type = 2;
150 static const tools::parser::token_type plus_type = 3;
151 static const tools::parser::token_type minus_type = 4;
152 static const tools::parser::token_type equal_type = 5;
154 class tokenizer : public tools::parser::tokenizer< std::istream > {
155 public:
156 tokenizer(std::istream& is, bool skipws) :
157 tools::parser::tokenizer< std::istream >
158 (is, skipws, eof_type, nl_type, word_type)
160 add_delim('+', plus_type);
161 add_delim('-', minus_type);
162 add_delim('=', equal_type);
168 namespace keywords {
170 static const tools::parser::token_type eof_type = 0;
171 static const tools::parser::token_type nl_type = 1;
172 static const tools::parser::token_type word_type = 2;
173 static const tools::parser::token_type var_type = 3;
174 static const tools::parser::token_type loop_type = 4;
175 static const tools::parser::token_type endloop_type = 5;
177 class tokenizer : public tools::parser::tokenizer< std::istream > {
178 public:
179 tokenizer(std::istream& is, bool skipws) :
180 tools::parser::tokenizer< std::istream >
181 (is, skipws, eof_type, nl_type, word_type)
183 add_keyword("var", var_type);
184 add_keyword("loop", loop_type);
185 add_keyword("endloop", endloop_type);
191 namespace quotes {
193 static const tools::parser::token_type eof_type = 0;
194 static const tools::parser::token_type nl_type = 1;
195 static const tools::parser::token_type word_type = 2;
196 static const tools::parser::token_type dblquote_type = 3;
198 class tokenizer : public tools::parser::tokenizer< std::istream > {
199 public:
200 tokenizer(std::istream& is, bool skipws) :
201 tools::parser::tokenizer< std::istream >
202 (is, skipws, eof_type, nl_type, word_type)
204 add_quote('"', dblquote_type);
210 ATF_TEST_CASE(tokenizer_minimal_nows);
211 ATF_TEST_CASE_HEAD(tokenizer_minimal_nows)
213 set_md_var("descr", "Tests the tokenizer class using a minimal parser "
214 "and not skipping whitespace");
216 ATF_TEST_CASE_BODY(tokenizer_minimal_nows)
218 using namespace minimal;
221 std::istringstream iss("");
222 tokenizer mt(iss, false);
224 EXPECT(mt, eof_type, "<<EOF>>");
225 EXPECT(mt, eof_type, "<<EOF>>");
229 std::istringstream iss("\n");
230 tokenizer mt(iss, false);
232 EXPECT(mt, nl_type, "<<NEWLINE>>");
233 EXPECT(mt, eof_type, "<<EOF>>");
234 EXPECT(mt, eof_type, "<<EOF>>");
238 std::istringstream iss("\n\n\n");
239 tokenizer mt(iss, false);
241 EXPECT(mt, nl_type, "<<NEWLINE>>");
242 EXPECT(mt, nl_type, "<<NEWLINE>>");
243 EXPECT(mt, nl_type, "<<NEWLINE>>");
244 EXPECT(mt, eof_type, "<<EOF>>");
245 EXPECT(mt, eof_type, "<<EOF>>");
249 std::istringstream iss("line 1");
250 tokenizer mt(iss, false);
252 EXPECT(mt, word_type, "line 1");
253 EXPECT(mt, eof_type, "<<EOF>>");
254 EXPECT(mt, eof_type, "<<EOF>>");
258 std::istringstream iss("line 1\n");
259 tokenizer mt(iss, false);
261 EXPECT(mt, word_type, "line 1");
262 EXPECT(mt, nl_type, "<<NEWLINE>>");
263 EXPECT(mt, eof_type, "<<EOF>>");
264 EXPECT(mt, eof_type, "<<EOF>>");
268 std::istringstream iss("line 1\nline 2");
269 tokenizer mt(iss, false);
271 EXPECT(mt, word_type, "line 1");
272 EXPECT(mt, nl_type, "<<NEWLINE>>");
273 EXPECT(mt, word_type, "line 2");
274 EXPECT(mt, eof_type, "<<EOF>>");
275 EXPECT(mt, eof_type, "<<EOF>>");
279 std::istringstream iss("line 1\nline 2\nline 3\n");
280 tokenizer mt(iss, false);
282 EXPECT(mt, word_type, "line 1");
283 EXPECT(mt, nl_type, "<<NEWLINE>>");
284 EXPECT(mt, word_type, "line 2");
285 EXPECT(mt, nl_type, "<<NEWLINE>>");
286 EXPECT(mt, word_type, "line 3");
287 EXPECT(mt, nl_type, "<<NEWLINE>>");
288 EXPECT(mt, eof_type, "<<EOF>>");
289 EXPECT(mt, eof_type, "<<EOF>>");
293 ATF_TEST_CASE(tokenizer_minimal_ws);
294 ATF_TEST_CASE_HEAD(tokenizer_minimal_ws)
296 set_md_var("descr", "Tests the tokenizer class using a minimal parser "
297 "and skipping whitespace");
299 ATF_TEST_CASE_BODY(tokenizer_minimal_ws)
301 using namespace minimal;
304 std::istringstream iss("");
305 minimal::tokenizer mt(iss, true);
307 EXPECT(mt, eof_type, "<<EOF>>");
308 EXPECT(mt, eof_type, "<<EOF>>");
312 std::istringstream iss(" \t ");
313 tokenizer mt(iss, true);
315 EXPECT(mt, eof_type, "<<EOF>>");
316 EXPECT(mt, eof_type, "<<EOF>>");
320 std::istringstream iss("\n");
321 tokenizer mt(iss, true);
323 EXPECT(mt, nl_type, "<<NEWLINE>>");
324 EXPECT(mt, eof_type, "<<EOF>>");
325 EXPECT(mt, eof_type, "<<EOF>>");
329 std::istringstream iss(" \t \n \t ");
330 tokenizer mt(iss, true);
332 EXPECT(mt, nl_type, "<<NEWLINE>>");
333 EXPECT(mt, eof_type, "<<EOF>>");
334 EXPECT(mt, eof_type, "<<EOF>>");
338 std::istringstream iss("\n\n\n");
339 tokenizer mt(iss, true);
341 EXPECT(mt, nl_type, "<<NEWLINE>>");
342 EXPECT(mt, nl_type, "<<NEWLINE>>");
343 EXPECT(mt, nl_type, "<<NEWLINE>>");
344 EXPECT(mt, eof_type, "<<EOF>>");
345 EXPECT(mt, eof_type, "<<EOF>>");
349 std::istringstream iss("line 1");
350 tokenizer mt(iss, true);
352 EXPECT(mt, word_type, "line");
353 EXPECT(mt, word_type, "1");
354 EXPECT(mt, eof_type, "<<EOF>>");
355 EXPECT(mt, eof_type, "<<EOF>>");
359 std::istringstream iss(" \tline\t 1\t");
360 tokenizer mt(iss, true);
362 EXPECT(mt, word_type, "line");
363 EXPECT(mt, word_type, "1");
364 EXPECT(mt, eof_type, "<<EOF>>");
365 EXPECT(mt, eof_type, "<<EOF>>");
369 std::istringstream iss("line 1\n");
370 tokenizer mt(iss, true);
372 EXPECT(mt, word_type, "line");
373 EXPECT(mt, word_type, "1");
374 EXPECT(mt, nl_type, "<<NEWLINE>>");
375 EXPECT(mt, eof_type, "<<EOF>>");
376 EXPECT(mt, eof_type, "<<EOF>>");
380 std::istringstream iss("line 1\nline 2");
381 tokenizer mt(iss, true);
383 EXPECT(mt, word_type, "line");
384 EXPECT(mt, word_type, "1");
385 EXPECT(mt, nl_type, "<<NEWLINE>>");
386 EXPECT(mt, word_type, "line");
387 EXPECT(mt, word_type, "2");
388 EXPECT(mt, eof_type, "<<EOF>>");
389 EXPECT(mt, eof_type, "<<EOF>>");
393 std::istringstream iss("line 1\nline 2\nline 3\n");
394 tokenizer mt(iss, true);
396 EXPECT(mt, word_type, "line");
397 EXPECT(mt, word_type, "1");
398 EXPECT(mt, nl_type, "<<NEWLINE>>");
399 EXPECT(mt, word_type, "line");
400 EXPECT(mt, word_type, "2");
401 EXPECT(mt, nl_type, "<<NEWLINE>>");
402 EXPECT(mt, word_type, "line");
403 EXPECT(mt, word_type, "3");
404 EXPECT(mt, nl_type, "<<NEWLINE>>");
405 EXPECT(mt, eof_type, "<<EOF>>");
406 EXPECT(mt, eof_type, "<<EOF>>");
410 std::istringstream iss(" \t line \t 1\n\tline\t2\n line 3 \n");
411 tokenizer mt(iss, true);
413 EXPECT(mt, word_type, "line");
414 EXPECT(mt, word_type, "1");
415 EXPECT(mt, nl_type, "<<NEWLINE>>");
416 EXPECT(mt, word_type, "line");
417 EXPECT(mt, word_type, "2");
418 EXPECT(mt, nl_type, "<<NEWLINE>>");
419 EXPECT(mt, word_type, "line");
420 EXPECT(mt, word_type, "3");
421 EXPECT(mt, nl_type, "<<NEWLINE>>");
422 EXPECT(mt, eof_type, "<<EOF>>");
423 EXPECT(mt, eof_type, "<<EOF>>");
427 ATF_TEST_CASE(tokenizer_delims_nows);
428 ATF_TEST_CASE_HEAD(tokenizer_delims_nows)
430 set_md_var("descr", "Tests the tokenizer class using a parser with some "
431 "additional delimiters and not skipping whitespace");
433 ATF_TEST_CASE_BODY(tokenizer_delims_nows)
435 using namespace delims;
438 std::istringstream iss("+-=");
439 tokenizer mt(iss, false);
441 EXPECT(mt, plus_type, "+");
442 EXPECT(mt, minus_type, "-");
443 EXPECT(mt, equal_type, "=");
444 EXPECT(mt, eof_type, "<<EOF>>");
445 EXPECT(mt, eof_type, "<<EOF>>");
449 std::istringstream iss("+++");
450 tokenizer mt(iss, false);
452 EXPECT(mt, plus_type, "+");
453 EXPECT(mt, plus_type, "+");
454 EXPECT(mt, plus_type, "+");
455 EXPECT(mt, eof_type, "<<EOF>>");
456 EXPECT(mt, eof_type, "<<EOF>>");
460 std::istringstream iss("\n+\n++\n");
461 tokenizer mt(iss, false);
463 EXPECT(mt, nl_type, "<<NEWLINE>>");
464 EXPECT(mt, plus_type, "+");
465 EXPECT(mt, nl_type, "<<NEWLINE>>");
466 EXPECT(mt, plus_type, "+");
467 EXPECT(mt, plus_type, "+");
468 EXPECT(mt, nl_type, "<<NEWLINE>>");
469 EXPECT(mt, eof_type, "<<EOF>>");
470 EXPECT(mt, eof_type, "<<EOF>>");
474 std::istringstream iss("foo+bar=baz");
475 tokenizer mt(iss, false);
477 EXPECT(mt, word_type, "foo");
478 EXPECT(mt, plus_type, "+");
479 EXPECT(mt, word_type, "bar");
480 EXPECT(mt, equal_type, "=");
481 EXPECT(mt, word_type, "baz");
482 EXPECT(mt, eof_type, "<<EOF>>");
483 EXPECT(mt, eof_type, "<<EOF>>");
487 std::istringstream iss(" foo\t+\tbar = baz ");
488 tokenizer mt(iss, false);
490 EXPECT(mt, word_type, " foo\t");
491 EXPECT(mt, plus_type, "+");
492 EXPECT(mt, word_type, "\tbar ");
493 EXPECT(mt, equal_type, "=");
494 EXPECT(mt, word_type, " baz ");
495 EXPECT(mt, eof_type, "<<EOF>>");
496 EXPECT(mt, eof_type, "<<EOF>>");
500 ATF_TEST_CASE(tokenizer_delims_ws);
501 ATF_TEST_CASE_HEAD(tokenizer_delims_ws)
503 set_md_var("descr", "Tests the tokenizer class using a parser with some "
504 "additional delimiters and skipping whitespace");
506 ATF_TEST_CASE_BODY(tokenizer_delims_ws)
508 using namespace delims;
511 std::istringstream iss(" foo\t+\tbar = baz ");
512 tokenizer mt(iss, true);
514 EXPECT(mt, word_type, "foo");
515 EXPECT(mt, plus_type, "+");
516 EXPECT(mt, word_type, "bar");
517 EXPECT(mt, equal_type, "=");
518 EXPECT(mt, word_type, "baz");
519 EXPECT(mt, eof_type, "<<EOF>>");
520 EXPECT(mt, eof_type, "<<EOF>>");
524 ATF_TEST_CASE(tokenizer_keywords_nows);
525 ATF_TEST_CASE_HEAD(tokenizer_keywords_nows)
527 set_md_var("descr", "Tests the tokenizer class using a parser with some "
528 "additional keywords and not skipping whitespace");
530 ATF_TEST_CASE_BODY(tokenizer_keywords_nows)
532 using namespace keywords;
535 std::istringstream iss("var");
536 tokenizer mt(iss, false);
538 EXPECT(mt, var_type, "var");
539 EXPECT(mt, eof_type, "<<EOF>>");
540 EXPECT(mt, eof_type, "<<EOF>>");
544 std::istringstream iss("va");
545 tokenizer mt(iss, false);
547 EXPECT(mt, word_type, "va");
548 EXPECT(mt, eof_type, "<<EOF>>");
549 EXPECT(mt, eof_type, "<<EOF>>");
553 std::istringstream iss("vara");
554 tokenizer mt(iss, false);
556 EXPECT(mt, word_type, "vara");
557 EXPECT(mt, eof_type, "<<EOF>>");
558 EXPECT(mt, eof_type, "<<EOF>>");
562 std::istringstream iss("var ");
563 tokenizer mt(iss, false);
565 EXPECT(mt, word_type, "var ");
566 EXPECT(mt, eof_type, "<<EOF>>");
567 EXPECT(mt, eof_type, "<<EOF>>");
571 std::istringstream iss("var\nloop\nendloop");
572 tokenizer mt(iss, false);
574 EXPECT(mt, var_type, "var");
575 EXPECT(mt, nl_type, "<<NEWLINE>>");
576 EXPECT(mt, loop_type, "loop");
577 EXPECT(mt, nl_type, "<<NEWLINE>>");
578 EXPECT(mt, endloop_type, "endloop");
579 EXPECT(mt, eof_type, "<<EOF>>");
580 EXPECT(mt, eof_type, "<<EOF>>");
584 ATF_TEST_CASE(tokenizer_keywords_ws);
585 ATF_TEST_CASE_HEAD(tokenizer_keywords_ws)
587 set_md_var("descr", "Tests the tokenizer class using a parser with some "
588 "additional keywords and not skipping whitespace");
590 ATF_TEST_CASE_BODY(tokenizer_keywords_ws)
592 using namespace keywords;
595 std::istringstream iss("var ");
596 tokenizer mt(iss, true);
598 EXPECT(mt, var_type, "var");
599 EXPECT(mt, eof_type, "<<EOF>>");
600 EXPECT(mt, eof_type, "<<EOF>>");
604 std::istringstream iss(" var \n\tloop\t\n \tendloop \t");
605 tokenizer mt(iss, true);
607 EXPECT(mt, var_type, "var");
608 EXPECT(mt, nl_type, "<<NEWLINE>>");
609 EXPECT(mt, loop_type, "loop");
610 EXPECT(mt, nl_type, "<<NEWLINE>>");
611 EXPECT(mt, endloop_type, "endloop");
612 EXPECT(mt, eof_type, "<<EOF>>");
613 EXPECT(mt, eof_type, "<<EOF>>");
617 std::istringstream iss("var loop endloop");
618 tokenizer mt(iss, true);
620 EXPECT(mt, var_type, "var");
621 EXPECT(mt, loop_type, "loop");
622 EXPECT(mt, endloop_type, "endloop");
623 EXPECT(mt, eof_type, "<<EOF>>");
624 EXPECT(mt, eof_type, "<<EOF>>");
628 ATF_TEST_CASE(tokenizer_quotes_nows);
629 ATF_TEST_CASE_HEAD(tokenizer_quotes_nows)
631 set_md_var("descr", "Tests the tokenizer class using a parser with "
632 "quoted strings and not skipping whitespace");
634 ATF_TEST_CASE_BODY(tokenizer_quotes_nows)
636 using namespace quotes;
639 std::istringstream iss("var");
640 tokenizer mt(iss, false);
642 EXPECT(mt, word_type, "var");
643 EXPECT(mt, eof_type, "<<EOF>>");
644 EXPECT(mt, eof_type, "<<EOF>>");
648 std::istringstream iss("\"var\"");
649 tokenizer mt(iss, false);
651 EXPECT(mt, word_type, "var");
652 EXPECT(mt, eof_type, "<<EOF>>");
653 EXPECT(mt, eof_type, "<<EOF>>");
657 std::istringstream iss("var1\"var2\"");
658 tokenizer mt(iss, false);
660 EXPECT(mt, word_type, "var1");
661 EXPECT(mt, word_type, "var2");
662 EXPECT(mt, eof_type, "<<EOF>>");
663 EXPECT(mt, eof_type, "<<EOF>>");
667 std::istringstream iss("var1\" var2 \"");
668 tokenizer mt(iss, false);
670 EXPECT(mt, word_type, "var1");
671 EXPECT(mt, word_type, " var2 ");
672 EXPECT(mt, eof_type, "<<EOF>>");
673 EXPECT(mt, eof_type, "<<EOF>>");
677 ATF_TEST_CASE(tokenizer_quotes_ws);
678 ATF_TEST_CASE_HEAD(tokenizer_quotes_ws)
680 set_md_var("descr", "Tests the tokenizer class using a parser with "
681 "quoted strings and skipping whitespace");
683 ATF_TEST_CASE_BODY(tokenizer_quotes_ws)
685 using namespace quotes;
688 std::istringstream iss(" var ");
689 tokenizer mt(iss, true);
691 EXPECT(mt, word_type, "var");
692 EXPECT(mt, eof_type, "<<EOF>>");
693 EXPECT(mt, eof_type, "<<EOF>>");
697 std::istringstream iss(" \"var\" ");
698 tokenizer mt(iss, true);
700 EXPECT(mt, word_type, "var");
701 EXPECT(mt, eof_type, "<<EOF>>");
702 EXPECT(mt, eof_type, "<<EOF>>");
706 std::istringstream iss(" var1 \"var2\" ");
707 tokenizer mt(iss, true);
709 EXPECT(mt, word_type, "var1");
710 EXPECT(mt, word_type, "var2");
711 EXPECT(mt, eof_type, "<<EOF>>");
712 EXPECT(mt, eof_type, "<<EOF>>");
716 std::istringstream iss(" var1 \" var2 \" ");
717 tokenizer mt(iss, true);
719 EXPECT(mt, word_type, "var1");
720 EXPECT(mt, word_type, " var2 ");
721 EXPECT(mt, eof_type, "<<EOF>>");
722 EXPECT(mt, eof_type, "<<EOF>>");
726 // ------------------------------------------------------------------------
727 // Tests for the headers parser.
728 // ------------------------------------------------------------------------
730 class header_reader {
731 std::istream& m_is;
733 public:
734 header_reader(std::istream& is) :
735 m_is(is)
739 void
740 read(void)
742 std::pair< size_t, tools::parser::headers_map > hml =
743 tools::parser::read_headers(m_is, 1);
744 tools::parser::validate_content_type(hml.second,
745 "application/X-atf-headers-test", 1234);
748 std::vector< std::string > m_calls;
751 ATF_TEST_CASE_WITHOUT_HEAD(headers_1);
752 ATF_TEST_CASE_BODY(headers_1)
754 const char* input =
758 const char* exp_calls[] = {
759 NULL
762 const char* exp_errors[] = {
763 "1: Unexpected token `<<EOF>>'; expected a header name",
764 NULL
767 do_parser_test< header_reader >(input, exp_calls, exp_errors);
770 ATF_TEST_CASE_WITHOUT_HEAD(headers_2);
771 ATF_TEST_CASE_BODY(headers_2)
773 const char* input =
774 "Content-Type\n"
777 const char* exp_calls[] = {
778 NULL
781 const char* exp_errors[] = {
782 "1: Unexpected token `<<NEWLINE>>'; expected `:'",
783 NULL
786 do_parser_test< header_reader >(input, exp_calls, exp_errors);
789 ATF_TEST_CASE_WITHOUT_HEAD(headers_3);
790 ATF_TEST_CASE_BODY(headers_3)
792 const char* input =
793 "Content-Type:\n"
796 const char* exp_calls[] = {
797 NULL
800 const char* exp_errors[] = {
801 "1: Unexpected token `<<NEWLINE>>'; expected a textual value",
802 NULL
805 do_parser_test< header_reader >(input, exp_calls, exp_errors);
808 ATF_TEST_CASE_WITHOUT_HEAD(headers_4);
809 ATF_TEST_CASE_BODY(headers_4)
811 const char* input =
812 "Content-Type: application/X-atf-headers-test\n"
815 const char* exp_calls[] = {
816 NULL
819 const char* exp_errors[] = {
820 "2: Unexpected token `<<EOF>>'; expected a header name",
821 NULL
824 do_parser_test< header_reader >(input, exp_calls, exp_errors);
827 ATF_TEST_CASE_WITHOUT_HEAD(headers_5);
828 ATF_TEST_CASE_BODY(headers_5)
830 const char* input =
831 "Content-Type: application/X-atf-headers-test;\n"
834 const char* exp_calls[] = {
835 NULL
838 const char* exp_errors[] = {
839 "1: Unexpected token `<<NEWLINE>>'; expected an attribute name",
840 NULL
843 do_parser_test< header_reader >(input, exp_calls, exp_errors);
846 ATF_TEST_CASE_WITHOUT_HEAD(headers_6);
847 ATF_TEST_CASE_BODY(headers_6)
849 const char* input =
850 "Content-Type: application/X-atf-headers-test; version\n"
853 const char* exp_calls[] = {
854 NULL
857 const char* exp_errors[] = {
858 "1: Unexpected token `<<NEWLINE>>'; expected `='",
859 NULL
862 do_parser_test< header_reader >(input, exp_calls, exp_errors);
865 ATF_TEST_CASE_WITHOUT_HEAD(headers_7);
866 ATF_TEST_CASE_BODY(headers_7)
868 const char* input =
869 "Content-Type: application/X-atf-headers-test; version=\n"
872 const char* exp_calls[] = {
873 NULL
876 const char* exp_errors[] = {
877 "1: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
878 NULL
881 do_parser_test< header_reader >(input, exp_calls, exp_errors);
884 ATF_TEST_CASE_WITHOUT_HEAD(headers_8);
885 ATF_TEST_CASE_BODY(headers_8)
887 const char* input =
888 "Content-Type: application/X-atf-headers-test; version=\"1234\n"
891 const char* exp_calls[] = {
892 NULL
895 const char* exp_errors[] = {
896 "1: Missing double quotes before end of line",
897 NULL
900 do_parser_test< header_reader >(input, exp_calls, exp_errors);
903 ATF_TEST_CASE_WITHOUT_HEAD(headers_9);
904 ATF_TEST_CASE_BODY(headers_9)
906 const char* input =
907 "Content-Type: application/X-atf-headers-test; version=1234\"\n"
910 const char* exp_calls[] = {
911 NULL
914 const char* exp_errors[] = {
915 "1: Missing double quotes before end of line",
916 NULL
919 do_parser_test< header_reader >(input, exp_calls, exp_errors);
922 ATF_TEST_CASE_WITHOUT_HEAD(headers_10);
923 ATF_TEST_CASE_BODY(headers_10)
925 const char* input =
926 "Content-Type: application/X-atf-headers-test; version=1234\n"
929 const char* exp_calls[] = {
930 NULL
933 const char* exp_errors[] = {
934 "2: Unexpected token `<<EOF>>'; expected a header name",
935 NULL
938 do_parser_test< header_reader >(input, exp_calls, exp_errors);
941 ATF_TEST_CASE_WITHOUT_HEAD(headers_11);
942 ATF_TEST_CASE_BODY(headers_11)
944 const char* input =
945 "Content-Type: application/X-atf-headers-test; version=\"1234\"\n"
948 const char* exp_calls[] = {
949 NULL
952 const char* exp_errors[] = {
953 "2: Unexpected token `<<EOF>>'; expected a header name",
954 NULL
957 do_parser_test< header_reader >(input, exp_calls, exp_errors);
960 ATF_TEST_CASE_WITHOUT_HEAD(headers_12);
961 ATF_TEST_CASE_BODY(headers_12)
963 const char* input =
964 "Content-Type: application/X-atf-headers-test; version=\"1234\"\n"
965 "a b\n"
966 "a-b:\n"
967 "a-b: foo;\n"
968 "a-b: foo; var\n"
969 "a-b: foo; var=\n"
970 "a-b: foo; var=\"a\n"
971 "a-b: foo; var=a\"\n"
972 "a-b: foo; var=\"a\";\n"
973 "a-b: foo; var=\"a\"; second\n"
974 "a-b: foo; var=\"a\"; second=\n"
975 "a-b: foo; var=\"a\"; second=\"b\n"
976 "a-b: foo; var=\"a\"; second=b\"\n"
977 "a-b: foo; var=\"a\"; second=\"b\"\n"
980 const char* exp_calls[] = {
981 NULL
984 const char* exp_errors[] = {
985 "2: Unexpected token `b'; expected `:'",
986 "3: Unexpected token `<<NEWLINE>>'; expected a textual value",
987 "4: Unexpected token `<<NEWLINE>>'; expected an attribute name",
988 "5: Unexpected token `<<NEWLINE>>'; expected `='",
989 "6: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
990 "7: Missing double quotes before end of line",
991 "8: Missing double quotes before end of line",
992 "9: Unexpected token `<<NEWLINE>>'; expected an attribute name",
993 "10: Unexpected token `<<NEWLINE>>'; expected `='",
994 "11: Unexpected token `<<NEWLINE>>'; expected word or quoted string",
995 "12: Missing double quotes before end of line",
996 "13: Missing double quotes before end of line",
997 NULL
1000 do_parser_test< header_reader >(input, exp_calls, exp_errors);
1003 // ------------------------------------------------------------------------
1004 // Main.
1005 // ------------------------------------------------------------------------
1007 ATF_INIT_TEST_CASES(tcs)
1009 // Add test cases for the "parse_error" class.
1010 ATF_ADD_TEST_CASE(tcs, parse_error_to_string);
1012 // Add test cases for the "parse_errors" class.
1013 ATF_ADD_TEST_CASE(tcs, parse_errors_what);
1015 // Add test cases for the "token" class.
1016 ATF_ADD_TEST_CASE(tcs, token_getters);
1018 // Add test cases for the "tokenizer" class.
1019 ATF_ADD_TEST_CASE(tcs, tokenizer_minimal_nows);
1020 ATF_ADD_TEST_CASE(tcs, tokenizer_minimal_ws);
1021 ATF_ADD_TEST_CASE(tcs, tokenizer_delims_nows);
1022 ATF_ADD_TEST_CASE(tcs, tokenizer_delims_ws);
1023 ATF_ADD_TEST_CASE(tcs, tokenizer_keywords_nows);
1024 ATF_ADD_TEST_CASE(tcs, tokenizer_keywords_ws);
1025 ATF_ADD_TEST_CASE(tcs, tokenizer_quotes_nows);
1026 ATF_ADD_TEST_CASE(tcs, tokenizer_quotes_ws);
1028 // Add the tests for the headers parser.
1030 // Add the test cases for the header file.
1031 ATF_ADD_TEST_CASE(tcs, headers_1);
1032 ATF_ADD_TEST_CASE(tcs, headers_2);
1033 ATF_ADD_TEST_CASE(tcs, headers_3);
1034 ATF_ADD_TEST_CASE(tcs, headers_4);
1035 ATF_ADD_TEST_CASE(tcs, headers_5);
1036 ATF_ADD_TEST_CASE(tcs, headers_6);
1037 ATF_ADD_TEST_CASE(tcs, headers_7);
1038 ATF_ADD_TEST_CASE(tcs, headers_8);
1039 ATF_ADD_TEST_CASE(tcs, headers_9);
1040 ATF_ADD_TEST_CASE(tcs, headers_10);
1041 ATF_ADD_TEST_CASE(tcs, headers_11);
1042 ATF_ADD_TEST_CASE(tcs, headers_12);