@@ -17,7 +17,9 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
1717 private( set) var fetchCompletion : ( ( [ TestObject ] ) -> Void ) !
1818
1919 private var paginationCurrentResults : [ TestObject ] !
20- private var paginationCompletion : ( ( [ TestObject ] ? ) -> Void ) !
20+ private var paginationRequestCompletion : ( ( [ TestObject ] ? ) -> Void ) !
21+
22+ private var performPaginationCompletionResult : Bool !
2123
2224 private var associationRequest : TestObject . AssociationRequest !
2325
@@ -35,7 +37,7 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
3537 }
3638 let paginationRequest : PaginatingFetchDefinition < TestObject > . PaginationRequest = { [ unowned self] currentResults, completion in
3739 self . paginationCurrentResults = currentResults
38- self . paginationCompletion = completion
40+ self . paginationRequestCompletion = completion
3941 }
4042
4143 let desiredAssociations = TestObject . fetchRequestAssociations (
@@ -72,7 +74,8 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
7274 controller = nil
7375 fetchCompletion = nil
7476 paginationCurrentResults = nil
75- paginationCompletion = nil
77+ paginationRequestCompletion = nil
78+ performPaginationCompletionResult = nil
7679 associationRequest = nil
7780 inclusionCheck = nil
7881
@@ -124,7 +127,8 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
124127
125128 fetchCompletion = nil
126129 paginationCurrentResults = nil
127- paginationCompletion = nil
130+ paginationRequestCompletion = nil
131+ performPaginationCompletionResult = nil
128132 changeEvents. removeAll ( )
129133
130134 // Trigger pagination
@@ -133,6 +137,8 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
133137
134138 performPagination ( paginationObjectIDs)
135139
140+ XCTAssertTrue ( performPaginationCompletionResult)
141+
136142 XCTAssertEqual ( controller. sections. count, 1 )
137143 XCTAssertEqual ( controller. sections [ 0 ] . fetchedIDs, objectIDs + paginationObjectIDs)
138144
@@ -161,7 +167,8 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
161167
162168 fetchCompletion = nil
163169 paginationCurrentResults = nil
164- paginationCompletion = nil
170+ paginationRequestCompletion = nil
171+ performPaginationCompletionResult = nil
165172 changeEvents. removeAll ( )
166173
167174 // Trigger pagination
@@ -170,9 +177,12 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
170177
171178 performPagination ( paginationObjectIDs)
172179
180+ XCTAssertTrue ( performPaginationCompletionResult)
181+
173182 fetchCompletion = nil
174183 paginationCurrentResults = nil
175- paginationCompletion = nil
184+ paginationRequestCompletion = nil
185+ performPaginationCompletionResult = nil
176186 changeEvents. removeAll ( )
177187
178188 // Trigger insert
@@ -184,7 +194,7 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
184194
185195 XCTAssertNil ( fetchCompletion)
186196 XCTAssertNil ( paginationCurrentResults)
187- XCTAssertNil ( paginationCompletion )
197+ XCTAssertNil ( paginationRequestCompletion )
188198
189199 XCTAssertEqual ( controller. sections. count, 1 )
190200 XCTAssertEqual ( controller. sections [ 0 ] . fetchedIDs, [ " a " , " b " , " c " , " d " , " e " , " f " ] )
@@ -193,6 +203,71 @@ class PaginatingFetchedResultsControllerTestCase: XCTestCase, FetchedResultsCont
193203 XCTAssertEqual ( changeEvents [ 0 ] . change, FetchedResultsChange . insert ( location: IndexPath ( item: 4 , section: 0 ) ) )
194204 XCTAssertEqual ( changeEvents [ 0 ] . object. id, " e " )
195205 }
206+
207+ func testPaginationHasObjects( ) async throws {
208+ controller = PaginatingFetchedResultsController (
209+ definition: createFetchDefinition ( ) ,
210+ debounceInsertsAndReloads: false
211+ )
212+ controller. setDelegate ( self )
213+
214+ // Fetch some objects
215+
216+ let objectIDs = [ " a " , " b " , " c " ]
217+
218+ try performFetch ( objectIDs)
219+
220+ fetchCompletion = nil
221+ paginationCurrentResults = nil
222+ paginationRequestCompletion = nil
223+ performPaginationCompletionResult = nil
224+ changeEvents. removeAll ( )
225+
226+ // Trigger pagination
227+
228+ let paginationObjectIDs = [ " d " , " f " ]
229+
230+ performPagination ( paginationObjectIDs)
231+
232+ XCTAssertTrue ( performPaginationCompletionResult)
233+
234+ XCTAssertEqual ( controller. sections. count, 1 )
235+ XCTAssertEqual ( controller. sections [ 0 ] . fetchedIDs, objectIDs + paginationObjectIDs)
236+
237+ XCTAssertEqual ( changeEvents. count, 2 )
238+ XCTAssertEqual ( changeEvents [ 0 ] . change, FetchedResultsChange . insert ( location: IndexPath ( item: 3 , section: 0 ) ) )
239+ XCTAssertEqual ( changeEvents [ 0 ] . object. id, " d " )
240+ XCTAssertEqual ( changeEvents [ 1 ] . change, FetchedResultsChange . insert ( location: IndexPath ( item: 4 , section: 0 ) ) )
241+ XCTAssertEqual ( changeEvents [ 1 ] . object. id, " f " )
242+ }
243+
244+ func testPaginationDoesNotHaveObjects( ) async throws {
245+ controller = PaginatingFetchedResultsController (
246+ definition: createFetchDefinition ( ) ,
247+ debounceInsertsAndReloads: false
248+ )
249+ controller. setDelegate ( self )
250+
251+ // Fetch some objects
252+
253+ let objectIDs = [ " a " , " b " , " c " ]
254+
255+ try performFetch ( objectIDs)
256+
257+ fetchCompletion = nil
258+ paginationCurrentResults = nil
259+ paginationRequestCompletion = nil
260+ performPaginationCompletionResult = nil
261+ changeEvents. removeAll ( )
262+
263+ // Trigger pagination
264+
265+ let paginationObjectIDs : [ String ] = [ ]
266+
267+ performPagination ( paginationObjectIDs)
268+
269+ XCTAssertFalse ( performPaginationCompletionResult)
270+ }
196271}
197272
198273// MARK: - FetchedResultsControllerDelegate
@@ -217,9 +292,11 @@ private extension PaginatingFetchedResultsControllerTestCase {
217292 }
218293
219294 func performPagination( _ objects: [ TestObject ] , file: StaticString = #file, line: UInt = #line) {
220- controller. performPagination ( )
295+ controller. performPagination { hasPageResults in
296+ self . performPaginationCompletionResult = hasPageResults
297+ }
221298
222- self . paginationCompletion ( objects)
299+ self . paginationRequestCompletion ( objects)
223300
224301 let hasAllObjects = objects. allSatisfy { controller. fetchedObjects. contains ( $0) }
225302 XCTAssertTrue ( hasAllObjects, file: file, line: line)
0 commit comments