Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / test / LexerTests.cpp
diff options
context:
space:
mode:
Commita7575e08c67ab6e4f3c5a48b302c42a17d2500c2 (patch)
Author
 martin dobrev <martindobrev0@gmail.com>
2020-10-12 22:56:16 +0300
Committer
 martin dobrev <martindobrev0@gmail.com>
2020-10-12 22:56:16 +0300
Filesab3caa138c0048a0140af070d0dbbdd0d686f15c /JSImpl/test/LexerTests.cpp
IPL-a7575e08c67ab6e4f3c5a48b302c42a17d2500c2.tar
IPL-a7575e08c67ab6e4f3c5a48b302c42a17d2500c2.tar.gz
IPL-a7575e08c67ab6e4f3c5a48b302c42a17d2500c2.zip
Parentd9183dd25685297d0b9278591b910bb753bc93ed (diff)
Add support for new lines and tabs in tokenizer.
Improve tests verbosity. Replace white spaces with tabs.
1 files changed, 116 insertions, 117 deletions
-rw-r--r--JSImpl/test/LexerTests.cpp233
diff --git a/JSImpl/test/LexerTests.cpp b/JSImpl/test/LexerTests.cpp
index 2f13916..a1a25d3 100644
--- a/JSImpl/test/LexerTests.cpp
+++ b/JSImpl/test/LexerTests.cpp
@@ -5,211 +5,210 @@
TEST(Lexer, Less)
{
- IPLVector<Token> tokens;
- Tokenize("<", tokens);
+ IPLVector<Token> tokens = Tokenize("<").tokens;
ASSERT_EQ(tokens.size(), 2u);
- ASSERT_EQ(tokens[0].Type, TokenType::Less);
+ ASSERT_EQ(tokens[0].Type, TokenType::Less);
}
TEST(Lexer, Number)
{
- IPLVector<Token> tokens;
- Tokenize("213434.24", tokens);
+ IPLVector<Token> tokens = Tokenize("213434.24").tokens;
ASSERT_EQ(tokens.size(), 2u);
- ASSERT_EQ(tokens[0].Type, TokenType::Number);
- ASSERT_EQ(tokens[0].Number, 213434.24);
+ ASSERT_EQ(tokens[0].Type, TokenType::Number);
+ ASSERT_EQ(tokens[0].Number, 213434.24);
}
TEST(Lexer, HexNumber)
{
- IPLVector<Token> tokens;
- auto result = Tokenize("0x10", tokens);
+ const auto res = Tokenize("0x10");
+ const auto& tokens = res.tokens;
- ASSERT_TRUE(result.IsSuccessful);
+ ASSERT_TRUE(res.IsSuccessful);
ASSERT_EQ(tokens.size(), 2u);
- ASSERT_EQ(tokens[0].Type, TokenType::Number);
- ASSERT_EQ(tokens[0].Number, 16);
+ ASSERT_EQ(tokens[0].Type, TokenType::Number);
+ ASSERT_EQ(tokens[0].Number, 16);
}
TEST(Lexer, ScientificNotationNumber)
{
- IPLVector<Token> tokens;
- auto result = Tokenize("1e2", tokens);
+ const auto res = Tokenize("1e2");
+ const auto& tokens = res.tokens;
- ASSERT_TRUE(result.IsSuccessful);
+ ASSERT_TRUE(res.IsSuccessful);
ASSERT_EQ(tokens.size(), 2u);
- ASSERT_EQ(tokens[0].Type, TokenType::Number);
- ASSERT_EQ(tokens[0].Number, 100);
+ ASSERT_EQ(tokens[0].Type, TokenType::Number);
+ ASSERT_EQ(tokens[0].Number, 100);
}
TEST(Lexer, NumberStartWithNine)
{
- IPLVector<Token> tokens;
- Tokenize("999", tokens);
+ IPLVector<Token> tokens = Tokenize("999").tokens;
ASSERT_EQ(tokens.size(), 2u);
- ASSERT_EQ(tokens[0].Type, TokenType::Number);
- ASSERT_EQ(tokens[0].Number, 999);
+ ASSERT_EQ(tokens[0].Type, TokenType::Number);
+ ASSERT_EQ(tokens[0].Number, 999);
}
TEST(Lexer, NumberStartWithZero)
{
- IPLVector<Token> tokens;
- Tokenize("0999", tokens);
+ IPLVector<Token> tokens = Tokenize("0999").tokens;
ASSERT_EQ(tokens.size(), 2u);
- ASSERT_EQ(tokens[0].Type, TokenType::Number);
- ASSERT_EQ(tokens[0].Number, 999);
+ ASSERT_EQ(tokens[0].Type, TokenType::Number);
+ ASSERT_EQ(tokens[0].Number, 999);
}
TEST(Lexer, SpaceNewLineSpace)
{
- IPLVector<Token> tokens;
- Tokenize(" \n var a = 4; ", tokens);
- ASSERT_TRUE(tokens.size() == 6 && tokens[0].Type == TokenType::Var &&
- tokens[1].Type == TokenType::Identifier &&
- tokens[2].Type == TokenType::Equal &&
- tokens[3].Type == TokenType::Number &&
- tokens[4].Type == TokenType::Semicolon);
+ IPLVector<Token> tokens = Tokenize(" \n var a = 4; ").tokens;
+ ASSERT_TRUE(tokens.size() == 6 && tokens[0].Type == TokenType::Var);
+ ASSERT_TRUE(tokens[1].Type == TokenType::Identifier);
+ ASSERT_TRUE(tokens[2].Type == TokenType::Equal);
+ ASSERT_TRUE(tokens[3].Type == TokenType::Number);
+ ASSERT_TRUE(tokens[4].Type == TokenType::Semicolon);
}
TEST(Lexer, String)
{
- IPLVector<Token> tokens;
- Tokenize("\"alabala\"", tokens);
+ IPLVector<Token> tokens = Tokenize("\"alabala\"").tokens;
ASSERT_TRUE(tokens.size() == 2 && tokens[0].Type == TokenType::String
- && tokens[0].Lexeme == "\"alabala\"");
+ && tokens[0].Lexeme == "\"alabala\"");
}
TEST(Lexer, StringSingleQuotedStrings)
{
- IPLVector<Token> tokens;
- Tokenize("'alabala'", tokens);
+ IPLVector<Token> tokens = Tokenize("'alabala'").tokens;
ASSERT_TRUE(tokens.size() == 2 && tokens[0].Type == TokenType::String && tokens[0].Lexeme == "'alabala'");
}
TEST(Lexer, KeyWord)
{
- IPLVector<Token> tokens;
- Tokenize("for", tokens);
+ IPLVector<Token> tokens = Tokenize("for").tokens;
ASSERT_TRUE(tokens.size() == 2 && tokens[0].Type == TokenType::For);
}
TEST(Lexer, VariableDeclaration)
{
- IPLVector<Token> tokens;
- Tokenize("var pesho = 10", tokens);
+ IPLVector<Token> tokens = Tokenize("var pesho = 10").tokens;
- ASSERT_TRUE(tokens.size() == 5 && tokens[0].Type == TokenType::Var
- && tokens[1].Type == TokenType::Identifier
- && tokens[2].Type == TokenType::Equal
- && tokens[3].Type == TokenType::Number
- && tokens[4].Type == TokenType::Eof);
+ ASSERT_TRUE(tokens.size() == 5 && tokens[0].Type == TokenType::Var);
+ ASSERT_TRUE(tokens[1].Type == TokenType::Identifier);
+ ASSERT_TRUE(tokens[2].Type == TokenType::Equal);
+ ASSERT_TRUE(tokens[3].Type == TokenType::Number);
+ ASSERT_TRUE(tokens[4].Type == TokenType::Eof);
}
TEST(Lexer, StringError)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize("\" aaaa", tokens);
+ const auto res = Tokenize("\" aaaa");
ASSERT_TRUE(!res.IsSuccessful && res.Error.Row == 0 && res.Error.Column == 6);
}
TEST(Lexer, TestWhiteSpaceTokens)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize(" 1\n2 abc\n \n", tokens, { true, false });
- ASSERT_TRUE(res.IsSuccessful
- && tokens.size() == 8
- && tokens[0].Type == TokenType::Whitespace
- && tokens[0].Lexeme == " "
- && tokens[1].Type == TokenType::Number
- && tokens[1].Number == 1
- && tokens[2].Type == TokenType::Whitespace
- && tokens[2].Lexeme == "\n"
- && tokens[3].Type == TokenType::Number
- && tokens[3].Number == 2
- && tokens[4].Type == TokenType::Whitespace
- && tokens[4].Lexeme == " "
- && tokens[5].Type == TokenType::Identifier
- && tokens[5].Lexeme == "abc"
- && tokens[6].Type == TokenType::Whitespace
- && tokens[6].Lexeme == "\n \n"
- && tokens[7].Type == TokenType::Eof);
+ const auto res = Tokenize(" 1\n2 abc\n \n", { true, false });
+ const auto& tokens = res.tokens;
+ ASSERT_TRUE(res.IsSuccessful);
+ ASSERT_TRUE(tokens.size() == 11);
+ ASSERT_TRUE(tokens[0].Type == TokenType::Whitespace);
+ ASSERT_TRUE(tokens[0].Lexeme == "");
+ ASSERT_TRUE(tokens[1].Type == TokenType::Number);
+ ASSERT_TRUE(tokens[1].Number == 1);
+ ASSERT_TRUE(tokens[2].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[2].Lexeme == "");
+ ASSERT_TRUE(tokens[3].Type == TokenType::Number);
+ ASSERT_TRUE(tokens[3].Number == 2);
+ ASSERT_TRUE(tokens[4].Type == TokenType::Whitespace);
+ ASSERT_TRUE(tokens[4].Lexeme == "");
+ ASSERT_TRUE(tokens[5].Type == TokenType::Whitespace);
+ ASSERT_TRUE(tokens[5].Lexeme == "");
+ ASSERT_TRUE(tokens[6].Type == TokenType::Identifier);
+ ASSERT_TRUE(tokens[6].Lexeme == "abc");
+ ASSERT_TRUE(tokens[7].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[7].Lexeme == "");
+ ASSERT_TRUE(tokens[8].Type == TokenType::Whitespace);
+ ASSERT_TRUE(tokens[8].Lexeme == "");
+ ASSERT_TRUE(tokens[9].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[9].Lexeme == "");
+ ASSERT_TRUE(tokens[10].Type == TokenType::Eof);
}
TEST(Lexer, SimpleComment)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize("//comment", tokens, { false, true });
- ASSERT_TRUE(res.IsSuccessful
- && tokens.size() == 2
- && tokens[0].Type == TokenType::Comment
- && tokens[0].Lexeme == "//comment"
- && tokens[1].Type == TokenType::Eof);
+ const auto res = Tokenize("//comment", { false, true });
+ const auto& tokens = res.tokens;
+ ASSERT_TRUE(res.IsSuccessful);
+ ASSERT_TRUE(tokens.size() == 2);
+ ASSERT_TRUE(tokens[0].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[0].Lexeme == "//comment");
+ ASSERT_TRUE(tokens[1].Type == TokenType::Eof);
}
TEST(Lexer, SimpleMultiLineComment)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize("/*comment\ncomment*/", tokens, { false, true });
- ASSERT_TRUE(res.IsSuccessful
- && tokens.size() == 2
- && tokens[0].Type == TokenType::Comment
- && tokens[0].Lexeme == "/*comment\ncomment*/"
- && tokens[1].Type == TokenType::Eof);
+ const auto res = Tokenize("/*comment\ncomment*/", { false, true });
+ const auto& tokens = res.tokens;
+ ASSERT_TRUE(res.IsSuccessful);
+ ASSERT_TRUE(tokens.size() == 2);
+ ASSERT_TRUE(tokens[0].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[0].Lexeme == "/*comment\ncomment*/");
+ ASSERT_TRUE(tokens[1].Type == TokenType::Eof);
}
TEST(Lexer, ConsecutiveMultiLineComment)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize("/*comment1\ncomment1*//*comment2\ncomment2*/", tokens, { false, true });
- ASSERT_TRUE(res.IsSuccessful
- && tokens.size() == 3
- && tokens[0].Type == TokenType::Comment
- && tokens[0].Lexeme == "/*comment1\ncomment1*/"
- && tokens[1].Type == TokenType::Comment
- && tokens[1].Lexeme == "/*comment2\ncomment2*/"
- && tokens[2].Type == TokenType::Eof);
+ const auto res = Tokenize("/*comment1\ncomment1*//*comment2\ncomment2*/", { false, true });
+ const auto& tokens = res.tokens;
+ ASSERT_TRUE(res.IsSuccessful);
+ ASSERT_TRUE(tokens.size() == 3);
+ ASSERT_TRUE(tokens[0].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[0].Lexeme == "/*comment1\ncomment1*/");
+ ASSERT_TRUE(tokens[1].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[1].Lexeme == "/*comment2\ncomment2*/");
+ ASSERT_TRUE(tokens[2].Type == TokenType::Eof);
}
TEST(Lexer, ConsecutiveMultiLineCommentWithSpace)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize("/*comment1\ncomment1*/\n\n\n/*comment2\ncomment2*/", tokens, { false, true });
- ASSERT_TRUE(res.IsSuccessful
- && tokens.size() == 3
- && tokens[0].Type == TokenType::Comment
- && tokens[0].Lexeme == "/*comment1\ncomment1*/"
- && tokens[1].Type == TokenType::Comment
- && tokens[1].Lexeme == "/*comment2\ncomment2*/"
- && tokens[2].Type == TokenType::Eof);
+ const auto res = Tokenize("/*comment1\ncomment1*/\n\n\n/*comment2\ncomment2*/", { false, true });
+ const auto& tokens = res.tokens;
+ ASSERT_TRUE(res.IsSuccessful);
+ ASSERT_TRUE(tokens.size() == 3);
+ ASSERT_TRUE(tokens[0].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[0].Lexeme == "/*comment1\ncomment1*/");
+ ASSERT_TRUE(tokens[1].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[1].Lexeme == "/*comment2\ncomment2*/");
+ ASSERT_TRUE(tokens[2].Type == TokenType::Eof);
}
TEST(Lexer, ConsecutiveMultiLineCommentWithSpaceWithTokens)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize("//comment1\n/*comment2\ncomment2*/\n\n\n/*comment3\ncomment3*/", tokens, { true, true });
- ASSERT_TRUE(res.IsSuccessful
- && tokens.size() == 6
- && tokens[0].Type == TokenType::Comment
- && tokens[0].Lexeme == "//comment1"
- && tokens[1].Type == TokenType::Whitespace
- && tokens[1].Lexeme == "\n"
- && tokens[2].Type == TokenType::Comment
- && tokens[2].Lexeme == "/*comment2\ncomment2*/"
- && tokens[3].Type == TokenType::Whitespace
- && tokens[3].Lexeme == "\n\n\n"
- && tokens[4].Type == TokenType::Comment
- && tokens[4].Lexeme == "/*comment3\ncomment3*/"
- && tokens[5].Type == TokenType::Eof);
+ const auto res = Tokenize("//comment1\n/*comment2\ncomment2*/\n\n\n/*comment3\ncomment3*/", { true, true });
+ const auto& tokens = res.tokens;
+ ASSERT_TRUE(res.IsSuccessful);
+ ASSERT_TRUE(tokens.size() == 8);
+ ASSERT_TRUE(tokens[0].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[0].Lexeme == "//comment1");
+ ASSERT_TRUE(tokens[1].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[1].Lexeme == "");
+ ASSERT_TRUE(tokens[2].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[2].Lexeme == "/*comment2\ncomment2*/");
+ ASSERT_TRUE(tokens[3].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[3].Lexeme == "");
+ ASSERT_TRUE(tokens[4].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[4].Lexeme == "");
+ ASSERT_TRUE(tokens[5].Type == TokenType::NewLine);
+ ASSERT_TRUE(tokens[5].Lexeme == "");
+ ASSERT_TRUE(tokens[6].Type == TokenType::Comment);
+ ASSERT_TRUE(tokens[6].Lexeme == "/*comment3\ncomment3*/");
+ ASSERT_TRUE(tokens[7].Type == TokenType::Eof);
}
TEST(Lexer, CommentError)
{
- IPLVector<Token> tokens;
- const auto& res = Tokenize(" aa\n /*", tokens);
+ auto res = Tokenize(" aa\n /*");
ASSERT_TRUE(!res.IsSuccessful && res.Error.Row == 1 &&
- res.Error.Column == 3);
+ res.Error.Column == 3);
}