blob: c4a48df8c986c15bdf0a088a844bff36117ebd0f [file] [log] [blame]
Lee Campbell220ca842015-07-30 09:27:11 -07001// Copyright (C) 2015 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "tokenizer.h"
16
17#include <errno.h>
18#include <gtest/gtest.h>
19
20#include <string>
21
22namespace init {
23
24#define SETUP_TEST(test_data) \
25 std::string data(test_data); \
26 Tokenizer tokenizer(data); \
27 ASSERT_EQ(Tokenizer::TOK_START, tokenizer.current().type)
28
29#define ASSERT_TEXT_TOKEN(test_text) \
30 ASSERT_TRUE(tokenizer.Next()); \
31 ASSERT_EQ(test_text, tokenizer.current().text); \
32 ASSERT_EQ(Tokenizer::TOK_TEXT, tokenizer.current().type)
33
34#define ASSERT_NEWLINE_TOKEN() \
35 ASSERT_TRUE(tokenizer.Next()); \
36 ASSERT_EQ(Tokenizer::TOK_NEWLINE, tokenizer.current().type)
37
38TEST(Tokenizer, Empty) {
39 SETUP_TEST("");
40 ASSERT_FALSE(tokenizer.Next());
41}
42
43TEST(Tokenizer, Simple) {
44 SETUP_TEST("test");
45 ASSERT_TEXT_TOKEN("test");
46 ASSERT_FALSE(tokenizer.Next());
47}
48
49TEST(Tokenizer, LeadingWhiteSpace) {
50 SETUP_TEST(" \t \r test");
51 ASSERT_TEXT_TOKEN("test");
52 ASSERT_FALSE(tokenizer.Next());
53}
54
55TEST(Tokenizer, TrailingWhiteSpace) {
56 SETUP_TEST("test \t \r ");
57 ASSERT_TEXT_TOKEN("test");
58 ASSERT_FALSE(tokenizer.Next());
59}
60
61TEST(Tokenizer, WhiteSpace) {
62 SETUP_TEST(" \t \r test \t \r ");
63 ASSERT_TEXT_TOKEN("test");
64
65 ASSERT_FALSE(tokenizer.Next());
66}
67
68TEST(Tokenizer, TwoTokens) {
69 SETUP_TEST(" foo bar ");
70 ASSERT_TEXT_TOKEN("foo");
71 ASSERT_TEXT_TOKEN("bar");
72
73 ASSERT_FALSE(tokenizer.Next());
74}
75
76TEST(Tokenizer, MultiToken) {
77 SETUP_TEST("one two three four five");
78 ASSERT_TEXT_TOKEN("one");
79 ASSERT_TEXT_TOKEN("two");
80 ASSERT_TEXT_TOKEN("three");
81 ASSERT_TEXT_TOKEN("four");
82 ASSERT_TEXT_TOKEN("five");
83
84 ASSERT_FALSE(tokenizer.Next());
85}
86
87TEST(Tokenizer, NewLine) {
88 SETUP_TEST("\n");
89 ASSERT_NEWLINE_TOKEN();
90
91 ASSERT_FALSE(tokenizer.Next());
92}
93
94TEST(Tokenizer, TextNewLine) {
95 SETUP_TEST("test\n");
96 ASSERT_TEXT_TOKEN("test");
97 ASSERT_NEWLINE_TOKEN();
98
99 ASSERT_FALSE(tokenizer.Next());
100}
101
102TEST(Tokenizer, MultiTextNewLine) {
103 SETUP_TEST("one\ntwo\nthree\n");
104 ASSERT_TEXT_TOKEN("one");
105 ASSERT_NEWLINE_TOKEN();
106 ASSERT_TEXT_TOKEN("two");
107 ASSERT_NEWLINE_TOKEN();
108 ASSERT_TEXT_TOKEN("three");
109 ASSERT_NEWLINE_TOKEN();
110
111 ASSERT_FALSE(tokenizer.Next());
112}
113
114TEST(Tokenizer, MultiTextNewLineNoLineEnding) {
115 SETUP_TEST("one\ntwo\nthree");
116 ASSERT_TEXT_TOKEN("one");
117 ASSERT_NEWLINE_TOKEN();
118 ASSERT_TEXT_TOKEN("two");
119 ASSERT_NEWLINE_TOKEN();
120 ASSERT_TEXT_TOKEN("three");
121
122 ASSERT_FALSE(tokenizer.Next());
123}
124
125TEST(Tokenizer, Comment) {
126 SETUP_TEST("#test");
127 ASSERT_FALSE(tokenizer.Next());
128}
129
130TEST(Tokenizer, CommentWhiteSpace) {
131 SETUP_TEST(" \t \r #test \t \r ");
132 ASSERT_FALSE(tokenizer.Next());
133}
134
135TEST(Tokenizer, CommentNewLine) {
136 SETUP_TEST(" #test \n");
137 ASSERT_NEWLINE_TOKEN();
138 ASSERT_FALSE(tokenizer.Next());
139}
140
141TEST(Tokenizer, CommentTwoNewLine) {
142 SETUP_TEST(" #test \n#test");
143 ASSERT_NEWLINE_TOKEN();
144 ASSERT_FALSE(tokenizer.Next());
145}
146
147TEST(Tokenizer, CommentWithText) {
148 SETUP_TEST("foo bar #test");
149 ASSERT_TEXT_TOKEN("foo");
150 ASSERT_TEXT_TOKEN("bar");
151 ASSERT_FALSE(tokenizer.Next());
152}
153
154TEST(Tokenizer, CommentWithTextNoSpace) {
155 SETUP_TEST("foo bar#test");
156 ASSERT_TEXT_TOKEN("foo");
157 ASSERT_TEXT_TOKEN("bar");
158 ASSERT_FALSE(tokenizer.Next());
159}
160
161TEST(Tokenizer, CommentWithTextLineFeed) {
162 SETUP_TEST("foo bar #test\n");
163 ASSERT_TEXT_TOKEN("foo");
164 ASSERT_TEXT_TOKEN("bar");
165 ASSERT_NEWLINE_TOKEN();
166 ASSERT_FALSE(tokenizer.Next());
167}
168
169TEST(Tokenizer, CommentWithMultiTextLineFeed) {
170 SETUP_TEST("#blah\nfoo bar #test\n#blah");
171 ASSERT_NEWLINE_TOKEN();
172 ASSERT_TEXT_TOKEN("foo");
173 ASSERT_TEXT_TOKEN("bar");
174 ASSERT_NEWLINE_TOKEN();
175 ASSERT_FALSE(tokenizer.Next());
176}
177
178TEST(Tokenizer, SimpleEscaped) {
179 SETUP_TEST("fo\\no bar");
180 ASSERT_TEXT_TOKEN("fo\\no");
181 ASSERT_TEXT_TOKEN("bar");
182 ASSERT_FALSE(tokenizer.Next());
183}
184
185TEST(Tokenizer, EscapedLineContNoLineFeed) {
186 SETUP_TEST("fo\\no bar \\ hello");
187 ASSERT_TEXT_TOKEN("fo\\no");
188 ASSERT_TEXT_TOKEN("bar");
189 ASSERT_FALSE(tokenizer.Next());
190}
191
192TEST(Tokenizer, EscapedLineContLineFeed) {
193 SETUP_TEST("fo\\no bar \\ hello\n");
194 ASSERT_TEXT_TOKEN("fo\\no");
195 ASSERT_TEXT_TOKEN("bar");
196 ASSERT_FALSE(tokenizer.Next());
197}
198
199TEST(Tokenizer, EscapedLineCont) {
200 SETUP_TEST("fo\\no bar \\\ntest");
201 ASSERT_TEXT_TOKEN("fo\\no");
202 ASSERT_TEXT_TOKEN("bar");
203 ASSERT_TEXT_TOKEN("test");
204 ASSERT_FALSE(tokenizer.Next());
205}
206
207TEST(Tokenizer, EscapedLineContWithBadChars) {
208 SETUP_TEST("fo\\no bar \\bad bad bad\ntest");
209 ASSERT_TEXT_TOKEN("fo\\no");
210 ASSERT_TEXT_TOKEN("bar");
211 ASSERT_TEXT_TOKEN("test");
212 ASSERT_FALSE(tokenizer.Next());
213}
214
215TEST(Tokenizer, SimpleQuotes) {
216 SETUP_TEST("foo \"single token\" bar");
217 ASSERT_TEXT_TOKEN("foo");
218 ASSERT_TEXT_TOKEN("single token");
219 ASSERT_TEXT_TOKEN("bar");
220 ASSERT_FALSE(tokenizer.Next());
221}
222
223TEST(Tokenizer, BadQuotes) {
224 SETUP_TEST("foo \"single token");
225 ASSERT_TEXT_TOKEN("foo");
226 ASSERT_TEXT_TOKEN("single token");
227 ASSERT_FALSE(tokenizer.Next());
228}
229
230} // namespace init