Index: mojom/lexer_unittest.cc |
diff --git a/mojom/lexer_unittest.cc b/mojom/lexer_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f4db79a6e998fe7fae800e3a39591b30b621df77 |
--- /dev/null |
+++ b/mojom/lexer_unittest.cc |
@@ -0,0 +1,162 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/logging.h" |
+#include "mojom/lexer.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace mojo { |
+namespace mojom { |
+namespace { |
+ |
+TEST(LexerTest, AllNonErrorTokens) { |
+ const struct TestData { |
+ const char* name; |
+ const char* source; |
+ mojom::TokenType expected_token; |
+ } test_data[] = { |
+ {"LPAREN", "(", mojom::TokenType::LPAREN}, |
+ {"RPAREN", ")", mojom::TokenType::RPAREN}, |
+ {"LBRACKET", "[", mojom::TokenType::LBRACKET}, |
+ {"RBRACKET", "]", mojom::TokenType::RBRACKET}, |
+ {"LBRACE", "{", mojom::TokenType::LBRACE}, |
+ {"RBRACE", "}", mojom::TokenType::RBRACE}, |
+ {"LANGLE", "<", mojom::TokenType::LANGLE}, |
+ {"RANGLE", ">", mojom::TokenType::RANGLE}, |
+ {"SEMI", ";", mojom::TokenType::SEMI}, |
+ {"COMMA", ",", mojom::TokenType::COMMA}, |
+ {"DOT", ".", mojom::TokenType::DOT}, |
+ {"MINUS", "-", mojom::TokenType::MINUS}, |
+ {"PLUS", "+", mojom::TokenType::PLUS}, |
+ {"AMP", "&", mojom::TokenType::AMP}, |
+ {"QSTN", "?", mojom::TokenType::QSTN}, |
+ {"EQUALS", "=", mojom::TokenType::EQUALS}, |
+ {"RESPONSE", "=>", mojom::TokenType::RESPONSE}, |
+ {"IDENTIFIER", "something", mojom::TokenType::IDENTIFIER}, |
+ {"IMPORT", "import", mojom::TokenType::IMPORT}, |
+ {"MODULE", "module", mojom::TokenType::MODULE}, |
+ {"STRUCT", "struct", mojom::TokenType::STRUCT}, |
+ {"UNION", "union", mojom::TokenType::UNION}, |
+ {"INTERFACE", "interface", mojom::TokenType::INTERFACE}, |
+ {"ENUM", "enum", mojom::TokenType::ENUM}, |
+ {"CONST", "const", mojom::TokenType::CONST}, |
+ {"TRUE", "true", mojom::TokenType::TRUE}, |
+ {"FALSE", "false", mojom::TokenType::FALSE}, |
+ {"DEFAULT", "default", mojom::TokenType::DEFAULT}, |
+ {"INT_CONST_DEC", "10", mojom::TokenType::INT_CONST_DEC}, |
+ {"INT_CONST_DEC_0", "0", mojom::TokenType::INT_CONST_DEC}, |
+ {"FLOAT_CONST", "10.5", mojom::TokenType::FLOAT_CONST}, |
+ {"FLOAT_CONST_E", "10e5", mojom::TokenType::FLOAT_CONST}, |
+ {"FLOAT_CONST_ZERO", "0.5", mojom::TokenType::FLOAT_CONST}, |
+ {"FLOAT_CONST_E_ZERO", "0e5", mojom::TokenType::FLOAT_CONST}, |
+ {"FLOAT_CONST_E_PLUS", "10e+5", mojom::TokenType::FLOAT_CONST}, |
+ {"FLOAT_CONST_E_MINUS", "10e-5", mojom::TokenType::FLOAT_CONST}, |
+ {"INT_CONST_HEX", "0x10A", mojom::TokenType::INT_CONST_HEX}, |
+ {"ORDINAL", "@10", mojom::TokenType::ORDINAL}, |
+ {"STRING_LITERAL", "\"hello world\"", mojom::TokenType::STRING_LITERAL}, |
+ {"STRING_LITERAL_ESCAPE", |
+ "\"hello \\\"world\\\"\"", |
+ mojom::TokenType::STRING_LITERAL}, |
+ {"STRING_LITERAL_HEX_ESCAPE", |
+ "\"hello \\x23 world\"", |
+ mojom::TokenType::STRING_LITERAL}, |
+ }; |
+ for (size_t i = 0; i < arraysize(test_data); i++) { |
+ const char* test_name = test_data[i].name; |
+ const char* source = test_data[i].source; |
+ const mojom::TokenType expected_token = test_data[i].expected_token; |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ DCHECK(tokens.size() >= 1) << "Failure to tokenize at all: " << test_name; |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(expected_token, token.token_type) |
+ << "Wrong token type: " << test_name; |
+ EXPECT_EQ(source, token.token) << "Wrong token value: " << test_name; |
+ } |
+} |
+ |
+TEST(LexerTest, TokenPosition) { |
+ std::string source(" \n ."); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(mojom::TokenType::DOT, token.token_type); |
+ EXPECT_EQ(".", token.token); |
+ EXPECT_EQ(5U, token.char_pos); |
+ EXPECT_EQ(1U, token.line_no); |
+ EXPECT_EQ(2U, token.line_pos); |
+} |
+ |
+TEST(LexerTest, ExhaustedTokens) { |
+ std::string source(""); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ EXPECT_EQ(0U, tokens.size()); |
+} |
+ |
+TEST(LexerTest, SkipSkippable) { |
+ std::string source(" \t \r \n ."); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(mojom::TokenType::DOT, token.token_type); |
+ EXPECT_EQ(".", token.token); |
+} |
+ |
+TEST(LexerTest, SkipToTheEnd) { |
+ std::string source(" \t \r \n "); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ EXPECT_EQ(0U, tokens.size()); |
+} |
+ |
+TEST(LexerTest, TokenizeMoreThanOne) { |
+ std::string source("()"); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ |
+ EXPECT_EQ(mojom::TokenType::LPAREN, tokens[0].token_type); |
+ EXPECT_EQ(mojom::TokenType::RPAREN, tokens[1].token_type); |
+ EXPECT_EQ(2U, tokens.size()); |
+} |
+ |
+TEST(LexerTest, ERROR_ILLEGAL_CHAR) { |
+ std::string source("#"); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(mojom::TokenType::ERROR_ILLEGAL_CHAR, token.token_type); |
+ EXPECT_EQ("#", token.token); |
+ EXPECT_TRUE(token.error()); |
+} |
+ |
+TEST(LexerTest, ERROR_UNTERMINATED_STRING_LITERAL_EOL) { |
+ std::string source("\"Hello \n World\""); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(mojom::TokenType::ERROR_UNTERMINATED_STRING_LITERAL, |
+ token.token_type); |
+ EXPECT_EQ("\"Hello ", token.token); |
+ EXPECT_EQ(0U, token.char_pos); |
+ EXPECT_TRUE(token.error()); |
+} |
+ |
+TEST(LexerTest, ERROR_UNTERMINATED_STRING_LITERAL_EOF) { |
+ std::string source("\"Hello "); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(mojom::TokenType::ERROR_UNTERMINATED_STRING_LITERAL, |
+ token.token_type); |
+ EXPECT_EQ("\"Hello ", token.token); |
+ EXPECT_EQ(0U, token.char_pos); |
+ EXPECT_TRUE(token.error()); |
+} |
+ |
+TEST(LexerTest, ERROR_UNTERMINATED_STRING_LITERAL_ESC_EOF) { |
+ std::string source("\"Hello \\"); |
+ std::vector<mojom::Token> tokens = mojom::Tokenize(source); |
+ const mojom::Token token = tokens[0]; |
+ EXPECT_EQ(mojom::TokenType::ERROR_UNTERMINATED_STRING_LITERAL, |
+ token.token_type); |
+ EXPECT_EQ("\"Hello \\", token.token); |
+ EXPECT_EQ(0U, token.char_pos); |
+ EXPECT_TRUE(token.error()); |
+} |
+ |
+} // namespace |
+} // namespace mojom |
+} // namespace mojo |