Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cartfile.resolved
Original file line number Diff line number Diff line change
@@ -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"
4 changes: 2 additions & 2 deletions Direkt.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "";
};
Expand Down Expand Up @@ -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 = "";
Expand Down
7 changes: 6 additions & 1 deletion Direkt/BaseNavigationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,18 @@ open class BaseNavigationManager: NavigationManager {
self.resolver = resolver
}

open func navigate<T: Navigator>(to navigator: T.Type, using input: T.Input, from hostViewController: UIViewController) {
open func attemptNavigate<T: Navigator>(
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
}
}

Expand Down
20 changes: 17 additions & 3 deletions Direkt/NavigationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,26 @@ import UIKit

public protocol NavigationManager {

func navigate<T: Navigator>(to navigator: T.Type, using: T.Input, from hostViewController: UIViewController)
func attemptNavigate<T: Navigator>(to navigator: T.Type, using input: T.Input, from hostViewController: UIViewController) throws
}

public extension NavigationManager {

func navigate<T: Navigator>(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<T: Navigator>(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<T: Navigator>(to navigator: T.Type, from hostViewController: UIViewController) -> Bool where T.Input == Void {
return navigate(to: T.self, using: (), from: hostViewController)
}

func attemptNavigate<T: Navigator>(to navigator: T.Type, from hostViewController: UIViewController) throws where T.Input== Void {
try attemptNavigate(to: T.self, using: (), from: hostViewController)
}
}
14 changes: 9 additions & 5 deletions DirektTests/NavigationStackMock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -107,9 +107,13 @@ class MockNavigationManager: BaseNavigationManager, MethodCallMock {

var calls: [MockNavigationManager.MethodCall] = []

override func navigate<T: Navigator>(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<T: Navigator>(
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<T: Navigator>(to navigator: T.Type, error: Error, hostViewController: UIViewController) {
Expand Down
26 changes: 24 additions & 2 deletions DirektTests/NavigatorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,33 @@ class NavigationManagerSpec: QuickSpec {

expect(
manager.didCall(
.navigate(MockNavigator<Void>.self, input: (), hostViewController: mockHost)
.attemptNavigate(MockNavigator<Void>.self, input: (), hostViewController: mockHost)
)
).to(beTrue())
}

it("handles optional parameters with failable navigation") {
try? manager.attemptNavigate(to: MockNavigator<Void>.self, from: mockHost)

expect(
manager.didCall(
.attemptNavigate(MockNavigator<Void>.self, input: (), hostViewController: mockHost)
)
).to(beTrue())
}

context("navigation result") {
it("provides failed navigation error") {
expect { try manager.attemptNavigate(to: MockNavigator<Double>.self, using: 0, from: mockHost) }
.to(throwError(MockResolver.Error.unkownType(MockNavigator<String>.self)))
}

it("provides navigation result") {
expect(manager.navigate(to: MockNavigator<Void>.self, from: mockHost)) == true
expect(manager.navigate(to: MockNavigator<Double>.self, using: 0, from: mockHost)) == false
}
}

context("performs navigation step") {
beforeEach {
manager.navigate(to: MockNavigator<String>.self, using: "mock", from: mockHost)
Expand All @@ -86,7 +108,7 @@ class NavigationManagerSpec: QuickSpec {
it("calls navigation methods") {
expect(
manager.didCall(
.navigate(MockNavigator<String>.self, input: "mock", hostViewController: mockHost)
.attemptNavigate(MockNavigator<String>.self, input: "mock", hostViewController: mockHost)
)
).to(beTrue())

Expand Down