1*f8d10d5aSManuel Klimek //===- unittest/Format/FormatReplacementTest.cpp - Formatting unit test ---===//
2*f8d10d5aSManuel Klimek //
3*f8d10d5aSManuel Klimek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f8d10d5aSManuel Klimek // See https://llvm.org/LICENSE.txt for license information.
5*f8d10d5aSManuel Klimek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f8d10d5aSManuel Klimek //
7*f8d10d5aSManuel Klimek //===----------------------------------------------------------------------===//
8*f8d10d5aSManuel Klimek
9*f8d10d5aSManuel Klimek #include "../Tooling/ReplacementTest.h"
10*f8d10d5aSManuel Klimek #include "clang/Format/Format.h"
11*f8d10d5aSManuel Klimek
12*f8d10d5aSManuel Klimek namespace clang {
13*f8d10d5aSManuel Klimek namespace tooling {
14*f8d10d5aSManuel Klimek namespace {
15*f8d10d5aSManuel Klimek
16*f8d10d5aSManuel Klimek using format::FormatStyle;
17*f8d10d5aSManuel Klimek using format::getLLVMStyle;
18*f8d10d5aSManuel Klimek
TEST_F(ReplacementTest,FormatCodeAfterReplacements)19*f8d10d5aSManuel Klimek TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
20*f8d10d5aSManuel Klimek // Column limit is 20.
21*f8d10d5aSManuel Klimek std::string Code = "Type *a =\n"
22*f8d10d5aSManuel Klimek " new Type();\n"
23*f8d10d5aSManuel Klimek "g(iiiii, 0, jjjjj,\n"
24*f8d10d5aSManuel Klimek " 0, kkkkk, 0, mm);\n"
25*f8d10d5aSManuel Klimek "int bad = format ;";
26*f8d10d5aSManuel Klimek std::string Expected = "auto a = new Type();\n"
27*f8d10d5aSManuel Klimek "g(iiiii, nullptr,\n"
28*f8d10d5aSManuel Klimek " jjjjj, nullptr,\n"
29*f8d10d5aSManuel Klimek " kkkkk, nullptr,\n"
30*f8d10d5aSManuel Klimek " mm);\n"
31*f8d10d5aSManuel Klimek "int bad = format ;";
32*f8d10d5aSManuel Klimek FileID ID = Context.createInMemoryFile("format.cpp", Code);
33*f8d10d5aSManuel Klimek tooling::Replacements Replaces = toReplacements(
34*f8d10d5aSManuel Klimek {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
35*f8d10d5aSManuel Klimek "auto "),
36*f8d10d5aSManuel Klimek tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
37*f8d10d5aSManuel Klimek "nullptr"),
38*f8d10d5aSManuel Klimek tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
39*f8d10d5aSManuel Klimek "nullptr"),
40*f8d10d5aSManuel Klimek tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
41*f8d10d5aSManuel Klimek "nullptr")});
42*f8d10d5aSManuel Klimek
43*f8d10d5aSManuel Klimek FormatStyle Style = getLLVMStyle();
44*f8d10d5aSManuel Klimek Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
45*f8d10d5aSManuel Klimek auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
46*f8d10d5aSManuel Klimek EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
47*f8d10d5aSManuel Klimek << llvm::toString(FormattedReplaces.takeError()) << "\n";
48*f8d10d5aSManuel Klimek auto Result = applyAllReplacements(Code, *FormattedReplaces);
49*f8d10d5aSManuel Klimek EXPECT_TRUE(static_cast<bool>(Result));
50*f8d10d5aSManuel Klimek EXPECT_EQ(Expected, *Result);
51*f8d10d5aSManuel Klimek }
52*f8d10d5aSManuel Klimek
TEST_F(ReplacementTest,SortIncludesAfterReplacement)53*f8d10d5aSManuel Klimek TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
54*f8d10d5aSManuel Klimek std::string Code = "#include \"a.h\"\n"
55*f8d10d5aSManuel Klimek "#include \"c.h\"\n"
56*f8d10d5aSManuel Klimek "\n"
57*f8d10d5aSManuel Klimek "int main() {\n"
58*f8d10d5aSManuel Klimek " return 0;\n"
59*f8d10d5aSManuel Klimek "}";
60*f8d10d5aSManuel Klimek std::string Expected = "#include \"a.h\"\n"
61*f8d10d5aSManuel Klimek "#include \"b.h\"\n"
62*f8d10d5aSManuel Klimek "#include \"c.h\"\n"
63*f8d10d5aSManuel Klimek "\n"
64*f8d10d5aSManuel Klimek "int main() {\n"
65*f8d10d5aSManuel Klimek " return 0;\n"
66*f8d10d5aSManuel Klimek "}";
67*f8d10d5aSManuel Klimek FileID ID = Context.createInMemoryFile("fix.cpp", Code);
68*f8d10d5aSManuel Klimek tooling::Replacements Replaces = toReplacements(
69*f8d10d5aSManuel Klimek {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
70*f8d10d5aSManuel Klimek "#include \"b.h\"\n")});
71*f8d10d5aSManuel Klimek
72*f8d10d5aSManuel Klimek FormatStyle Style = getLLVMStyle();
73*f8d10d5aSManuel Klimek Style.SortIncludes = FormatStyle::SI_CaseSensitive;
74*f8d10d5aSManuel Klimek auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
75*f8d10d5aSManuel Klimek EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
76*f8d10d5aSManuel Klimek << llvm::toString(FormattedReplaces.takeError()) << "\n";
77*f8d10d5aSManuel Klimek auto Result = applyAllReplacements(Code, *FormattedReplaces);
78*f8d10d5aSManuel Klimek EXPECT_TRUE(static_cast<bool>(Result));
79*f8d10d5aSManuel Klimek EXPECT_EQ(Expected, *Result);
80*f8d10d5aSManuel Klimek }
81*f8d10d5aSManuel Klimek
82*f8d10d5aSManuel Klimek } // namespace
83*f8d10d5aSManuel Klimek } // namespace tooling
84*f8d10d5aSManuel Klimek } // namespace clang
85