From cd40d253bb27009f25cf704ff2bacc6d275f87e2 Mon Sep 17 00:00:00 2001 From: "damian.malarczyk" Date: Thu, 28 Feb 2019 18:04:49 +0100 Subject: [PATCH 1/3] Update dependencies --- Cartfile.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cartfile.resolved b/Cartfile.resolved index 236a626..82e9866 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,2 +1,2 @@ -github "Quick/Nimble" "v7.1.3" -github "Quick/Quick" "v1.3.1" +github "Quick/Nimble" "v7.3.4" +github "Quick/Quick" "v1.3.4" From b08a113d2e3793623dace0b507acea453bcb4bde Mon Sep 17 00:00:00 2001 From: "damian.malarczyk" Date: Thu, 28 Feb 2019 18:05:23 +0100 Subject: [PATCH 2/3] Bump Swift version 4.2 --- Direkt.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Direkt.xcodeproj/project.pbxproj b/Direkt.xcodeproj/project.pbxproj index 577802d..4fdbdef 100644 --- a/Direkt.xcodeproj/project.pbxproj +++ b/Direkt.xcodeproj/project.pbxproj @@ -361,7 +361,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -419,7 +419,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; From 57f6e5fffb99d4c3b559a256a94bdaecfbcff00e Mon Sep 17 00:00:00 2001 From: "damian.malarczyk" Date: Thu, 28 Feb 2019 18:13:43 +0100 Subject: [PATCH 3/3] NavigationManager, add navigation result --- Direkt/BaseNavigationManager.swift | 7 ++++++- Direkt/NavigationManager.swift | 20 +++++++++++++++++--- DirektTests/NavigationStackMock.swift | 14 +++++++++----- DirektTests/NavigatorTests.swift | 26 ++++++++++++++++++++++++-- 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/Direkt/BaseNavigationManager.swift b/Direkt/BaseNavigationManager.swift index 4f1c5e0..69b89f4 100644 --- a/Direkt/BaseNavigationManager.swift +++ b/Direkt/BaseNavigationManager.swift @@ -16,13 +16,18 @@ open class BaseNavigationManager: NavigationManager { self.resolver = resolver } - open func navigate(to navigator: T.Type, using input: T.Input, from hostViewController: UIViewController) { + open func attemptNavigate( + to navigator: T.Type, + using input: T.Input, + from hostViewController: UIViewController + ) throws { do { try resolver .resolve(navigator) .navigate(using: input, from: hostViewController, resolver: resolver) } catch { didFailNavigation(to: navigator, error: error, hostViewController: hostViewController) + throw error } } diff --git a/Direkt/NavigationManager.swift b/Direkt/NavigationManager.swift index 69dc127..187debc 100644 --- a/Direkt/NavigationManager.swift +++ b/Direkt/NavigationManager.swift @@ -10,12 +10,26 @@ import UIKit public protocol NavigationManager { - func navigate(to navigator: T.Type, using: T.Input, from hostViewController: UIViewController) + func attemptNavigate(to navigator: T.Type, using input: T.Input, from hostViewController: UIViewController) throws } public extension NavigationManager { - func navigate(to navigator: T.Type, from hostViewController: UIViewController) where T.Input == Void { - navigate(to: navigator, using: (), from: hostViewController) + /// + /// - Returns: false if navigation failed + @discardableResult + func navigate(to navigator: T.Type, using input: T.Input, from hostViewController: UIViewController) -> Bool { + return (try? attemptNavigate(to: T.self, using: input, from: hostViewController)) != nil + } + + /// + /// - Returns: false if navigation failed + @discardableResult + func navigate(to navigator: T.Type, from hostViewController: UIViewController) -> Bool where T.Input == Void { + return navigate(to: T.self, using: (), from: hostViewController) + } + + func attemptNavigate(to navigator: T.Type, from hostViewController: UIViewController) throws where T.Input== Void { + try attemptNavigate(to: T.self, using: (), from: hostViewController) } } diff --git a/DirektTests/NavigationStackMock.swift b/DirektTests/NavigationStackMock.swift index 291a934..5d416c8 100644 --- a/DirektTests/NavigationStackMock.swift +++ b/DirektTests/NavigationStackMock.swift @@ -86,12 +86,12 @@ class MockNavigationManager: BaseNavigationManager, MethodCallMock { enum MethodCall: Equatable { - case navigate(Any.Type, input: Any, hostViewController: UIViewController) + case attemptNavigate(Any.Type, input: Any, hostViewController: UIViewController) case didFailNavigation(Any.Type, Error, UIViewController) static func == (lhs: MethodCall, rhs: MethodCall) -> Bool { switch (lhs, rhs) { - case let (.navigate(lhs), .navigate(rhs)): + case let (.attemptNavigate(lhs), .attemptNavigate(rhs)): return lhs.0 == rhs.0 && type(of: lhs.input) == type(of: rhs.input) && lhs.hostViewController === rhs.hostViewController @@ -107,9 +107,13 @@ class MockNavigationManager: BaseNavigationManager, MethodCallMock { var calls: [MockNavigationManager.MethodCall] = [] - override func navigate(to navigator: T.Type, using input: T.Input, from hostViewController: UIViewController) { - makeCall(.navigate(navigator, input: input, hostViewController: hostViewController)) - super.navigate(to: navigator, using: input, from: hostViewController) + override func attemptNavigate( + to navigator: T.Type, + using input: T.Input, + from hostViewController: UIViewController + ) throws { + makeCall(.attemptNavigate(navigator, input: input, hostViewController: hostViewController)) + try super.attemptNavigate(to: navigator, using: input, from: hostViewController) } override func didFailNavigation(to navigator: T.Type, error: Error, hostViewController: UIViewController) { diff --git a/DirektTests/NavigatorTests.swift b/DirektTests/NavigatorTests.swift index 6484c5b..efdb2f1 100644 --- a/DirektTests/NavigatorTests.swift +++ b/DirektTests/NavigatorTests.swift @@ -59,11 +59,33 @@ class NavigationManagerSpec: QuickSpec { expect( manager.didCall( - .navigate(MockNavigator.self, input: (), hostViewController: mockHost) + .attemptNavigate(MockNavigator.self, input: (), hostViewController: mockHost) ) ).to(beTrue()) } + it("handles optional parameters with failable navigation") { + try? manager.attemptNavigate(to: MockNavigator.self, from: mockHost) + + expect( + manager.didCall( + .attemptNavigate(MockNavigator.self, input: (), hostViewController: mockHost) + ) + ).to(beTrue()) + } + + context("navigation result") { + it("provides failed navigation error") { + expect { try manager.attemptNavigate(to: MockNavigator.self, using: 0, from: mockHost) } + .to(throwError(MockResolver.Error.unkownType(MockNavigator.self))) + } + + it("provides navigation result") { + expect(manager.navigate(to: MockNavigator.self, from: mockHost)) == true + expect(manager.navigate(to: MockNavigator.self, using: 0, from: mockHost)) == false + } + } + context("performs navigation step") { beforeEach { manager.navigate(to: MockNavigator.self, using: "mock", from: mockHost) @@ -86,7 +108,7 @@ class NavigationManagerSpec: QuickSpec { it("calls navigation methods") { expect( manager.didCall( - .navigate(MockNavigator.self, input: "mock", hostViewController: mockHost) + .attemptNavigate(MockNavigator.self, input: "mock", hostViewController: mockHost) ) ).to(beTrue())