marshroute
/
AnimatingTransitionsHandler_TransitionAnimationsLauncherTests_BaseMasterDetailRouter.swift
433 строки · 18.6 Кб
1import XCTest
2@testable import Marshroute
3
4final class AnimatingTransitionsHandler_TransitionAnimationsLauncherTests_BaseMasterDetailRouter: XCTestCase {
5
6var sourceViewController: UIViewController!
7var targetViewController: UIViewController!
8
9var router: BaseMasterDetailRouter!
10
11override func setUp() {
12super.setUp()
13
14sourceViewController = UIViewController()
15targetViewController = UIViewController()
16
17let transitionIdGenerator = TransitionIdGeneratorImpl()
18let transitionId = transitionIdGenerator.generateNewTransitionId()
19
20let stackClientProvider = TransitionContextsStackClientProviderImpl()
21
22let peekAndPopTransitionsCoordinator = PeekAndPopUtilityImpl()
23
24let transitionsCoordinator = TransitionsCoordinatorImpl(
25stackClientProvider: stackClientProvider,
26peekAndPopTransitionsCoordinator: peekAndPopTransitionsCoordinator
27)
28
29let masterAnimatingTransitionsHandler = BaseAnimatingTransitionsHandler(
30transitionsCoordinator: transitionsCoordinator
31)
32
33let setMasterRootViewControllerContext = ResettingTransitionContext(
34registeringViewController: sourceViewController,
35animatingTransitionsHandler: masterAnimatingTransitionsHandler,
36transitionId: transitionId
37)
38
39// set root view controller for a master transitions handler
40masterAnimatingTransitionsHandler.resetWithTransition(context: setMasterRootViewControllerContext)
41
42let detailAnimatingTransitionsHandler = BaseAnimatingTransitionsHandler(
43transitionsCoordinator: transitionsCoordinator
44)
45
46let setDetailRootViewControllerContext = ResettingTransitionContext(
47registeringViewController: sourceViewController,
48animatingTransitionsHandler: detailAnimatingTransitionsHandler,
49transitionId: transitionId
50)
51
52// set root view controller for a detail transitions handler
53detailAnimatingTransitionsHandler.resetWithTransition(context: setDetailRootViewControllerContext)
54
55router = BaseMasterDetailRouter(
56routerSeed: MasterDetailRouterSeed(
57masterTransitionsHandlerBox: .init(
58animatingTransitionsHandler: masterAnimatingTransitionsHandler
59),
60detailTransitionsHandlerBox: .init(
61animatingTransitionsHandler: detailAnimatingTransitionsHandler
62),
63transitionId: transitionIdGenerator.generateNewTransitionId(),
64presentingTransitionsHandler: nil,
65transitionsHandlersProvider: transitionsCoordinator,
66transitionIdGenerator: transitionIdGenerator,
67controllersProvider: RouterControllersProviderImpl(),
68routerTransitionDelegate: nil
69)
70)
71}
72
73// MARK: - TransitionAnimationsLauncher
74
75// MARK: MasterRouter
76func testThatAnimatorIsNotCalledOn_SetMasterViewControllerDerivedFrom() {
77// Given
78let resetNavigationTransitionsAnimatorSpy = ResetNavigationTransitionsAnimatorSpy()
79
80// When
81router.setMasterViewControllerDerivedFrom( { (_) -> UIViewController in
82return targetViewController
83}, animator: resetNavigationTransitionsAnimatorSpy
84)
85
86// Then
87XCTAssertNil(resetNavigationTransitionsAnimatorSpy.animateResetting)
88}
89
90func testThatAnimatorIsNotCalledOn_PushMasterViewControllerDerivedFrom() {
91// Given
92let navigationTransitionsAnimator = NavigationTransitionsAnimatorSpy()
93
94// When
95router.pushMasterViewControllerDerivedFrom( { (_) -> UIViewController in
96return targetViewController
97}, animator: navigationTransitionsAnimator
98)
99
100// Then
101XCTAssertNil(navigationTransitionsAnimator.animatePerforming)
102}
103
104func testThatAnimatorIsNotCalledOn_SetDetailViewControllerDerivedFrom() {
105// Given
106let resetNavigationTransitionsAnimatorSpy = ResetNavigationTransitionsAnimatorSpy()
107
108// When
109router.setDetailViewControllerDerivedFrom( { (_) -> UIViewController in
110return targetViewController
111}, animator: resetNavigationTransitionsAnimatorSpy
112)
113
114// Then
115XCTAssertNil(resetNavigationTransitionsAnimatorSpy.animateResetting)
116}
117
118func testThatAnimatorIsNotCalledOn_PushDetailViewControllerDerivedFrom() {
119// Given
120let navigationTransitionsAnimator = NavigationTransitionsAnimatorSpy()
121
122// When
123router.pushDetailViewControllerDerivedFrom( { (_) -> UIViewController in
124return targetViewController
125}, animator: navigationTransitionsAnimator
126)
127
128// Then
129XCTAssertNil(navigationTransitionsAnimator.animatePerforming)
130}
131
132// MARK: EndpointRouter
133
134func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentModalEndpointNavigationController() {
135// Given
136let targetNavigationController = UINavigationController()
137let modalEndpointNavigationTransitionsAnimator = ModalEndpointNavigationTransitionsAnimatorSpy()
138
139// When
140router.presentModalEndpointNavigationController(
141targetNavigationController,
142animator: modalEndpointNavigationTransitionsAnimator
143) { _ in }
144
145// Then
146if case .called(let animationContext) = modalEndpointNavigationTransitionsAnimator.animatePerforming! {
147XCTAssert(animationContext.sourceViewController === sourceViewController)
148XCTAssert(animationContext.targetNavigationController === targetNavigationController)
149} else { XCTFail() }
150}
151
152// MARK: ModalPresentationRouter
153
154func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentModalViewControllerDerivedFrom() {
155// Given
156let modalTransitionsAnimator = ModalTransitionsAnimatorSpy()
157
158// When
159router.presentModalViewControllerDerivedFrom( { (_) -> UIViewController in
160return targetViewController
161}, animator: modalTransitionsAnimator
162)
163
164// Then
165if case .called(let animationContext) = modalTransitionsAnimator.animatePerforming! {
166XCTAssert(animationContext.sourceViewController === sourceViewController)
167XCTAssert(animationContext.targetViewController === targetViewController)
168} else { XCTFail() }
169}
170
171func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentModalMasterDetailViewControllerDerivedFrom() {
172// Given
173let modalMasterDetailTransitionsAnimator = ModalMasterDetailTransitionsAnimatorSpy()
174
175// When
176router.presentModalMasterDetailViewControllerDerivedFrom(
177deriveMasterViewController: { (_) -> UIViewController in
178return UIViewController()
179},
180deriveDetailViewController: { (_) -> UIViewController in
181return UIViewController()
182},
183animator: modalMasterDetailTransitionsAnimator
184)
185
186// Then
187if case .called(let animationContext) = modalMasterDetailTransitionsAnimator.animatePerforming! {
188XCTAssert(animationContext.sourceViewController === sourceViewController)
189} else { XCTFail() }
190}
191
192func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentModalMasterDetailViewControllerDerivedFrom_IfCustomCustomMasterNavigationController_CustomDetailNavigationController_CustomSplitViewController() {
193// Given
194let modalMasterDetailTransitionsAnimator = ModalMasterDetailTransitionsAnimatorSpy()
195let splitViewController = UISplitViewController()
196
197// When
198router.presentModalMasterDetailViewControllerDerivedFrom(
199deriveMasterViewController: { (_) -> UIViewController in
200return UIViewController()
201},
202deriveDetailViewController: { (_) -> UIViewController in
203return UIViewController()
204},
205animator: modalMasterDetailTransitionsAnimator,
206masterNavigationController: UINavigationController(),
207detailNavigationController: UINavigationController(),
208splitViewController: splitViewController
209)
210
211// Then
212if case .called(let animationContext) = modalMasterDetailTransitionsAnimator.animatePerforming! {
213XCTAssert(animationContext.sourceViewController === sourceViewController)
214XCTAssert(animationContext.targetViewController === splitViewController)
215} else { XCTFail() }
216}
217
218func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentModalNavigationControllerWithRootViewControllerDerivedFrom() {
219// Given
220let modalNavigationTransitionsAnimator = ModalNavigationTransitionsAnimatorSpy()
221
222// When
223router.presentModalNavigationControllerWithRootViewControllerDerivedFrom( { (_) -> UIViewController in
224return targetViewController
225}, animator: modalNavigationTransitionsAnimator
226)
227
228// Then
229if case .called(let animationContext) = modalNavigationTransitionsAnimator.animatePerforming! {
230XCTAssert(animationContext.sourceViewController === sourceViewController)
231XCTAssert(animationContext.targetViewController === targetViewController)
232} else { XCTFail() }
233}
234
235func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentModalNavigationControllerWithRootViewControllerDerivedFrom_IfCustomNavigationController() {
236// Given
237let navigationController = UINavigationController()
238let modalNavigationTransitionsAnimator = ModalNavigationTransitionsAnimatorSpy()
239
240// When
241router.presentModalNavigationControllerWithRootViewControllerDerivedFrom( { (_) -> UIViewController in
242return targetViewController
243}, animator: modalNavigationTransitionsAnimator,
244navigationController: navigationController
245)
246
247// Then
248if case .called(let animationContext) = modalNavigationTransitionsAnimator.animatePerforming! {
249XCTAssert(animationContext.sourceViewController === sourceViewController)
250XCTAssert(animationContext.targetViewController === targetViewController)
251XCTAssert(animationContext.targetNavigationController === navigationController)
252} else { XCTFail() }
253}
254
255// MARK: PopoverPresentationRouter
256
257func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentPopoverFromRect() {
258guard UIDevice.current.userInterfaceIdiom == .pad
259else { return }
260
261// Given
262let rect = CGRect(x: 0, y: 1, width: 2, height: 3)
263let view = UIView()
264let popoverTransitionsAnimator = PopoverTransitionsAnimatorSpy()
265
266// When
267router.presentPopoverFromRect(
268rect,
269inView: view,
270withViewControllerDerivedFrom: { (_) -> UIViewController in
271return targetViewController
272},
273animator: popoverTransitionsAnimator
274)
275
276// Then
277if case .called(let animationContext) = popoverTransitionsAnimator.animatePerforming! {
278XCTAssert(animationContext.sourceViewController === sourceViewController)
279XCTAssert(animationContext.targetViewController === targetViewController)
280if case .popoverFromView(let sourceView, let sourceRect) = animationContext.transitionStyle {
281XCTAssertEqual(sourceRect, rect)
282XCTAssertEqual(sourceView, view)
283} else { XCTFail() }
284} else { XCTFail() }
285}
286
287func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentPopoverFromBarButtonItem() {
288guard UIDevice.current.userInterfaceIdiom == .pad
289else { return }
290
291// Given
292let barButtonItem = UIBarButtonItem()
293let popoverTransitionsAnimator = PopoverTransitionsAnimatorSpy()
294
295// When
296router.presentPopoverFromBarButtonItem(
297barButtonItem,
298withViewControllerDerivedFrom: { (_) -> UIViewController in
299return targetViewController
300},
301animator: popoverTransitionsAnimator
302)
303
304// Then
305if case .called(let animationContext) = popoverTransitionsAnimator.animatePerforming! {
306XCTAssert(animationContext.sourceViewController === sourceViewController)
307XCTAssert(animationContext.targetViewController === targetViewController)
308if case .popoverFromBarButtonItem(let buttonItem) = animationContext.transitionStyle {
309XCTAssert(buttonItem === barButtonItem)
310} else { XCTFail() }
311} else { XCTFail() }
312}
313
314func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentPopoverWithNavigationControllerFromRect() {
315guard UIDevice.current.userInterfaceIdiom == .pad
316else { return }
317
318// Given
319let rect = CGRect(x: 0, y: 1, width: 2, height: 3)
320let view = UIView()
321let popoverNavigationTransitionsAnimator = PopoverNavigationTransitionsAnimatorSpy()
322
323// When
324router.presentPopoverWithNavigationControllerFromRect(
325rect,
326inView: view,
327withViewControllerDerivedFrom: { (_) -> UIViewController in
328return targetViewController
329},
330animator: popoverNavigationTransitionsAnimator
331)
332
333// Then
334if case .called(let animationContext) = popoverNavigationTransitionsAnimator.animatePerforming! {
335XCTAssert(animationContext.sourceViewController === sourceViewController)
336XCTAssert(animationContext.targetViewController === targetViewController)
337if case .popoverFromView(let sourceView, let sourceRect) = animationContext.transitionStyle {
338XCTAssertEqual(sourceRect, rect)
339XCTAssertEqual(sourceView, view)
340} else { XCTFail() }
341} else { XCTFail() }
342}
343
344func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentPopoverWithNavigationControllerFromRect_IfCustomNavigationController() {
345guard UIDevice.current.userInterfaceIdiom == .pad
346else { return }
347
348// Given
349let rect = CGRect(x: 0, y: 1, width: 2, height: 3)
350let view = UIView()
351let navigationController = UINavigationController()
352let popoverNavigationTransitionsAnimator = PopoverNavigationTransitionsAnimatorSpy()
353
354// When
355router.presentPopoverWithNavigationControllerFromRect(
356rect,
357inView: view,
358withViewControllerDerivedFrom: { (_) -> UIViewController in
359return targetViewController
360},
361animator: popoverNavigationTransitionsAnimator,
362navigationController: navigationController
363)
364
365// Then
366if case .called(let animationContext) = popoverNavigationTransitionsAnimator.animatePerforming! {
367XCTAssert(animationContext.sourceViewController === sourceViewController)
368XCTAssert(animationContext.targetViewController === targetViewController)
369XCTAssert(animationContext.targetNavigationController === navigationController)
370if case .popoverFromView(let sourceView, let sourceRect) = animationContext.transitionStyle {
371XCTAssertEqual(sourceRect, rect)
372XCTAssertEqual(sourceView, view)
373} else { XCTFail() }
374} else { XCTFail() }
375}
376
377func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentPopoverWithNavigationControllerFromBarButtonItem() {
378guard UIDevice.current.userInterfaceIdiom == .pad
379else { return }
380
381// Given
382let barButtonItem = UIBarButtonItem()
383let popoverNavigationTransitionsAnimator = PopoverNavigationTransitionsAnimatorSpy()
384
385// When
386router.presentPopoverWithNavigationControllerFromBarButtonItem(
387barButtonItem,
388withViewControllerDerivedFrom: { (_) -> UIViewController in
389return targetViewController
390},
391animator: popoverNavigationTransitionsAnimator
392)
393
394// Then
395if case .called(let animationContext) = popoverNavigationTransitionsAnimator.animatePerforming! {
396XCTAssert(animationContext.sourceViewController === sourceViewController)
397XCTAssert(animationContext.targetViewController === targetViewController)
398if case .popoverFromBarButtonItem(let buttonItem) = animationContext.transitionStyle {
399XCTAssert(buttonItem === barButtonItem)
400} else { XCTFail() }
401} else { XCTFail() }
402}
403
404func testThatAnimatorIsCalledWithCorectPresentationAnimationContextOn_PresentPopoverWithNavigationControllerFromBarButtonItem_IfCustomnavigationController() {
405guard UIDevice.current.userInterfaceIdiom == .pad
406else { return }
407
408// Given
409let barButtonItem = UIBarButtonItem()
410let navigationController = UINavigationController()
411let popoverNavigationTransitionsAnimator = PopoverNavigationTransitionsAnimatorSpy()
412
413// When
414router.presentPopoverWithNavigationControllerFromBarButtonItem(
415barButtonItem,
416withViewControllerDerivedFrom: { (_) -> UIViewController in
417return targetViewController
418},
419animator: popoverNavigationTransitionsAnimator,
420navigationController: navigationController
421)
422
423// Then
424if case .called(let animationContext) = popoverNavigationTransitionsAnimator.animatePerforming! {
425XCTAssert(animationContext.sourceViewController === sourceViewController)
426XCTAssert(animationContext.targetViewController === targetViewController)
427XCTAssert(animationContext.targetNavigationController === navigationController)
428if case .popoverFromBarButtonItem(let buttonItem) = animationContext.transitionStyle {
429XCTAssert(buttonItem === barButtonItem)
430} else { XCTFail() }
431} else { XCTFail() }
432}
433}
434