| // Copyright 2019-present the Material Components for iOS authors. All Rights Reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #import <XCTest/XCTest.h> | |
| #import "MaterialAppBar.h" | |
| #import "MaterialFlexibleHeader.h" | |
| @interface AppBarNavigationControllerTests : XCTestCase | |
| @property(nonatomic, strong) MDCAppBarNavigationController *navigationController; | |
| @end | |
| @implementation AppBarNavigationControllerTests | |
| - (void)setUp { | |
| [super setUp]; | |
| self.navigationController = [[MDCAppBarNavigationController alloc] init]; | |
| } | |
| - (void)tearDown { | |
| self.navigationController = nil; | |
| [super tearDown]; | |
| } | |
| - (void)testInitHidesTheNavigationBar { | |
| // Then | |
| XCTAssertTrue(self.navigationController.navigationBarHidden); | |
| } | |
| - (void)testInitWithNibNameHidesTheNavigationBar { | |
| // Given | |
| MDCAppBarNavigationController *navigationController = | |
| [[MDCAppBarNavigationController alloc] initWithNibName:nil bundle:nil]; | |
| // Then | |
| XCTAssertTrue(navigationController.navigationBarHidden); | |
| } | |
| - (void)testInitWithRootViewControllerHidesTheNavigationBar { | |
| // Given | |
| UIViewController *viewController = [[UIViewController alloc] init]; | |
| MDCAppBarNavigationController *navigationController = | |
| [[MDCAppBarNavigationController alloc] initWithRootViewController:viewController]; | |
| // Then | |
| XCTAssertTrue(navigationController.navigationBarHidden); | |
| } | |
| - (void)testSettingAViewControllerInjectsAnAppBar { | |
| // Given | |
| UIViewController *viewController = [[UIViewController alloc] init]; | |
| // When | |
| self.navigationController.viewControllers = @[ viewController ]; | |
| // Then | |
| XCTAssertEqual( | |
| viewController.childViewControllers.count, 1, | |
| @"Expected there to be exactly one child view controller added to the view controller."); | |
| XCTAssertEqual(self.navigationController.topViewController, viewController, | |
| @"The navigation controller's top view controller is supposed to be the pushed " | |
| @"view controller, but it is %@.", | |
| viewController); | |
| XCTAssertTrue( | |
| [viewController.childViewControllers.firstObject | |
| isKindOfClass:[MDCFlexibleHeaderViewController class]], | |
| "The injected view controller is not a flexible header view controller, it is %@ instead.", | |
| NSStringFromClass([viewController.childViewControllers.firstObject class])); | |
| if ([viewController.childViewControllers.firstObject | |
| isKindOfClass:[MDCFlexibleHeaderViewController class]]) { | |
| MDCFlexibleHeaderViewController *headerViewController = | |
| viewController.childViewControllers.firstObject; | |
| XCTAssertEqual(headerViewController.headerView.frame.size.height, | |
| headerViewController.headerView.maximumHeight); | |
| } | |
| } | |
| - (void)testSettingAViewControllerAnimatedInjectsAnAppBar { | |
| // Given | |
| UIViewController *viewController = [[UIViewController alloc] init]; | |
| // When | |
| [self.navigationController setViewControllers:@[ viewController ] animated:NO]; | |
| // Then | |
| XCTAssertEqual( | |
| viewController.childViewControllers.count, 1, | |
| @"Expected there to be exactly one child view controller added to the view controller."); | |
| XCTAssertEqual(self.navigationController.topViewController, viewController, | |
| @"The navigation controller's top view controller is supposed to be the pushed " | |
| @"view controller, but it is %@.", | |
| viewController); | |
| XCTAssertTrue( | |
| [viewController.childViewControllers.firstObject | |
| isKindOfClass:[MDCFlexibleHeaderViewController class]], | |
| "The injected view controller is not a flexible header view controller, it is %@ instead.", | |
| NSStringFromClass([viewController.childViewControllers.firstObject class])); | |
| if ([viewController.childViewControllers.firstObject | |
| isKindOfClass:[MDCFlexibleHeaderViewController class]]) { | |
| MDCFlexibleHeaderViewController *headerViewController = | |
| viewController.childViewControllers.firstObject; | |
| XCTAssertEqual(headerViewController.headerView.frame.size.height, | |
| headerViewController.headerView.maximumHeight); | |
| } | |
| } | |
| - (void)testSettingAViewControllerAssignsTraitCollectionDidChangeBlock { | |
| // Given | |
| UIViewController *viewController = [[UIViewController alloc] init]; | |
| self.navigationController.traitCollectionDidChangeBlockForAppBarController = | |
| ^(MDCFlexibleHeaderViewController *_Nonnull flexibleHeaderViewController, | |
| UITraitCollection *_Nullable previousTraitCollection) { | |
| }; | |
| // When | |
| self.navigationController.viewControllers = @[ viewController ]; | |
| // Then | |
| MDCAppBarViewController *injectedAppBarViewController = | |
| viewController.childViewControllers.firstObject; | |
| XCTAssertNotNil(injectedAppBarViewController); | |
| XCTAssertNotNil(injectedAppBarViewController.traitCollectionDidChangeBlock); | |
| } | |
| - (void)testSettingAViewControllerAnimatedAssignsTraitCollectionDidChangeBlock { | |
| // Given | |
| UIViewController *viewController = [[UIViewController alloc] init]; | |
| self.navigationController.traitCollectionDidChangeBlockForAppBarController = | |
| ^(MDCFlexibleHeaderViewController *_Nonnull flexibleHeaderViewController, | |
| UITraitCollection *_Nullable previousTraitCollection) { | |
| }; | |
| // When | |
| [self.navigationController setViewControllers:@[ viewController ] animated:NO]; | |
| // Then | |
| MDCAppBarViewController *injectedAppBarViewController = | |
| viewController.childViewControllers.firstObject; | |
| XCTAssertNotNil(injectedAppBarViewController); | |
| XCTAssertNotNil(injectedAppBarViewController.traitCollectionDidChangeBlock); | |
| } | |
| @end |