Skip to content

Commit 6a403fa

Browse files
authored
Merge pull request #162 from ramblex/master
Allow elements to be moved to start of FirebaseArray (potential fix for #129)
2 parents 4fd5e28 + d92efb6 commit 6a403fa

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

FirebaseDatabaseUI/FirebaseArray.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,13 @@ - (void)initListeners {
123123
NSUInteger fromIndex = [self indexForKey:snapshot.key];
124124
[self.snapshots removeObjectAtIndex:fromIndex];
125125

126-
NSUInteger toIndex = [self indexForKey:previousChildKey] + 1;
126+
NSUInteger toIndex = 0;
127+
if (previousChildKey != nil) {
128+
NSUInteger prevIndex = [self indexForKey:previousChildKey];
129+
if (prevIndex != NSNotFound) {
130+
toIndex = prevIndex + 1;
131+
}
132+
}
127133
[self.snapshots insertObject:snapshot atIndex:toIndex];
128134

129135
if ([self.delegate respondsToSelector:@selector(array:didMoveObject:fromIndex:toIndex:)]) {

FirebaseDatabaseUITests/FirebaseArrayTest.m

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,4 +378,68 @@ - (void)testFirebaseArrayCanMoveElement {
378378
XCTAssert(expectedParametersWereCorrect, @"unexpected parameter in delegate callback");
379379
}
380380

381+
- (void)testFirebaseArrayCanMoveElementToStart {
382+
[self.observable populateWithCount:10];
383+
self.snap.key = @"8";
384+
385+
// Test delegate
386+
__block BOOL delegateWasCalled = NO;
387+
__block BOOL expectedParametersWereCorrect = NO;
388+
self.arrayDelegate.didMoveObject = ^(FirebaseArray *array, id object, NSUInteger from, NSUInteger to) {
389+
// Xcode complains about retain cycles if an XCTAssert is placed in here.
390+
delegateWasCalled = YES;
391+
expectedParametersWereCorrect = (array == self.firebaseArray &&
392+
object == self.snap &&
393+
from == 8 && to == 0);
394+
};
395+
396+
// Move 8 to the start
397+
[self.observable sendEvent:FIRDataEventTypeChildMoved withObject:self.snap previousKey:@"" error:nil];
398+
399+
// Array expectation
400+
NSArray *items = self.firebaseArray.items;
401+
NSArray *expected = @[@"8", @"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"9"];
402+
NSMutableArray *result = [NSMutableArray array];
403+
for (FUIFakeSnapshot *snapshot in items) {
404+
[result addObject:snapshot.key];
405+
}
406+
XCTAssert([result isEqual:expected], @"expected firebaseArray contents to equal %@, got %@", expected, [result copy]);
407+
408+
// Delegate expectations
409+
XCTAssert(delegateWasCalled, @"expected delegate to receive callback for deletion");
410+
XCTAssert(expectedParametersWereCorrect, @"unexpected parameter in delegate callback");
411+
}
412+
413+
- (void)testFirebaseArrayMovesElementToStartWithNilPreviousKey {
414+
[self.observable populateWithCount:10];
415+
self.snap.key = @"6";
416+
417+
// Test delegate
418+
__block BOOL delegateWasCalled = NO;
419+
__block BOOL expectedParametersWereCorrect = NO;
420+
self.arrayDelegate.didMoveObject = ^(FirebaseArray *array, id object, NSUInteger from, NSUInteger to) {
421+
// Xcode complains about retain cycles if an XCTAssert is placed in here.
422+
delegateWasCalled = YES;
423+
expectedParametersWereCorrect = (array == self.firebaseArray &&
424+
object == self.snap &&
425+
from == 6 && to == 0);
426+
};
427+
428+
// Move 8 to the start
429+
[self.observable sendEvent:FIRDataEventTypeChildMoved withObject:self.snap previousKey:nil error:nil];
430+
431+
// Array expectation
432+
NSArray *items = self.firebaseArray.items;
433+
NSArray *expected = @[@"6", @"0", @"1", @"2", @"3", @"4", @"5", @"7", @"8", @"9"];
434+
NSMutableArray *result = [NSMutableArray array];
435+
for (FUIFakeSnapshot *snapshot in items) {
436+
[result addObject:snapshot.key];
437+
}
438+
XCTAssert([result isEqual:expected], @"expected firebaseArray contents to equal %@, got %@", expected, [result copy]);
439+
440+
// Delegate expectations
441+
XCTAssert(delegateWasCalled, @"expected delegate to receive callback for deletion");
442+
XCTAssert(expectedParametersWereCorrect, @"unexpected parameter in delegate callback");
443+
}
444+
381445
@end

0 commit comments

Comments
 (0)