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