2017-05-15 12:27:07 -07:00
|
|
|
/*
|
|
|
|
|
* Copyright 2017 Google
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
2020-06-22 07:58:52 -07:00
|
|
|
#import "FirebaseDatabase/Tests/Unit/FIRMutableDataTests.h"
|
|
|
|
|
#import "FirebaseDatabase/Sources/Api/Private/FIRMutableData_Private.h"
|
|
|
|
|
#import "FirebaseDatabase/Sources/Snapshot/FSnapshotUtilities.h"
|
2017-05-15 12:27:07 -07:00
|
|
|
|
|
|
|
|
@implementation FIRMutableDataTests
|
|
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
- (FIRMutableData*)dataFor:(id)input {
|
|
|
|
|
id<FNode> node = [FSnapshotUtilities nodeFrom:input];
|
|
|
|
|
return [[FIRMutableData alloc] initWithNode:node];
|
2017-05-15 12:27:07 -07:00
|
|
|
}
|
|
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
- (void)testDataForInWorksAlphaPriorities {
|
|
|
|
|
FIRMutableData* data = [self dataFor:@{
|
|
|
|
|
@"a" : @{@".value" : @1, @".priority" : @"first"},
|
|
|
|
|
@"z" : @{@".value" : @26, @".priority" : @"second"},
|
|
|
|
|
@"m" : @{@".value" : @13, @".priority" : @"third"},
|
|
|
|
|
@"n" : @{@".value" : @14, @".priority" : @"fourth"},
|
|
|
|
|
@"c" : @{@".value" : @3, @".priority" : @"fifth"},
|
|
|
|
|
@"b" : @{@".value" : @2, @".priority" : @"sixth"},
|
|
|
|
|
@"e" : @{@".value" : @5, @".priority" : @"seventh"},
|
|
|
|
|
}];
|
2017-05-15 12:27:07 -07:00
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
NSMutableString* output = [[NSMutableString alloc] init];
|
|
|
|
|
NSMutableArray* priorities = [[NSMutableArray alloc] init];
|
|
|
|
|
for (FIRMutableData* child in data.children) {
|
|
|
|
|
[output appendFormat:@"%@:%@:", child.key, child.value];
|
|
|
|
|
[priorities addObject:child.priority];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
XCTAssertTrue([output isEqualToString:@"c:3:a:1:n:14:z:26:e:5:b:2:m:13:"], @"Proper order");
|
|
|
|
|
NSArray* expected = @[ @"fifth", @"first", @"fourth", @"second", @"seventh", @"sixth", @"third" ];
|
|
|
|
|
XCTAssertTrue([priorities isEqualToArray:expected], @"Correct priorities");
|
|
|
|
|
XCTAssertTrue(data.childrenCount == 7, @"Got correct children count");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)testWritingMutableData {
|
|
|
|
|
FIRMutableData* data = [self dataFor:@{}];
|
|
|
|
|
|
|
|
|
|
data.value = @{@"a" : @1, @"b" : @2};
|
|
|
|
|
XCTAssertTrue([data hasChildren], @"Should have children node");
|
|
|
|
|
XCTAssertTrue(data.childrenCount == 2, @"Counts both children");
|
|
|
|
|
XCTAssertTrue([data hasChildAtPath:@"a"], @"Can see the children individually");
|
|
|
|
|
|
|
|
|
|
FIRMutableData* childData = [data childDataByAppendingPath:@"b"];
|
|
|
|
|
XCTAssertTrue([childData.value isEqualToNumber:@2], @"Get the correct child data");
|
|
|
|
|
childData.value = @3;
|
|
|
|
|
|
|
|
|
|
NSDictionary* expected = @{@"a" : @1, @"b" : @3};
|
|
|
|
|
XCTAssertTrue([data.value isEqualToDictionary:expected], @"Updates the parent");
|
|
|
|
|
|
|
|
|
|
int count = 0;
|
|
|
|
|
for (FIRDataSnapshot* __unused child in data.children) {
|
|
|
|
|
count++;
|
|
|
|
|
if (count == 1) {
|
|
|
|
|
[data childDataByAppendingPath:@"c"].value = @4;
|
2017-05-15 12:27:07 -07:00
|
|
|
}
|
2019-08-05 13:27:47 -07:00
|
|
|
}
|
|
|
|
|
XCTAssertTrue(count == 2, @"Should not iterate nodes added while iterating");
|
|
|
|
|
XCTAssertTrue(data.childrenCount == 3, @"Got the new node we added while iterating");
|
|
|
|
|
XCTAssertTrue([[data childDataByAppendingPath:@"c"].value isEqualToNumber:@4],
|
|
|
|
|
@"Can see the value of the new node");
|
2017-05-15 12:27:07 -07:00
|
|
|
}
|
|
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
- (void)testMutableDataNavigation {
|
|
|
|
|
FIRMutableData* data = [self dataFor:@{@"a" : @1, @"b" : @2}];
|
2017-05-15 12:27:07 -07:00
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
XCTAssertNil(data.key, @"Root data has no key");
|
2017-05-15 12:27:07 -07:00
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
// Can get a child
|
|
|
|
|
FIRMutableData* childData = [data childDataByAppendingPath:@"b"];
|
|
|
|
|
XCTAssertTrue([childData.key isEqualToString:@"b"], @"Child has correct key");
|
2017-05-15 12:27:07 -07:00
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
// Can get a non-existent child
|
|
|
|
|
childData = [data childDataByAppendingPath:@"c"];
|
|
|
|
|
XCTAssertTrue(childData != nil, @"Wrapper should not be nil");
|
|
|
|
|
XCTAssertTrue([childData.key isEqualToString:@"c"], @"Child should have correct key");
|
|
|
|
|
XCTAssertTrue(childData.value == [NSNull null], @"Non-existent data has no value");
|
|
|
|
|
childData.value = @{@"d" : @4};
|
2017-05-15 12:27:07 -07:00
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
NSDictionary* expected = @{@"a" : @1, @"b" : @2, @"c" : @{@"d" : @4}};
|
|
|
|
|
XCTAssertTrue([data.value isEqualToDictionary:expected],
|
|
|
|
|
@"Setting non-existent child updates parent");
|
2017-05-15 12:27:07 -07:00
|
|
|
}
|
|
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
- (void)testPriorities {
|
|
|
|
|
FIRMutableData* data = [self dataFor:@{@"a" : @1, @"b" : @2}];
|
2017-05-15 12:27:07 -07:00
|
|
|
|
2019-08-05 13:27:47 -07:00
|
|
|
XCTAssertTrue(data.priority == [NSNull null], @"Should not be a priority");
|
|
|
|
|
data.priority = @"foo";
|
|
|
|
|
XCTAssertTrue([data.priority isEqualToString:@"foo"], @"Should now have a priority");
|
|
|
|
|
data.value = @3;
|
|
|
|
|
XCTAssertTrue(data.priority == [NSNull null], @"Setting a value overrides a priority");
|
|
|
|
|
data.priority = @4;
|
|
|
|
|
data.value = nil;
|
|
|
|
|
XCTAssertTrue(data.priority == [NSNull null], @"Removing the value does remove the priority");
|
2017-05-15 12:27:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@end
|