You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
5.4 KiB
230 lines
5.4 KiB
// 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
|
|
|