You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			734 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			734 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- unittest/Format/FormatTestRawStrings.cpp - Formatting unit tests ---===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "clang/Format/Format.h"
 | |
| 
 | |
| #include "../Tooling/ReplacementTest.h"
 | |
| #include "FormatTestUtils.h"
 | |
| 
 | |
| #include "clang/Frontend/TextDiagnosticPrinter.h"
 | |
| #include "llvm/Support/Debug.h"
 | |
| #include "llvm/Support/MemoryBuffer.h"
 | |
| #include "gtest/gtest.h"
 | |
| 
 | |
| #define DEBUG_TYPE "format-test"
 | |
| 
 | |
| using clang::tooling::ReplacementTest;
 | |
| using clang::tooling::toReplacements;
 | |
| 
 | |
| namespace clang {
 | |
| namespace format {
 | |
| namespace {
 | |
| 
 | |
| class FormatTestRawStrings : public ::testing::Test {
 | |
| protected:
 | |
|   enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck };
 | |
| 
 | |
|   std::string format(llvm::StringRef Code,
 | |
|                      const FormatStyle &Style = getLLVMStyle(),
 | |
|                      StatusCheck CheckComplete = SC_ExpectComplete) {
 | |
|     DEBUG(llvm::errs() << "---\n");
 | |
|     DEBUG(llvm::errs() << Code << "\n\n");
 | |
|     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
 | |
|     FormattingAttemptStatus Status;
 | |
|     tooling::Replacements Replaces =
 | |
|         reformat(Style, Code, Ranges, "<stdin>", &Status);
 | |
|     if (CheckComplete != SC_DoNotCheck) {
 | |
|       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
 | |
|       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
 | |
|           << Code << "\n\n";
 | |
|     }
 | |
|     ReplacementCount = Replaces.size();
 | |
|     auto Result = applyAllReplacements(Code, Replaces);
 | |
|     EXPECT_TRUE(static_cast<bool>(Result));
 | |
|     DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
 | |
|     return *Result;
 | |
|   }
 | |
| 
 | |
|   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
 | |
|     Style.ColumnLimit = ColumnLimit;
 | |
|     return Style;
 | |
|   }
 | |
| 
 | |
|   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
 | |
|     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
 | |
|   }
 | |
| 
 | |
|   int ReplacementCount;
 | |
| 
 | |
|   FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) {
 | |
|     FormatStyle Style = getLLVMStyle();
 | |
|     Style.ColumnLimit = ColumnLimit;
 | |
|     Style.RawStringFormats = {{/*Delimiter=*/"pb",
 | |
|                                /*Kind=*/FormatStyle::LK_TextProto,
 | |
|                                /*BasedOnStyle=*/"google"}};
 | |
|     return Style;
 | |
|   }
 | |
| 
 | |
|   FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) {
 | |
|     FormatStyle Style = getLLVMStyle();
 | |
|     Style.RawStringFormats = {{/*Delimiter=*/"cpp",
 | |
|                                /*Kind=*/FormatStyle::LK_Cpp, BasedOnStyle}};
 | |
|     return Style;
 | |
|   }
 | |
| 
 | |
|   FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) {
 | |
|     FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
 | |
|     Style.RawStringFormats = {{/*Delimiter=*/"cpp",
 | |
|                                /*Kind=*/FormatStyle::LK_Cpp, BasedOnStyle}};
 | |
|     return Style;
 | |
|   }
 | |
| 
 | |
|   // Gcc 4.8 doesn't support raw string literals in macros, which breaks some
 | |
|   // build bots. We use this function instead.
 | |
|   void expect_eq(const std::string Expected, const std::string Actual) {
 | |
|     EXPECT_EQ(Expected, Actual);
 | |
|   }
 | |
| };
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, ReformatsAccordingToBaseStyle) {
 | |
|   // llvm style puts '*' on the right.
 | |
|   // google style puts '*' on the left.
 | |
| 
 | |
|   // Use the llvm style if the raw string style has no BasedOnStyle.
 | |
|   expect_eq(R"test(int *i = R"cpp(int *p = nullptr;)cpp")test",
 | |
|             format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
 | |
|                    getRawStringLLVMCppStyleBasedOn("")));
 | |
| 
 | |
|   // Use the google style if the raw string style has BasedOnStyle=google.
 | |
|   expect_eq(R"test(int *i = R"cpp(int* p = nullptr;)cpp")test",
 | |
|             format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
 | |
|                    getRawStringLLVMCppStyleBasedOn("google")));
 | |
| 
 | |
|   // Use the llvm style if the raw string style has no BasedOnStyle=llvm.
 | |
|   expect_eq(R"test(int* i = R"cpp(int *p = nullptr;)cpp")test",
 | |
|             format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
 | |
|                    getRawStringGoogleCppStyleBasedOn("llvm")));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, MatchesDelimitersCaseSensitively) {
 | |
|   // Don't touch the 'PB' raw string, format the 'pb' raw string.
 | |
|   expect_eq(R"test(
 | |
| s = R"PB(item:1)PB";
 | |
| t = R"pb(item: 1)pb";)test",
 | |
|             format(R"test(
 | |
| s = R"PB(item:1)PB";
 | |
| t = R"pb(item:1)pb";)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   FormatStyle MixedStyle = getLLVMStyle();
 | |
|   MixedStyle.RawStringFormats = {
 | |
|       {/*Delimiter=*/"cpp", /*Kind=*/FormatStyle::LK_Cpp,
 | |
|        /*BasedOnStyle=*/"llvm"},
 | |
|       {/*Delimiter=*/"CPP", /*Kind=*/FormatStyle::LK_Cpp,
 | |
|        /*BasedOnStyle=*/"google"}};
 | |
| 
 | |
|   // Format the 'cpp' raw string with '*' on the right.
 | |
|   // Format the 'CPP' raw string with '*' on the left.
 | |
|   // Do not format the 'Cpp' raw string.
 | |
|   // Do not format non-raw strings.
 | |
|   expect_eq(R"test(
 | |
| a = R"cpp(int *i = 0;)cpp";
 | |
| b = R"CPP(int* j = 0;)CPP";
 | |
| c = R"Cpp(int * k = 0;)Cpp";
 | |
| d = R"cpp(int * k = 0;)Cpp";)test",
 | |
|             format(R"test(
 | |
| a = R"cpp(int * i = 0;)cpp";
 | |
| b = R"CPP(int * j = 0;)CPP";
 | |
| c = R"Cpp(int * k = 0;)Cpp";
 | |
| d = R"cpp(int * k = 0;)Cpp";)test",
 | |
|                    MixedStyle));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, ReformatsShortRawStringsOnSingleLine) {
 | |
|   expect_eq(
 | |
|       R"test(P p = TP(R"pb()pb");)test",
 | |
|       format(
 | |
|           R"test(P p = TP(R"pb( )pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
|   expect_eq(
 | |
|       R"test(P p = TP(R"pb(item_1: 1)pb");)test",
 | |
|       format(
 | |
|           R"test(P p = TP(R"pb(item_1:1)pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
|   expect_eq(
 | |
|       R"test(P p = TP(R"pb(item_1: 1)pb");)test",
 | |
|       format(
 | |
|           R"test(P p = TP(R"pb(  item_1 :  1   )pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
|   expect_eq(
 | |
|       R"test(P p = TP(R"pb(item_1: 1 item_2: 2)pb");)test",
 | |
|       format(
 | |
|           R"test(P p = TP(R"pb(item_1:1 item_2:2)pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
|   expect_eq(
 | |
|       R"test(P p = TP(R"pb(item_1 <1> item_2: {2})pb");)test",
 | |
|       format(
 | |
|           R"test(P p = TP(R"pb(item_1<1> item_2:{2})pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Merge two short lines into one.
 | |
|   expect_eq(R"test(
 | |
| std::string s = R"pb(
 | |
|   item_1: 1 item_2: 2
 | |
| )pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| std::string s = R"pb(
 | |
|   item_1:1
 | |
|   item_2:2
 | |
| )pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, BreaksRawStringsExceedingColumnLimit) {
 | |
|   expect_eq(R"test(
 | |
| P p = TPPPPPPPPPPPPPPP(
 | |
|     R"pb(item_1: 1, item_2: 2)pb");)test",
 | |
|             format(R"test(
 | |
| P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2)pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| P p =
 | |
|     TPPPPPPPPPPPPPPP(
 | |
|         R"pb(item_1: 1,
 | |
|              item_2: 2,
 | |
|              item_3: 3)pb");)test",
 | |
|             format(R"test(
 | |
| P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2, item_3: 3)pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| P p = TP(R"pb(item_1 <1>
 | |
|               item_2: <2>
 | |
|               item_3 {})pb");)test",
 | |
|       format(R"test(
 | |
| P p = TP(R"pb(item_1<1> item_2:<2> item_3{ })pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(
 | |
|       R"test(
 | |
| P p = TP(R"pb(item_1: 1,
 | |
|               item_2: 2,
 | |
|               item_3: 3,
 | |
|               item_4: 4)pb");)test",
 | |
|       format(
 | |
|           R"test(
 | |
| P p = TP(R"pb(item_1: 1, item_2: 2, item_3: 3, item_4: 4)pb");)test",
 | |
|           getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| P p = TPPPPPPPPPPPPPPP(
 | |
|     R"pb(item_1 <1>,
 | |
|          item_2: {2},
 | |
|          item_3: <3>,
 | |
|          item_4: {4})pb");)test",
 | |
|             format(R"test(
 | |
| P p = TPPPPPPPPPPPPPPP(R"pb(item_1<1>, item_2: {2}, item_3: <3>, item_4:{4})pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Breaks before a short raw string exceeding the column limit.
 | |
|   expect_eq(R"test(
 | |
| FFFFFFFFFFFFFFFFFFFFFFFFFFF(
 | |
|     R"pb(key: 1)pb");
 | |
| P p = TPPPPPPPPPPPPPPPPPPPP(
 | |
|     R"pb(key: 2)pb");
 | |
| auto TPPPPPPPPPPPPPPPPPPPP =
 | |
|     R"pb(key: 3)pb";
 | |
| P p = TPPPPPPPPPPPPPPPPPPPP(
 | |
|     R"pb(i: 1, j: 2)pb");
 | |
| 
 | |
| int f(string s) {
 | |
|   FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(
 | |
|       R"pb(key: 1)pb");
 | |
|   P p = TPPPPPPPPPPPPPPPPPPPP(
 | |
|       R"pb(key: 2)pb");
 | |
|   auto TPPPPPPPPPPPPPPPPPPPP =
 | |
|       R"pb(key: 3)pb";
 | |
|   if (s.empty())
 | |
|     P p = TPPPPPPPPPPPPPPPPPPPP(
 | |
|         R"pb(i: 1, j: 2)pb");
 | |
| }
 | |
| )test",
 | |
|             format(R"test(
 | |
| FFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb");
 | |
| P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb");
 | |
| auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb";
 | |
| P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb");
 | |
| 
 | |
| int f(string s) {
 | |
|   FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb");
 | |
|   P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb");
 | |
|   auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb";
 | |
|   if (s.empty())
 | |
|     P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb");
 | |
| }
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, FormatsRawStringArguments) {
 | |
|   expect_eq(R"test(
 | |
| P p = TP(R"pb(key {1})pb", param_2);)test",
 | |
|             format(R"test(
 | |
| P p = TP(R"pb(key{1})pb",param_2);)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| PPPPPPPPPPPPP(R"pb(keykeyk)pb",
 | |
|               param_2);)test",
 | |
|             format(R"test(
 | |
| PPPPPPPPPPPPP(R"pb(keykeyk)pb", param_2);)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| P p =
 | |
|     TP(R"pb(item: {i: 1, s: 's'}
 | |
|             item: {i: 2, s: 't'})pb");)test",
 | |
|             format(R"test(
 | |
| P p = TP(R"pb(item: {i: 1, s: 's'} item: {i: 2, s: 't'})pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
|   expect_eq(R"test(
 | |
| FFFFFFFFFFFFFFFFFFF(
 | |
|     R"pb(key: "value")pb",
 | |
|     R"pb(key2: "value")pb");)test",
 | |
|             format(R"test(
 | |
| FFFFFFFFFFFFFFFFFFF(R"pb(key: "value")pb", R"pb(key2: "value")pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats the first out of two arguments.
 | |
|   expect_eq(R"test(
 | |
| FFFFFFFF(R"pb(key: 1)pb", argument2);
 | |
| struct S {
 | |
|   const s =
 | |
|       f(R"pb(key: 1)pb", argument2);
 | |
|   void f() {
 | |
|     if (gol)
 | |
|       return g(R"pb(key: 1)pb",
 | |
|                132789237);
 | |
|     return g(R"pb(key: 1)pb", "172893");
 | |
|   }
 | |
| };)test",
 | |
|             format(R"test(
 | |
| FFFFFFFF(R"pb(key:1)pb", argument2);
 | |
| struct S {
 | |
| const s = f(R"pb(key:1)pb", argument2);
 | |
| void f() {
 | |
|   if (gol)
 | |
|     return g(R"pb(key:1)pb", 132789237);
 | |
|   return g(R"pb(key:1)pb", "172893");
 | |
| }
 | |
| };)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats the second out of two arguments.
 | |
|   expect_eq(R"test(
 | |
| FFFFFFFF(argument1, R"pb(key: 2)pb");
 | |
| struct S {
 | |
|   const s =
 | |
|       f(argument1, R"pb(key: 2)pb");
 | |
|   void f() {
 | |
|     if (gol)
 | |
|       return g(12784137,
 | |
|                R"pb(key: 2)pb");
 | |
|     return g(17283122, R"pb(key: 2)pb");
 | |
|   }
 | |
| };)test",
 | |
|             format(R"test(
 | |
| FFFFFFFF(argument1, R"pb(key:2)pb");
 | |
| struct S {
 | |
| const s = f(argument1, R"pb(key:2)pb");
 | |
| void f() {
 | |
|   if (gol)
 | |
|     return g(12784137, R"pb(key:2)pb");
 | |
|   return g(17283122, R"pb(key:2)pb");
 | |
| }
 | |
| };)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats two short raw string arguments.
 | |
|   expect_eq(R"test(
 | |
| FFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test",
 | |
|             format(R"test(
 | |
| FFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
|   // TODO(krasimir): The original source code fits on one line, so the
 | |
|   // non-optimizing formatter is chosen. But after the formatting in protos is
 | |
|   // made, the code doesn't fit on one line anymore and further formatting
 | |
|   // splits it.
 | |
|   //
 | |
|   // Should we disable raw string formatting for the non-optimizing formatter?
 | |
|   expect_eq(R"test(
 | |
| FFFFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test",
 | |
|             format(R"test(
 | |
| FFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats two short raw string arguments, puts second on newline.
 | |
|   expect_eq(R"test(
 | |
| FFFFFFFF(R"pb(key: 1)pb",
 | |
|          R"pb(key: 2)pb");)test",
 | |
|             format(R"test(
 | |
| FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats both arguments.
 | |
|   expect_eq(R"test(
 | |
| FFFFFFFF(R"pb(key: 1)pb",
 | |
|          R"pb(key: 2)pb");
 | |
| struct S {
 | |
|   const s = f(R"pb(key: 1)pb",
 | |
|               R"pb(key: 2)pb");
 | |
|   void f() {
 | |
|     if (gol)
 | |
|       return g(R"pb(key: 1)pb",
 | |
|                R"pb(key: 2)pb");
 | |
|     return g(R"pb(k1)pb", R"pb(k2)pb");
 | |
|   }
 | |
| };)test",
 | |
|             format(R"test(
 | |
| FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");
 | |
| struct S {
 | |
| const s = f(R"pb(key:1)pb", R"pb(key:2)pb");
 | |
| void f() {
 | |
|   if (gol)
 | |
|     return g(R"pb(key:1)pb", R"pb(key:2)pb");
 | |
|   return g(R"pb( k1 )pb", R"pb( k2 )pb");
 | |
| }
 | |
| };)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, RawStringStartingWithNewlines) {
 | |
|   expect_eq(R"test(
 | |
| std::string s = R"pb(
 | |
|   item_1: 1
 | |
| )pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| std::string s = R"pb(
 | |
|     item_1:1
 | |
| )pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| std::string s = R"pb(
 | |
| 
 | |
|   item_1: 1
 | |
| )pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| std::string s = R"pb(
 | |
| 
 | |
|     item_1:1
 | |
| )pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| std::string s = R"pb(
 | |
|   item_1: 1
 | |
| )pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| std::string s = R"pb(
 | |
|     item_1:1
 | |
| 
 | |
| )pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| std::string s = R"pb(
 | |
|   item_1: 1,
 | |
|   item_2: 2
 | |
| )pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| std::string s = R"pb(
 | |
|   item_1:1, item_2:2
 | |
| )pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| std::string s = R"pb(
 | |
|   book {
 | |
|     title: "Alice's Adventures"
 | |
|     author: "Lewis Caroll"
 | |
|   }
 | |
|   book {
 | |
|     title: "Peter Pan"
 | |
|     author: "J. M. Barrie"
 | |
|   }
 | |
| )pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| std::string s = R"pb(
 | |
|     book { title: "Alice's Adventures" author: "Lewis Caroll" }
 | |
|     book { title: "Peter Pan" author: "J. M. Barrie" }
 | |
| )pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, BreaksBeforeRawStrings) {
 | |
|   expect_eq(R"test(
 | |
| ASSERT_TRUE(
 | |
|     ParseFromString(R"pb(item_1: 1)pb"),
 | |
|     ptr);)test",
 | |
|             format(R"test(
 | |
| ASSERT_TRUE(ParseFromString(R"pb(item_1: 1)pb"), ptr);)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| ASSERT_TRUE(toolong::ParseFromString(
 | |
|                 R"pb(item_1: 1)pb"),
 | |
|             ptr);)test",
 | |
|             format(R"test(
 | |
| ASSERT_TRUE(toolong::ParseFromString(R"pb(item_1: 1)pb"), ptr);)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| ASSERT_TRUE(ParseFromString(
 | |
|                 R"pb(item_1: 1,
 | |
|                      item_2: 2)pb"),
 | |
|             ptr);)test",
 | |
|             format(R"test(
 | |
| ASSERT_TRUE(ParseFromString(R"pb(item_1: 1, item_2: 2)pb"), ptr);)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| ASSERT_TRUE(
 | |
|     ParseFromString(
 | |
|         R"pb(item_1: 1 item_2: 2)pb"),
 | |
|     ptr);)test",
 | |
|             format(R"test(
 | |
| ASSERT_TRUE(ParseFromString(R"pb(item_1: 1 item_2: 2)pb"), ptr);)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, RawStringsInOperands) {
 | |
|   // Formats the raw string first operand of a binary operator expression.
 | |
|   expect_eq(R"test(auto S = R"pb(item_1: 1)pb" + rest;)test",
 | |
|             format(R"test(auto S = R"pb(item_1:1)pb" + rest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1, item_2: 2)pb" +
 | |
|          rest;)test",
 | |
|             format(R"test(
 | |
| auto S = R"pb(item_1:1,item_2:2)pb"+rest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S =
 | |
|     R"pb(item_1: 1 item_2: 2)pb" + rest;)test",
 | |
|             format(R"test(
 | |
| auto S = R"pb(item_1:1 item_2:2)pb"+rest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1,
 | |
|               item_2: 2,
 | |
|               item_3: 3)pb" + rest;)test",
 | |
|             format(R"test(
 | |
| auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1,
 | |
|               item_2: 2,
 | |
|               item_3: 3)pb" +
 | |
|          longlongrest;)test",
 | |
|             format(R"test(
 | |
| auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats the raw string second operand of a binary operator expression.
 | |
|   expect_eq(R"test(auto S = first + R"pb(item_1: 1)pb";)test",
 | |
|             format(R"test(auto S = first + R"pb(item_1:1)pb";)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = first + R"pb(item_1: 1,
 | |
|                       item_2: 2)pb";)test",
 | |
|             format(R"test(
 | |
| auto S = first+R"pb(item_1:1,item_2:2)pb";)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = first + R"pb(item_1: 1
 | |
|                       item_2: 2)pb";)test",
 | |
|             format(R"test(
 | |
| auto S = first+R"pb(item_1:1 item_2:2)pb";)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1,
 | |
|               item_2: 2,
 | |
|               item_3: 3)pb" + rest;)test",
 | |
|             format(R"test(
 | |
| auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1,
 | |
|               item_2: 2,
 | |
|               item_3: 3)pb" +
 | |
|          longlongrest;)test",
 | |
|             format(R"test(
 | |
| auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   // Formats the raw string operands in expressions.
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1)pb" +
 | |
|          R"pb(item_2: 2)pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = R"pb(item_1: 1)pb" +
 | |
|          R"pb(item_2: 2)pb" +
 | |
|          R"pb(item_3: 3)pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb"+R"pb(item_3:3)pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S = (count < 3)
 | |
|              ? R"pb(item_1: 1)pb"
 | |
|              : R"pb(item_2: 2)pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2)pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S =
 | |
|     (count < 3)
 | |
|         ? R"pb(item_1: 1, item_2: 2)pb"
 | |
|         : R"pb(item_3: 3)pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| auto S=(count<3)?R"pb(item_1:1,item_2:2)pb":R"pb(item_3:3)pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
|   expect_eq(R"test(
 | |
| auto S =
 | |
|     (count < 3)
 | |
|         ? R"pb(item_1: 1)pb"
 | |
|         : R"pb(item_2: 2, item_3: 3)pb";
 | |
| )test",
 | |
|             format(R"test(
 | |
| auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2,item_3:3)pb";
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(40)));
 | |
| 
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, PrefixAndSuffixAlignment) {
 | |
|   // Keep the suffix at the end of line if not on newline.
 | |
|   expect_eq(R"test(
 | |
| int s() {
 | |
|   auto S = PTP(
 | |
|       R"pb(
 | |
|         item_1: 1,
 | |
|         item_2: 2)pb");
 | |
| })test",
 | |
|             format(R"test(
 | |
| int s() {
 | |
|   auto S = PTP(
 | |
|       R"pb(
 | |
|       item_1: 1,
 | |
|       item_2: 2)pb");
 | |
| })test",
 | |
|                    getRawStringPbStyleWithColumns(20)));
 | |
| 
 | |
|   // Align the suffix with the surrounding FirstIndent if the prefix is not on
 | |
|   // a line of its own.
 | |
|   expect_eq(R"test(
 | |
| int s() {
 | |
|   auto S = PTP(
 | |
|       R"pb(
 | |
|         item_1: 1,
 | |
|         item_2: 2
 | |
|       )pb");
 | |
| })test",
 | |
|             format(R"test(
 | |
| int s() {
 | |
|   auto S = PTP(R"pb(
 | |
|       item_1: 1,
 | |
|       item_2: 2
 | |
|       )pb");
 | |
| })test",
 | |
|                    getRawStringPbStyleWithColumns(20)));
 | |
| 
 | |
|   // Align the prefix with the suffix if both the prefix and suffix are on a
 | |
|   // line of their own.
 | |
|   expect_eq(R"test(
 | |
| int s() {
 | |
|   auto S = PTP(
 | |
|       R"pb(
 | |
|         item_1: 1,
 | |
|         item_2: 2,
 | |
|       )pb");
 | |
| })test",
 | |
|             format(R"test(
 | |
| int s() {
 | |
|   auto S = PTP(
 | |
|       R"pb(
 | |
|       item_1: 1,
 | |
|       item_2: 2,
 | |
|       )pb");
 | |
| })test",
 | |
|                    getRawStringPbStyleWithColumns(20)));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, EstimatesPenalty) {
 | |
|   // The penalty for characters exceeding the column limit in the raw string
 | |
|   // forces 'hh' to be put on a newline.
 | |
|   expect_eq(R"test(
 | |
| ff(gggggg,
 | |
|    hh(R"pb(key {
 | |
|              i1: k1
 | |
|              i2: k2
 | |
|            })pb"));
 | |
| )test",
 | |
|             format(R"test(
 | |
| ff(gggggg, hh(R"pb(key {
 | |
|     i1: k1
 | |
|     i2: k2
 | |
|     })pb"));
 | |
| )test",
 | |
|                    getRawStringPbStyleWithColumns(20)));
 | |
| }
 | |
| 
 | |
| TEST_F(FormatTestRawStrings, DontFormatNonRawStrings) {
 | |
|   expect_eq(R"test(a = R"pb(key:value)";)test",
 | |
|             format(R"test(a = R"pb(key:value)";)test",
 | |
|                    getRawStringPbStyleWithColumns(20)));
 | |
| }
 | |
| 
 | |
| } // end namespace
 | |
| } // end namespace format
 | |
| } // end namespace clang
 |