| // Copyright (C) 2015 The Android Open Source Project | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #include "tokenizer.h" | |
| #include <errno.h> | |
| #include <gtest/gtest.h> | |
| #include <string> | |
| namespace init { | |
| #define SETUP_TEST(test_data) \ | |
| std::string data(test_data); \ | |
| Tokenizer tokenizer(data); \ | |
| ASSERT_EQ(Tokenizer::TOK_START, tokenizer.current().type) | |
| #define ASSERT_TEXT_TOKEN(test_text) \ | |
| ASSERT_TRUE(tokenizer.Next()); \ | |
| ASSERT_EQ(test_text, tokenizer.current().text); \ | |
| ASSERT_EQ(Tokenizer::TOK_TEXT, tokenizer.current().type) | |
| #define ASSERT_NEWLINE_TOKEN() \ | |
| ASSERT_TRUE(tokenizer.Next()); \ | |
| ASSERT_EQ(Tokenizer::TOK_NEWLINE, tokenizer.current().type) | |
| TEST(Tokenizer, Empty) { | |
| SETUP_TEST(""); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, Simple) { | |
| SETUP_TEST("test"); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, LeadingWhiteSpace) { | |
| SETUP_TEST(" \t \r test"); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, TrailingWhiteSpace) { | |
| SETUP_TEST("test \t \r "); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, WhiteSpace) { | |
| SETUP_TEST(" \t \r test \t \r "); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, TwoTokens) { | |
| SETUP_TEST(" foo bar "); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, MultiToken) { | |
| SETUP_TEST("one two three four five"); | |
| ASSERT_TEXT_TOKEN("one"); | |
| ASSERT_TEXT_TOKEN("two"); | |
| ASSERT_TEXT_TOKEN("three"); | |
| ASSERT_TEXT_TOKEN("four"); | |
| ASSERT_TEXT_TOKEN("five"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, NewLine) { | |
| SETUP_TEST("\n"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, TextNewLine) { | |
| SETUP_TEST("test\n"); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, MultiTextNewLine) { | |
| SETUP_TEST("one\ntwo\nthree\n"); | |
| ASSERT_TEXT_TOKEN("one"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_TEXT_TOKEN("two"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_TEXT_TOKEN("three"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, MultiTextNewLineNoLineEnding) { | |
| SETUP_TEST("one\ntwo\nthree"); | |
| ASSERT_TEXT_TOKEN("one"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_TEXT_TOKEN("two"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_TEXT_TOKEN("three"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, Comment) { | |
| SETUP_TEST("#test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentWhiteSpace) { | |
| SETUP_TEST(" \t \r #test \t \r "); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentNewLine) { | |
| SETUP_TEST(" #test \n"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentTwoNewLine) { | |
| SETUP_TEST(" #test \n#test"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentWithText) { | |
| SETUP_TEST("foo bar #test"); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentWithTextNoSpace) { | |
| SETUP_TEST("foo bar#test"); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentWithTextLineFeed) { | |
| SETUP_TEST("foo bar #test\n"); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, CommentWithMultiTextLineFeed) { | |
| SETUP_TEST("#blah\nfoo bar #test\n#blah"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_NEWLINE_TOKEN(); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, SimpleEscaped) { | |
| SETUP_TEST("fo\\no bar"); | |
| ASSERT_TEXT_TOKEN("fo\\no"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, EscapedLineContNoLineFeed) { | |
| SETUP_TEST("fo\\no bar \\ hello"); | |
| ASSERT_TEXT_TOKEN("fo\\no"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, EscapedLineContLineFeed) { | |
| SETUP_TEST("fo\\no bar \\ hello\n"); | |
| ASSERT_TEXT_TOKEN("fo\\no"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, EscapedLineCont) { | |
| SETUP_TEST("fo\\no bar \\\ntest"); | |
| ASSERT_TEXT_TOKEN("fo\\no"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, EscapedLineContWithBadChars) { | |
| SETUP_TEST("fo\\no bar \\bad bad bad\ntest"); | |
| ASSERT_TEXT_TOKEN("fo\\no"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_TEXT_TOKEN("test"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, SimpleQuotes) { | |
| SETUP_TEST("foo \"single token\" bar"); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("single token"); | |
| ASSERT_TEXT_TOKEN("bar"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| TEST(Tokenizer, BadQuotes) { | |
| SETUP_TEST("foo \"single token"); | |
| ASSERT_TEXT_TOKEN("foo"); | |
| ASSERT_TEXT_TOKEN("single token"); | |
| ASSERT_FALSE(tokenizer.Next()); | |
| } | |
| } // namespace init |