xref: /llvm-project/clang/unittests/Format/FormatTokenSourceTest.cpp (revision 1c58208d899285318c89e069268145c85ec33368)
104ed86ffSManuel Klimek //===- unittest/Format/FormatTokenSourceTest.cpp --------------------------===//
204ed86ffSManuel Klimek //
304ed86ffSManuel Klimek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
404ed86ffSManuel Klimek // See https://llvm.org/LICENSE.txt for license information.
504ed86ffSManuel Klimek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
604ed86ffSManuel Klimek //
704ed86ffSManuel Klimek //===----------------------------------------------------------------------===//
804ed86ffSManuel Klimek 
904ed86ffSManuel Klimek #include "../../lib/Format/FormatTokenSource.h"
1004ed86ffSManuel Klimek #include "TestLexer.h"
1104ed86ffSManuel Klimek #include "clang/Basic/TokenKinds.h"
1204ed86ffSManuel Klimek #include "gtest/gtest.h"
1304ed86ffSManuel Klimek 
1404ed86ffSManuel Klimek namespace clang {
1504ed86ffSManuel Klimek namespace format {
1604ed86ffSManuel Klimek namespace {
1704ed86ffSManuel Klimek 
18*1c58208dSOwen Pan class IndexedTokenSourceTest : public testing::Test {
1904ed86ffSManuel Klimek protected:
lex(StringRef Code,const FormatStyle & Style=getLLVMStyle ())20*1c58208dSOwen Pan   TokenList lex(StringRef Code, const FormatStyle &Style = getLLVMStyle()) {
2104ed86ffSManuel Klimek     return TestLexer(Allocator, Buffers, Style).lex(Code);
2204ed86ffSManuel Klimek   }
2304ed86ffSManuel Klimek   llvm::SpecificBumpPtrAllocator<FormatToken> Allocator;
2404ed86ffSManuel Klimek   std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;
2504ed86ffSManuel Klimek };
2604ed86ffSManuel Klimek 
2704ed86ffSManuel Klimek #define EXPECT_TOKEN_KIND(FormatTok, Kind)                                     \
2804ed86ffSManuel Klimek   do {                                                                         \
2904ed86ffSManuel Klimek     FormatToken *Tok = FormatTok;                                              \
301995d442SManuel Klimek     EXPECT_EQ(Tok->Tok.getKind(), Kind) << *Tok;                               \
311995d442SManuel Klimek   } while (false);
321995d442SManuel Klimek #define EXPECT_TOKEN_ID(FormatTok, Name)                                       \
331995d442SManuel Klimek   do {                                                                         \
341995d442SManuel Klimek     FormatToken *Tok = FormatTok;                                              \
351995d442SManuel Klimek     EXPECT_EQ(Tok->Tok.getKind(), tok::identifier) << *Tok;                    \
361995d442SManuel Klimek     EXPECT_EQ(Tok->TokenText, Name) << *Tok;                                   \
3704ed86ffSManuel Klimek   } while (false);
3804ed86ffSManuel Klimek 
TEST_F(IndexedTokenSourceTest,EmptyInput)3904ed86ffSManuel Klimek TEST_F(IndexedTokenSourceTest, EmptyInput) {
401995d442SManuel Klimek   IndexedTokenSource Source(lex(""));
4104ed86ffSManuel Klimek   EXPECT_FALSE(Source.isEOF());
4204ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
4304ed86ffSManuel Klimek   EXPECT_TRUE(Source.isEOF());
4404ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
4504ed86ffSManuel Klimek   EXPECT_TRUE(Source.isEOF());
4604ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.peekNextToken(/*SkipComment=*/false), tok::eof);
4704ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.peekNextToken(/*SkipComment=*/true), tok::eof);
4804ed86ffSManuel Klimek   EXPECT_EQ(Source.getPreviousToken(), nullptr);
4904ed86ffSManuel Klimek   EXPECT_TRUE(Source.isEOF());
5004ed86ffSManuel Klimek }
5104ed86ffSManuel Klimek 
TEST_F(IndexedTokenSourceTest,NavigateTokenStream)5204ed86ffSManuel Klimek TEST_F(IndexedTokenSourceTest, NavigateTokenStream) {
531995d442SManuel Klimek   IndexedTokenSource Source(lex("int a;"));
5404ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::kw_int);
5504ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::kw_int);
5604ed86ffSManuel Klimek   EXPECT_EQ(Source.getPreviousToken(), nullptr);
5704ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::identifier);
5804ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::identifier);
5904ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::kw_int);
6004ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::semi);
6104ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::semi);
6204ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::identifier);
6304ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::eof);
6404ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
6504ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::semi);
661995d442SManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
671995d442SManuel Klimek   EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::semi);
6804ed86ffSManuel Klimek }
6904ed86ffSManuel Klimek 
TEST_F(IndexedTokenSourceTest,ResetPosition)7004ed86ffSManuel Klimek TEST_F(IndexedTokenSourceTest, ResetPosition) {
711995d442SManuel Klimek   IndexedTokenSource Source(lex("int a;"));
7204ed86ffSManuel Klimek   Source.getNextToken();
7304ed86ffSManuel Klimek   unsigned Position = Source.getPosition();
7404ed86ffSManuel Klimek   Source.getNextToken();
7504ed86ffSManuel Klimek   Source.getNextToken();
7604ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
7704ed86ffSManuel Klimek   EXPECT_TOKEN_KIND(Source.setPosition(Position), tok::kw_int);
7804ed86ffSManuel Klimek }
7904ed86ffSManuel Klimek 
TEST_F(IndexedTokenSourceTest,InsertTokens)801995d442SManuel Klimek TEST_F(IndexedTokenSourceTest, InsertTokens) {
811995d442SManuel Klimek   IndexedTokenSource Source(lex("A1 A2"));
821995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
831995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("B1 B2")), "B1");
841995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "B2");
851995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
861995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A2");
871995d442SManuel Klimek }
881995d442SManuel Klimek 
TEST_F(IndexedTokenSourceTest,InsertTokensAtEOF)891995d442SManuel Klimek TEST_F(IndexedTokenSourceTest, InsertTokensAtEOF) {
901995d442SManuel Klimek   IndexedTokenSource Source(lex("A1"));
911995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
921995d442SManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
931995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("B1 B2")), "B1");
941995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "B2");
951995d442SManuel Klimek   EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
961995d442SManuel Klimek }
971995d442SManuel Klimek 
TEST_F(IndexedTokenSourceTest,InsertTokensRecursive)981995d442SManuel Klimek TEST_F(IndexedTokenSourceTest, InsertTokensRecursive) {
991995d442SManuel Klimek   IndexedTokenSource Source(lex("A1"));
1001995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
1011995d442SManuel Klimek   // A1
1021995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("B1")), "B1");
1031995d442SManuel Klimek   // B1 A1
1041995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("C1")), "C1");
1051995d442SManuel Klimek   // C1 B1 A1
1061995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("D1")), "D1");
1071995d442SManuel Klimek   // D1 C1 B1 A1
1081995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "C1");
1091995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "B1");
1101995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
1111995d442SManuel Klimek }
1121995d442SManuel Klimek 
TEST_F(IndexedTokenSourceTest,InsertTokensRecursiveAtEndOfSequence)1131995d442SManuel Klimek TEST_F(IndexedTokenSourceTest, InsertTokensRecursiveAtEndOfSequence) {
1141995d442SManuel Klimek   IndexedTokenSource Source(lex("A1"));
1151995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
1161995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("B1")), "B1");
1171995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
1181995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("C1")), "C1");
1191995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
1201995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.insertTokens(lex("D1")), "D1");
1211995d442SManuel Klimek   EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
1221995d442SManuel Klimek }
1231995d442SManuel Klimek 
12404ed86ffSManuel Klimek } // namespace
12504ed86ffSManuel Klimek } // namespace format
12604ed86ffSManuel Klimek } // namespace clang
127