From d8816657ab0ef6aba16ac56117f4eba0245f9425 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 23 Feb 2023 15:58:43 +0200 Subject: [PATCH] Guard against using the same coordinator more than once --- .../Navigation/NavigationCoordinators.swift | 28 +++++++++++++++++++ .../NavigationSplitCoordinatorTests.swift | 16 ----------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/ElementX/Sources/Application/Navigation/NavigationCoordinators.swift b/ElementX/Sources/Application/Navigation/NavigationCoordinators.swift index 020f0472a8..52cec3f642 100644 --- a/ElementX/Sources/Application/Navigation/NavigationCoordinators.swift +++ b/ElementX/Sources/Application/Navigation/NavigationCoordinators.swift @@ -138,6 +138,10 @@ class NavigationSplitCoordinator: CoordinatorProtocol, ObservableObject, CustomS return } + if sidebarModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + sidebarModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) } @@ -151,6 +155,10 @@ class NavigationSplitCoordinator: CoordinatorProtocol, ObservableObject, CustomS return } + if detailModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + detailModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) } @@ -164,6 +172,10 @@ class NavigationSplitCoordinator: CoordinatorProtocol, ObservableObject, CustomS return } + if sheetModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + sheetModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) } @@ -177,6 +189,10 @@ class NavigationSplitCoordinator: CoordinatorProtocol, ObservableObject, CustomS return } + if fullScreenCoverModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + fullScreenCoverModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) } @@ -509,6 +525,10 @@ class NavigationStackCoordinator: ObservableObject, CoordinatorProtocol, CustomS return } + if rootModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + popToRoot(animated: false) rootModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) @@ -565,6 +585,10 @@ class NavigationStackCoordinator: ObservableObject, CoordinatorProtocol, CustomS return } + if sheetModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + sheetModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) } @@ -584,6 +608,10 @@ class NavigationStackCoordinator: ObservableObject, CoordinatorProtocol, CustomS return } + if fullScreenCoverModule?.coordinator === coordinator { + fatalError("Cannot use the same coordinator more than once") + } + fullScreenCoverModule = NavigationModule(coordinator, dismissalCallback: dismissalCallback) } diff --git a/UnitTests/Sources/NavigationSplitCoordinatorTests.swift b/UnitTests/Sources/NavigationSplitCoordinatorTests.swift index c730d46594..7fc49d720d 100644 --- a/UnitTests/Sources/NavigationSplitCoordinatorTests.swift +++ b/UnitTests/Sources/NavigationSplitCoordinatorTests.swift @@ -123,22 +123,6 @@ class NavigationSplitCoordinatorTests: XCTestCase { waitForExpectations(timeout: 1.0) } - func testNavigationStackDetailRootReplacement() { - let detailCoordinator = SomeTestCoordinator() - - let navigationStackCoordinator = NavigationStackCoordinator() - navigationStackCoordinator.setRootCoordinator(detailCoordinator) - - navigationSplitCoordinator.setDetailCoordinator(navigationStackCoordinator) - - let newDetailCoordinator = SomeTestCoordinator() - navigationStackCoordinator.setRootCoordinator(newDetailCoordinator) - - navigationSplitCoordinator.setDetailCoordinator(navigationStackCoordinator) - - assertCoordinatorsEqual(navigationStackCoordinator.rootCoordinator, nil) - } - func testSheetDismissalCallback() { let sheetCoordinator = SomeTestCoordinator()