OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import "ios/clean/chrome/browser/browser_coordinator.h" |
| 6 #import "ios/clean/chrome/browser/browser_coordinator+internal.h" |
| 7 |
| 8 #include "base/logging.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "testing/gtest_mac.h" |
| 11 #include "testing/platform_test.h" |
| 12 |
| 13 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 14 #error "This file requires ARC support." |
| 15 #endif |
| 16 |
| 17 @interface TestCoordinator : BrowserCoordinator |
| 18 @property(nonatomic) UIViewController* viewController; |
| 19 @property(nonatomic, copy) void (^stopHandler)(); |
| 20 @end |
| 21 |
| 22 @implementation TestCoordinator |
| 23 @synthesize viewController = _viewController; |
| 24 @synthesize stopHandler = _stopHandler; |
| 25 |
| 26 - (instancetype)init { |
| 27 if (!(self = [super init])) |
| 28 return nil; |
| 29 |
| 30 _viewController = [[UIViewController alloc] init]; |
| 31 return self; |
| 32 } |
| 33 |
| 34 - (void)stop { |
| 35 if (self.stopHandler) |
| 36 self.stopHandler(); |
| 37 } |
| 38 |
| 39 @end |
| 40 |
| 41 @interface NonOverlayableCoordinator : TestCoordinator |
| 42 @end |
| 43 |
| 44 @implementation NonOverlayableCoordinator |
| 45 |
| 46 - (BOOL)canAddOverlayCoordinator:(BrowserCoordinator*)overlayCoordinator { |
| 47 return NO; |
| 48 } |
| 49 |
| 50 @end |
| 51 |
| 52 TEST(BrowserCoordinatorTest, TestStopOnDealloc) { |
| 53 __block BOOL called = NO; |
| 54 |
| 55 { |
| 56 TestCoordinator* coordinator = [[TestCoordinator alloc] init]; |
| 57 coordinator.stopHandler = ^{ |
| 58 called = YES; |
| 59 }; |
| 60 } |
| 61 |
| 62 EXPECT_TRUE(called); |
| 63 } |
| 64 |
| 65 TEST(BrowserCoordinatorTest, TestChildren) { |
| 66 TestCoordinator* parent = [[TestCoordinator alloc] init]; |
| 67 TestCoordinator* child = [[TestCoordinator alloc] init]; |
| 68 |
| 69 [parent addChildCoordinator:child]; |
| 70 EXPECT_TRUE([parent.children containsObject:child]); |
| 71 EXPECT_EQ(parent, child.parentCoordinator); |
| 72 EXPECT_EQ(parent.viewController, child.rootViewController); |
| 73 |
| 74 [parent removeChildCoordinator:child]; |
| 75 EXPECT_FALSE([parent.children containsObject:child]); |
| 76 EXPECT_EQ(nil, child.parentCoordinator); |
| 77 // Unparenting shouldn't change a child's rootViewController. |
| 78 EXPECT_EQ(parent.viewController, child.rootViewController); |
| 79 |
| 80 TestCoordinator* otherParent = [[TestCoordinator alloc] init]; |
| 81 TestCoordinator* otherChild = [[TestCoordinator alloc] init]; |
| 82 [otherParent addChildCoordinator:otherChild]; |
| 83 |
| 84 // -removeChildCoordinator of a non-child should have no affect. |
| 85 [parent removeChildCoordinator:otherChild]; |
| 86 EXPECT_TRUE([otherParent.children containsObject:otherChild]); |
| 87 EXPECT_EQ(otherParent, otherChild.parentCoordinator); |
| 88 } |
| 89 |
| 90 TEST(BrowserCoordinatorTest, TestOverlay) { |
| 91 TestCoordinator* parent = [[TestCoordinator alloc] init]; |
| 92 TestCoordinator* child = [[TestCoordinator alloc] init]; |
| 93 TestCoordinator* grandchild = [[TestCoordinator alloc] init]; |
| 94 TestCoordinator* overlay = [[TestCoordinator alloc] init]; |
| 95 TestCoordinator* secondOverlay = [[TestCoordinator alloc] init]; |
| 96 |
| 97 EXPECT_TRUE([parent canAddOverlayCoordinator:overlay]); |
| 98 [parent addChildCoordinator:child]; |
| 99 [child addChildCoordinator:grandchild]; |
| 100 EXPECT_FALSE([parent canAddOverlayCoordinator:overlay]); |
| 101 EXPECT_FALSE([child canAddOverlayCoordinator:overlay]); |
| 102 EXPECT_TRUE([grandchild canAddOverlayCoordinator:overlay]); |
| 103 EXPECT_FALSE([grandchild canAddOverlayCoordinator:child]); |
| 104 |
| 105 EXPECT_FALSE(overlay.overlaying); |
| 106 [parent addOverlayCoordinator:overlay]; |
| 107 EXPECT_TRUE(overlay.overlaying); |
| 108 EXPECT_EQ(overlay, parent.overlayCoordinator); |
| 109 EXPECT_EQ(overlay, child.overlayCoordinator); |
| 110 EXPECT_EQ(overlay, grandchild.overlayCoordinator); |
| 111 EXPECT_TRUE([grandchild.children containsObject:overlay]); |
| 112 EXPECT_EQ(grandchild, overlay.parentCoordinator); |
| 113 |
| 114 // Shouldn't be able to add a second overlaying coordinator. |
| 115 EXPECT_FALSE([grandchild canAddOverlayCoordinator:secondOverlay]); |
| 116 EXPECT_FALSE(secondOverlay.overlaying); |
| 117 [parent addOverlayCoordinator:secondOverlay]; |
| 118 EXPECT_FALSE(secondOverlay.overlaying); |
| 119 |
| 120 [child removeOverlayCoordinator]; |
| 121 EXPECT_FALSE(overlay.overlaying); |
| 122 EXPECT_EQ(nil, parent.overlayCoordinator); |
| 123 EXPECT_EQ(nil, child.overlayCoordinator); |
| 124 EXPECT_EQ(nil, grandchild.overlayCoordinator); |
| 125 EXPECT_FALSE([grandchild.children containsObject:overlay]); |
| 126 EXPECT_EQ(nil, overlay.parentCoordinator); |
| 127 |
| 128 // An implementation that doesn't allow any overlays shouldn't get one. |
| 129 NonOverlayableCoordinator* noOverlays = |
| 130 [[NonOverlayableCoordinator alloc] init]; |
| 131 TestCoordinator* thirdOverlay = [[TestCoordinator alloc] init]; |
| 132 |
| 133 EXPECT_FALSE([noOverlays canAddOverlayCoordinator:thirdOverlay]); |
| 134 EXPECT_FALSE(thirdOverlay.overlaying); |
| 135 [noOverlays addOverlayCoordinator:thirdOverlay]; |
| 136 EXPECT_FALSE(thirdOverlay.overlaying); |
| 137 } |
OLD | NEW |