From dbc24cbc3cf9077821307a54c3ee0398e256e7da Mon Sep 17 00:00:00 2001 From: Erik Drobne Date: Tue, 24 Oct 2023 09:30:30 +0200 Subject: [PATCH 1/5] Test coordinator initial state. --- Tests/SwiftUICoordinatorTests/CoordinatorTests.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift index 3e10723..23fede8 100644 --- a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift +++ b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift @@ -5,6 +5,13 @@ import Foundation @MainActor final class CoordinatorTests: XCTestCase { + func test_coordinatorInitialState() { + let navigationController = NavigationController() + let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: navigationController) + XCTAssertNil(sut.parent) + XCTAssertTrue(sut.childCoordinators.isEmpty) + } + func test_addChildToCoordinator() { let navigationController = NavigationController() let sut = MockAppCoordinator(window: UIWindow(), navigationController: navigationController) From db5bb3429f4bbf4e524541d2d26ce38e6d88fa08 Mon Sep 17 00:00:00 2001 From: Erik Drobne Date: Tue, 24 Oct 2023 09:33:09 +0200 Subject: [PATCH 2/5] Update add child coordinator tests. --- Tests/SwiftUICoordinatorTests/CoordinatorTests.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift index 23fede8..cfef8a5 100644 --- a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift +++ b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift @@ -12,13 +12,14 @@ final class CoordinatorTests: XCTestCase { XCTAssertTrue(sut.childCoordinators.isEmpty) } - func test_addChildToCoordinator() { + func test_addChildCoordinator() { let navigationController = NavigationController() let sut = MockAppCoordinator(window: UIWindow(), navigationController: navigationController) let coordinator = MockCoordinator(parent: sut, startRoute: .rectangle, navigationController: navigationController) sut.start(with: coordinator) XCTAssertEqual(sut.childCoordinators.count, 1) + XCTAssert(sut.childCoordinators.first?.coordinator === coordinator) } func test_addMultipleChildrenToCoordinator() { @@ -30,6 +31,7 @@ final class CoordinatorTests: XCTestCase { sut.add(child: MockCoordinator(parent: coordinator, startRoute: .circle, navigationController: navigationController)) XCTAssertEqual(sut.childCoordinators.count, 2) + XCTAssert(sut.childCoordinators.first?.coordinator === coordinator) } func test_removeChildCoordinator() { From a46e752a71ed2d86142c5e2b451e9cd8c8191368 Mon Sep 17 00:00:00 2001 From: Erik Drobne Date: Tue, 24 Oct 2023 09:34:11 +0200 Subject: [PATCH 3/5] Simplify remove child coordinator test. --- Tests/SwiftUICoordinatorTests/CoordinatorTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift index cfef8a5..e1b566d 100644 --- a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift +++ b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift @@ -42,7 +42,7 @@ final class CoordinatorTests: XCTestCase { sut.start(with: coordinator) sut.remove(coordinator: coordinator) - XCTAssertEqual(sut.childCoordinators.count, 0) + XCTAssertTrue(sut.childCoordinators.isEmpty) } func test_showRouteThrowsError() { From 1be76c563fadd0a79a7d7bed1baafd057eb3bece Mon Sep 17 00:00:00 2001 From: Erik Drobne Date: Tue, 24 Oct 2023 09:46:04 +0200 Subject: [PATCH 4/5] Test that coordinator does not retain child coordinators. --- Tests/SwiftUICoordinatorTests/CoordinatorTests.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift index e1b566d..d444336 100644 --- a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift +++ b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift @@ -45,6 +45,18 @@ final class CoordinatorTests: XCTestCase { XCTAssertTrue(sut.childCoordinators.isEmpty) } + func test_coordinatorDoesNotRetainChildCoordinators() { + let navigationController = NavigationController() + let parentCoordinator = MockAppCoordinator(window: UIWindow(), navigationController: navigationController) + var childCoordinator: Coordinator? = MockCoordinator(parent: parentCoordinator, startRoute: .rectangle, navigationController: navigationController) + parentCoordinator.add(child: childCoordinator!) + + XCTAssertNotNil(parentCoordinator.childCoordinators.first?.coordinator) + childCoordinator = nil + XCTAssertNil(parentCoordinator.childCoordinators.first?.coordinator) + } + + func test_showRouteThrowsError() { let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) XCTAssertNoThrow(try sut.start()) From af81d796858148d0610ba34aa55f952300fe83d5 Mon Sep 17 00:00:00 2001 From: Erik Drobne Date: Tue, 24 Oct 2023 09:52:38 +0200 Subject: [PATCH 5/5] Move navigator tests into a separate file. --- .../CoordinatorTests.swift | 59 +++---------------- .../NavigatorTests.swift | 58 ++++++++++++++++++ 2 files changed, 67 insertions(+), 50 deletions(-) create mode 100644 Tests/SwiftUICoordinatorTests/NavigatorTests.swift diff --git a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift index d444336..c1045e2 100644 --- a/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift +++ b/Tests/SwiftUICoordinatorTests/CoordinatorTests.swift @@ -47,57 +47,16 @@ final class CoordinatorTests: XCTestCase { func test_coordinatorDoesNotRetainChildCoordinators() { let navigationController = NavigationController() - let parentCoordinator = MockAppCoordinator(window: UIWindow(), navigationController: navigationController) - var childCoordinator: Coordinator? = MockCoordinator(parent: parentCoordinator, startRoute: .rectangle, navigationController: navigationController) - parentCoordinator.add(child: childCoordinator!) + let sut = MockAppCoordinator(window: UIWindow(), navigationController: navigationController) + var childCoordinator: Coordinator? = MockCoordinator( + parent: sut, + startRoute: .rectangle, + navigationController: navigationController + ) - XCTAssertNotNil(parentCoordinator.childCoordinators.first?.coordinator) + sut.add(child: childCoordinator!) + XCTAssertNotNil(sut.childCoordinators.first?.coordinator) childCoordinator = nil - XCTAssertNil(parentCoordinator.childCoordinators.first?.coordinator) - } - - - func test_showRouteThrowsError() { - let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) - XCTAssertNoThrow(try sut.start()) - - XCTAssertThrowsError(try sut.show(route: .square)) { error in - guard let error = error as? NavigatorError else { - XCTFail("Cannot cast to NavigatorError: \(error)") - return - } - - switch error { - case .cannotShow(let route as MockRoute): - XCTAssertEqual(route, .square) - default: - XCTFail("Unexpected error type: \(error)") - } - } - } - - func test_showRouteNoThrow() { - let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) - XCTAssertNoThrow(try sut.start()) - } - - func test_setRoutes() { - let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) - sut.set(routes: [.rectangle, .rectangle]) - XCTAssertEqual(sut.viewControllers.count, 2) - } - - func test_appendRoutes() { - let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) - sut.append(routes: [.rectangle, .circle]) - XCTAssertEqual(sut.viewControllers.count, 2) - } - - func test_popToRoot() { - let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) - sut.append(routes: [.rectangle, .circle]) - XCTAssertEqual(sut.viewControllers.count, 2) - sut.popToRoot(animated: false) - XCTAssertEqual(sut.viewControllers.count, 1) + XCTAssertNil(sut.childCoordinators.first?.coordinator) } } diff --git a/Tests/SwiftUICoordinatorTests/NavigatorTests.swift b/Tests/SwiftUICoordinatorTests/NavigatorTests.swift new file mode 100644 index 0000000..f1b6f3f --- /dev/null +++ b/Tests/SwiftUICoordinatorTests/NavigatorTests.swift @@ -0,0 +1,58 @@ +// +// NavigatorTests.swift +// +// +// Created by Erik Drobne on 24. 10. 23. +// + +import XCTest +import Foundation +@testable import SwiftUICoordinator + +@MainActor +final class NavigatorTests: XCTestCase { + + func test_showRouteThrowsError() { + let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) + XCTAssertNoThrow(try sut.start()) + + XCTAssertThrowsError(try sut.show(route: .square)) { error in + guard let error = error as? NavigatorError else { + XCTFail("Cannot cast to NavigatorError: \(error)") + return + } + + switch error { + case .cannotShow(let route as MockRoute): + XCTAssertEqual(route, .square) + default: + XCTFail("Unexpected error type: \(error)") + } + } + } + + func test_showRouteNoThrow() { + let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) + XCTAssertNoThrow(try sut.start()) + } + + func test_setRoutes() { + let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) + sut.set(routes: [.rectangle, .rectangle]) + XCTAssertEqual(sut.viewControllers.count, 2) + } + + func test_appendRoutes() { + let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) + sut.append(routes: [.rectangle, .circle]) + XCTAssertEqual(sut.viewControllers.count, 2) + } + + func test_popToRoot() { + let sut = MockCoordinator(parent: nil, startRoute: .circle, navigationController: NavigationController()) + sut.append(routes: [.rectangle, .circle]) + XCTAssertEqual(sut.viewControllers.count, 2) + sut.popToRoot(animated: false) + XCTAssertEqual(sut.viewControllers.count, 1) + } +}