Files
firebase-ios-sdk/Example/Database/Tests/Unit/FNodeTests.m
T

192 lines
9.1 KiB
Objective-C
Raw Normal View History

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.
*/
#import <Foundation/Foundation.h>
#import <XCTest/XCTest.h>
#import "FChildrenNode.h"
2019-08-05 13:27:47 -07:00
#import "FEmptyNode.h"
2017-05-15 12:27:07 -07:00
#import "FLeafNode.h"
2019-08-05 13:27:47 -07:00
#import "FSnapshotUtilities.h"
2017-05-15 12:27:07 -07:00
@interface FNodeTests : XCTestCase
@end
@implementation FNodeTests
2019-08-05 13:27:47 -07:00
- (void)testLeafNodeEqualsHashCode {
id<FNode> falseNode = [FSnapshotUtilities nodeFrom:@NO];
id<FNode> trueNode = [FSnapshotUtilities nodeFrom:@YES];
id<FNode> stringOneNode = [FSnapshotUtilities nodeFrom:@"one"];
id<FNode> stringTwoNode = [FSnapshotUtilities nodeFrom:@"two"];
id<FNode> zeroNode = [FSnapshotUtilities nodeFrom:@0];
id<FNode> oneNode = [FSnapshotUtilities nodeFrom:@1];
id<FNode> emptyNode1 = [FSnapshotUtilities nodeFrom:nil];
id<FNode> emptyNode2 = [FSnapshotUtilities nodeFrom:[NSNull null]];
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(falseNode, [FSnapshotUtilities nodeFrom:@NO]);
XCTAssertEqual(falseNode.hash, [FSnapshotUtilities nodeFrom:@NO].hash);
XCTAssertEqualObjects(trueNode, [FSnapshotUtilities nodeFrom:@YES]);
XCTAssertEqual(trueNode.hash, [FSnapshotUtilities nodeFrom:@YES].hash);
XCTAssertFalse([falseNode isEqual:trueNode]);
XCTAssertFalse([falseNode isEqual:oneNode]);
XCTAssertFalse([falseNode isEqual:stringOneNode]);
XCTAssertFalse([falseNode isEqual:emptyNode1]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(stringOneNode, [FSnapshotUtilities nodeFrom:@"one"]);
XCTAssertEqual(stringOneNode.hash, [FSnapshotUtilities nodeFrom:@"one"].hash);
XCTAssertFalse([stringOneNode isEqual:stringTwoNode]);
XCTAssertFalse([stringOneNode isEqual:emptyNode1]);
XCTAssertFalse([stringOneNode isEqual:oneNode]);
XCTAssertFalse([stringOneNode isEqual:trueNode]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(zeroNode, [FSnapshotUtilities nodeFrom:@0]);
XCTAssertEqual(zeroNode.hash, [FSnapshotUtilities nodeFrom:@0].hash);
XCTAssertFalse([zeroNode isEqual:oneNode]);
XCTAssertFalse([zeroNode isEqual:emptyNode1]);
XCTAssertFalse([zeroNode isEqual:falseNode]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(emptyNode1, emptyNode2);
XCTAssertEqual(emptyNode1.hash, emptyNode2.hash);
2017-05-15 12:27:07 -07:00
}
2019-08-05 13:27:47 -07:00
- (void)testLeafNodePrioritiesEqualsHashCode {
id<FNode> oneOne = [FSnapshotUtilities nodeFrom:@1 priority:@1];
id<FNode> stringOne = [FSnapshotUtilities nodeFrom:@"value" priority:@1];
id<FNode> oneString = [FSnapshotUtilities nodeFrom:@1 priority:@"value"];
id<FNode> stringString = [FSnapshotUtilities nodeFrom:@"value" priority:@"value"];
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(oneOne, [FSnapshotUtilities nodeFrom:@1 priority:@1]);
XCTAssertEqual(oneOne.hash, [FSnapshotUtilities nodeFrom:@1 priority:@1].hash);
XCTAssertFalse([oneOne isEqual:stringOne]);
XCTAssertFalse([oneOne isEqual:oneString]);
XCTAssertFalse([oneOne isEqual:stringString]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(stringOne, [FSnapshotUtilities nodeFrom:@"value" priority:@1]);
XCTAssertEqual(stringOne.hash, [FSnapshotUtilities nodeFrom:@"value" priority:@1].hash);
XCTAssertFalse([stringOne isEqual:oneOne]);
XCTAssertFalse([stringOne isEqual:oneString]);
XCTAssertFalse([stringOne isEqual:stringString]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(oneString, [FSnapshotUtilities nodeFrom:@1 priority:@"value"]);
XCTAssertEqual(oneString.hash, [FSnapshotUtilities nodeFrom:@1 priority:@"value"].hash);
XCTAssertFalse([oneString isEqual:stringOne]);
XCTAssertFalse([oneString isEqual:oneOne]);
XCTAssertFalse([oneString isEqual:stringString]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(stringString, [FSnapshotUtilities nodeFrom:@"value" priority:@"value"]);
XCTAssertEqual(stringString.hash, [FSnapshotUtilities nodeFrom:@"value" priority:@"value"].hash);
XCTAssertFalse([stringString isEqual:stringOne]);
XCTAssertFalse([stringString isEqual:oneString]);
XCTAssertFalse([stringString isEqual:oneOne]);
2017-05-15 12:27:07 -07:00
}
- (void)testChildrenNodeEqualsHashCode {
2019-08-05 13:27:47 -07:00
id<FNode> nodeOne =
[FSnapshotUtilities nodeFrom:@{@"one" : @1, @"two" : @2, @".priority" : @"prio"}];
id<FNode> nodeTwo =
[[FEmptyNode emptyNode] updateImmediateChild:@"one"
withNewChild:[FSnapshotUtilities nodeFrom:@1]];
nodeTwo = [nodeTwo updateImmediateChild:@"two" withNewChild:[FSnapshotUtilities nodeFrom:@2]];
nodeTwo = [nodeTwo updatePriority:[FSnapshotUtilities nodeFrom:@"prio"]];
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects(nodeOne, nodeTwo);
XCTAssertEqual(nodeOne.hash, nodeTwo.hash);
XCTAssertFalse([[nodeOne updatePriority:[FEmptyNode emptyNode]] isEqual:nodeOne]);
XCTAssertFalse([[nodeOne updateImmediateChild:@"one"
withNewChild:[FEmptyNode emptyNode]] isEqual:nodeOne]);
XCTAssertFalse([[nodeOne updateImmediateChild:@"one"
withNewChild:[FSnapshotUtilities nodeFrom:@2]] isEqual:nodeOne]);
2017-05-15 12:27:07 -07:00
}
- (void)testLeadingZerosWorkCorrectly {
2019-08-05 13:27:47 -07:00
NSDictionary *data = @{@"1" : @1, @"01" : @2, @"001" : @3, @"0001" : @4};
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
id<FNode> node = [FSnapshotUtilities nodeFrom:data];
XCTAssertEqualObjects([node getImmediateChild:@"1"].val, @1);
XCTAssertEqualObjects([node getImmediateChild:@"01"].val, @2);
XCTAssertEqualObjects([node getImmediateChild:@"001"].val, @3);
XCTAssertEqualObjects([node getImmediateChild:@"0001"].val, @4);
2017-05-15 12:27:07 -07:00
}
- (void)testLeadindZerosArePreservedInValue {
2019-08-05 13:27:47 -07:00
NSDictionary *data = @{@"1" : @1, @"01" : @2, @"001" : @3, @"0001" : @4};
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects([FSnapshotUtilities nodeFrom:data].val, data);
2017-05-15 12:27:07 -07:00
}
- (void)testEmptyNodeEqualsEmptyChildrenNode {
2019-08-05 13:27:47 -07:00
XCTAssertEqualObjects([FEmptyNode emptyNode], [[FChildrenNode alloc] init]);
XCTAssertEqualObjects([[FChildrenNode alloc] init], [FEmptyNode emptyNode]);
XCTAssertEqual([[FChildrenNode alloc] init].hash, [FEmptyNode emptyNode].hash);
2017-05-15 12:27:07 -07:00
}
- (void)testUpdatingEmptyChildrenDoesntOverwriteLeafNode {
2019-08-05 13:27:47 -07:00
FLeafNode *node = [[FLeafNode alloc] initWithValue:@"value"];
XCTAssertEqualObjects(node, [node updateChild:[FPath pathWithString:@".priority"]
withNewChild:[FEmptyNode emptyNode]]);
XCTAssertEqualObjects(node, [node updateChild:[FPath pathWithString:@"child"]
withNewChild:[FEmptyNode emptyNode]]);
XCTAssertEqualObjects(node, [node updateChild:[FPath pathWithString:@"child/.priority"]
withNewChild:[FEmptyNode emptyNode]]);
XCTAssertEqualObjects(node, [node updateImmediateChild:@"child"
withNewChild:[FEmptyNode emptyNode]]);
XCTAssertEqualObjects(node, [node updateImmediateChild:@".priority"
withNewChild:[FEmptyNode emptyNode]]);
2017-05-15 12:27:07 -07:00
}
- (void)testUpdatingPrioritiesOnEmptyNodesIsANoOp {
2019-08-05 13:27:47 -07:00
id<FNode> priority = [FSnapshotUtilities nodeFrom:@"prio"];
XCTAssertTrue([[[[FEmptyNode emptyNode] updatePriority:priority] getPriority] isEmpty]);
XCTAssertTrue([[[[FEmptyNode emptyNode] updateChild:[FPath pathWithString:@".priority"]
withNewChild:priority] getPriority] isEmpty]);
XCTAssertTrue([[[[FEmptyNode emptyNode] updateImmediateChild:@".priority"
withNewChild:priority] getPriority] isEmpty]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
id<FNode> valueNode = [FSnapshotUtilities nodeFrom:@"value"];
FPath *childPath = [FPath pathWithString:@"child"];
id<FNode> reemptiedChildren = [[[FEmptyNode emptyNode]
updateChild:childPath
withNewChild:valueNode] updateChild:childPath withNewChild:[FEmptyNode emptyNode]];
XCTAssertTrue([[[reemptiedChildren updatePriority:priority] getPriority] isEmpty]);
XCTAssertTrue([[[reemptiedChildren updateChild:[FPath pathWithString:@".priority"]
withNewChild:priority] getPriority] isEmpty]);
XCTAssertTrue([[[reemptiedChildren updateImmediateChild:@".priority"
withNewChild:priority] getPriority] isEmpty]);
2017-05-15 12:27:07 -07:00
}
- (void)testDeletingLastChildFromChildrenNodeRemovesPriority {
2019-08-05 13:27:47 -07:00
id<FNode> priority = [FSnapshotUtilities nodeFrom:@"prio"];
id<FNode> valueNode = [FSnapshotUtilities nodeFrom:@"value"];
FPath *childPath = [FPath pathWithString:@"child"];
id<FNode> withPriority = [[[FEmptyNode emptyNode] updateChild:childPath
withNewChild:valueNode] updatePriority:priority];
XCTAssertEqualObjects(priority, [withPriority getPriority]);
id<FNode> deletedChild = [withPriority updateChild:childPath withNewChild:[FEmptyNode emptyNode]];
XCTAssertTrue([[deletedChild getPriority] isEmpty]);
2017-05-15 12:27:07 -07:00
}
- (void)testFromNodeReturnsEmptyNodesWithoutPriority {
2019-08-05 13:27:47 -07:00
id<FNode> empty1 = [FSnapshotUtilities nodeFrom:@{@".priority" : @"prio"}];
XCTAssertTrue([[empty1 getPriority] isEmpty]);
2017-05-15 12:27:07 -07:00
2019-08-05 13:27:47 -07:00
id<FNode> empty2 =
[FSnapshotUtilities nodeFrom:@{@"dummy" : [NSNull null], @".priority" : @"prio"}];
XCTAssertTrue([[empty2 getPriority] isEmpty]);
2017-05-15 12:27:07 -07:00
}
@end