xref: /llvm-project/clang/unittests/Format/FormatTestRawStrings.cpp (revision 1c58208d899285318c89e069268145c85ec33368)
19ad83fe7SKrasimir Georgiev //===- unittest/Format/FormatTestRawStrings.cpp - Formatting unit tests ---===//
29ad83fe7SKrasimir Georgiev //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69ad83fe7SKrasimir Georgiev //
79ad83fe7SKrasimir Georgiev //===----------------------------------------------------------------------===//
89ad83fe7SKrasimir Georgiev 
99ad83fe7SKrasimir Georgiev #include "clang/Format/Format.h"
109ad83fe7SKrasimir Georgiev 
119ad83fe7SKrasimir Georgiev #include "../Tooling/ReplacementTest.h"
129ad83fe7SKrasimir Georgiev #include "FormatTestUtils.h"
139ad83fe7SKrasimir Georgiev 
149ad83fe7SKrasimir Georgiev #include "llvm/Support/Debug.h"
159ad83fe7SKrasimir Georgiev #include "llvm/Support/MemoryBuffer.h"
169ad83fe7SKrasimir Georgiev #include "gtest/gtest.h"
179ad83fe7SKrasimir Georgiev 
189ad83fe7SKrasimir Georgiev #define DEBUG_TYPE "format-test"
199ad83fe7SKrasimir Georgiev 
209ad83fe7SKrasimir Georgiev namespace clang {
219ad83fe7SKrasimir Georgiev namespace format {
229ad83fe7SKrasimir Georgiev namespace {
239ad83fe7SKrasimir Georgiev 
24*1c58208dSOwen Pan class FormatTestRawStrings : public testing::Test {
259ad83fe7SKrasimir Georgiev protected:
269ad83fe7SKrasimir Georgiev   enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck };
279ad83fe7SKrasimir Georgiev 
format(StringRef Code,const FormatStyle & Style=getLLVMStyle (),StatusCheck CheckComplete=SC_ExpectComplete)28*1c58208dSOwen Pan   std::string format(StringRef Code, const FormatStyle &Style = getLLVMStyle(),
299ad83fe7SKrasimir Georgiev                      StatusCheck CheckComplete = SC_ExpectComplete) {
303538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << "---\n");
313538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
329ad83fe7SKrasimir Georgiev     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
339ad83fe7SKrasimir Georgiev     FormattingAttemptStatus Status;
349ad83fe7SKrasimir Georgiev     tooling::Replacements Replaces =
359ad83fe7SKrasimir Georgiev         reformat(Style, Code, Ranges, "<stdin>", &Status);
369ad83fe7SKrasimir Georgiev     if (CheckComplete != SC_DoNotCheck) {
379ad83fe7SKrasimir Georgiev       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
389ad83fe7SKrasimir Georgiev       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
399ad83fe7SKrasimir Georgiev           << Code << "\n\n";
409ad83fe7SKrasimir Georgiev     }
419ad83fe7SKrasimir Georgiev     ReplacementCount = Replaces.size();
429ad83fe7SKrasimir Georgiev     auto Result = applyAllReplacements(Code, Replaces);
439ad83fe7SKrasimir Georgiev     EXPECT_TRUE(static_cast<bool>(Result));
443538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
459ad83fe7SKrasimir Georgiev     return *Result;
469ad83fe7SKrasimir Georgiev   }
479ad83fe7SKrasimir Georgiev 
getStyleWithColumns(FormatStyle Style,unsigned ColumnLimit)489ad83fe7SKrasimir Georgiev   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
499ad83fe7SKrasimir Georgiev     Style.ColumnLimit = ColumnLimit;
509ad83fe7SKrasimir Georgiev     return Style;
519ad83fe7SKrasimir Georgiev   }
529ad83fe7SKrasimir Georgiev 
getLLVMStyleWithColumns(unsigned ColumnLimit)539ad83fe7SKrasimir Georgiev   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
549ad83fe7SKrasimir Georgiev     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
559ad83fe7SKrasimir Georgiev   }
569ad83fe7SKrasimir Georgiev 
579ad83fe7SKrasimir Georgiev   int ReplacementCount;
589ad83fe7SKrasimir Georgiev 
getRawStringPbStyleWithColumns(unsigned ColumnLimit)599ad83fe7SKrasimir Georgiev   FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) {
609ad83fe7SKrasimir Georgiev     FormatStyle Style = getLLVMStyle();
619ad83fe7SKrasimir Georgiev     Style.ColumnLimit = ColumnLimit;
622537e220SKrasimir Georgiev     Style.RawStringFormats = {
63412ed095SKrasimir Georgiev         {
64412ed095SKrasimir Georgiev             /*Language=*/FormatStyle::LK_TextProto,
654527f13aSKrasimir Georgiev             /*Delimiters=*/{"pb"},
662537e220SKrasimir Georgiev             /*EnclosingFunctions=*/{},
67412ed095SKrasimir Georgiev             /*CanonicalDelimiter=*/"",
68412ed095SKrasimir Georgiev             /*BasedOnStyle=*/"google",
69412ed095SKrasimir Georgiev         },
702537e220SKrasimir Georgiev     };
719ad83fe7SKrasimir Georgiev     return Style;
729ad83fe7SKrasimir Georgiev   }
739ad83fe7SKrasimir Georgiev 
getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle)749ad83fe7SKrasimir Georgiev   FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) {
759ad83fe7SKrasimir Georgiev     FormatStyle Style = getLLVMStyle();
762537e220SKrasimir Georgiev     Style.RawStringFormats = {
77412ed095SKrasimir Georgiev         {
78412ed095SKrasimir Georgiev             /*Language=*/FormatStyle::LK_Cpp,
792537e220SKrasimir Georgiev             /*Delimiters=*/{"cpp"},
80412ed095SKrasimir Georgiev             /*EnclosingFunctions=*/{},
81412ed095SKrasimir Georgiev             /*CanonicalDelimiter=*/"",
82412ed095SKrasimir Georgiev             BasedOnStyle,
83412ed095SKrasimir Georgiev         },
842537e220SKrasimir Georgiev     };
859ad83fe7SKrasimir Georgiev     return Style;
869ad83fe7SKrasimir Georgiev   }
879ad83fe7SKrasimir Georgiev 
getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle)889ad83fe7SKrasimir Georgiev   FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) {
899ad83fe7SKrasimir Georgiev     FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
902537e220SKrasimir Georgiev     Style.RawStringFormats = {
91412ed095SKrasimir Georgiev         {
92412ed095SKrasimir Georgiev             /*Language=*/FormatStyle::LK_Cpp,
932537e220SKrasimir Georgiev             /*Delimiters=*/{"cpp"},
94412ed095SKrasimir Georgiev             /*EnclosingFunctions=*/{},
95412ed095SKrasimir Georgiev             /*CanonicalDelimiter=*/"",
96412ed095SKrasimir Georgiev             BasedOnStyle,
97412ed095SKrasimir Georgiev         },
982537e220SKrasimir Georgiev     };
999ad83fe7SKrasimir Georgiev     return Style;
1009ad83fe7SKrasimir Georgiev   }
1019ad83fe7SKrasimir Georgiev 
1029ad83fe7SKrasimir Georgiev   // Gcc 4.8 doesn't support raw string literals in macros, which breaks some
1039ad83fe7SKrasimir Georgiev   // build bots. We use this function instead.
expect_eq(const std::string Expected,const std::string Actual)1049ad83fe7SKrasimir Georgiev   void expect_eq(const std::string Expected, const std::string Actual) {
1059ad83fe7SKrasimir Georgiev     EXPECT_EQ(Expected, Actual);
1069ad83fe7SKrasimir Georgiev   }
1079ad83fe7SKrasimir Georgiev };
1089ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,ReformatsAccordingToBaseStyle)1099ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, ReformatsAccordingToBaseStyle) {
1109ad83fe7SKrasimir Georgiev   // llvm style puts '*' on the right.
1119ad83fe7SKrasimir Georgiev   // google style puts '*' on the left.
1129ad83fe7SKrasimir Georgiev 
1139ad83fe7SKrasimir Georgiev   // Use the llvm style if the raw string style has no BasedOnStyle.
1149ad83fe7SKrasimir Georgiev   expect_eq(R"test(int *i = R"cpp(int *p = nullptr;)cpp")test",
1159ad83fe7SKrasimir Georgiev             format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
1169ad83fe7SKrasimir Georgiev                    getRawStringLLVMCppStyleBasedOn("")));
1179ad83fe7SKrasimir Georgiev 
1189ad83fe7SKrasimir Georgiev   // Use the google style if the raw string style has BasedOnStyle=google.
1199ad83fe7SKrasimir Georgiev   expect_eq(R"test(int *i = R"cpp(int* p = nullptr;)cpp")test",
1209ad83fe7SKrasimir Georgiev             format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
1219ad83fe7SKrasimir Georgiev                    getRawStringLLVMCppStyleBasedOn("google")));
1229ad83fe7SKrasimir Georgiev 
1239ad83fe7SKrasimir Georgiev   // Use the llvm style if the raw string style has no BasedOnStyle=llvm.
1249ad83fe7SKrasimir Georgiev   expect_eq(R"test(int* i = R"cpp(int *p = nullptr;)cpp")test",
1259ad83fe7SKrasimir Georgiev             format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
1269ad83fe7SKrasimir Georgiev                    getRawStringGoogleCppStyleBasedOn("llvm")));
1279ad83fe7SKrasimir Georgiev }
1289ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,UsesConfigurationOverBaseStyle)1294527f13aSKrasimir Georgiev TEST_F(FormatTestRawStrings, UsesConfigurationOverBaseStyle) {
1304527f13aSKrasimir Georgiev   // llvm style puts '*' on the right.
1314527f13aSKrasimir Georgiev   // google style puts '*' on the left.
1324527f13aSKrasimir Georgiev 
1334527f13aSKrasimir Georgiev   // Uses the configured google style inside raw strings even if BasedOnStyle in
1344527f13aSKrasimir Georgiev   // the raw string format is llvm.
1354527f13aSKrasimir Georgiev   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
1364527f13aSKrasimir Georgiev   EXPECT_EQ(0, parseConfiguration("---\n"
1374527f13aSKrasimir Georgiev                                   "Language: Cpp\n"
138ece7e95fSmydeveloperday                                   "BasedOnStyle: Google",
139ece7e95fSmydeveloperday                                   &Style)
140ece7e95fSmydeveloperday                    .value());
141412ed095SKrasimir Georgiev   Style.RawStringFormats = {{
142412ed095SKrasimir Georgiev       FormatStyle::LK_Cpp,
143412ed095SKrasimir Georgiev       {"cpp"},
144412ed095SKrasimir Georgiev       {},
145412ed095SKrasimir Georgiev       /*CanonicalDelimiter=*/"",
146412ed095SKrasimir Georgiev       /*BasedOnStyle=*/"llvm",
147412ed095SKrasimir Georgiev   }};
1484527f13aSKrasimir Georgiev   expect_eq(R"test(int* i = R"cpp(int* j = 0;)cpp";)test",
1494527f13aSKrasimir Georgiev             format(R"test(int * i = R"cpp(int * j = 0;)cpp";)test", Style));
1504527f13aSKrasimir Georgiev }
1514527f13aSKrasimir Georgiev 
TEST_F(FormatTestRawStrings,MatchesDelimitersCaseSensitively)1529ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, MatchesDelimitersCaseSensitively) {
1539ad83fe7SKrasimir Georgiev   // Don't touch the 'PB' raw string, format the 'pb' raw string.
1549ad83fe7SKrasimir Georgiev   expect_eq(R"test(
1559ad83fe7SKrasimir Georgiev s = R"PB(item:1)PB";
1569ad83fe7SKrasimir Georgiev t = R"pb(item: 1)pb";)test",
1579ad83fe7SKrasimir Georgiev             format(R"test(
1589ad83fe7SKrasimir Georgiev s = R"PB(item:1)PB";
1599ad83fe7SKrasimir Georgiev t = R"pb(item:1)pb";)test",
1609ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
1619ad83fe7SKrasimir Georgiev }
1629ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,RespectsClangFormatOff)163dd0c4e1dSDaniel Jasper TEST_F(FormatTestRawStrings, RespectsClangFormatOff) {
164dd0c4e1dSDaniel Jasper   expect_eq(R"test(
165dd0c4e1dSDaniel Jasper // clang-format off
166dd0c4e1dSDaniel Jasper s = R"pb(item:      1)pb";
167dd0c4e1dSDaniel Jasper // clang-format on
168dd0c4e1dSDaniel Jasper t = R"pb(item: 1)pb";)test",
169dd0c4e1dSDaniel Jasper             format(R"test(
170dd0c4e1dSDaniel Jasper // clang-format off
171dd0c4e1dSDaniel Jasper s = R"pb(item:      1)pb";
172dd0c4e1dSDaniel Jasper // clang-format on
173dd0c4e1dSDaniel Jasper t = R"pb(item:      1)pb";)test",
174dd0c4e1dSDaniel Jasper                    getRawStringPbStyleWithColumns(40)));
175dd0c4e1dSDaniel Jasper }
176dd0c4e1dSDaniel Jasper 
TEST_F(FormatTestRawStrings,ReformatsShortRawStringsOnSingleLine)1779ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, ReformatsShortRawStringsOnSingleLine) {
178ece7e95fSmydeveloperday   expect_eq(R"test(P p = TP(R"pb()pb");)test",
179ece7e95fSmydeveloperday             format(R"test(P p = TP(R"pb( )pb");)test",
1809ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
181ece7e95fSmydeveloperday   expect_eq(R"test(P p = TP(R"pb(item_1: 1)pb");)test",
182ece7e95fSmydeveloperday             format(R"test(P p = TP(R"pb(item_1:1)pb");)test",
1839ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
184ece7e95fSmydeveloperday   expect_eq(R"test(P p = TP(R"pb(item_1: 1)pb");)test",
185ece7e95fSmydeveloperday             format(R"test(P p = TP(R"pb(  item_1 :  1   )pb");)test",
1869ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
187ece7e95fSmydeveloperday   expect_eq(R"test(P p = TP(R"pb(item_1: 1 item_2: 2)pb");)test",
188ece7e95fSmydeveloperday             format(R"test(P p = TP(R"pb(item_1:1 item_2:2)pb");)test",
1899ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
1909ad83fe7SKrasimir Georgiev   // Merge two short lines into one.
1919ad83fe7SKrasimir Georgiev   expect_eq(R"test(
1929ad83fe7SKrasimir Georgiev std::string s = R"pb(
1939ad83fe7SKrasimir Georgiev   item_1: 1 item_2: 2
1949ad83fe7SKrasimir Georgiev )pb";
1959ad83fe7SKrasimir Georgiev )test",
1969ad83fe7SKrasimir Georgiev             format(R"test(
1979ad83fe7SKrasimir Georgiev std::string s = R"pb(
1989ad83fe7SKrasimir Georgiev   item_1:1
1999ad83fe7SKrasimir Georgiev   item_2:2
2009ad83fe7SKrasimir Georgiev )pb";
2019ad83fe7SKrasimir Georgiev )test",
2029ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
2039ad83fe7SKrasimir Georgiev }
2049ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,BreaksShortRawStringsWhenNeeded)2058b98f551SKrasimir Georgiev TEST_F(FormatTestRawStrings, BreaksShortRawStringsWhenNeeded) {
2068b98f551SKrasimir Georgiev   // The raw string contains multiple submessage entries, so break for
2078b98f551SKrasimir Georgiev   // readability.
2088b98f551SKrasimir Georgiev   expect_eq(R"test(
2098b98f551SKrasimir Georgiev P p = TP(R"pb(item_1 < 1 >
2108b98f551SKrasimir Georgiev               item_2: { 2 })pb");)test",
2118b98f551SKrasimir Georgiev             format(
2128b98f551SKrasimir Georgiev                 R"test(
2138b98f551SKrasimir Georgiev P p = TP(R"pb(item_1<1> item_2:{2})pb");)test",
2148b98f551SKrasimir Georgiev                 getRawStringPbStyleWithColumns(40)));
2158b98f551SKrasimir Georgiev }
2168b98f551SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,BreaksRawStringsExceedingColumnLimit)2179ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, BreaksRawStringsExceedingColumnLimit) {
2189ad83fe7SKrasimir Georgiev   expect_eq(R"test(
2199ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPP(
2209ad83fe7SKrasimir Georgiev     R"pb(item_1: 1, item_2: 2)pb");)test",
2219ad83fe7SKrasimir Georgiev             format(R"test(
2229ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2)pb");)test",
2239ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
2249ad83fe7SKrasimir Georgiev 
2259ad83fe7SKrasimir Georgiev   expect_eq(R"test(
2269ad83fe7SKrasimir Georgiev P p =
2279ad83fe7SKrasimir Georgiev     TPPPPPPPPPPPPPPP(
2289ad83fe7SKrasimir Georgiev         R"pb(item_1: 1,
2299ad83fe7SKrasimir Georgiev              item_2: 2,
2309ad83fe7SKrasimir Georgiev              item_3: 3)pb");)test",
2319ad83fe7SKrasimir Georgiev             format(R"test(
2329ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2, item_3: 3)pb");)test",
2339ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
2349ad83fe7SKrasimir Georgiev 
2359ad83fe7SKrasimir Georgiev   expect_eq(R"test(
2369ad83fe7SKrasimir Georgiev P p = TP(R"pb(item_1 < 1 >
2379ad83fe7SKrasimir Georgiev               item_2: < 2 >
2389ad83fe7SKrasimir Georgiev               item_3 {})pb");)test",
2399ad83fe7SKrasimir Georgiev             format(R"test(
2409ad83fe7SKrasimir Georgiev P p = TP(R"pb(item_1<1> item_2:<2> item_3{ })pb");)test",
2419ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
2429ad83fe7SKrasimir Georgiev 
2439ad83fe7SKrasimir Georgiev   expect_eq(
2449ad83fe7SKrasimir Georgiev       R"test(
2459ad83fe7SKrasimir Georgiev P p = TP(R"pb(item_1: 1,
2469ad83fe7SKrasimir Georgiev               item_2: 2,
2479ad83fe7SKrasimir Georgiev               item_3: 3,
2489ad83fe7SKrasimir Georgiev               item_4: 4)pb");)test",
2499ad83fe7SKrasimir Georgiev       format(
2509ad83fe7SKrasimir Georgiev           R"test(
2519ad83fe7SKrasimir Georgiev P p = TP(R"pb(item_1: 1, item_2: 2, item_3: 3, item_4: 4)pb");)test",
2529ad83fe7SKrasimir Georgiev           getRawStringPbStyleWithColumns(40)));
2539ad83fe7SKrasimir Georgiev 
2549ad83fe7SKrasimir Georgiev   expect_eq(R"test(
2559ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPP(
2569ad83fe7SKrasimir Georgiev     R"pb(item_1 < 1 >,
2579ad83fe7SKrasimir Georgiev          item_2: { 2 },
2589ad83fe7SKrasimir Georgiev          item_3: < 3 >,
2599ad83fe7SKrasimir Georgiev          item_4: { 4 })pb");)test",
2609ad83fe7SKrasimir Georgiev             format(R"test(
2619ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPP(R"pb(item_1<1>, item_2: {2}, item_3: <3>, item_4:{4})pb");)test",
2629ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
2639ad83fe7SKrasimir Georgiev 
2649ad83fe7SKrasimir Georgiev   // Breaks before a short raw string exceeding the column limit.
2659ad83fe7SKrasimir Georgiev   expect_eq(R"test(
2669ad83fe7SKrasimir Georgiev FFFFFFFFFFFFFFFFFFFFFFFFFFF(
2679ad83fe7SKrasimir Georgiev     R"pb(key: 1)pb");
2689ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPPPPPPP(
2699ad83fe7SKrasimir Georgiev     R"pb(key: 2)pb");
2709ad83fe7SKrasimir Georgiev auto TPPPPPPPPPPPPPPPPPPPP =
2719ad83fe7SKrasimir Georgiev     R"pb(key: 3)pb";
2729ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPPPPPPP(
2739ad83fe7SKrasimir Georgiev     R"pb(i: 1, j: 2)pb");
2749ad83fe7SKrasimir Georgiev 
2759ad83fe7SKrasimir Georgiev int f(string s) {
2769ad83fe7SKrasimir Georgiev   FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(
2779ad83fe7SKrasimir Georgiev       R"pb(key: 1)pb");
2789ad83fe7SKrasimir Georgiev   P p = TPPPPPPPPPPPPPPPPPPPP(
2799ad83fe7SKrasimir Georgiev       R"pb(key: 2)pb");
2809ad83fe7SKrasimir Georgiev   auto TPPPPPPPPPPPPPPPPPPPP =
2819ad83fe7SKrasimir Georgiev       R"pb(key: 3)pb";
2829ad83fe7SKrasimir Georgiev   if (s.empty())
2839ad83fe7SKrasimir Georgiev     P p = TPPPPPPPPPPPPPPPPPPPP(
2849ad83fe7SKrasimir Georgiev         R"pb(i: 1, j: 2)pb");
2859ad83fe7SKrasimir Georgiev }
2869ad83fe7SKrasimir Georgiev )test",
2879ad83fe7SKrasimir Georgiev             format(R"test(
2889ad83fe7SKrasimir Georgiev FFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb");
2899ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb");
2909ad83fe7SKrasimir Georgiev auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb";
2919ad83fe7SKrasimir Georgiev P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb");
2929ad83fe7SKrasimir Georgiev 
2939ad83fe7SKrasimir Georgiev int f(string s) {
2949ad83fe7SKrasimir Georgiev   FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb");
2959ad83fe7SKrasimir Georgiev   P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb");
2969ad83fe7SKrasimir Georgiev   auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb";
2979ad83fe7SKrasimir Georgiev   if (s.empty())
2989ad83fe7SKrasimir Georgiev     P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb");
2999ad83fe7SKrasimir Georgiev }
3009ad83fe7SKrasimir Georgiev )test",
3019ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3029ad83fe7SKrasimir Georgiev }
3039ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,FormatsRawStringArguments)3049ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, FormatsRawStringArguments) {
3059ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3069ad83fe7SKrasimir Georgiev P p = TP(R"pb(key { 1 })pb", param_2);)test",
3079ad83fe7SKrasimir Georgiev             format(R"test(
3089ad83fe7SKrasimir Georgiev P p = TP(R"pb(key{1})pb",param_2);)test",
3099ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3109ad83fe7SKrasimir Georgiev 
3119ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3129ad83fe7SKrasimir Georgiev PPPPPPPPPPPPP(R"pb(keykeyk)pb",
3139ad83fe7SKrasimir Georgiev               param_2);)test",
3149ad83fe7SKrasimir Georgiev             format(R"test(
3159ad83fe7SKrasimir Georgiev PPPPPPPPPPPPP(R"pb(keykeyk)pb", param_2);)test",
3169ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3179ad83fe7SKrasimir Georgiev 
3189ad83fe7SKrasimir Georgiev   expect_eq(R"test(
319c2091808SKrasimir Georgiev P p = TP(
320c2091808SKrasimir Georgiev     R"pb(item: { i: 1, s: 's' }
3219ad83fe7SKrasimir Georgiev          item: { i: 2, s: 't' })pb");)test",
3229ad83fe7SKrasimir Georgiev             format(R"test(
3239ad83fe7SKrasimir Georgiev P p = TP(R"pb(item: {i: 1, s: 's'} item: {i: 2, s: 't'})pb");)test",
3249ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3259ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3269ad83fe7SKrasimir Georgiev FFFFFFFFFFFFFFFFFFF(
3279ad83fe7SKrasimir Georgiev     R"pb(key: "value")pb",
3289ad83fe7SKrasimir Georgiev     R"pb(key2: "value")pb");)test",
3299ad83fe7SKrasimir Georgiev             format(R"test(
3309ad83fe7SKrasimir Georgiev FFFFFFFFFFFFFFFFFFF(R"pb(key: "value")pb", R"pb(key2: "value")pb");)test",
3319ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3329ad83fe7SKrasimir Georgiev 
3339ad83fe7SKrasimir Georgiev   // Formats the first out of two arguments.
3349ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3359ad83fe7SKrasimir Georgiev FFFFFFFF(R"pb(key: 1)pb", argument2);
3369ad83fe7SKrasimir Georgiev struct S {
3379ad83fe7SKrasimir Georgiev   const s =
3389ad83fe7SKrasimir Georgiev       f(R"pb(key: 1)pb", argument2);
3399ad83fe7SKrasimir Georgiev   void f() {
3409ad83fe7SKrasimir Georgiev     if (gol)
3419ad83fe7SKrasimir Georgiev       return g(R"pb(key: 1)pb",
3429ad83fe7SKrasimir Georgiev                132789237);
3439ad83fe7SKrasimir Georgiev     return g(R"pb(key: 1)pb", "172893");
3449ad83fe7SKrasimir Georgiev   }
3459ad83fe7SKrasimir Georgiev };)test",
3469ad83fe7SKrasimir Georgiev             format(R"test(
3479ad83fe7SKrasimir Georgiev FFFFFFFF(R"pb(key:1)pb", argument2);
3489ad83fe7SKrasimir Georgiev struct S {
3499ad83fe7SKrasimir Georgiev const s = f(R"pb(key:1)pb", argument2);
3509ad83fe7SKrasimir Georgiev void f() {
3519ad83fe7SKrasimir Georgiev   if (gol)
3529ad83fe7SKrasimir Georgiev     return g(R"pb(key:1)pb", 132789237);
3539ad83fe7SKrasimir Georgiev   return g(R"pb(key:1)pb", "172893");
3549ad83fe7SKrasimir Georgiev }
3559ad83fe7SKrasimir Georgiev };)test",
3569ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3579ad83fe7SKrasimir Georgiev 
3589ad83fe7SKrasimir Georgiev   // Formats the second out of two arguments.
3599ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3609ad83fe7SKrasimir Georgiev FFFFFFFF(argument1, R"pb(key: 2)pb");
3619ad83fe7SKrasimir Georgiev struct S {
3629ad83fe7SKrasimir Georgiev   const s =
3639ad83fe7SKrasimir Georgiev       f(argument1, R"pb(key: 2)pb");
3649ad83fe7SKrasimir Georgiev   void f() {
3659ad83fe7SKrasimir Georgiev     if (gol)
3669ad83fe7SKrasimir Georgiev       return g(12784137,
3679ad83fe7SKrasimir Georgiev                R"pb(key: 2)pb");
3689ad83fe7SKrasimir Georgiev     return g(17283122, R"pb(key: 2)pb");
3699ad83fe7SKrasimir Georgiev   }
3709ad83fe7SKrasimir Georgiev };)test",
3719ad83fe7SKrasimir Georgiev             format(R"test(
3729ad83fe7SKrasimir Georgiev FFFFFFFF(argument1, R"pb(key:2)pb");
3739ad83fe7SKrasimir Georgiev struct S {
3749ad83fe7SKrasimir Georgiev const s = f(argument1, R"pb(key:2)pb");
3759ad83fe7SKrasimir Georgiev void f() {
3769ad83fe7SKrasimir Georgiev   if (gol)
3779ad83fe7SKrasimir Georgiev     return g(12784137, R"pb(key:2)pb");
3789ad83fe7SKrasimir Georgiev   return g(17283122, R"pb(key:2)pb");
3799ad83fe7SKrasimir Georgiev }
3809ad83fe7SKrasimir Georgiev };)test",
3819ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3829ad83fe7SKrasimir Georgiev 
3839ad83fe7SKrasimir Georgiev   // Formats two short raw string arguments.
3849ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3859ad83fe7SKrasimir Georgiev FFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test",
3869ad83fe7SKrasimir Georgiev             format(R"test(
3879ad83fe7SKrasimir Georgiev FFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
3889ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
3899ad83fe7SKrasimir Georgiev   // TODO(krasimir): The original source code fits on one line, so the
3909ad83fe7SKrasimir Georgiev   // non-optimizing formatter is chosen. But after the formatting in protos is
3919ad83fe7SKrasimir Georgiev   // made, the code doesn't fit on one line anymore and further formatting
3929ad83fe7SKrasimir Georgiev   // splits it.
3939ad83fe7SKrasimir Georgiev   //
3949ad83fe7SKrasimir Georgiev   // Should we disable raw string formatting for the non-optimizing formatter?
3959ad83fe7SKrasimir Georgiev   expect_eq(R"test(
3969ad83fe7SKrasimir Georgiev FFFFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test",
3979ad83fe7SKrasimir Georgiev             format(R"test(
3989ad83fe7SKrasimir Georgiev FFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
3999ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4009ad83fe7SKrasimir Georgiev 
4019ad83fe7SKrasimir Georgiev   // Formats two short raw string arguments, puts second on newline.
4029ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4039ad83fe7SKrasimir Georgiev FFFFFFFF(R"pb(key: 1)pb",
4049ad83fe7SKrasimir Georgiev          R"pb(key: 2)pb");)test",
4059ad83fe7SKrasimir Georgiev             format(R"test(
4069ad83fe7SKrasimir Georgiev FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
4079ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4089ad83fe7SKrasimir Georgiev 
4099ad83fe7SKrasimir Georgiev   // Formats both arguments.
4109ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4119ad83fe7SKrasimir Georgiev FFFFFFFF(R"pb(key: 1)pb",
4129ad83fe7SKrasimir Georgiev          R"pb(key: 2)pb");
4139ad83fe7SKrasimir Georgiev struct S {
4149ad83fe7SKrasimir Georgiev   const s = f(R"pb(key: 1)pb",
4159ad83fe7SKrasimir Georgiev               R"pb(key: 2)pb");
4169ad83fe7SKrasimir Georgiev   void f() {
4179ad83fe7SKrasimir Georgiev     if (gol)
4189ad83fe7SKrasimir Georgiev       return g(R"pb(key: 1)pb",
4199ad83fe7SKrasimir Georgiev                R"pb(key: 2)pb");
4209ad83fe7SKrasimir Georgiev     return g(R"pb(k1)pb", R"pb(k2)pb");
4219ad83fe7SKrasimir Georgiev   }
4229ad83fe7SKrasimir Georgiev };)test",
4239ad83fe7SKrasimir Georgiev             format(R"test(
4249ad83fe7SKrasimir Georgiev FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");
4259ad83fe7SKrasimir Georgiev struct S {
4269ad83fe7SKrasimir Georgiev const s = f(R"pb(key:1)pb", R"pb(key:2)pb");
4279ad83fe7SKrasimir Georgiev void f() {
4289ad83fe7SKrasimir Georgiev   if (gol)
4299ad83fe7SKrasimir Georgiev     return g(R"pb(key:1)pb", R"pb(key:2)pb");
4309ad83fe7SKrasimir Georgiev   return g(R"pb( k1 )pb", R"pb( k2 )pb");
4319ad83fe7SKrasimir Georgiev }
4329ad83fe7SKrasimir Georgiev };)test",
4339ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4349ad83fe7SKrasimir Georgiev }
4359ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,RawStringStartingWithNewlines)4369ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, RawStringStartingWithNewlines) {
4379ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4389ad83fe7SKrasimir Georgiev std::string s = R"pb(
4399ad83fe7SKrasimir Georgiev   item_1: 1
4409ad83fe7SKrasimir Georgiev )pb";
4419ad83fe7SKrasimir Georgiev )test",
4429ad83fe7SKrasimir Georgiev             format(R"test(
4439ad83fe7SKrasimir Georgiev std::string s = R"pb(
4449ad83fe7SKrasimir Georgiev     item_1:1
4459ad83fe7SKrasimir Georgiev )pb";
4469ad83fe7SKrasimir Georgiev )test",
4479ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4489ad83fe7SKrasimir Georgiev 
4499ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4509ad83fe7SKrasimir Georgiev std::string s = R"pb(
4519ad83fe7SKrasimir Georgiev 
4529ad83fe7SKrasimir Georgiev   item_1: 1
4539ad83fe7SKrasimir Georgiev )pb";
4549ad83fe7SKrasimir Georgiev )test",
4559ad83fe7SKrasimir Georgiev             format(R"test(
4569ad83fe7SKrasimir Georgiev std::string s = R"pb(
4579ad83fe7SKrasimir Georgiev 
4589ad83fe7SKrasimir Georgiev     item_1:1
4599ad83fe7SKrasimir Georgiev )pb";
4609ad83fe7SKrasimir Georgiev )test",
4619ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4629ad83fe7SKrasimir Georgiev 
4639ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4649ad83fe7SKrasimir Georgiev std::string s = R"pb(
4659ad83fe7SKrasimir Georgiev   item_1: 1
4669ad83fe7SKrasimir Georgiev )pb";
4679ad83fe7SKrasimir Georgiev )test",
4689ad83fe7SKrasimir Georgiev             format(R"test(
4699ad83fe7SKrasimir Georgiev std::string s = R"pb(
4709ad83fe7SKrasimir Georgiev     item_1:1
4719ad83fe7SKrasimir Georgiev 
4729ad83fe7SKrasimir Georgiev )pb";
4739ad83fe7SKrasimir Georgiev )test",
4749ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4759ad83fe7SKrasimir Georgiev 
4769ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4779ad83fe7SKrasimir Georgiev std::string s = R"pb(
4789ad83fe7SKrasimir Georgiev   item_1: 1,
4799ad83fe7SKrasimir Georgiev   item_2: 2
4809ad83fe7SKrasimir Georgiev )pb";
4819ad83fe7SKrasimir Georgiev )test",
4829ad83fe7SKrasimir Georgiev             format(R"test(
4839ad83fe7SKrasimir Georgiev std::string s = R"pb(
4849ad83fe7SKrasimir Georgiev   item_1:1, item_2:2
4859ad83fe7SKrasimir Georgiev )pb";
4869ad83fe7SKrasimir Georgiev )test",
4879ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
4889ad83fe7SKrasimir Georgiev 
4899ad83fe7SKrasimir Georgiev   expect_eq(R"test(
4909ad83fe7SKrasimir Georgiev std::string s = R"pb(
4919ad83fe7SKrasimir Georgiev   book {
4929ad83fe7SKrasimir Georgiev     title: "Alice's Adventures"
4939ad83fe7SKrasimir Georgiev     author: "Lewis Caroll"
4949ad83fe7SKrasimir Georgiev   }
4959ad83fe7SKrasimir Georgiev   book {
4969ad83fe7SKrasimir Georgiev     title: "Peter Pan"
4979ad83fe7SKrasimir Georgiev     author: "J. M. Barrie"
4989ad83fe7SKrasimir Georgiev   }
4999ad83fe7SKrasimir Georgiev )pb";
5009ad83fe7SKrasimir Georgiev )test",
5019ad83fe7SKrasimir Georgiev             format(R"test(
5029ad83fe7SKrasimir Georgiev std::string s = R"pb(
5039ad83fe7SKrasimir Georgiev     book { title: "Alice's Adventures" author: "Lewis Caroll" }
5049ad83fe7SKrasimir Georgiev     book { title: "Peter Pan" author: "J. M. Barrie" }
5059ad83fe7SKrasimir Georgiev )pb";
5069ad83fe7SKrasimir Georgiev )test",
5079ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5089ad83fe7SKrasimir Georgiev }
5099ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,BreaksBeforeRawStrings)5109ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, BreaksBeforeRawStrings) {
5119ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5129ad83fe7SKrasimir Georgiev ASSERT_TRUE(
5139ad83fe7SKrasimir Georgiev     ParseFromString(R"pb(item_1: 1)pb"),
5149ad83fe7SKrasimir Georgiev     ptr);)test",
5159ad83fe7SKrasimir Georgiev             format(R"test(
5169ad83fe7SKrasimir Georgiev ASSERT_TRUE(ParseFromString(R"pb(item_1: 1)pb"), ptr);)test",
5179ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5189ad83fe7SKrasimir Georgiev 
5199ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5209ad83fe7SKrasimir Georgiev ASSERT_TRUE(toolong::ParseFromString(
5219ad83fe7SKrasimir Georgiev                 R"pb(item_1: 1)pb"),
5229ad83fe7SKrasimir Georgiev             ptr);)test",
5239ad83fe7SKrasimir Georgiev             format(R"test(
5249ad83fe7SKrasimir Georgiev ASSERT_TRUE(toolong::ParseFromString(R"pb(item_1: 1)pb"), ptr);)test",
5259ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5269ad83fe7SKrasimir Georgiev 
5279ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5289ad83fe7SKrasimir Georgiev ASSERT_TRUE(ParseFromString(
5299ad83fe7SKrasimir Georgiev                 R"pb(item_1: 1,
5309ad83fe7SKrasimir Georgiev                      item_2: 2)pb"),
5319ad83fe7SKrasimir Georgiev             ptr);)test",
5329ad83fe7SKrasimir Georgiev             format(R"test(
5339ad83fe7SKrasimir Georgiev ASSERT_TRUE(ParseFromString(R"pb(item_1: 1, item_2: 2)pb"), ptr);)test",
5349ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5359ad83fe7SKrasimir Georgiev 
5369ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5379ad83fe7SKrasimir Georgiev ASSERT_TRUE(
5389ad83fe7SKrasimir Georgiev     ParseFromString(
5399ad83fe7SKrasimir Georgiev         R"pb(item_1: 1 item_2: 2)pb"),
5409ad83fe7SKrasimir Georgiev     ptr);)test",
5419ad83fe7SKrasimir Georgiev             format(R"test(
5429ad83fe7SKrasimir Georgiev ASSERT_TRUE(ParseFromString(R"pb(item_1: 1 item_2: 2)pb"), ptr);)test",
5439ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5449ad83fe7SKrasimir Georgiev }
5459ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,RawStringsInOperands)5469ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, RawStringsInOperands) {
5479ad83fe7SKrasimir Georgiev   // Formats the raw string first operand of a binary operator expression.
5489ad83fe7SKrasimir Georgiev   expect_eq(R"test(auto S = R"pb(item_1: 1)pb" + rest;)test",
5499ad83fe7SKrasimir Georgiev             format(R"test(auto S = R"pb(item_1:1)pb" + rest;)test",
5509ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5519ad83fe7SKrasimir Georgiev 
5529ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5539ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1, item_2: 2)pb" +
5549ad83fe7SKrasimir Georgiev          rest;)test",
5559ad83fe7SKrasimir Georgiev             format(R"test(
5569ad83fe7SKrasimir Georgiev auto S = R"pb(item_1:1,item_2:2)pb"+rest;)test",
5579ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5589ad83fe7SKrasimir Georgiev 
5599ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5609ad83fe7SKrasimir Georgiev auto S =
5619ad83fe7SKrasimir Georgiev     R"pb(item_1: 1 item_2: 2)pb" + rest;)test",
5629ad83fe7SKrasimir Georgiev             format(R"test(
5639ad83fe7SKrasimir Georgiev auto S = R"pb(item_1:1 item_2:2)pb"+rest;)test",
5649ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5659ad83fe7SKrasimir Georgiev 
566128fcffbSKrasimir Georgiev   // `rest` fits on the line after )pb", but forced on newline since the raw
567128fcffbSKrasimir Georgiev   // string literal is multiline.
5689ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5699ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1,
5709ad83fe7SKrasimir Georgiev               item_2: 2,
571128fcffbSKrasimir Georgiev               item_3: 3)pb" +
572128fcffbSKrasimir Georgiev          rest;)test",
5739ad83fe7SKrasimir Georgiev             format(R"test(
5749ad83fe7SKrasimir Georgiev auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test",
5759ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5769ad83fe7SKrasimir Georgiev 
5779ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5789ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1,
5799ad83fe7SKrasimir Georgiev               item_2: 2,
5809ad83fe7SKrasimir Georgiev               item_3: 3)pb" +
5819ad83fe7SKrasimir Georgiev          longlongrest;)test",
5829ad83fe7SKrasimir Georgiev             format(R"test(
5839ad83fe7SKrasimir Georgiev auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test",
5849ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5859ad83fe7SKrasimir Georgiev 
5869ad83fe7SKrasimir Georgiev   // Formats the raw string second operand of a binary operator expression.
5879ad83fe7SKrasimir Georgiev   expect_eq(R"test(auto S = first + R"pb(item_1: 1)pb";)test",
5889ad83fe7SKrasimir Georgiev             format(R"test(auto S = first + R"pb(item_1:1)pb";)test",
5899ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5909ad83fe7SKrasimir Georgiev 
5919ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5929ad83fe7SKrasimir Georgiev auto S = first + R"pb(item_1: 1,
5939ad83fe7SKrasimir Georgiev                       item_2: 2)pb";)test",
5949ad83fe7SKrasimir Georgiev             format(R"test(
5959ad83fe7SKrasimir Georgiev auto S = first+R"pb(item_1:1,item_2:2)pb";)test",
5969ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
5979ad83fe7SKrasimir Georgiev 
5989ad83fe7SKrasimir Georgiev   expect_eq(R"test(
5999ad83fe7SKrasimir Georgiev auto S = first + R"pb(item_1: 1
6009ad83fe7SKrasimir Georgiev                       item_2: 2)pb";)test",
6019ad83fe7SKrasimir Georgiev             format(R"test(
6029ad83fe7SKrasimir Georgiev auto S = first+R"pb(item_1:1 item_2:2)pb";)test",
6039ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6049ad83fe7SKrasimir Georgiev 
6059ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6069ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1,
6079ad83fe7SKrasimir Georgiev               item_2: 2,
608128fcffbSKrasimir Georgiev               item_3: 3)pb" +
609128fcffbSKrasimir Georgiev          rest;)test",
6109ad83fe7SKrasimir Georgiev             format(R"test(
6119ad83fe7SKrasimir Georgiev auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test",
6129ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6139ad83fe7SKrasimir Georgiev 
6149ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6159ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1,
6169ad83fe7SKrasimir Georgiev               item_2: 2,
6179ad83fe7SKrasimir Georgiev               item_3: 3)pb" +
6189ad83fe7SKrasimir Georgiev          longlongrest;)test",
6199ad83fe7SKrasimir Georgiev             format(R"test(
6209ad83fe7SKrasimir Georgiev auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test",
6219ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6229ad83fe7SKrasimir Georgiev 
6239ad83fe7SKrasimir Georgiev   // Formats the raw string operands in expressions.
6249ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6259ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1)pb" +
6269ad83fe7SKrasimir Georgiev          R"pb(item_2: 2)pb";
6279ad83fe7SKrasimir Georgiev )test",
6289ad83fe7SKrasimir Georgiev             format(R"test(
6299ad83fe7SKrasimir Georgiev auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb";
6309ad83fe7SKrasimir Georgiev )test",
6319ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6329ad83fe7SKrasimir Georgiev 
6339ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6349ad83fe7SKrasimir Georgiev auto S = R"pb(item_1: 1)pb" +
6359ad83fe7SKrasimir Georgiev          R"pb(item_2: 2)pb" +
6369ad83fe7SKrasimir Georgiev          R"pb(item_3: 3)pb";
6379ad83fe7SKrasimir Georgiev )test",
6389ad83fe7SKrasimir Georgiev             format(R"test(
6399ad83fe7SKrasimir Georgiev auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb"+R"pb(item_3:3)pb";
6409ad83fe7SKrasimir Georgiev )test",
6419ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6429ad83fe7SKrasimir Georgiev 
6439ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6449ad83fe7SKrasimir Georgiev auto S = (count < 3)
6459ad83fe7SKrasimir Georgiev              ? R"pb(item_1: 1)pb"
6469ad83fe7SKrasimir Georgiev              : R"pb(item_2: 2)pb";
6479ad83fe7SKrasimir Georgiev )test",
6489ad83fe7SKrasimir Georgiev             format(R"test(
6499ad83fe7SKrasimir Georgiev auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2)pb";
6509ad83fe7SKrasimir Georgiev )test",
6519ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6529ad83fe7SKrasimir Georgiev 
6539ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6549ad83fe7SKrasimir Georgiev auto S =
6559ad83fe7SKrasimir Georgiev     (count < 3)
6569ad83fe7SKrasimir Georgiev         ? R"pb(item_1: 1, item_2: 2)pb"
6579ad83fe7SKrasimir Georgiev         : R"pb(item_3: 3)pb";
6589ad83fe7SKrasimir Georgiev )test",
6599ad83fe7SKrasimir Georgiev             format(R"test(
6609ad83fe7SKrasimir Georgiev auto S=(count<3)?R"pb(item_1:1,item_2:2)pb":R"pb(item_3:3)pb";
6619ad83fe7SKrasimir Georgiev )test",
6629ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6639ad83fe7SKrasimir Georgiev 
6649ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6659ad83fe7SKrasimir Georgiev auto S =
6669ad83fe7SKrasimir Georgiev     (count < 3)
6679ad83fe7SKrasimir Georgiev         ? R"pb(item_1: 1)pb"
6689ad83fe7SKrasimir Georgiev         : R"pb(item_2: 2, item_3: 3)pb";
6699ad83fe7SKrasimir Georgiev )test",
6709ad83fe7SKrasimir Georgiev             format(R"test(
6719ad83fe7SKrasimir Georgiev auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2,item_3:3)pb";
6729ad83fe7SKrasimir Georgiev )test",
6739ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(40)));
6749ad83fe7SKrasimir Georgiev }
6759ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,PrefixAndSuffixAlignment)6769ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, PrefixAndSuffixAlignment) {
6779ad83fe7SKrasimir Georgiev   // Keep the suffix at the end of line if not on newline.
6789ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6799ad83fe7SKrasimir Georgiev int s() {
6809ad83fe7SKrasimir Georgiev   auto S = PTP(
6819ad83fe7SKrasimir Georgiev       R"pb(
6829ad83fe7SKrasimir Georgiev         item_1: 1,
6839ad83fe7SKrasimir Georgiev         item_2: 2)pb");
6849ad83fe7SKrasimir Georgiev })test",
6859ad83fe7SKrasimir Georgiev             format(R"test(
6869ad83fe7SKrasimir Georgiev int s() {
6879ad83fe7SKrasimir Georgiev   auto S = PTP(
6889ad83fe7SKrasimir Georgiev       R"pb(
6899ad83fe7SKrasimir Georgiev       item_1: 1,
6909ad83fe7SKrasimir Georgiev       item_2: 2)pb");
6919ad83fe7SKrasimir Georgiev })test",
6929ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(20)));
6939ad83fe7SKrasimir Georgiev 
694a71f626eSKrasimir Georgiev   // Align the suffix with the surrounding indent if the prefix is not on
6959ad83fe7SKrasimir Georgiev   // a line of its own.
6969ad83fe7SKrasimir Georgiev   expect_eq(R"test(
6979ad83fe7SKrasimir Georgiev int s() {
698a71f626eSKrasimir Georgiev   auto S = PTP(R"pb(
6999ad83fe7SKrasimir Georgiev     item_1: 1,
7009ad83fe7SKrasimir Georgiev     item_2: 2
7019ad83fe7SKrasimir Georgiev   )pb");
7029ad83fe7SKrasimir Georgiev })test",
7039ad83fe7SKrasimir Georgiev             format(R"test(
7049ad83fe7SKrasimir Georgiev int s() {
7059ad83fe7SKrasimir Georgiev   auto S = PTP(R"pb(
7069ad83fe7SKrasimir Georgiev       item_1: 1,
7079ad83fe7SKrasimir Georgiev       item_2: 2
7089ad83fe7SKrasimir Georgiev       )pb");
7099ad83fe7SKrasimir Georgiev })test",
7109ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(20)));
7119ad83fe7SKrasimir Georgiev 
7129ad83fe7SKrasimir Georgiev   // Align the prefix with the suffix if both the prefix and suffix are on a
7139ad83fe7SKrasimir Georgiev   // line of their own.
7149ad83fe7SKrasimir Georgiev   expect_eq(R"test(
7159ad83fe7SKrasimir Georgiev int s() {
7169ad83fe7SKrasimir Georgiev   auto S = PTP(
7179ad83fe7SKrasimir Georgiev       R"pb(
7189ad83fe7SKrasimir Georgiev         item_1: 1,
7199ad83fe7SKrasimir Georgiev         item_2: 2,
7209ad83fe7SKrasimir Georgiev       )pb");
7219ad83fe7SKrasimir Georgiev })test",
7229ad83fe7SKrasimir Georgiev             format(R"test(
7239ad83fe7SKrasimir Georgiev int s() {
7249ad83fe7SKrasimir Georgiev   auto S = PTP(
7259ad83fe7SKrasimir Georgiev       R"pb(
7269ad83fe7SKrasimir Georgiev       item_1: 1,
7279ad83fe7SKrasimir Georgiev       item_2: 2,
7289ad83fe7SKrasimir Georgiev       )pb");
7299ad83fe7SKrasimir Georgiev })test",
7309ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(20)));
7319ad83fe7SKrasimir Georgiev }
7329ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,EstimatesPenalty)7339ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, EstimatesPenalty) {
7349ad83fe7SKrasimir Georgiev   // The penalty for characters exceeding the column limit in the raw string
7359ad83fe7SKrasimir Georgiev   // forces 'hh' to be put on a newline.
7369ad83fe7SKrasimir Georgiev   expect_eq(R"test(
7379ad83fe7SKrasimir Georgiev ff(gggggg,
7389ad83fe7SKrasimir Georgiev    hh(R"pb(key {
7399ad83fe7SKrasimir Georgiev              i1: k1
7409ad83fe7SKrasimir Georgiev              i2: k2
7419ad83fe7SKrasimir Georgiev            })pb"));
7429ad83fe7SKrasimir Georgiev )test",
7439ad83fe7SKrasimir Georgiev             format(R"test(
7449ad83fe7SKrasimir Georgiev ff(gggggg, hh(R"pb(key {
7459ad83fe7SKrasimir Georgiev     i1: k1
7469ad83fe7SKrasimir Georgiev     i2: k2
7479ad83fe7SKrasimir Georgiev     })pb"));
7489ad83fe7SKrasimir Georgiev )test",
7499ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(20)));
7509ad83fe7SKrasimir Georgiev }
7519ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,DontFormatNonRawStrings)7529ad83fe7SKrasimir Georgiev TEST_F(FormatTestRawStrings, DontFormatNonRawStrings) {
7539ad83fe7SKrasimir Georgiev   expect_eq(R"test(a = R"pb(key:value)";)test",
7549ad83fe7SKrasimir Georgiev             format(R"test(a = R"pb(key:value)";)test",
7559ad83fe7SKrasimir Georgiev                    getRawStringPbStyleWithColumns(20)));
7569ad83fe7SKrasimir Georgiev }
7579ad83fe7SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,FormatsRawStringsWithEnclosingFunctionName)7582537e220SKrasimir Georgiev TEST_F(FormatTestRawStrings, FormatsRawStringsWithEnclosingFunctionName) {
7592537e220SKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(40);
760ece7e95fSmydeveloperday   Style.RawStringFormats[0].EnclosingFunctions.push_back("PARSE_TEXT_PROTO");
7612537e220SKrasimir Georgiev   Style.RawStringFormats[0].EnclosingFunctions.push_back("ParseTextProto");
7622537e220SKrasimir Georgiev   expect_eq(R"test(a = PARSE_TEXT_PROTO(R"(key: value)");)test",
7632537e220SKrasimir Georgiev             format(R"test(a = PARSE_TEXT_PROTO(R"(key:value)");)test", Style));
7642537e220SKrasimir Georgiev 
7652537e220SKrasimir Georgiev   expect_eq(R"test(
7662537e220SKrasimir Georgiev a = PARSE_TEXT_PROTO /**/ (
7672537e220SKrasimir Georgiev     /**/ R"(key: value)");)test",
7682537e220SKrasimir Georgiev             format(R"test(
7692537e220SKrasimir Georgiev a = PARSE_TEXT_PROTO/**/(/**/R"(key:value)");)test",
7702537e220SKrasimir Georgiev                    Style));
7712537e220SKrasimir Georgiev 
7722537e220SKrasimir Georgiev   expect_eq(R"test(
7732537e220SKrasimir Georgiev a = ParseTextProto<ProtoType>(
7742537e220SKrasimir Georgiev     R"(key: value)");)test",
7752537e220SKrasimir Georgiev             format(R"test(
7762537e220SKrasimir Georgiev a = ParseTextProto<ProtoType>(R"(key:value)");)test",
7772537e220SKrasimir Georgiev                    Style));
7782537e220SKrasimir Georgiev }
7792537e220SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,UpdatesToCanonicalDelimiters)780412ed095SKrasimir Georgiev TEST_F(FormatTestRawStrings, UpdatesToCanonicalDelimiters) {
781587859d9SKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(35);
782412ed095SKrasimir Georgiev   Style.RawStringFormats[0].CanonicalDelimiter = "proto";
783587859d9SKrasimir Georgiev   Style.RawStringFormats[0].EnclosingFunctions.push_back("PARSE_TEXT_PROTO");
784587859d9SKrasimir Georgiev 
785412ed095SKrasimir Georgiev   expect_eq(R"test(a = R"proto(key: value)proto";)test",
786412ed095SKrasimir Georgiev             format(R"test(a = R"pb(key:value)pb";)test", Style));
787412ed095SKrasimir Georgiev 
788587859d9SKrasimir Georgiev   expect_eq(R"test(PARSE_TEXT_PROTO(R"proto(key: value)proto");)test",
789587859d9SKrasimir Georgiev             format(R"test(PARSE_TEXT_PROTO(R"(key:value)");)test", Style));
790587859d9SKrasimir Georgiev 
791412ed095SKrasimir Georgiev   // Don't update to canonical delimiter if it occurs as a raw string suffix in
792412ed095SKrasimir Georgiev   // the raw string content.
793412ed095SKrasimir Georgiev   expect_eq(R"test(a = R"pb(key: ")proto")pb";)test",
794412ed095SKrasimir Georgiev             format(R"test(a = R"pb(key:")proto")pb";)test", Style));
795412ed095SKrasimir Georgiev }
796412ed095SKrasimir Georgiev 
TEST_F(FormatTestRawStrings,PenalizesPrefixExcessChars)797ce00978bSKrasimir Georgiev TEST_F(FormatTestRawStrings, PenalizesPrefixExcessChars) {
798ce00978bSKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(60);
799ce00978bSKrasimir Georgiev 
800ce00978bSKrasimir Georgiev   // The '(' in R"pb is at column 60, no break.
801ce00978bSKrasimir Georgiev   expect_eq(R"test(
802ce00978bSKrasimir Georgiev xxxxxxxaaaaax wwwwwww = _Verxrrrrrrrr(PARSE_TEXT_PROTO(R"pb(
803ce00978bSKrasimir Georgiev   Category: aaaaaaaaaaaaaaaaaaaaaaaaaa
804ce00978bSKrasimir Georgiev )pb"));
805ce00978bSKrasimir Georgiev )test",
806ce00978bSKrasimir Georgiev             format(R"test(
807ce00978bSKrasimir Georgiev xxxxxxxaaaaax wwwwwww = _Verxrrrrrrrr(PARSE_TEXT_PROTO(R"pb(
808ce00978bSKrasimir Georgiev   Category: aaaaaaaaaaaaaaaaaaaaaaaaaa
809ce00978bSKrasimir Georgiev )pb"));
810ece7e95fSmydeveloperday )test",
811ece7e95fSmydeveloperday                    Style));
812ce00978bSKrasimir Georgiev   // The '(' in R"pb is at column 61, break.
813ce00978bSKrasimir Georgiev   expect_eq(R"test(
814ce00978bSKrasimir Georgiev xxxxxxxaaaaax wwwwwww =
815ce00978bSKrasimir Georgiev     _Verxrrrrrrrrr(PARSE_TEXT_PROTO(R"pb(
816ce00978bSKrasimir Georgiev       Category: aaaaaaaaaaaaaaaaaaaaaaaaaa
817ce00978bSKrasimir Georgiev     )pb"));
818ce00978bSKrasimir Georgiev )test",
819ce00978bSKrasimir Georgiev             format(R"test(
820ce00978bSKrasimir Georgiev xxxxxxxaaaaax wwwwwww = _Verxrrrrrrrrr(PARSE_TEXT_PROTO(R"pb(
821ce00978bSKrasimir Georgiev       Category: aaaaaaaaaaaaaaaaaaaaaaaaaa
822ce00978bSKrasimir Georgiev )pb"));
823ece7e95fSmydeveloperday )test",
824ece7e95fSmydeveloperday                    Style));
825ce00978bSKrasimir Georgiev }
826ce00978bSKrasimir Georgiev 
TEST_F(FormatTestRawStrings,KeepsRBraceFolloedByMoreLBracesOnSameLine)8278b4bc76aSKrasimir Georgiev TEST_F(FormatTestRawStrings, KeepsRBraceFolloedByMoreLBracesOnSameLine) {
8288b4bc76aSKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(80);
8298b4bc76aSKrasimir Georgiev 
8308b4bc76aSKrasimir Georgiev   expect_eq(
8318b4bc76aSKrasimir Georgiev       R"test(
8328b4bc76aSKrasimir Georgiev int f() {
8338b4bc76aSKrasimir Georgiev   if (1) {
8348b4bc76aSKrasimir Georgiev     TTTTTTTTTTTTTTTTTTTTT s = PARSE_TEXT_PROTO(R"pb(
8358b4bc76aSKrasimir Georgiev       ttttttttt {
8368b4bc76aSKrasimir Georgiev         ppppppppppppp {
8378b4bc76aSKrasimir Georgiev           [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_1: "123_1" }
8388b4bc76aSKrasimir Georgiev           [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_2: "123_2" }
8398b4bc76aSKrasimir Georgiev         }
8408b4bc76aSKrasimir Georgiev       }
8418b4bc76aSKrasimir Georgiev     )pb");
8428b4bc76aSKrasimir Georgiev   }
8438b4bc76aSKrasimir Georgiev }
8448b4bc76aSKrasimir Georgiev )test",
8458b4bc76aSKrasimir Georgiev       format(
8468b4bc76aSKrasimir Georgiev           R"test(
8478b4bc76aSKrasimir Georgiev int f() {
8488b4bc76aSKrasimir Georgiev   if (1) {
8498b4bc76aSKrasimir Georgiev    TTTTTTTTTTTTTTTTTTTTT s = PARSE_TEXT_PROTO(R"pb(
8508b4bc76aSKrasimir Georgiev    ttttttttt {
8518b4bc76aSKrasimir Georgiev    ppppppppppppp {
8528b4bc76aSKrasimir Georgiev    [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_1: "123_1" }
8538b4bc76aSKrasimir Georgiev    [cccccccccc.pppppppppppppp.TTTTTTTTTTTTTTTTTTTT] { field_2: "123_2" }}}
8548b4bc76aSKrasimir Georgiev    )pb");
8558b4bc76aSKrasimir Georgiev   }
8568b4bc76aSKrasimir Georgiev }
8578b4bc76aSKrasimir Georgiev )test",
8588b4bc76aSKrasimir Georgiev           Style));
8598b4bc76aSKrasimir Georgiev }
8608b4bc76aSKrasimir Georgiev 
TEST_F(FormatTestRawStrings,DoNotFormatUnrecognizedDelimitersInRecognizedFunctions)8612d69f5d8SKrasimir Georgiev TEST_F(FormatTestRawStrings,
8622d69f5d8SKrasimir Georgiev        DoNotFormatUnrecognizedDelimitersInRecognizedFunctions) {
8632d69f5d8SKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(60);
864ece7e95fSmydeveloperday   Style.RawStringFormats[0].EnclosingFunctions.push_back("EqualsProto");
8652d69f5d8SKrasimir Georgiev   // EqualsProto is a recognized function, but the Raw delimiter is
8662d69f5d8SKrasimir Georgiev   // unrecognized. Do not touch the string in this case, since it might be
8672d69f5d8SKrasimir Georgiev   // special.
8682d69f5d8SKrasimir Georgiev   expect_eq(R"test(
8692d69f5d8SKrasimir Georgiev void f() {
8702d69f5d8SKrasimir Georgiev   aaaaaaaaa(bbbbbbbbb, EqualsProto(R"Raw(
8712d69f5d8SKrasimir Georgiev item {
8722d69f5d8SKrasimir Georgiev   key: value
8732d69f5d8SKrasimir Georgiev }
8742d69f5d8SKrasimir Georgiev )Raw"));
8752d69f5d8SKrasimir Georgiev })test",
8762d69f5d8SKrasimir Georgiev             format(R"test(
8772d69f5d8SKrasimir Georgiev void f() {
8782d69f5d8SKrasimir Georgiev   aaaaaaaaa(bbbbbbbbb, EqualsProto(R"Raw(
8792d69f5d8SKrasimir Georgiev item {
8802d69f5d8SKrasimir Georgiev   key: value
8812d69f5d8SKrasimir Georgiev }
8822d69f5d8SKrasimir Georgiev )Raw"));
8832d69f5d8SKrasimir Georgiev })test",
8842d69f5d8SKrasimir Georgiev                    Style));
8852d69f5d8SKrasimir Georgiev }
8868b4bc76aSKrasimir Georgiev 
TEST_F(FormatTestRawStrings,BreaksBeforeNextParamAfterMultilineRawStringParam)887128fcffbSKrasimir Georgiev TEST_F(FormatTestRawStrings,
888128fcffbSKrasimir Georgiev        BreaksBeforeNextParamAfterMultilineRawStringParam) {
889128fcffbSKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(60);
890128fcffbSKrasimir Georgiev   expect_eq(R"test(
891128fcffbSKrasimir Georgiev int f() {
892128fcffbSKrasimir Georgiev   int a = g(x, R"pb(
893128fcffbSKrasimir Georgiev               key: 1  #
894128fcffbSKrasimir Georgiev               key: 2
895128fcffbSKrasimir Georgiev             )pb",
896128fcffbSKrasimir Georgiev             3, 4);
897128fcffbSKrasimir Georgiev }
898128fcffbSKrasimir Georgiev )test",
899128fcffbSKrasimir Georgiev             format(R"test(
900128fcffbSKrasimir Georgiev int f() {
901128fcffbSKrasimir Georgiev   int a = g(x, R"pb(
902128fcffbSKrasimir Georgiev               key: 1 #
903128fcffbSKrasimir Georgiev               key: 2
904128fcffbSKrasimir Georgiev             )pb", 3, 4);
905128fcffbSKrasimir Georgiev }
906128fcffbSKrasimir Georgiev )test",
907128fcffbSKrasimir Georgiev                    Style));
908128fcffbSKrasimir Georgiev 
909128fcffbSKrasimir Georgiev   // Breaks after a parent of a multiline param.
910128fcffbSKrasimir Georgiev   expect_eq(R"test(
911128fcffbSKrasimir Georgiev int f() {
912128fcffbSKrasimir Georgiev   int a = g(x, h(R"pb(
913128fcffbSKrasimir Georgiev               key: 1  #
914128fcffbSKrasimir Georgiev               key: 2
915128fcffbSKrasimir Georgiev             )pb"),
916128fcffbSKrasimir Georgiev             3, 4);
917128fcffbSKrasimir Georgiev }
918128fcffbSKrasimir Georgiev )test",
919128fcffbSKrasimir Georgiev             format(R"test(
920128fcffbSKrasimir Georgiev int f() {
921128fcffbSKrasimir Georgiev   int a = g(x, h(R"pb(
922128fcffbSKrasimir Georgiev               key: 1 #
923128fcffbSKrasimir Georgiev               key: 2
924128fcffbSKrasimir Georgiev             )pb"), 3, 4);
925128fcffbSKrasimir Georgiev }
926128fcffbSKrasimir Georgiev )test",
927128fcffbSKrasimir Georgiev                    Style));
928128fcffbSKrasimir Georgiev 
929128fcffbSKrasimir Georgiev   expect_eq(R"test(
930128fcffbSKrasimir Georgiev int f() {
931128fcffbSKrasimir Georgiev   int a = g(x,
932128fcffbSKrasimir Georgiev             h(R"pb(
933128fcffbSKrasimir Georgiev                 key: 1  #
934128fcffbSKrasimir Georgiev                 key: 2
935128fcffbSKrasimir Georgiev               )pb",
936128fcffbSKrasimir Georgiev               2),
937128fcffbSKrasimir Georgiev             3, 4);
938128fcffbSKrasimir Georgiev }
939128fcffbSKrasimir Georgiev )test",
940128fcffbSKrasimir Georgiev             format(R"test(
941128fcffbSKrasimir Georgiev int f() {
942128fcffbSKrasimir Georgiev   int a = g(x, h(R"pb(
943128fcffbSKrasimir Georgiev               key: 1 #
944128fcffbSKrasimir Georgiev               key: 2
945128fcffbSKrasimir Georgiev             )pb", 2), 3, 4);
946128fcffbSKrasimir Georgiev }
947128fcffbSKrasimir Georgiev )test",
948128fcffbSKrasimir Georgiev                    Style));
949128fcffbSKrasimir Georgiev   // Breaks if formatting introduces a multiline raw string.
950128fcffbSKrasimir Georgiev   expect_eq(R"test(
951128fcffbSKrasimir Georgiev int f() {
952128fcffbSKrasimir Georgiev   int a = g(x, R"pb(key1: value111111111
953128fcffbSKrasimir Georgiev                     key2: value2222222222)pb",
954128fcffbSKrasimir Georgiev             3, 4);
955128fcffbSKrasimir Georgiev }
956128fcffbSKrasimir Georgiev )test",
957128fcffbSKrasimir Georgiev             format(R"test(
958128fcffbSKrasimir Georgiev int f() {
959128fcffbSKrasimir Georgiev   int a = g(x, R"pb(key1: value111111111 key2: value2222222222)pb", 3, 4);
960128fcffbSKrasimir Georgiev }
961128fcffbSKrasimir Georgiev )test",
962128fcffbSKrasimir Georgiev                    Style));
963128fcffbSKrasimir Georgiev   // Does not force a break after an original multiline param that is
964128fcffbSKrasimir Georgiev   // reformatterd as on single line.
965128fcffbSKrasimir Georgiev   expect_eq(R"test(
966128fcffbSKrasimir Georgiev int f() {
967128fcffbSKrasimir Georgiev   int a = g(R"pb(key: 1)pb", 2);
968128fcffbSKrasimir Georgiev })test",
969128fcffbSKrasimir Georgiev             format(R"test(
970128fcffbSKrasimir Georgiev int f() {
971128fcffbSKrasimir Georgiev   int a = g(R"pb(key:
972128fcffbSKrasimir Georgiev                  1)pb", 2);
973ece7e95fSmydeveloperday })test",
974ece7e95fSmydeveloperday                    Style));
975128fcffbSKrasimir Georgiev }
976128fcffbSKrasimir Georgiev 
TEST_F(FormatTestRawStrings,IndentsLastParamAfterNewline)977bda8482aSKrasimir Georgiev TEST_F(FormatTestRawStrings, IndentsLastParamAfterNewline) {
978bda8482aSKrasimir Georgiev   FormatStyle Style = getRawStringPbStyleWithColumns(60);
979bda8482aSKrasimir Georgiev   expect_eq(R"test(
980bda8482aSKrasimir Georgiev fffffffffffffffffffff("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
981bda8482aSKrasimir Georgiev                       R"pb(
982bda8482aSKrasimir Georgiev                         b: c
983bda8482aSKrasimir Georgiev                       )pb");)test",
984bda8482aSKrasimir Georgiev             format(R"test(
985bda8482aSKrasimir Georgiev fffffffffffffffffffff("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
986bda8482aSKrasimir Georgiev                       R"pb(
987bda8482aSKrasimir Georgiev                       b: c
988bda8482aSKrasimir Georgiev                       )pb");)test",
989bda8482aSKrasimir Georgiev                    Style));
990bda8482aSKrasimir Georgiev }
9919ad83fe7SKrasimir Georgiev } // end namespace
9929ad83fe7SKrasimir Georgiev } // end namespace format
9939ad83fe7SKrasimir Georgiev } // end namespace clang
994