1 //===- unittest/Format/FormatTestObjC.cpp - Formatting unit tests----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "clang/Format/Format.h"
12 #include "../Tooling/ReplacementTest.h"
13 #include "FormatTestUtils.h"
15 #include "clang/Frontend/TextDiagnosticPrinter.h"
16 #include "llvm/Support/Debug.h"
17 #include "llvm/Support/MemoryBuffer.h"
18 #include "gtest/gtest.h"
20 #define DEBUG_TYPE "format-test"
22 using clang::tooling::ReplacementTest;
28 class FormatTestObjC : public ::testing::Test {
31 Style = getLLVMStyle();
32 Style.Language = FormatStyle::LK_ObjC;
41 std::string format(llvm::StringRef Code,
42 StatusCheck CheckComplete = SC_ExpectComplete) {
43 LLVM_DEBUG(llvm::errs() << "---\n");
44 LLVM_DEBUG(llvm::errs() << Code << "\n\n");
45 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
46 FormattingAttemptStatus Status;
47 tooling::Replacements Replaces =
48 reformat(Style, Code, Ranges, "<stdin>", &Status);
49 if (CheckComplete != SC_DoNotCheck) {
50 bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
51 EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
54 auto Result = applyAllReplacements(Code, Replaces);
55 EXPECT_TRUE(static_cast<bool>(Result));
56 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
60 void verifyFormat(StringRef Code) {
61 EXPECT_EQ(Code.str(), format(Code)) << "Expected code is not stable";
62 EXPECT_EQ(Code.str(), format(test::messUp(Code)));
65 void verifyIncompleteFormat(StringRef Code) {
66 EXPECT_EQ(Code.str(), format(test::messUp(Code), SC_ExpectIncomplete));
72 TEST(FormatTestObjCStyle, DetectsObjCInHeaders) {
73 auto Style = getStyle("LLVM", "a.h", "none", "@interface\n"
75 ASSERT_TRUE((bool)Style);
76 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
78 Style = getStyle("LLVM", "a.h", "none", "@interface\n"
80 ASSERT_TRUE((bool)Style);
81 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
83 Style = getStyle("LLVM", "a.h", "none", "@interface\n"
86 ASSERT_TRUE((bool)Style);
87 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
89 Style = getStyle("LLVM", "a.h", "none", "@interface\n"
91 ASSERT_TRUE((bool)Style);
92 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
94 // No recognizable ObjC.
95 Style = getStyle("LLVM", "a.h", "none", "void f() {}");
96 ASSERT_TRUE((bool)Style);
97 EXPECT_EQ(FormatStyle::LK_Cpp, Style->Language);
99 Style = getStyle("{}", "a.h", "none", "@interface Foo\n@end\n");
100 ASSERT_TRUE((bool)Style);
101 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
103 Style = getStyle("{}", "a.h", "none",
104 "const int interface = 1;\nconst int end = 2;\n");
105 ASSERT_TRUE((bool)Style);
106 EXPECT_EQ(FormatStyle::LK_Cpp, Style->Language);
108 Style = getStyle("{}", "a.h", "none", "@protocol Foo\n@end\n");
109 ASSERT_TRUE((bool)Style);
110 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
112 Style = getStyle("{}", "a.h", "none",
113 "const int protocol = 1;\nconst int end = 2;\n");
114 ASSERT_TRUE((bool)Style);
115 EXPECT_EQ(FormatStyle::LK_Cpp, Style->Language);
118 getStyle("{}", "a.h", "none", "typedef NS_ENUM(NSInteger, Foo) {};\n");
119 ASSERT_TRUE((bool)Style);
120 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
122 Style = getStyle("{}", "a.h", "none", "enum Foo {};");
123 ASSERT_TRUE((bool)Style);
124 EXPECT_EQ(FormatStyle::LK_Cpp, Style->Language);
127 getStyle("{}", "a.h", "none", "inline void Foo() { Log(@\"Foo\"); }\n");
128 ASSERT_TRUE((bool)Style);
129 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
132 getStyle("{}", "a.h", "none", "inline void Foo() { Log(\"Foo\"); }\n");
133 ASSERT_TRUE((bool)Style);
134 EXPECT_EQ(FormatStyle::LK_Cpp, Style->Language);
137 getStyle("{}", "a.h", "none", "inline void Foo() { id = @[1, 2, 3]; }\n");
138 ASSERT_TRUE((bool)Style);
139 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
141 Style = getStyle("{}", "a.h", "none",
142 "inline void Foo() { id foo = @{1: 2, 3: 4, 5: 6}; }\n");
143 ASSERT_TRUE((bool)Style);
144 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
146 Style = getStyle("{}", "a.h", "none",
147 "inline void Foo() { int foo[] = {1, 2, 3}; }\n");
148 ASSERT_TRUE((bool)Style);
149 EXPECT_EQ(FormatStyle::LK_Cpp, Style->Language);
151 // ObjC characteristic types.
152 Style = getStyle("{}", "a.h", "none", "extern NSString *kFoo;\n");
153 ASSERT_TRUE((bool)Style);
154 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
156 Style = getStyle("{}", "a.h", "none", "extern NSInteger Foo();\n");
157 ASSERT_TRUE((bool)Style);
158 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
160 Style = getStyle("{}", "a.h", "none", "NSObject *Foo();\n");
161 ASSERT_TRUE((bool)Style);
162 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
164 Style = getStyle("{}", "a.h", "none", "NSSet *Foo();\n");
165 ASSERT_TRUE((bool)Style);
166 EXPECT_EQ(FormatStyle::LK_ObjC, Style->Language);
169 TEST_F(FormatTestObjC, FormatObjCTryCatch) {
170 verifyFormat("@try {\n"
172 "} @catch (NSException e) {\n"
177 verifyFormat("DEBUG({\n"
184 TEST_F(FormatTestObjC, FormatObjCAutoreleasepool) {
185 verifyFormat("@autoreleasepool {\n"
188 "@autoreleasepool {\n"
191 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
192 Style.BraceWrapping.AfterControlStatement = true;
193 verifyFormat("@autoreleasepool\n"
203 TEST_F(FormatTestObjC, FormatObjCGenerics) {
204 Style.ColumnLimit = 40;
205 verifyFormat("int aaaaaaaaaaaaaaaa(\n"
206 " NSArray<aaaaaaaaaaaaaaaaaa *>\n"
207 " aaaaaaaaaaaaaaaaa);\n");
208 verifyFormat("int aaaaaaaaaaaaaaaa(\n"
209 " NSArray<aaaaaaaaaaaaaaaaaaa<\n"
210 " aaaaaaaaaaaaaaaa *> *>\n"
211 " aaaaaaaaaaaaaaaaa);\n");
214 TEST_F(FormatTestObjC, FormatObjCSynchronized) {
215 verifyFormat("@synchronized(self) {\n"
218 "@synchronized(self) {\n"
221 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
222 Style.BraceWrapping.AfterControlStatement = true;
223 verifyFormat("@synchronized(self)\n"
227 "@synchronized(self)\n"
233 TEST_F(FormatTestObjC, FormatObjCInterface) {
234 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
247 verifyFormat("@interface /* wait for it */ Foo\n"
249 "// Look, a comment!\n"
250 "- (int)answerWith:(int)i;\n"
253 verifyFormat("@interface Foo\n"
258 verifyFormat("@interface Foo : Bar\n"
259 "@property(assign, readwrite) NSInteger bar;\n"
263 verifyFormat("FOUNDATION_EXPORT NS_AVAILABLE_IOS(10.0) @interface Foo : Bar\n"
264 "@property(assign, readwrite) NSInteger bar;\n"
268 verifyFormat("@interface Foo : /**/ Bar /**/ <Baz, /**/ Quux>\n"
272 verifyFormat("@interface Foo (HackStuff)\n"
276 verifyFormat("@interface Foo ()\n"
280 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
284 verifyFormat("@interface Foo {\n"
290 verifyFormat("@interface Foo : Bar {\n"
296 verifyFormat("@interface Foo : Bar <Baz, Quux> {\n"
302 verifyFormat("@interface Foo<Baz : Blech> : Bar <Baz, Quux> {\n"
308 verifyFormat("@interface Foo<Bar : Baz <Blech>> : Xyzzy <Corge> {\n"
314 verifyFormat("@interface Foo (HackStuff) {\n"
320 verifyFormat("@interface Foo () {\n"
326 verifyFormat("@interface Foo (HackStuff) <MyProtocol> {\n"
331 verifyFormat("@interface Foo\n"
335 "@implementation Bar\n"
339 Style.ColumnLimit = 40;
340 verifyFormat("@interface ccccccccccccc () <\n"
341 " ccccccccccccc, ccccccccccccc,\n"
342 " ccccccccccccc, ccccccccccccc> {\n"
344 verifyFormat("@interface ccccccccccccc (ccccccccccc) <\n"
345 " ccccccccccccc> {\n"
347 Style.ObjCBinPackProtocolList = FormatStyle::BPS_Never;
348 verifyFormat("@interface ddddddddddddd () <\n"
352 " ddddddddddddd> {\n"
355 Style.BinPackParameters = false;
356 Style.ObjCBinPackProtocolList = FormatStyle::BPS_Auto;
357 verifyFormat("@interface eeeeeeeeeeeee () <\n"
361 " eeeeeeeeeeeee> {\n"
363 Style.ObjCBinPackProtocolList = FormatStyle::BPS_Always;
364 verifyFormat("@interface fffffffffffff () <\n"
365 " fffffffffffff, fffffffffffff,\n"
366 " fffffffffffff, fffffffffffff> {\n"
369 Style = getGoogleStyle(FormatStyle::LK_ObjC);
370 verifyFormat("@interface Foo : NSObject <NSSomeDelegate> {\n"
382 verifyFormat("@interface Foo : Bar <Baz, Quux>\n"
385 verifyFormat("@interface Foo (HackStuff) <MyProtocol>\n"
388 Style.ColumnLimit = 40;
389 // BinPackParameters should be true by default.
390 verifyFormat("void eeeeeeee(int eeeee, int eeeee,\n"
391 " int eeeee, int eeeee);\n");
392 // ObjCBinPackProtocolList should be BPS_Never by default.
393 verifyFormat("@interface fffffffffffff () <\n"
397 " fffffffffffff> {\n"
401 TEST_F(FormatTestObjC, FormatObjCImplementation) {
402 verifyFormat("@implementation Foo : NSObject {\n"
415 verifyFormat("@implementation Foo\n"
420 "// Look, a comment!\n"
421 "- (int)answerWith:(int)i {\n"
424 "+ (int)answerWith:(int)i {\n"
429 verifyFormat("@implementation Foo\n"
431 "@implementation Bar\n"
434 EXPECT_EQ("@implementation Foo : Bar\n"
438 format("@implementation Foo : Bar\n"
443 verifyFormat("@implementation Foo {\n"
449 verifyFormat("@implementation Foo : Bar {\n"
455 verifyFormat("@implementation Foo (HackStuff)\n"
458 verifyFormat("@implementation ObjcClass\n"
463 Style = getGoogleStyle(FormatStyle::LK_ObjC);
464 verifyFormat("@implementation Foo : NSObject {\n"
478 TEST_F(FormatTestObjC, FormatObjCProtocol) {
479 verifyFormat("@protocol Foo\n"
480 "@property(weak) id delegate;\n"
481 "- (NSUInteger)numberOfThings;\n"
484 verifyFormat("@protocol MyProtocol <NSObject>\n"
485 "- (NSUInteger)numberOfThings;\n"
488 verifyFormat("@protocol Foo;\n"
491 verifyFormat("@protocol Foo\n"
496 verifyFormat("FOUNDATION_EXPORT NS_AVAILABLE_IOS(10.0) @protocol Foo\n"
497 "@property(assign, readwrite) NSInteger bar;\n"
500 verifyFormat("@protocol myProtocol\n"
501 "- (void)mandatoryWithInt:(int)i;\n"
503 "- (void)optional;\n"
505 "- (void)required;\n"
507 "@property(assign) int madProp;\n"
510 verifyFormat("@property(nonatomic, assign, readonly)\n"
511 " int *looooooooooooooooooooooooooooongNumber;\n"
512 "@property(nonatomic, assign, readonly)\n"
513 " NSString *looooooooooooooooooooooooooooongName;");
515 verifyFormat("@implementation PR18406\n"
519 Style = getGoogleStyle(FormatStyle::LK_ObjC);
520 verifyFormat("@protocol MyProtocol <NSObject>\n"
521 "- (NSUInteger)numberOfThings;\n"
525 TEST_F(FormatTestObjC, FormatObjCMethodDeclarations) {
526 verifyFormat("- (void)doSomethingWith:(GTMFoo *)theFoo\n"
527 " rect:(NSRect)theRect\n"
528 " interval:(float)theInterval {\n"
530 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
531 " longKeyword:(NSRect)theRect\n"
532 " longerKeyword:(float)theInterval\n"
533 " error:(NSError **)theError {\n"
535 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
536 " longKeyword:(NSRect)theRect\n"
537 " evenLongerKeyword:(float)theInterval\n"
538 " error:(NSError **)theError {\n"
540 verifyFormat("+ (instancetype)new;\n");
541 Style.ColumnLimit = 60;
542 verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n"
543 " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n"
544 " NS_DESIGNATED_INITIALIZER;");
545 verifyFormat("- (void)drawRectOn:(id)surface\n"
546 " ofSize:(size_t)height\n"
548 Style.ColumnLimit = 40;
549 // Make sure selectors with 0, 1, or more arguments are indented when wrapped.
550 verifyFormat("- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n");
552 verifyFormat("- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a;\n");
554 verifyFormat("- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
555 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a\n"
556 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a;\n");
557 verifyFormat("- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
558 " aaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a\n"
559 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a;\n");
560 verifyFormat("- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
561 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a\n"
562 " aaaaaaaaaaaaaaaaaaaaaaaaaaa:(int)a;\n");
564 // Continuation indent width should win over aligning colons if the function
566 Style = getGoogleStyle(FormatStyle::LK_ObjC);
567 Style.ColumnLimit = 40;
568 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
569 " dontAlignNamef:(NSRect)theRect {\n"
572 // Make sure we don't break aligning for short parameter names.
573 verifyFormat("- (void)shortf:(GTMFoo *)theFoo\n"
574 " aShortf:(NSRect)theRect {\n"
577 // Format pairs correctly.
578 Style.ColumnLimit = 80;
579 verifyFormat("- (void)drawRectOn:(id)surface\n"
580 " ofSize:(aaaaaaaa)height\n"
582 " atOrigin:(size_t)x\n"
586 verifyFormat("- (void)drawRectOn:(id)surface ofSize:(aaa)height:(bbb)width;");
589 TEST_F(FormatTestObjC, FormatObjCMethodExpr) {
590 verifyFormat("[foo bar:baz];");
591 verifyFormat("return [foo bar:baz];");
592 verifyFormat("return (a)[foo bar:baz];");
593 verifyFormat("f([foo bar:baz]);");
594 verifyFormat("f(2, [foo bar:baz]);");
595 verifyFormat("f(2, a ? b : c);");
596 verifyFormat("[[self initWithInt:4] bar:[baz quux:arrrr]];");
599 verifyFormat("int a = +[foo bar:baz];");
600 verifyFormat("int a = -[foo bar:baz];");
601 verifyFormat("int a = ![foo bar:baz];");
602 verifyFormat("int a = ~[foo bar:baz];");
603 verifyFormat("int a = ++[foo bar:baz];");
604 verifyFormat("int a = --[foo bar:baz];");
605 verifyFormat("int a = sizeof [foo bar:baz];");
606 verifyFormat("int a = alignof [foo bar:baz];");
607 verifyFormat("int a = &[foo bar:baz];");
608 verifyFormat("int a = *[foo bar:baz];");
609 // FIXME: Make casts work, without breaking f()[4].
610 // verifyFormat("int a = (int)[foo bar:baz];");
611 // verifyFormat("return (int)[foo bar:baz];");
612 // verifyFormat("(void)[foo bar:baz];");
613 verifyFormat("return (MyType *)[self.tableView cellForRowAtIndexPath:cell];");
616 verifyFormat("[foo bar:baz], [foo bar:baz];");
617 verifyFormat("[foo bar:baz] = [foo bar:baz];");
618 verifyFormat("[foo bar:baz] *= [foo bar:baz];");
619 verifyFormat("[foo bar:baz] /= [foo bar:baz];");
620 verifyFormat("[foo bar:baz] %= [foo bar:baz];");
621 verifyFormat("[foo bar:baz] += [foo bar:baz];");
622 verifyFormat("[foo bar:baz] -= [foo bar:baz];");
623 verifyFormat("[foo bar:baz] <<= [foo bar:baz];");
624 verifyFormat("[foo bar:baz] >>= [foo bar:baz];");
625 verifyFormat("[foo bar:baz] &= [foo bar:baz];");
626 verifyFormat("[foo bar:baz] ^= [foo bar:baz];");
627 verifyFormat("[foo bar:baz] |= [foo bar:baz];");
628 verifyFormat("[foo bar:baz] ? [foo bar:baz] : [foo bar:baz];");
629 verifyFormat("[foo bar:baz] || [foo bar:baz];");
630 verifyFormat("[foo bar:baz] && [foo bar:baz];");
631 verifyFormat("[foo bar:baz] | [foo bar:baz];");
632 verifyFormat("[foo bar:baz] ^ [foo bar:baz];");
633 verifyFormat("[foo bar:baz] & [foo bar:baz];");
634 verifyFormat("[foo bar:baz] == [foo bar:baz];");
635 verifyFormat("[foo bar:baz] != [foo bar:baz];");
636 verifyFormat("[foo bar:baz] >= [foo bar:baz];");
637 verifyFormat("[foo bar:baz] <= [foo bar:baz];");
638 verifyFormat("[foo bar:baz] > [foo bar:baz];");
639 verifyFormat("[foo bar:baz] < [foo bar:baz];");
640 verifyFormat("[foo bar:baz] >> [foo bar:baz];");
641 verifyFormat("[foo bar:baz] << [foo bar:baz];");
642 verifyFormat("[foo bar:baz] - [foo bar:baz];");
643 verifyFormat("[foo bar:baz] + [foo bar:baz];");
644 verifyFormat("[foo bar:baz] * [foo bar:baz];");
645 verifyFormat("[foo bar:baz] / [foo bar:baz];");
646 verifyFormat("[foo bar:baz] % [foo bar:baz];");
649 verifyFormat("return in[42];");
650 verifyFormat("for (auto v : in[1]) {\n}");
651 verifyFormat("for (int i = 0; i < in[a]; ++i) {\n}");
652 verifyFormat("for (int i = 0; in[a] < i; ++i) {\n}");
653 verifyFormat("for (int i = 0; i < n; ++i, ++in[a]) {\n}");
654 verifyFormat("for (int i = 0; i < n; ++i, in[a]++) {\n}");
655 verifyFormat("for (int i = 0; i < f(in[a]); ++i, in[a]++) {\n}");
656 verifyFormat("for (id foo in [self getStuffFor:bla]) {\n"
658 verifyFormat("[self aaaaa:MACRO(a, b:, c:)];");
659 verifyFormat("[self aaaaa:MACRO(a, b:c:, d:e:)];");
660 verifyFormat("[self aaaaa:MACRO(a, b:c:d:, e:f:g:)];");
661 verifyFormat("int XYMyFoo(int a, int b) NS_SWIFT_NAME(foo(self:scale:));");
662 verifyFormat("[self aaaaa:(1 + 2) bbbbb:3];");
663 verifyFormat("[self aaaaa:(Type)a bbbbb:3];");
665 verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];");
666 verifyFormat("[self stuffWithInt:a ? b : c float:4.5];");
667 verifyFormat("[self stuffWithInt:a ? [self foo:bar] : c];");
668 verifyFormat("[self stuffWithInt:a ? (e ? f : g) : c];");
669 verifyFormat("[cond ? obj1 : obj2 methodWithParam:param]");
670 verifyFormat("[button setAction:@selector(zoomOut:)];");
671 verifyFormat("[color getRed:&r green:&g blue:&b alpha:&a];");
673 verifyFormat("arr[[self indexForFoo:a]];");
674 verifyFormat("throw [self errorFor:a];");
675 verifyFormat("@throw [self errorFor:a];");
677 verifyFormat("[(id)foo bar:(id)baz quux:(id)snorf];");
678 verifyFormat("[(id)foo bar:(id) ? baz : quux];");
679 verifyFormat("4 > 4 ? (id)a : (id)baz;");
681 unsigned PreviousColumnLimit = Style.ColumnLimit;
682 Style.ColumnLimit = 50;
685 // ([object a:42] == 0 || [object a:42
687 verifyFormat("bool a = ([object a:42] == 0 ||\n"
688 " [object a:42 b:42] == 0);");
689 Style.ColumnLimit = PreviousColumnLimit;
690 verifyFormat("bool a = ([aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaa ||\n"
691 " [aaaaaaaa aaaaa] == aaaaaaaaaaaaaaaaaaaa);");
693 // This tests that the formatter doesn't break after "backing" but before ":",
694 // which would be at 80 columns.
697 " if ((self = [super initWithContentRect:contentRect\n"
698 " styleMask:styleMask ?: otherMask\n"
699 " backing:NSBackingStoreBuffered\n"
703 "[foo checkThatBreakingAfterColonWorksOk:\n"
704 " [bar ifItDoes:reduceOverallLineLengthLikeInThisCase]];");
706 verifyFormat("[myObj short:arg1 // Force line break\n"
707 " longKeyword:arg2 != nil ? arg2 : @\"longKeyword\"\n"
708 " evenLongerKeyword:arg3 ?: @\"evenLongerKeyword\"\n"
712 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
713 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
714 " pos.width(), pos.height())\n"
715 " styleMask:NSBorderlessWindowMask\n"
716 " backing:NSBackingStoreBuffered\n"
719 verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n"
720 " with:contentsNativeView];");
723 "[pboard addTypes:[NSArray arrayWithObject:kBookmarkButtonDragType]\n"
724 " owner:nillllll];");
727 "[pboard setData:[NSData dataWithBytes:&button length:sizeof(button)]\n"
728 " forType:kBookmarkButtonDragType];");
730 verifyFormat("[defaultCenter addObserver:self\n"
731 " selector:@selector(willEnterFullscreen)\n"
732 " name:kWillEnterFullscreenNotification\n"
734 verifyFormat("[image_rep drawInRect:drawRect\n"
735 " fromRect:NSZeroRect\n"
736 " operation:NSCompositeCopy\n"
738 " respectFlipped:NO\n"
740 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
742 verifyFormat("[aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
744 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa[aaaaaaaaaaaaaaaaaaaaa]\n"
745 " aaaaaaaaaaaaaaaaaaaaaa];");
748 "scoped_nsobject<NSTextField> message(\n"
749 " // The frame will be fixed up when |-setMessageText:| is called.\n"
750 " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);");
751 verifyFormat("[self aaaaaa:bbbbbbbbbbbbb\n"
752 " aaaaaaaaaa:bbbbbbbbbbbbbbbbb\n"
753 " aaaaa:bbbbbbbbbbb + bbbbbbbbbbbb\n"
755 verifyFormat("[self param:function( //\n"
758 "[self aaaaaaaaaa:aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
759 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa |\n"
760 " aaaaaaaaaaaaaaa | aaaaaaaaaaaaaaa];");
762 // Variadic parameters.
764 "NSArray *myStrings = [NSArray stringarray:@\"a\", @\"b\", nil];");
766 "[self aaaaaaaaaaaaa:aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
767 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa,\n"
768 " aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaa];");
770 verifyFormat("[self // break\n"
774 // Formats pair-parameters.
775 verifyFormat("[I drawRectOn:surface ofSize:aa:bbb atOrigin:cc:dd];");
776 verifyFormat("[I drawRectOn:surface //\n"
778 " atOrigin:cc:dd];");
780 // Inline block as a first argument.
781 verifyFormat("[object justBlock:^{\n"
784 verifyFormat("[object\n"
790 verifyFormat("[object\n"
794 " blockWithLongerName:^{\n"
797 verifyFormat("[object\n"
798 " blockWithLongerName:^{\n"
804 verifyFormat("[object\n"
813 // Space between cast rparen and selector name component.
814 verifyFormat("[((Foo *)foo) bar];");
815 verifyFormat("[((Foo *)foo) bar:1 blech:2];");
817 Style.ColumnLimit = 20;
818 verifyFormat("aaaaa = [a aa:aa\n"
820 verifyFormat("aaaaaa = [aa aa:aa\n"
823 // Message receiver taking multiple lines.
825 verifyFormat("[[object block:^{\n"
828 // Arguments just fit into one line.
829 verifyFormat("[[object block:^{\n"
831 "}] aaaaaaa:42 b:42];");
832 // Arguments just over a column limit.
833 verifyFormat("[[object block:^{\n"
837 // Arguments just fit into one line.
838 Style.ColumnLimit = 23;
839 verifyFormat("[[obj a:42\n"
842 " d:42] e:42 f:42];");
844 // Arguments do not fit into one line with a receiver.
845 Style.ColumnLimit = 20;
846 verifyFormat("[[obj a:42] a:42\n"
848 verifyFormat("[[obj a:42] a:42\n"
851 verifyFormat("[[obj aaaaaa:42\n"
856 // Avoid breaking receiver expression.
857 Style.ColumnLimit = 30;
858 verifyFormat("fooooooo =\n"
859 " [[obj fooo] aaa:42\n"
861 verifyFormat("[[[obj foo] bar] aa:42\n"
865 Style.ColumnLimit = 70;
868 " popup_wdow_.reset([[RenderWidgetPopupWindow alloc]\n"
869 " iniithContentRect:NSMakRet(origin_global.x, origin_global.y,\n"
870 " pos.width(), pos.height())\n"
871 " syeMask:NSBorderlessWindowMask\n"
872 " bking:NSBackingStoreBuffered\n"
876 Style.ColumnLimit = 60;
877 verifyFormat("[call aaaaaaaa.aaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa.aaaaaaaa\n"
878 " .aaaaaaaa];"); // FIXME: Indentation seems off.
879 // FIXME: This violates the column limit.
881 "[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
882 " aaaaaaaaaaaaaaaaa:aaaaaaaa\n"
883 " aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
885 Style = getChromiumStyle(FormatStyle::LK_ObjC);
886 Style.ColumnLimit = 80;
889 " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n"
890 " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n"
891 " pos.width(), pos.height())\n"
892 " styleMask:NSBorderlessWindowMask\n"
893 " backing:NSBackingStoreBuffered\n"
897 // Respect continuation indent and colon alignment (e.g. when object name is
898 // short, and first selector is the longest one)
899 Style = getLLVMStyle();
900 Style.Language = FormatStyle::LK_ObjC;
901 Style.ContinuationIndentWidth = 8;
902 verifyFormat("[self performSelectorOnMainThread:@selector(loadAccessories)\n"
904 " waitUntilDone:false];");
905 verifyFormat("[self performSelector:@selector(loadAccessories)\n"
906 " withObjectOnMainThread:nil\n"
907 " waitUntilDone:false];");
908 verifyFormat("[aaaaaaaaaaaaaaaaaaaaaaaaa\n"
909 " performSelectorOnMainThread:@selector(loadAccessories)\n"
911 " waitUntilDone:false];");
912 verifyFormat("[self // force wrapping\n"
913 " performSelectorOnMainThread:@selector(loadAccessories)\n"
915 " waitUntilDone:false];");
918 TEST_F(FormatTestObjC, ObjCAt) {
919 verifyFormat("@autoreleasepool");
920 verifyFormat("@catch");
921 verifyFormat("@class");
922 verifyFormat("@compatibility_alias");
923 verifyFormat("@defs");
924 verifyFormat("@dynamic");
925 verifyFormat("@encode");
926 verifyFormat("@end");
927 verifyFormat("@finally");
928 verifyFormat("@implementation");
929 verifyFormat("@import");
930 verifyFormat("@interface");
931 verifyFormat("@optional");
932 verifyFormat("@package");
933 verifyFormat("@private");
934 verifyFormat("@property");
935 verifyFormat("@protected");
936 verifyFormat("@protocol");
937 verifyFormat("@public");
938 verifyFormat("@required");
939 verifyFormat("@selector");
940 verifyFormat("@synchronized");
941 verifyFormat("@synthesize");
942 verifyFormat("@throw");
943 verifyFormat("@try");
945 EXPECT_EQ("@interface", format("@ interface"));
947 // The precise formatting of this doesn't matter, nobody writes code like
949 verifyFormat("@ /*foo*/ interface");
952 TEST_F(FormatTestObjC, ObjCBlockTypesAndVariables) {
953 verifyFormat("void DoStuffWithBlockType(int (^)(char));");
954 verifyFormat("int (^foo)(char, float);");
955 verifyFormat("int (^foo[10])(char, float);");
956 verifyFormat("int (^foo[kNumEntries])(char, float);");
957 verifyFormat("int (^foo[kNumEntries + 10])(char, float);");
958 verifyFormat("int (^foo[(kNumEntries + 10)])(char, float);");
961 TEST_F(FormatTestObjC, ObjCSnippets) {
962 verifyFormat("@autoreleasepool {\n"
965 verifyFormat("@class Foo, Bar;");
966 verifyFormat("@compatibility_alias AliasName ExistingClass;");
967 verifyFormat("@dynamic textColor;");
968 verifyFormat("char *buf1 = @encode(int *);");
969 verifyFormat("char *buf1 = @encode(typeof(4 * 5));");
970 verifyFormat("char *buf1 = @encode(int **);");
971 verifyFormat("Protocol *proto = @protocol(p1);");
972 verifyFormat("SEL s = @selector(foo:);");
973 verifyFormat("@synchronized(self) {\n"
977 verifyFormat("@import foo.bar;\n"
980 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
982 verifyFormat("@property(assign, nonatomic) CGFloat hoverAlpha;");
983 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
985 Style.ColumnLimit = 50;
986 verifyFormat("@interface Foo\n"
987 "- (void)doStuffWithFoo:(id)name\n"
990 " NS_SWIFT_NAME(doStuff(withFoo:bar:baz:));\n"
993 Style = getMozillaStyle();
994 verifyFormat("@property (assign, getter=isEditable) BOOL editable;");
995 verifyFormat("@property BOOL editable;");
997 Style = getWebKitStyle();
998 verifyFormat("@property (assign, getter=isEditable) BOOL editable;");
999 verifyFormat("@property BOOL editable;");
1001 Style = getGoogleStyle(FormatStyle::LK_ObjC);
1002 verifyFormat("@synthesize dropArrowPosition = dropArrowPosition_;");
1003 verifyFormat("@property(assign, getter=isEditable) BOOL editable;");
1006 TEST_F(FormatTestObjC, ObjCForIn) {
1007 verifyFormat("- (void)test {\n"
1008 " for (NSString *n in arrayOfStrings) {\n"
1012 verifyFormat("- (void)test {\n"
1013 " for (NSString *n in (__bridge NSArray *)arrayOfStrings) {\n"
1017 verifyFormat("for (Foo *x in bar) {\n}");
1018 verifyFormat("for (Foo *x in [bar baz]) {\n}");
1019 verifyFormat("for (Foo *x in [bar baz:blech]) {\n}");
1020 verifyFormat("for (Foo *x in [bar baz:blech, 1, 2, 3, 0]) {\n}");
1021 verifyFormat("for (Foo *x in [bar baz:^{\n"
1026 TEST_F(FormatTestObjC, ObjCCxxKeywords) {
1027 verifyFormat("+ (instancetype)new {\n"
1030 verifyFormat("+ (instancetype)myNew {\n"
1031 " return [self new];\n"
1033 verifyFormat("SEL NewSelector(void) { return @selector(new); }\n");
1034 verifyFormat("SEL MacroSelector(void) { return MACRO(new); }\n");
1035 verifyFormat("+ (instancetype)delete {\n"
1038 verifyFormat("+ (instancetype)myDelete {\n"
1039 " return [self delete];\n"
1041 verifyFormat("SEL DeleteSelector(void) { return @selector(delete); }\n");
1042 verifyFormat("SEL MacroSelector(void) { return MACRO(delete); }\n");
1043 verifyFormat("MACRO(new:)\n");
1044 verifyFormat("MACRO(delete:)\n");
1045 verifyFormat("foo = @{MACRO(new:) : MACRO(delete:)}\n");
1046 verifyFormat("@implementation Foo\n"
1048 "- (Class)class {\n"
1053 verifyFormat("@implementation Foo\n"
1054 "- (Class)class {\n"
1059 verifyFormat("@implementation Foo\n"
1060 "+ (Class)class {\n"
1065 verifyFormat("@implementation Foo\n"
1066 "- (Class)class:(Class)klass {\n"
1071 verifyFormat("@implementation Foo\n"
1072 "+ (Class)class:(Class)klass {\n"
1078 verifyFormat("@interface Foo\n"
1083 verifyFormat("@interface Foo\n"
1087 verifyFormat("@interface Foo\n"
1091 verifyFormat("@interface Foo\n"
1092 "- (Class)class:(Class)klass;\n"
1095 verifyFormat("@interface Foo\n"
1096 "+ (Class)class:(Class)klass;\n"
1101 TEST_F(FormatTestObjC, ObjCLiterals) {
1102 verifyFormat("@\"String\"");
1104 verifyFormat("@+4.8");
1105 verifyFormat("@-4");
1106 verifyFormat("@1LL");
1107 verifyFormat("@.5");
1108 verifyFormat("@'c'");
1109 verifyFormat("@true");
1111 verifyFormat("NSNumber *smallestInt = @(-INT_MAX - 1);");
1112 verifyFormat("NSNumber *piOverTwo = @(M_PI / 2);");
1113 verifyFormat("NSNumber *favoriteColor = @(Green);");
1114 verifyFormat("NSString *path = @(getenv(\"PATH\"));");
1116 verifyFormat("[dictionary setObject:@(1) forKey:@\"number\"];");
1119 TEST_F(FormatTestObjC, ObjCDictLiterals) {
1121 verifyFormat("@{}");
1122 verifyFormat("@{@\"one\" : @1}");
1123 verifyFormat("return @{@\"one\" : @1;");
1124 verifyFormat("@{@\"one\" : @1}");
1126 verifyFormat("@{@\"one\" : @{@2 : @1}}");
1128 " @\"one\" : @{@2 : @1},\n"
1131 verifyFormat("@{1 > 2 ? @\"one\" : @\"two\" : 1 > 2 ? @1 : @2}");
1132 verifyIncompleteFormat("[self setDict:@{}");
1133 verifyIncompleteFormat("[self setDict:@{@1 : @2}");
1134 verifyFormat("NSLog(@\"%@\", @{@1 : @2, @2 : @3}[@1]);");
1136 "NSDictionary *masses = @{@\"H\" : @1.0078, @\"He\" : @4.0026};");
1138 "NSDictionary *settings = @{AVEncoderKey : @(AVAudioQualityMax)};");
1140 verifyFormat("NSDictionary *d = @{\n"
1141 " @\"nam\" : NSUserNam(),\n"
1142 " @\"dte\" : [NSDate date],\n"
1143 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
1147 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
1152 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee :\n"
1153 " reeeeeeeeeeeeeeeeeeeeeeeegularFont,\n"
1156 // We should try to be robust in case someone forgets the "@".
1157 verifyFormat("NSDictionary *d = {\n"
1158 " @\"nam\" : NSUserNam(),\n"
1159 " @\"dte\" : [NSDate date],\n"
1160 " @\"processInfo\" : [NSProcessInfo processInfo]\n"
1162 verifyFormat("NSMutableDictionary *dictionary =\n"
1163 " [NSMutableDictionary dictionaryWithDictionary:@{\n"
1164 " aaaaaaaaaaaaaaaaaaaaa : aaaaaaaaaaaaa,\n"
1165 " bbbbbbbbbbbbbbbbbb : bbbbb,\n"
1166 " cccccccccccccccc : ccccccccccccccc\n"
1169 // Ensure that casts before the key are kept on the same line as the key.
1171 "NSDictionary *d = @{\n"
1172 " (aaaaaaaa id)aaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaaaaaaaaaaaa,\n"
1173 " (aaaaaaaa id)aaaaaaaaaaaaaa : (aaaaaaaa id)aaaaaaaaaaaaaa,\n"
1175 Style.ColumnLimit = 40;
1176 verifyFormat("int Foo() {\n"
1177 " a12345 = @{a12345 : a12345};\n"
1179 verifyFormat("int Foo() {\n"
1180 " a12345 = @{a12345 : @(a12345)};\n"
1182 verifyFormat("int Foo() {\n"
1183 " a12345 = @{(Foo *)a12345 : @(a12345)};\n"
1185 verifyFormat("int Foo() {\n"
1186 " a12345 = @{@(a12345) : a12345};\n"
1188 verifyFormat("int Foo() {\n"
1189 " a12345 = @{@(a12345) : @YES};\n"
1191 Style.SpacesInContainerLiterals = false;
1192 verifyFormat("int Foo() {\n"
1193 " b12345 = @{b12345: b12345};\n"
1195 verifyFormat("int Foo() {\n"
1196 " b12345 = @{(Foo *)b12345: @(b12345)};\n"
1198 Style.SpacesInContainerLiterals = true;
1200 Style = getGoogleStyle(FormatStyle::LK_ObjC);
1203 " NSFontAttributeNameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee : "
1208 TEST_F(FormatTestObjC, ObjCArrayLiterals) {
1209 verifyIncompleteFormat("@[");
1210 verifyFormat("@[]");
1212 "NSArray *array = @[ @\" Hey \", NSApp, [NSNumber numberWithInt:42] ];");
1213 verifyFormat("return @[ @3, @[], @[ @4, @5 ] ];");
1214 verifyFormat("NSArray *array = @[ [foo description] ];");
1217 "NSArray *some_variable = @[\n"
1218 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
1219 " @\"aaaaaaaaaaaaaaaaa\",\n"
1220 " @\"aaaaaaaaaaaaaaaaa\",\n"
1221 " @\"aaaaaaaaaaaaaaaaa\",\n"
1224 "NSArray *some_variable = @[\n"
1225 " aaaa == bbbbbbbbbbb ? @\"aaaaaaaaaaaa\" : @\"aaaaaaaaaaaaaa\",\n"
1226 " @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\", @\"aaaaaaaaaaaaaaaa\"\n"
1228 verifyFormat("NSArray *some_variable = @[\n"
1229 " @\"aaaaaaaaaaaaaaaaa\",\n"
1230 " @\"aaaaaaaaaaaaaaaaa\",\n"
1231 " @\"aaaaaaaaaaaaaaaaa\",\n"
1232 " @\"aaaaaaaaaaaaaaaaa\",\n"
1234 verifyFormat("NSArray *array = @[\n"
1236 " @\"a\",\n" // Trailing comma -> one per line.
1239 // We should try to be robust in case someone forgets the "@".
1240 verifyFormat("NSArray *some_variable = [\n"
1241 " @\"aaaaaaaaaaaaaaaaa\",\n"
1242 " @\"aaaaaaaaaaaaaaaaa\",\n"
1243 " @\"aaaaaaaaaaaaaaaaa\",\n"
1244 " @\"aaaaaaaaaaaaaaaaa\",\n"
1247 "- (NSAttributedString *)attributedStringForSegment:(NSUInteger)segment\n"
1248 " index:(NSUInteger)index\n"
1249 " nonDigitAttributes:\n"
1250 " (NSDictionary *)noDigitAttributes;");
1251 verifyFormat("[someFunction someLooooooooooooongParameter:@[\n"
1252 " NSBundle.mainBundle.infoDictionary[@\"a\"]\n"
1254 Style.ColumnLimit = 40;
1255 verifyFormat("int Foo() {\n"
1256 " a12345 = @[ a12345, a12345 ];\n"
1258 verifyFormat("int Foo() {\n"
1259 " a123 = @[ (Foo *)a12345, @(a12345) ];\n"
1261 Style.SpacesInContainerLiterals = false;
1262 verifyFormat("int Foo() {\n"
1263 " b12345 = @[b12345, b12345];\n"
1265 verifyFormat("int Foo() {\n"
1266 " b12345 = @[(Foo *)b12345, @(b12345)];\n"
1268 Style.SpacesInContainerLiterals = true;
1269 Style.ColumnLimit = 20;
1270 // We can't break string literals inside NSArray literals
1271 // (that raises -Wobjc-string-concatenation).
1272 verifyFormat("NSArray *foo = @[\n"
1273 " @\"aaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
1277 TEST_F(FormatTestObjC, BreaksCallStatementWhereSemiJustOverTheLimit) {
1278 Style.ColumnLimit = 60;
1279 // If the statement starting with 'a = ...' is put on a single line, the ';'
1281 verifyFormat("int f(int a) {\n"
1282 " a = [self aaaaaaaaaa:bbbbbbbbb\n"
1283 " ccccccccc:dddddddd\n"
1288 TEST_F(FormatTestObjC, AlwaysBreakBeforeMultilineStrings) {
1289 Style = getGoogleStyle(FormatStyle::LK_ObjC);
1290 Style.ColumnLimit = 40;
1291 verifyFormat("aaaa = @\"bbbb\"\n"
1293 verifyFormat("aaaa(@\"bbbb\"\n"
1295 verifyFormat("aaaa(qqq, @\"bbbb\"\n"
1297 verifyFormat("[aaaa qqqq:@\"bbbb\"\n"
1299 verifyFormat("aaaa = [aaaa qqqq:@\"bbbb\"\n"
1301 verifyFormat("[aaaa qqqq:@\"bbbb\"\n"
1309 } // end namespace format
1310 } // end namespace clang