blob: 6e7b7065875d9bff8532fbc6900ed275d52c7396 [file] [log] [blame]
Krasimir Georgiev9ad83fe2017-10-30 14:01:50 +00001//===- unittest/Format/FormatTestRawStrings.cpp - Formatting unit tests ---===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "clang/Format/Format.h"
11
12#include "../Tooling/ReplacementTest.h"
13#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
16#include "llvm/Support/Debug.h"
17#include "llvm/Support/MemoryBuffer.h"
18#include "gtest/gtest.h"
19
20#define DEBUG_TYPE "format-test"
21
22using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
25namespace clang {
26namespace format {
27namespace {
28
29class FormatTestRawStrings : public ::testing::Test {
30protected:
31 enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck };
32
33 std::string format(llvm::StringRef Code,
34 const FormatStyle &Style = getLLVMStyle(),
35 StatusCheck CheckComplete = SC_ExpectComplete) {
36 DEBUG(llvm::errs() << "---\n");
37 DEBUG(llvm::errs() << Code << "\n\n");
38 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
39 FormattingAttemptStatus Status;
40 tooling::Replacements Replaces =
41 reformat(Style, Code, Ranges, "<stdin>", &Status);
42 if (CheckComplete != SC_DoNotCheck) {
43 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
44 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
45 << Code << "\n\n";
46 }
47 ReplacementCount = Replaces.size();
48 auto Result = applyAllReplacements(Code, Replaces);
49 EXPECT_TRUE(static_cast<bool>(Result));
50 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
51 return *Result;
52 }
53
54 FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
55 Style.ColumnLimit = ColumnLimit;
56 return Style;
57 }
58
59 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
61 }
62
63 int ReplacementCount;
64
65 FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getLLVMStyle();
67 Style.ColumnLimit = ColumnLimit;
68 Style.RawStringFormats = {{/*Delimiter=*/"pb",
69 /*Kind=*/FormatStyle::LK_TextProto,
70 /*BasedOnStyle=*/"google"}};
71 return Style;
72 }
73
74 FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) {
75 FormatStyle Style = getLLVMStyle();
76 Style.RawStringFormats = {{/*Delimiter=*/"cpp",
77 /*Kind=*/FormatStyle::LK_Cpp, BasedOnStyle}};
78 return Style;
79 }
80
81 FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) {
82 FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
83 Style.RawStringFormats = {{/*Delimiter=*/"cpp",
84 /*Kind=*/FormatStyle::LK_Cpp, BasedOnStyle}};
85 return Style;
86 }
87
88 // Gcc 4.8 doesn't support raw string literals in macros, which breaks some
89 // build bots. We use this function instead.
90 void expect_eq(const std::string Expected, const std::string Actual) {
91 EXPECT_EQ(Expected, Actual);
92 }
93};
94
95TEST_F(FormatTestRawStrings, ReformatsAccordingToBaseStyle) {
96 // llvm style puts '*' on the right.
97 // google style puts '*' on the left.
98
99 // Use the llvm style if the raw string style has no BasedOnStyle.
100 expect_eq(R"test(int *i = R"cpp(int *p = nullptr;)cpp")test",
101 format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
102 getRawStringLLVMCppStyleBasedOn("")));
103
104 // Use the google style if the raw string style has BasedOnStyle=google.
105 expect_eq(R"test(int *i = R"cpp(int* p = nullptr;)cpp")test",
106 format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
107 getRawStringLLVMCppStyleBasedOn("google")));
108
109 // Use the llvm style if the raw string style has no BasedOnStyle=llvm.
110 expect_eq(R"test(int* i = R"cpp(int *p = nullptr;)cpp")test",
111 format(R"test(int * i = R"cpp(int * p = nullptr;)cpp")test",
112 getRawStringGoogleCppStyleBasedOn("llvm")));
113}
114
115TEST_F(FormatTestRawStrings, MatchesDelimitersCaseSensitively) {
116 // Don't touch the 'PB' raw string, format the 'pb' raw string.
117 expect_eq(R"test(
118s = R"PB(item:1)PB";
119t = R"pb(item: 1)pb";)test",
120 format(R"test(
121s = R"PB(item:1)PB";
122t = R"pb(item:1)pb";)test",
123 getRawStringPbStyleWithColumns(40)));
124
125 FormatStyle MixedStyle = getLLVMStyle();
126 MixedStyle.RawStringFormats = {
127 {/*Delimiter=*/"cpp", /*Kind=*/FormatStyle::LK_Cpp,
128 /*BasedOnStyle=*/"llvm"},
129 {/*Delimiter=*/"CPP", /*Kind=*/FormatStyle::LK_Cpp,
130 /*BasedOnStyle=*/"google"}};
131
132 // Format the 'cpp' raw string with '*' on the right.
133 // Format the 'CPP' raw string with '*' on the left.
134 // Do not format the 'Cpp' raw string.
135 // Do not format non-raw strings.
136 expect_eq(R"test(
137a = R"cpp(int *i = 0;)cpp";
138b = R"CPP(int* j = 0;)CPP";
139c = R"Cpp(int * k = 0;)Cpp";
140d = R"cpp(int * k = 0;)Cpp";)test",
141 format(R"test(
142a = R"cpp(int * i = 0;)cpp";
143b = R"CPP(int * j = 0;)CPP";
144c = R"Cpp(int * k = 0;)Cpp";
145d = R"cpp(int * k = 0;)Cpp";)test",
146 MixedStyle));
147}
148
149TEST_F(FormatTestRawStrings, ReformatsShortRawStringsOnSingleLine) {
150 expect_eq(
151 R"test(P p = TP(R"pb()pb");)test",
152 format(
153 R"test(P p = TP(R"pb( )pb");)test",
154 getRawStringPbStyleWithColumns(40)));
155 expect_eq(
156 R"test(P p = TP(R"pb(item_1: 1)pb");)test",
157 format(
158 R"test(P p = TP(R"pb(item_1:1)pb");)test",
159 getRawStringPbStyleWithColumns(40)));
160 expect_eq(
161 R"test(P p = TP(R"pb(item_1: 1)pb");)test",
162 format(
163 R"test(P p = TP(R"pb( item_1 : 1 )pb");)test",
164 getRawStringPbStyleWithColumns(40)));
165 expect_eq(
166 R"test(P p = TP(R"pb(item_1: 1 item_2: 2)pb");)test",
167 format(
168 R"test(P p = TP(R"pb(item_1:1 item_2:2)pb");)test",
169 getRawStringPbStyleWithColumns(40)));
170 expect_eq(
171 R"test(P p = TP(R"pb(item_1 <1> item_2: {2})pb");)test",
172 format(
173 R"test(P p = TP(R"pb(item_1<1> item_2:{2})pb");)test",
174 getRawStringPbStyleWithColumns(40)));
175
176 // Merge two short lines into one.
177 expect_eq(R"test(
178std::string s = R"pb(
179 item_1: 1 item_2: 2
180)pb";
181)test",
182 format(R"test(
183std::string s = R"pb(
184 item_1:1
185 item_2:2
186)pb";
187)test",
188 getRawStringPbStyleWithColumns(40)));
189}
190
191TEST_F(FormatTestRawStrings, BreaksRawStringsExceedingColumnLimit) {
192 expect_eq(R"test(
193P p = TPPPPPPPPPPPPPPP(
194 R"pb(item_1: 1, item_2: 2)pb");)test",
195 format(R"test(
196P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2)pb");)test",
197 getRawStringPbStyleWithColumns(40)));
198
199 expect_eq(R"test(
200P p =
201 TPPPPPPPPPPPPPPP(
202 R"pb(item_1: 1,
203 item_2: 2,
204 item_3: 3)pb");)test",
205 format(R"test(
206P p = TPPPPPPPPPPPPPPP(R"pb(item_1: 1, item_2: 2, item_3: 3)pb");)test",
207 getRawStringPbStyleWithColumns(40)));
208
209 expect_eq(R"test(
210P p = TP(R"pb(item_1 <1>
211 item_2: <2>
212 item_3 {})pb");)test",
213 format(R"test(
214P p = TP(R"pb(item_1<1> item_2:<2> item_3{ })pb");)test",
215 getRawStringPbStyleWithColumns(40)));
216
217 expect_eq(
218 R"test(
219P p = TP(R"pb(item_1: 1,
220 item_2: 2,
221 item_3: 3,
222 item_4: 4)pb");)test",
223 format(
224 R"test(
225P p = TP(R"pb(item_1: 1, item_2: 2, item_3: 3, item_4: 4)pb");)test",
226 getRawStringPbStyleWithColumns(40)));
227
228 expect_eq(R"test(
229P p = TPPPPPPPPPPPPPPP(
230 R"pb(item_1 <1>,
231 item_2: {2},
232 item_3: <3>,
233 item_4: {4})pb");)test",
234 format(R"test(
235P p = TPPPPPPPPPPPPPPP(R"pb(item_1<1>, item_2: {2}, item_3: <3>, item_4:{4})pb");)test",
236 getRawStringPbStyleWithColumns(40)));
237
238 // Breaks before a short raw string exceeding the column limit.
239 expect_eq(R"test(
240FFFFFFFFFFFFFFFFFFFFFFFFFFF(
241 R"pb(key: 1)pb");
242P p = TPPPPPPPPPPPPPPPPPPPP(
243 R"pb(key: 2)pb");
244auto TPPPPPPPPPPPPPPPPPPPP =
245 R"pb(key: 3)pb";
246P p = TPPPPPPPPPPPPPPPPPPPP(
247 R"pb(i: 1, j: 2)pb");
248
249int f(string s) {
250 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(
251 R"pb(key: 1)pb");
252 P p = TPPPPPPPPPPPPPPPPPPPP(
253 R"pb(key: 2)pb");
254 auto TPPPPPPPPPPPPPPPPPPPP =
255 R"pb(key: 3)pb";
256 if (s.empty())
257 P p = TPPPPPPPPPPPPPPPPPPPP(
258 R"pb(i: 1, j: 2)pb");
259}
260)test",
261 format(R"test(
262FFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb");
263P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb");
264auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb";
265P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb");
266
267int f(string s) {
268 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF(R"pb(key:1)pb");
269 P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(key:2)pb");
270 auto TPPPPPPPPPPPPPPPPPPPP = R"pb(key:3)pb";
271 if (s.empty())
272 P p = TPPPPPPPPPPPPPPPPPPPP(R"pb(i: 1, j:2)pb");
273}
274)test",
275 getRawStringPbStyleWithColumns(40)));
276}
277
278TEST_F(FormatTestRawStrings, FormatsRawStringArguments) {
279 expect_eq(R"test(
280P p = TP(R"pb(key {1})pb", param_2);)test",
281 format(R"test(
282P p = TP(R"pb(key{1})pb",param_2);)test",
283 getRawStringPbStyleWithColumns(40)));
284
285 expect_eq(R"test(
286PPPPPPPPPPPPP(R"pb(keykeyk)pb",
287 param_2);)test",
288 format(R"test(
289PPPPPPPPPPPPP(R"pb(keykeyk)pb", param_2);)test",
290 getRawStringPbStyleWithColumns(40)));
291
292 expect_eq(R"test(
293P p =
294 TP(R"pb(item: {i: 1, s: 's'}
295 item: {i: 2, s: 't'})pb");)test",
296 format(R"test(
297P p = TP(R"pb(item: {i: 1, s: 's'} item: {i: 2, s: 't'})pb");)test",
298 getRawStringPbStyleWithColumns(40)));
299 expect_eq(R"test(
300FFFFFFFFFFFFFFFFFFF(
301 R"pb(key: "value")pb",
302 R"pb(key2: "value")pb");)test",
303 format(R"test(
304FFFFFFFFFFFFFFFFFFF(R"pb(key: "value")pb", R"pb(key2: "value")pb");)test",
305 getRawStringPbStyleWithColumns(40)));
306
307 // Formats the first out of two arguments.
308 expect_eq(R"test(
309FFFFFFFF(R"pb(key: 1)pb", argument2);
310struct S {
311 const s =
312 f(R"pb(key: 1)pb", argument2);
313 void f() {
314 if (gol)
315 return g(R"pb(key: 1)pb",
316 132789237);
317 return g(R"pb(key: 1)pb", "172893");
318 }
319};)test",
320 format(R"test(
321FFFFFFFF(R"pb(key:1)pb", argument2);
322struct S {
323const s = f(R"pb(key:1)pb", argument2);
324void f() {
325 if (gol)
326 return g(R"pb(key:1)pb", 132789237);
327 return g(R"pb(key:1)pb", "172893");
328}
329};)test",
330 getRawStringPbStyleWithColumns(40)));
331
332 // Formats the second out of two arguments.
333 expect_eq(R"test(
334FFFFFFFF(argument1, R"pb(key: 2)pb");
335struct S {
336 const s =
337 f(argument1, R"pb(key: 2)pb");
338 void f() {
339 if (gol)
340 return g(12784137,
341 R"pb(key: 2)pb");
342 return g(17283122, R"pb(key: 2)pb");
343 }
344};)test",
345 format(R"test(
346FFFFFFFF(argument1, R"pb(key:2)pb");
347struct S {
348const s = f(argument1, R"pb(key:2)pb");
349void f() {
350 if (gol)
351 return g(12784137, R"pb(key:2)pb");
352 return g(17283122, R"pb(key:2)pb");
353}
354};)test",
355 getRawStringPbStyleWithColumns(40)));
356
357 // Formats two short raw string arguments.
358 expect_eq(R"test(
359FFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test",
360 format(R"test(
361FFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
362 getRawStringPbStyleWithColumns(40)));
363 // TODO(krasimir): The original source code fits on one line, so the
364 // non-optimizing formatter is chosen. But after the formatting in protos is
365 // made, the code doesn't fit on one line anymore and further formatting
366 // splits it.
367 //
368 // Should we disable raw string formatting for the non-optimizing formatter?
369 expect_eq(R"test(
370FFFFFFF(R"pb(key: 1)pb", R"pb(key: 2)pb");)test",
371 format(R"test(
372FFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
373 getRawStringPbStyleWithColumns(40)));
374
375 // Formats two short raw string arguments, puts second on newline.
376 expect_eq(R"test(
377FFFFFFFF(R"pb(key: 1)pb",
378 R"pb(key: 2)pb");)test",
379 format(R"test(
380FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");)test",
381 getRawStringPbStyleWithColumns(40)));
382
383 // Formats both arguments.
384 expect_eq(R"test(
385FFFFFFFF(R"pb(key: 1)pb",
386 R"pb(key: 2)pb");
387struct S {
388 const s = f(R"pb(key: 1)pb",
389 R"pb(key: 2)pb");
390 void f() {
391 if (gol)
392 return g(R"pb(key: 1)pb",
393 R"pb(key: 2)pb");
394 return g(R"pb(k1)pb", R"pb(k2)pb");
395 }
396};)test",
397 format(R"test(
398FFFFFFFF(R"pb(key:1)pb", R"pb(key:2)pb");
399struct S {
400const s = f(R"pb(key:1)pb", R"pb(key:2)pb");
401void f() {
402 if (gol)
403 return g(R"pb(key:1)pb", R"pb(key:2)pb");
404 return g(R"pb( k1 )pb", R"pb( k2 )pb");
405}
406};)test",
407 getRawStringPbStyleWithColumns(40)));
408}
409
410TEST_F(FormatTestRawStrings, RawStringStartingWithNewlines) {
411 expect_eq(R"test(
412std::string s = R"pb(
413 item_1: 1
414)pb";
415)test",
416 format(R"test(
417std::string s = R"pb(
418 item_1:1
419)pb";
420)test",
421 getRawStringPbStyleWithColumns(40)));
422
423 expect_eq(R"test(
424std::string s = R"pb(
425
426 item_1: 1
427)pb";
428)test",
429 format(R"test(
430std::string s = R"pb(
431
432 item_1:1
433)pb";
434)test",
435 getRawStringPbStyleWithColumns(40)));
436
437 expect_eq(R"test(
438std::string s = R"pb(
439 item_1: 1
440)pb";
441)test",
442 format(R"test(
443std::string s = R"pb(
444 item_1:1
445
446)pb";
447)test",
448 getRawStringPbStyleWithColumns(40)));
449
450 expect_eq(R"test(
451std::string s = R"pb(
452 item_1: 1,
453 item_2: 2
454)pb";
455)test",
456 format(R"test(
457std::string s = R"pb(
458 item_1:1, item_2:2
459)pb";
460)test",
461 getRawStringPbStyleWithColumns(40)));
462
463 expect_eq(R"test(
464std::string s = R"pb(
465 book {
466 title: "Alice's Adventures"
467 author: "Lewis Caroll"
468 }
469 book {
470 title: "Peter Pan"
471 author: "J. M. Barrie"
472 }
473)pb";
474)test",
475 format(R"test(
476std::string s = R"pb(
477 book { title: "Alice's Adventures" author: "Lewis Caroll" }
478 book { title: "Peter Pan" author: "J. M. Barrie" }
479)pb";
480)test",
481 getRawStringPbStyleWithColumns(40)));
482}
483
484TEST_F(FormatTestRawStrings, BreaksBeforeRawStrings) {
485 expect_eq(R"test(
486ASSERT_TRUE(
487 ParseFromString(R"pb(item_1: 1)pb"),
488 ptr);)test",
489 format(R"test(
490ASSERT_TRUE(ParseFromString(R"pb(item_1: 1)pb"), ptr);)test",
491 getRawStringPbStyleWithColumns(40)));
492
493 expect_eq(R"test(
494ASSERT_TRUE(toolong::ParseFromString(
495 R"pb(item_1: 1)pb"),
496 ptr);)test",
497 format(R"test(
498ASSERT_TRUE(toolong::ParseFromString(R"pb(item_1: 1)pb"), ptr);)test",
499 getRawStringPbStyleWithColumns(40)));
500
501 expect_eq(R"test(
502ASSERT_TRUE(ParseFromString(
503 R"pb(item_1: 1,
504 item_2: 2)pb"),
505 ptr);)test",
506 format(R"test(
507ASSERT_TRUE(ParseFromString(R"pb(item_1: 1, item_2: 2)pb"), ptr);)test",
508 getRawStringPbStyleWithColumns(40)));
509
510 expect_eq(R"test(
511ASSERT_TRUE(
512 ParseFromString(
513 R"pb(item_1: 1 item_2: 2)pb"),
514 ptr);)test",
515 format(R"test(
516ASSERT_TRUE(ParseFromString(R"pb(item_1: 1 item_2: 2)pb"), ptr);)test",
517 getRawStringPbStyleWithColumns(40)));
518
519}
520
521TEST_F(FormatTestRawStrings, RawStringsInOperands) {
522 // Formats the raw string first operand of a binary operator expression.
523 expect_eq(R"test(auto S = R"pb(item_1: 1)pb" + rest;)test",
524 format(R"test(auto S = R"pb(item_1:1)pb" + rest;)test",
525 getRawStringPbStyleWithColumns(40)));
526
527 expect_eq(R"test(
528auto S = R"pb(item_1: 1, item_2: 2)pb" +
529 rest;)test",
530 format(R"test(
531auto S = R"pb(item_1:1,item_2:2)pb"+rest;)test",
532 getRawStringPbStyleWithColumns(40)));
533
534 expect_eq(R"test(
535auto S =
536 R"pb(item_1: 1 item_2: 2)pb" + rest;)test",
537 format(R"test(
538auto S = R"pb(item_1:1 item_2:2)pb"+rest;)test",
539 getRawStringPbStyleWithColumns(40)));
540
541 expect_eq(R"test(
542auto S = R"pb(item_1: 1,
543 item_2: 2,
544 item_3: 3)pb" + rest;)test",
545 format(R"test(
546auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test",
547 getRawStringPbStyleWithColumns(40)));
548
549 expect_eq(R"test(
550auto S = R"pb(item_1: 1,
551 item_2: 2,
552 item_3: 3)pb" +
553 longlongrest;)test",
554 format(R"test(
555auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test",
556 getRawStringPbStyleWithColumns(40)));
557
558 // Formats the raw string second operand of a binary operator expression.
559 expect_eq(R"test(auto S = first + R"pb(item_1: 1)pb";)test",
560 format(R"test(auto S = first + R"pb(item_1:1)pb";)test",
561 getRawStringPbStyleWithColumns(40)));
562
563 expect_eq(R"test(
564auto S = first + R"pb(item_1: 1,
565 item_2: 2)pb";)test",
566 format(R"test(
567auto S = first+R"pb(item_1:1,item_2:2)pb";)test",
568 getRawStringPbStyleWithColumns(40)));
569
570 expect_eq(R"test(
571auto S = first + R"pb(item_1: 1
572 item_2: 2)pb";)test",
573 format(R"test(
574auto S = first+R"pb(item_1:1 item_2:2)pb";)test",
575 getRawStringPbStyleWithColumns(40)));
576
577 expect_eq(R"test(
578auto S = R"pb(item_1: 1,
579 item_2: 2,
580 item_3: 3)pb" + rest;)test",
581 format(R"test(
582auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+rest;)test",
583 getRawStringPbStyleWithColumns(40)));
584
585 expect_eq(R"test(
586auto S = R"pb(item_1: 1,
587 item_2: 2,
588 item_3: 3)pb" +
589 longlongrest;)test",
590 format(R"test(
591auto S = R"pb(item_1:1,item_2:2,item_3:3)pb"+longlongrest;)test",
592 getRawStringPbStyleWithColumns(40)));
593
594 // Formats the raw string operands in expressions.
595 expect_eq(R"test(
596auto S = R"pb(item_1: 1)pb" +
597 R"pb(item_2: 2)pb";
598)test",
599 format(R"test(
600auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb";
601)test",
602 getRawStringPbStyleWithColumns(40)));
603
604 expect_eq(R"test(
605auto S = R"pb(item_1: 1)pb" +
606 R"pb(item_2: 2)pb" +
607 R"pb(item_3: 3)pb";
608)test",
609 format(R"test(
610auto S=R"pb(item_1:1)pb"+R"pb(item_2:2)pb"+R"pb(item_3:3)pb";
611)test",
612 getRawStringPbStyleWithColumns(40)));
613
614 expect_eq(R"test(
615auto S = (count < 3)
616 ? R"pb(item_1: 1)pb"
617 : R"pb(item_2: 2)pb";
618)test",
619 format(R"test(
620auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2)pb";
621)test",
622 getRawStringPbStyleWithColumns(40)));
623
624 expect_eq(R"test(
625auto S =
626 (count < 3)
627 ? R"pb(item_1: 1, item_2: 2)pb"
628 : R"pb(item_3: 3)pb";
629)test",
630 format(R"test(
631auto S=(count<3)?R"pb(item_1:1,item_2:2)pb":R"pb(item_3:3)pb";
632)test",
633 getRawStringPbStyleWithColumns(40)));
634
635 expect_eq(R"test(
636auto S =
637 (count < 3)
638 ? R"pb(item_1: 1)pb"
639 : R"pb(item_2: 2, item_3: 3)pb";
640)test",
641 format(R"test(
642auto S=(count<3)?R"pb(item_1:1)pb":R"pb(item_2:2,item_3:3)pb";
643)test",
644 getRawStringPbStyleWithColumns(40)));
645
646}
647
648TEST_F(FormatTestRawStrings, PrefixAndSuffixAlignment) {
649 // Keep the suffix at the end of line if not on newline.
650 expect_eq(R"test(
651int s() {
652 auto S = PTP(
653 R"pb(
654 item_1: 1,
655 item_2: 2)pb");
656})test",
657 format(R"test(
658int s() {
659 auto S = PTP(
660 R"pb(
661 item_1: 1,
662 item_2: 2)pb");
663})test",
664 getRawStringPbStyleWithColumns(20)));
665
666 // Align the suffix with the surrounding FirstIndent if the prefix is not on
667 // a line of its own.
668 expect_eq(R"test(
669int s() {
670 auto S = PTP(
671 R"pb(
672 item_1: 1,
673 item_2: 2
674 )pb");
675})test",
676 format(R"test(
677int s() {
678 auto S = PTP(R"pb(
679 item_1: 1,
680 item_2: 2
681 )pb");
682})test",
683 getRawStringPbStyleWithColumns(20)));
684
685 // Align the prefix with the suffix if both the prefix and suffix are on a
686 // line of their own.
687 expect_eq(R"test(
688int s() {
689 auto S = PTP(
690 R"pb(
691 item_1: 1,
692 item_2: 2,
693 )pb");
694})test",
695 format(R"test(
696int s() {
697 auto S = PTP(
698 R"pb(
699 item_1: 1,
700 item_2: 2,
701 )pb");
702})test",
703 getRawStringPbStyleWithColumns(20)));
704}
705
706TEST_F(FormatTestRawStrings, EstimatesPenalty) {
707 // The penalty for characters exceeding the column limit in the raw string
708 // forces 'hh' to be put on a newline.
709 expect_eq(R"test(
710ff(gggggg,
711 hh(R"pb(key {
712 i1: k1
713 i2: k2
714 })pb"));
715)test",
716 format(R"test(
717ff(gggggg, hh(R"pb(key {
718 i1: k1
719 i2: k2
720 })pb"));
721)test",
722 getRawStringPbStyleWithColumns(20)));
723}
724
725TEST_F(FormatTestRawStrings, DontFormatNonRawStrings) {
726 expect_eq(R"test(a = R"pb(key:value)";)test",
727 format(R"test(a = R"pb(key:value)";)test",
728 getRawStringPbStyleWithColumns(20)));
729}
730
731} // end namespace
732} // end namespace format
733} // end namespace clang