// 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 #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