marshroute
286 строк · 13.6 Кб
1import XCTest
2@testable import Marshroute
3
4final class RouterFocusableTests: XCTestCase
5{
6var transitionId: TransitionId!
7var transitionIdGenerator: TransitionIdGenerator!
8var transitionsCoordinator: TransitionsCoordinatorImpl!
9
10var masterAnimatingTransitionsHandlerSpy: AnimatingTransitionsHandlerSpy!
11var detailAnimatingTransitionsHandlerSpy: AnimatingTransitionsHandlerSpy!
12var masterContainingTransitionsHandlerSpy: ContainingTransitionsHandlerSpy!
13var detailContainingTransitionsHandlerSpy: ContainingTransitionsHandlerSpy!
14
15var dummyPresentingTransitionsHandler: DummyAnimatingTransitionsHandler!
16
17override func setUp() {
18super.setUp()
19
20transitionIdGenerator = TransitionIdGeneratorImpl()
21transitionId = transitionIdGenerator.generateNewTransitionId()
22
23let peekAndPopTransitionsCoordinator = PeekAndPopUtilityImpl()
24
25transitionsCoordinator = TransitionsCoordinatorImpl(
26stackClientProvider: TransitionContextsStackClientProviderImpl(),
27peekAndPopTransitionsCoordinator: peekAndPopTransitionsCoordinator
28)
29
30masterAnimatingTransitionsHandlerSpy = AnimatingTransitionsHandlerSpy(
31transitionsCoordinator: transitionsCoordinator
32)
33
34detailAnimatingTransitionsHandlerSpy = AnimatingTransitionsHandlerSpy(
35transitionsCoordinator: transitionsCoordinator
36)
37
38masterContainingTransitionsHandlerSpy = ContainingTransitionsHandlerSpy(
39transitionsCoordinator: transitionsCoordinator
40)
41
42detailContainingTransitionsHandlerSpy = ContainingTransitionsHandlerSpy(
43transitionsCoordinator: transitionsCoordinator
44)
45
46dummyPresentingTransitionsHandler = DummyAnimatingTransitionsHandler()
47}
48
49// MARK: - BaseRouter
50
51func testThatNotRootRouterCallsItsTransitionsHandlerOn_FocusOnCurrentModule_IfItsTransitionHandlerIsAnimating() {
52// Given
53let router = BaseRouter( // Base Router
54routerSeed: RouterSeed(
55transitionsHandlerBox: .init(
56animatingTransitionsHandler: masterAnimatingTransitionsHandlerSpy // Animating Transitions Handler
57),
58transitionId: transitionId,
59presentingTransitionsHandler: dummyPresentingTransitionsHandler, // Not Root Router
60transitionsHandlersProvider: transitionsCoordinator,
61transitionIdGenerator: transitionIdGenerator,
62controllersProvider: RouterControllersProviderImpl(),
63routerTransitionDelegate: nil
64)
65)
66
67// When
68router.focusOnCurrentModule()
69
70// Then
71XCTAssert(router.transitionsHandlerBox.unbox() === masterAnimatingTransitionsHandlerSpy)
72XCTAssert(router.presentingTransitionsHandler === dummyPresentingTransitionsHandler)
73
74XCTAssert(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterCalled)
75XCTAssertEqual(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterTransitionIdParameter, transitionId)
76}
77
78func testThatNotRootRouterCallsItsTransitionsHandlerOn_FocusOnCurrentModule_IfItsTransitionHandlerIsContaining() {
79// Given
80let router = BaseRouter( // Base Router
81routerSeed: RouterSeed(
82transitionsHandlerBox: .init(
83containingTransitionsHandler: masterContainingTransitionsHandlerSpy // Containing Transitions Handler
84),
85transitionId: transitionId,
86presentingTransitionsHandler: dummyPresentingTransitionsHandler, // Not Root Router
87transitionsHandlersProvider: transitionsCoordinator,
88transitionIdGenerator: transitionIdGenerator,
89controllersProvider: RouterControllersProviderImpl(),
90routerTransitionDelegate: nil
91)
92)
93
94// When
95router.focusOnCurrentModule()
96
97// Then
98XCTAssert(router.transitionsHandlerBox.unbox() === masterContainingTransitionsHandlerSpy)
99XCTAssert(router.presentingTransitionsHandler === dummyPresentingTransitionsHandler)
100
101XCTAssert(masterContainingTransitionsHandlerSpy.undoTransitionsAfterCalled)
102XCTAssertEqual(masterContainingTransitionsHandlerSpy.undoTransitionsAfterTransitionIdParameter, transitionId)
103}
104
105func testThatRootRouterCallsItsTransitionsHandlerOn_FocusOnCurrentModule_IfItsTransitionHandlerIsAnimating() {
106// Given
107let router = BaseRouter( // Router
108routerSeed: RouterSeed(
109transitionsHandlerBox: .init(
110animatingTransitionsHandler: masterAnimatingTransitionsHandlerSpy // Animating Transitions Handler
111),
112transitionId: transitionId,
113presentingTransitionsHandler: nil, // Root Router
114transitionsHandlersProvider: transitionsCoordinator,
115transitionIdGenerator: transitionIdGenerator,
116controllersProvider: RouterControllersProviderImpl(),
117routerTransitionDelegate: nil
118)
119)
120
121// When
122router.focusOnCurrentModule()
123
124// Then
125XCTAssert(router.transitionsHandlerBox.unbox() === masterAnimatingTransitionsHandlerSpy)
126XCTAssertNil(router.presentingTransitionsHandler)
127
128XCTAssert(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterCalled)
129XCTAssertEqual(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterTransitionIdParameter, transitionId)
130}
131
132func testThatRootRouterDoesNotCallItsTransitionsHandlerOn_FocusOnCurrentModule_IfItsTransitionHandlerIsContaining() {
133// Given
134let router = BaseRouter( // Router
135routerSeed: RouterSeed(
136transitionsHandlerBox: .init(
137containingTransitionsHandler: masterContainingTransitionsHandlerSpy // Containing Transitions Handler
138),
139transitionId: transitionId,
140presentingTransitionsHandler: nil, // Root Router
141transitionsHandlersProvider: transitionsCoordinator,
142transitionIdGenerator: transitionIdGenerator,
143controllersProvider: RouterControllersProviderImpl(),
144routerTransitionDelegate: nil
145)
146)
147
148// When
149router.focusOnCurrentModule()
150
151// Then
152XCTAssert(router.transitionsHandlerBox.unbox() === masterContainingTransitionsHandlerSpy)
153XCTAssertNil(router.presentingTransitionsHandler)
154
155XCTAssertFalse(masterContainingTransitionsHandlerSpy.undoTransitionsAfterCalled)
156}
157
158// MARK: - BaseMasterDetailRouter
159
160func testThatNotRootMasterDetailRouterCallsItsMasterTransitionsHandlerOn_FocusOnCurrentModule_IfItsMasterTransitionHandlerIsAnimating() {
161// Given
162let masterDetailRouter = BaseMasterDetailRouter( // MasterDetail Router
163routerSeed: MasterDetailRouterSeed(
164masterTransitionsHandlerBox: .init(
165animatingTransitionsHandler: masterAnimatingTransitionsHandlerSpy // Animating Master Transitions Handler
166),
167detailTransitionsHandlerBox: .init(
168animatingTransitionsHandler: detailAnimatingTransitionsHandlerSpy
169),
170transitionId: transitionId,
171presentingTransitionsHandler: dummyPresentingTransitionsHandler, // Not Root Router
172transitionsHandlersProvider: transitionsCoordinator,
173transitionIdGenerator: transitionIdGenerator,
174controllersProvider: RouterControllersProviderImpl(),
175routerTransitionDelegate: nil
176)
177)
178
179// When
180masterDetailRouter.focusOnCurrentModule()
181
182// Then
183XCTAssert(masterDetailRouter.masterTransitionsHandlerBox.unbox() === masterAnimatingTransitionsHandlerSpy)
184XCTAssert(masterDetailRouter.detailTransitionsHandlerBox.unbox() === detailAnimatingTransitionsHandlerSpy)
185XCTAssert(masterDetailRouter.presentingTransitionsHandler === dummyPresentingTransitionsHandler)
186
187XCTAssert(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterCalled)
188XCTAssertEqual(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterTransitionIdParameter, transitionId)
189XCTAssertFalse(detailAnimatingTransitionsHandlerSpy.undoTransitionsAfterCalled)
190}
191
192func testThatNotRootMasterDetailRouterCallsItsMasterTransitionsHandlerOn_FocusOnCurrentModule_IfItsMasterTransitionHandlerIsContaining() {
193// Given
194let masterDetailRouter = BaseMasterDetailRouter( // MasterDetail Router
195routerSeed: MasterDetailRouterSeed(
196masterTransitionsHandlerBox: .init(
197containingTransitionsHandler: masterContainingTransitionsHandlerSpy // Containing Master Transitions Handler
198),
199detailTransitionsHandlerBox: .init(
200containingTransitionsHandler: detailContainingTransitionsHandlerSpy
201),
202transitionId: transitionId,
203presentingTransitionsHandler: dummyPresentingTransitionsHandler, // Not Root Router
204transitionsHandlersProvider: transitionsCoordinator,
205transitionIdGenerator: transitionIdGenerator,
206controllersProvider: RouterControllersProviderImpl(),
207routerTransitionDelegate: nil
208)
209)
210
211// When
212masterDetailRouter.focusOnCurrentModule()
213
214// Then
215XCTAssert(masterDetailRouter.masterTransitionsHandlerBox.unbox() === masterContainingTransitionsHandlerSpy)
216XCTAssert(masterDetailRouter.detailTransitionsHandlerBox.unbox() === detailContainingTransitionsHandlerSpy)
217XCTAssert(masterDetailRouter.presentingTransitionsHandler === dummyPresentingTransitionsHandler)
218
219XCTAssert(masterContainingTransitionsHandlerSpy.undoTransitionsAfterCalled)
220XCTAssertEqual(masterContainingTransitionsHandlerSpy.undoTransitionsAfterTransitionIdParameter, transitionId)
221XCTAssertFalse(detailContainingTransitionsHandlerSpy.undoTransitionsAfterCalled)
222}
223
224func testThatRootMasterDetailRouterCallsItsMasterTransitionsHandlerOn_FocusOnCurrentModule_IfItsMasterTransitionHandlerIsAnimating() {
225// Given
226let masterDetailRouter = BaseMasterDetailRouter( // MasterDetail Router
227routerSeed: MasterDetailRouterSeed(
228masterTransitionsHandlerBox: .init(
229animatingTransitionsHandler: masterAnimatingTransitionsHandlerSpy // Animating Master Transitions Handler
230),
231detailTransitionsHandlerBox: .init(
232animatingTransitionsHandler: detailAnimatingTransitionsHandlerSpy
233),
234transitionId: transitionId,
235presentingTransitionsHandler: nil, // Root Router
236transitionsHandlersProvider: transitionsCoordinator,
237transitionIdGenerator: transitionIdGenerator,
238controllersProvider: RouterControllersProviderImpl(),
239routerTransitionDelegate: nil
240)
241)
242
243// When
244masterDetailRouter.focusOnCurrentModule()
245
246// Then
247XCTAssert(masterDetailRouter.masterTransitionsHandlerBox.unbox() === masterAnimatingTransitionsHandlerSpy)
248XCTAssert(masterDetailRouter.detailTransitionsHandlerBox.unbox() === detailAnimatingTransitionsHandlerSpy)
249XCTAssertNil(masterDetailRouter.presentingTransitionsHandler)
250
251XCTAssert(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterCalled)
252XCTAssertEqual(masterAnimatingTransitionsHandlerSpy.undoTransitionsAfterTransitionIdParameter, transitionId)
253XCTAssertFalse(detailAnimatingTransitionsHandlerSpy.undoTransitionsAfterCalled)
254}
255
256func testThatRootMasterDetailRouterDoesNotCallItsMasterTransitionsHandlerOn_FocusOnCurrentModule_IfItsMasterTransitionHandlerIsContaining() {
257// Given
258let masterDetailRouter = BaseMasterDetailRouter( // MasterDetail Router
259routerSeed: MasterDetailRouterSeed(
260masterTransitionsHandlerBox: .init(
261containingTransitionsHandler: masterContainingTransitionsHandlerSpy // Containing Master Transitions Handler
262),
263detailTransitionsHandlerBox: .init(
264containingTransitionsHandler: detailContainingTransitionsHandlerSpy
265),
266transitionId: transitionId,
267presentingTransitionsHandler: nil, // Root Router
268transitionsHandlersProvider: transitionsCoordinator,
269transitionIdGenerator: transitionIdGenerator,
270controllersProvider: RouterControllersProviderImpl(),
271routerTransitionDelegate: nil
272)
273)
274
275// When
276masterDetailRouter.focusOnCurrentModule()
277
278// Then
279XCTAssert(masterDetailRouter.masterTransitionsHandlerBox.unbox() === masterContainingTransitionsHandlerSpy)
280XCTAssert(masterDetailRouter.detailTransitionsHandlerBox.unbox() === detailContainingTransitionsHandlerSpy)
281XCTAssertNil(masterDetailRouter.presentingTransitionsHandler)
282
283XCTAssertFalse(masterContainingTransitionsHandlerSpy.undoTransitionsAfterCalled)
284XCTAssertFalse(detailContainingTransitionsHandlerSpy.undoTransitionsAfterCalled)
285}
286}
287