marshroute

Форк
0
/
ModalPresentationRouterTests_BaseMasterDetailRouter.swift 
288 строк · 15.4 Кб
1
import XCTest
2
@testable import Marshroute
3

4
final class ModalPresentationRouterTests_BaseMasterDetailRouter: XCTestCase
5
{
6
    var masterAnimatingTransitionsHandlerSpy: AnimatingTransitionsHandlerSpy!
7
    var router: ModalPresentationRouter!
8
    
9
    override func setUp() {
10
        super.setUp()
11
        
12
        let transitionIdGenerator = TransitionIdGeneratorImpl()
13
        
14
        let peekAndPopTransitionsCoordinator = PeekAndPopUtilityImpl()
15
        
16
        let transitionsCoordinator = TransitionsCoordinatorImpl(
17
            stackClientProvider: TransitionContextsStackClientProviderImpl(),
18
            peekAndPopTransitionsCoordinator: peekAndPopTransitionsCoordinator
19
        )
20
        
21
        masterAnimatingTransitionsHandlerSpy = AnimatingTransitionsHandlerSpy(
22
            transitionsCoordinator: transitionsCoordinator
23
        )
24
        
25
        router = BaseMasterDetailRouter(
26
            routerSeed: MasterDetailRouterSeed(
27
                masterTransitionsHandlerBox: .init(
28
                    animatingTransitionsHandler: masterAnimatingTransitionsHandlerSpy
29
                ),
30
                detailTransitionsHandlerBox: .init(
31
                    animatingTransitionsHandler: AnimatingTransitionsHandlerSpy(
32
                        transitionsCoordinator: transitionsCoordinator
33
                    )
34
                ),
35
                transitionId: transitionIdGenerator.generateNewTransitionId(),
36
                presentingTransitionsHandler: nil,
37
                transitionsHandlersProvider: transitionsCoordinator,
38
                transitionIdGenerator: transitionIdGenerator,
39
                controllersProvider: RouterControllersProviderImpl(),
40
                routerTransitionDelegate: nil
41
            )
42
        )
43
    }
44
    
45
    // MARK: - UIViewController
46
    
47
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalViewControllerDerivedFrom_WithCorrectPresentationContext() {
48
        // Given
49
        let targetViewController = UIViewController()
50
        var nextModuleRouterSeed: RouterSeed!
51
        
52
        // When
53
        router.presentModalViewControllerDerivedFrom { (routerSeed) -> UIViewController in
54
            nextModuleRouterSeed = routerSeed
55
            return targetViewController
56
        }
57
        
58
        // Then
59
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
60
        
61
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
62
        XCTAssertEqual(presentationContext?.transitionId, nextModuleRouterSeed.transitionId)
63
        XCTAssert(presentationContext?.targetViewController === targetViewController)
64
        if case .some(.animating) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
65
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
66
        if case .some(.modal(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
67
            XCTAssert(launchingContext.targetViewController! == targetViewController)
68
        } else { XCTFail() }
69
    }
70
    
71
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalViewControllerDerivedFrom_WithCorrectPresentationContext_IfCustomAnimator() {
72
        // Given
73
        let targetViewController = UIViewController()
74
        var nextModuleRouterSeed: RouterSeed!
75
        let modalTransitionsAnimator = ModalTransitionsAnimator()
76
        
77
        // When
78
        router.presentModalViewControllerDerivedFrom( { (routerSeed) -> UIViewController in
79
            nextModuleRouterSeed = routerSeed
80
            return targetViewController
81
            }, animator: modalTransitionsAnimator
82
        )
83
        
84
        // Then
85
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
86
        
87
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
88
        XCTAssertEqual(presentationContext?.transitionId, nextModuleRouterSeed.transitionId)
89
        XCTAssert(presentationContext?.targetViewController === targetViewController)
90
        if case .some(.animating) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
91
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
92
        if case .some(.modal(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
93
            XCTAssert(launchingContext.animator === modalTransitionsAnimator)
94
            XCTAssert(launchingContext.targetViewController! === targetViewController)
95
        } else { XCTFail() }
96
    }
97
    
98
    // MARK: - UISplitViewController
99
    
100
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalMasterDetailViewControllerDerivedFrom_WithCorrectPresentationContext() {
101
        // Given
102
        let targetMasterViewController = UIViewController()
103
        let targetDetailViewController = UIViewController()
104
        var nextMasterDetailModuleRouterSeed: MasterDetailRouterSeed!
105
        var nextDetailModuleRouterSeed: RouterSeed!
106
        
107
        // When
108
        router.presentModalMasterDetailViewControllerDerivedFrom(
109
            deriveMasterViewController: { (routerSeed) -> UIViewController in
110
                nextMasterDetailModuleRouterSeed = routerSeed
111
                return targetMasterViewController
112
            },
113
            deriveDetailViewController: { (routerSeed) -> UIViewController in
114
                nextDetailModuleRouterSeed = routerSeed
115
                return targetDetailViewController
116
            }
117
        )
118
        
119
        // Then
120
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
121
        
122
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
123
        XCTAssertEqual(presentationContext?.transitionId, nextMasterDetailModuleRouterSeed.transitionId)
124
        XCTAssertEqual(presentationContext?.transitionId, nextDetailModuleRouterSeed.transitionId)
125

126
        if case .some(.containing) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
127
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
128
        if case .some(.modalMasterDetail) = presentationContext?.presentationAnimationLaunchingContextBox {} else { XCTFail() }
129
    }
130
    
131
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalMasterDetailViewControllerDerivedFrom_WithCorrectPresentationContext_IfCustomAnimator() {
132
        // Given
133
        let targetMasterViewController = UIViewController()
134
        let targetDetailViewController = UIViewController()
135
        let modalMasterDetailTransitionsAnimator = ModalMasterDetailTransitionsAnimator()
136
        var nextMasterDetailModuleRouterSeed: MasterDetailRouterSeed!
137
        var nextDetailModuleRouterSeed: RouterSeed!
138
        
139
        // When
140
        router.presentModalMasterDetailViewControllerDerivedFrom(
141
            deriveMasterViewController: { (routerSeed) -> UIViewController in
142
                nextMasterDetailModuleRouterSeed = routerSeed
143
                return targetMasterViewController
144
            },
145
            deriveDetailViewController: { (routerSeed) -> UIViewController in
146
                nextDetailModuleRouterSeed = routerSeed
147
                return targetDetailViewController
148
            },
149
            animator: modalMasterDetailTransitionsAnimator
150
        )
151
        
152
        // Then
153
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
154
        
155
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
156
        XCTAssertEqual(presentationContext?.transitionId, nextMasterDetailModuleRouterSeed.transitionId)
157
        XCTAssertEqual(presentationContext?.transitionId, nextDetailModuleRouterSeed.transitionId)
158
        
159
        if case .some(.containing) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
160
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
161
        if case .some(.modalMasterDetail(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
162
            XCTAssert(launchingContext.animator === modalMasterDetailTransitionsAnimator)
163
        } else { XCTFail() }
164
    }
165
    
166
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalMasterDetailViewControllerDerivedFrom_WithCorrectPresentationContext_IfCustomAnimator_CustomMasterNavigationController_CustomDetailNavigationController_CustomSplitViewController() {
167
        // Given
168
        let targetMasterViewController = UIViewController()
169
        let targetDetailViewController = UIViewController()
170
        let splitViewController = UISplitViewController()
171
        let modalMasterDetailTransitionsAnimator = ModalMasterDetailTransitionsAnimator()
172
        var nextMasterDetailModuleRouterSeed: MasterDetailRouterSeed!
173
        var nextDetailModuleRouterSeed: RouterSeed!
174
        
175
        // When
176
        router.presentModalMasterDetailViewControllerDerivedFrom(
177
            deriveMasterViewController: { (routerSeed) -> UIViewController in
178
                nextMasterDetailModuleRouterSeed = routerSeed
179
                return targetMasterViewController
180
            },
181
            deriveDetailViewController: { (routerSeed) -> UIViewController in
182
                nextDetailModuleRouterSeed = routerSeed
183
                return targetDetailViewController
184
            },
185
            animator: modalMasterDetailTransitionsAnimator,
186
            masterNavigationController: UINavigationController(),
187
            detailNavigationController: UINavigationController(),
188
            splitViewController: splitViewController
189
        )
190
        
191
        // Then
192
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
193
        
194
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
195
        XCTAssertEqual(presentationContext?.transitionId, nextMasterDetailModuleRouterSeed.transitionId)
196
        XCTAssertEqual(presentationContext?.transitionId, nextDetailModuleRouterSeed.transitionId)
197
        
198
        if case .some(.containing) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
199
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
200
        if case .some(.modalMasterDetail(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
201
            XCTAssert(launchingContext.animator === modalMasterDetailTransitionsAnimator)
202
            XCTAssert(launchingContext.targetViewController! === splitViewController)
203
        } else { XCTFail() }
204
    }
205
    
206
    // MARK: - UIViewController in UINavigationController
207
    
208
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalNavigationControllerWithRootViewControllerDerivedFrom_WithCorrectPresentationContext() {
209
        // Given
210
        let targetViewController = UIViewController()
211
        var nextModuleRouterSeed: RouterSeed!
212
        
213
        // When
214
        router.presentModalNavigationControllerWithRootViewControllerDerivedFrom { (routerSeed) -> UIViewController in
215
            nextModuleRouterSeed = routerSeed
216
            return targetViewController
217
        }
218
        
219
        // Then
220
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
221
        
222
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
223
        XCTAssertEqual(presentationContext?.transitionId, nextModuleRouterSeed.transitionId)
224
        XCTAssert(presentationContext?.targetViewController === targetViewController)
225
        if case .some(.animating) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
226
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
227
        if case .some(.modalNavigation(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
228
            XCTAssert(launchingContext.targetViewController! === targetViewController)
229
        } else { XCTFail() }
230
    }
231
    
232
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalNavigationControllerWithRootViewControllerDerivedFrom_WithCorrectPresentationContext_IfCustomAnimator() {
233
        // Given
234
        let targetViewController = UIViewController()
235
        var nextModuleRouterSeed: RouterSeed!
236
        let modalNavigationTransitionsAnimator = ModalNavigationTransitionsAnimator()
237
        
238
        // When
239
        router.presentModalNavigationControllerWithRootViewControllerDerivedFrom( { (routerSeed) -> UIViewController in
240
            nextModuleRouterSeed = routerSeed
241
            return targetViewController
242
            }, animator: modalNavigationTransitionsAnimator
243
        )
244
        
245
        // Then
246
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
247
        
248
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
249
        XCTAssertEqual(presentationContext?.transitionId, nextModuleRouterSeed.transitionId)
250
        XCTAssert(presentationContext?.targetViewController === targetViewController)
251
        if case .some(.animating) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
252
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
253
        if case .some(.modalNavigation(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
254
            XCTAssert(launchingContext.animator === modalNavigationTransitionsAnimator)
255
            XCTAssert(launchingContext.targetViewController! === targetViewController)
256
        } else { XCTFail() }
257
    }
258
    
259
    func testThatMasterDetailRouterCallsItsMasterTransitionsHandlerOn_PresentModalNavigationControllerWithRootViewControllerDerivedFrom_WithCorrectPresentationContext_IfCustomAnimator_CustomNavigationController() {
260
        // Given
261
        let targetViewController = UIViewController()
262
        let navigationController = UINavigationController()
263
        var nextModuleRouterSeed: RouterSeed!
264
        let modalNavigationTransitionsAnimator = ModalNavigationTransitionsAnimator()
265
        
266
        // When
267
        router.presentModalNavigationControllerWithRootViewControllerDerivedFrom( { (routerSeed) -> UIViewController in
268
            nextModuleRouterSeed = routerSeed
269
            return targetViewController
270
            }, animator: modalNavigationTransitionsAnimator,
271
               navigationController: navigationController
272
        )
273
        
274
        // Then
275
        XCTAssert(masterAnimatingTransitionsHandlerSpy.performTransitionCalled)
276
        
277
        let presentationContext = masterAnimatingTransitionsHandlerSpy.perFormTransitionContextParameter
278
        XCTAssertEqual(presentationContext?.transitionId, nextModuleRouterSeed.transitionId)
279
        XCTAssert(presentationContext?.targetViewController === targetViewController)
280
        if case .some(.animating) = presentationContext?.targetTransitionsHandlerBox {} else { XCTFail() }
281
        XCTAssert(presentationContext?.storableParameters! is NavigationTransitionStorableParameters)
282
        if case .some(.modalNavigation(let launchingContext)) = presentationContext?.presentationAnimationLaunchingContextBox {
283
            XCTAssert(launchingContext.animator === modalNavigationTransitionsAnimator)
284
            XCTAssert(launchingContext.targetViewController! === targetViewController)
285
            XCTAssert(launchingContext.targetNavigationController! === navigationController)
286
        } else { XCTFail() }
287
    }
288
}
289

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.