mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 10:46:06 +00:00

In preparation for configured macro replacements in formatting, add the ability to insert tokens to FormatTokenSource, and implement token insertion in IndexedTokenSource. Differential Revision: https://reviews.llvm.org/D143070
128 lines
5.1 KiB
C++
128 lines
5.1 KiB
C++
//===- unittest/Format/FormatTokenSourceTest.cpp --------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../../lib/Format/FormatTokenSource.h"
|
|
#include "TestLexer.h"
|
|
#include "clang/Basic/TokenKinds.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
namespace clang {
|
|
namespace format {
|
|
namespace {
|
|
|
|
class IndexedTokenSourceTest : public ::testing::Test {
|
|
protected:
|
|
TokenList lex(llvm::StringRef Code,
|
|
const FormatStyle &Style = getLLVMStyle()) {
|
|
return TestLexer(Allocator, Buffers, Style).lex(Code);
|
|
}
|
|
llvm::SpecificBumpPtrAllocator<FormatToken> Allocator;
|
|
std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;
|
|
};
|
|
|
|
#define EXPECT_TOKEN_KIND(FormatTok, Kind) \
|
|
do { \
|
|
FormatToken *Tok = FormatTok; \
|
|
EXPECT_EQ(Tok->Tok.getKind(), Kind) << *Tok; \
|
|
} while (false);
|
|
#define EXPECT_TOKEN_ID(FormatTok, Name) \
|
|
do { \
|
|
FormatToken *Tok = FormatTok; \
|
|
EXPECT_EQ(Tok->Tok.getKind(), tok::identifier) << *Tok; \
|
|
EXPECT_EQ(Tok->TokenText, Name) << *Tok; \
|
|
} while (false);
|
|
|
|
TEST_F(IndexedTokenSourceTest, EmptyInput) {
|
|
IndexedTokenSource Source(lex(""));
|
|
EXPECT_FALSE(Source.isEOF());
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
EXPECT_TRUE(Source.isEOF());
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
EXPECT_TRUE(Source.isEOF());
|
|
EXPECT_TOKEN_KIND(Source.peekNextToken(/*SkipComment=*/false), tok::eof);
|
|
EXPECT_TOKEN_KIND(Source.peekNextToken(/*SkipComment=*/true), tok::eof);
|
|
EXPECT_EQ(Source.getPreviousToken(), nullptr);
|
|
EXPECT_TRUE(Source.isEOF());
|
|
}
|
|
|
|
TEST_F(IndexedTokenSourceTest, NavigateTokenStream) {
|
|
IndexedTokenSource Source(lex("int a;"));
|
|
EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::kw_int);
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::kw_int);
|
|
EXPECT_EQ(Source.getPreviousToken(), nullptr);
|
|
EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::identifier);
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::identifier);
|
|
EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::kw_int);
|
|
EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::semi);
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::semi);
|
|
EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::identifier);
|
|
EXPECT_TOKEN_KIND(Source.peekNextToken(), tok::eof);
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::semi);
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
EXPECT_TOKEN_KIND(Source.getPreviousToken(), tok::semi);
|
|
}
|
|
|
|
TEST_F(IndexedTokenSourceTest, ResetPosition) {
|
|
IndexedTokenSource Source(lex("int a;"));
|
|
Source.getNextToken();
|
|
unsigned Position = Source.getPosition();
|
|
Source.getNextToken();
|
|
Source.getNextToken();
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
EXPECT_TOKEN_KIND(Source.setPosition(Position), tok::kw_int);
|
|
}
|
|
|
|
TEST_F(IndexedTokenSourceTest, InsertTokens) {
|
|
IndexedTokenSource Source(lex("A1 A2"));
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("B1 B2")), "B1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "B2");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A2");
|
|
}
|
|
|
|
TEST_F(IndexedTokenSourceTest, InsertTokensAtEOF) {
|
|
IndexedTokenSource Source(lex("A1"));
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("B1 B2")), "B1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "B2");
|
|
EXPECT_TOKEN_KIND(Source.getNextToken(), tok::eof);
|
|
}
|
|
|
|
TEST_F(IndexedTokenSourceTest, InsertTokensRecursive) {
|
|
IndexedTokenSource Source(lex("A1"));
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
// A1
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("B1")), "B1");
|
|
// B1 A1
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("C1")), "C1");
|
|
// C1 B1 A1
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("D1")), "D1");
|
|
// D1 C1 B1 A1
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "C1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "B1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
}
|
|
|
|
TEST_F(IndexedTokenSourceTest, InsertTokensRecursiveAtEndOfSequence) {
|
|
IndexedTokenSource Source(lex("A1"));
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("B1")), "B1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("C1")), "C1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
EXPECT_TOKEN_ID(Source.insertTokens(lex("D1")), "D1");
|
|
EXPECT_TOKEN_ID(Source.getNextToken(), "A1");
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace format
|
|
} // namespace clang
|