chromium/ios/chrome/test/fakes/fake_ui_navigation_controller.mm

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/test/fakes/fake_ui_navigation_controller.h"

@implementation FakeUINavigationController {
  // View controller presented using
  // `presentViewController:animated:completion:`
  UIViewController* _presentedViewController;
  // View controllers pushed using `pushViewController:animated:completion:` or
  // set using `setViewControllers:animated:`
  NSMutableArray<UIViewController*>* _viewControllers;
}

- (instancetype)init {
  self = [super init];
  if (self) {
    _viewControllers = [NSMutableArray array];
  }
  return self;
}

#pragma mark - UIViewController

- (void)presentViewController:(UIViewController*)viewControllerToPresent
                     animated:(BOOL)flag
                   completion:(void (^)())completion {
  _presentedViewController = viewControllerToPresent;
}

- (void)dismissViewControllerAnimated:(BOOL)flag
                           completion:(void (^)())completion {
  _presentedViewController = nil;
}

- (UIViewController*)presentedViewController {
  return _presentedViewController;
}

#pragma mark - UINavigationController

- (void)pushViewController:(UIViewController*)viewController
                  animated:(BOOL)animated {
  [_viewControllers addObject:viewController];
}

- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
  UIViewController* lastObject = _viewControllers.lastObject;
  if (lastObject) {
    [_viewControllers removeLastObject];
  }
  return lastObject;
}

- (NSArray<UIViewController*>*)popToViewController:
                                   (UIViewController*)viewController
                                          animated:(BOOL)animated {
  NSMutableArray<UIViewController*>* popped = [NSMutableArray array];
  while (self.topViewController && self.topViewController != viewController) {
    [popped addObject:[self popViewControllerAnimated:animated]];
  }
  return popped;
}

- (NSArray<UIViewController*>*)popToRootViewControllerAnimated:(BOOL)animated {
  return [self popToViewController:self.viewControllers.firstObject
                          animated:animated];
}

- (UIViewController*)topViewController {
  return _viewControllers.lastObject;
}

- (UIViewController*)visibleViewController {
  if (self.presentedViewController) {
    return self.presentedViewController;
  } else {
    return self.topViewController;
  }
}

- (NSArray<UIViewController*>*)viewControllers {
  return _viewControllers;
}

- (void)setViewControllers:(NSArray<UIViewController*>*)viewControllers
                  animated:(BOOL)animated {
  _viewControllers = [NSMutableArray arrayWithArray:viewControllers];
}

@end