1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker// 5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker// met: 8*1b3f573fSAndroid Build Coastguard Worker// 9*1b3f573fSAndroid Build Coastguard Worker// * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker// * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker// distribution. 15*1b3f573fSAndroid Build Coastguard Worker// * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker// 19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 32*1b3f573fSAndroid Build Coastguard Worker#import <XCTest/XCTest.h> 33*1b3f573fSAndroid Build Coastguard Worker 34*1b3f573fSAndroid Build Coastguard Worker#import "GPBDictionary.h" 35*1b3f573fSAndroid Build Coastguard Worker#import "GPBDictionary_PackagePrivate.h" 36*1b3f573fSAndroid Build Coastguard Worker 37*1b3f573fSAndroid Build Coastguard Worker#import "GPBTestUtilities.h" 38*1b3f573fSAndroid Build Coastguard Worker 39*1b3f573fSAndroid Build Coastguard Worker#pragma mark - GPBAutocreatedDictionary Tests 40*1b3f573fSAndroid Build Coastguard Worker 41*1b3f573fSAndroid Build Coastguard Worker// These are hand written tests to double check some behaviors of the 42*1b3f573fSAndroid Build Coastguard Worker// GPBAutocreatedDictionary. The GPBDictionary+[type]Tests files are generate 43*1b3f573fSAndroid Build Coastguard Worker// tests. 44*1b3f573fSAndroid Build Coastguard Worker 45*1b3f573fSAndroid Build Coastguard Worker// NOTE: GPBAutocreatedDictionary is private to the library, users of the 46*1b3f573fSAndroid Build Coastguard Worker// library should never have to directly deal with this class. 47*1b3f573fSAndroid Build Coastguard Worker 48*1b3f573fSAndroid Build Coastguard Worker@interface GPBAutocreatedDictionaryTests : XCTestCase 49*1b3f573fSAndroid Build Coastguard Worker@end 50*1b3f573fSAndroid Build Coastguard Worker 51*1b3f573fSAndroid Build Coastguard Worker@implementation GPBAutocreatedDictionaryTests 52*1b3f573fSAndroid Build Coastguard Worker 53*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 54*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init]; 55*1b3f573fSAndroid Build Coastguard Worker 56*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict isEqual:@{}]); 57*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict isEqualToDictionary:@{}]); 58*1b3f573fSAndroid Build Coastguard Worker 59*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqual:@{ @"foo" : @"bar" }]); 60*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqualToDictionary:@{ @"foo" : @"bar" }]); 61*1b3f573fSAndroid Build Coastguard Worker 62*1b3f573fSAndroid Build Coastguard Worker [dict setObject:@"bar" forKey:@"foo"]; 63*1b3f573fSAndroid Build Coastguard Worker 64*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqual:@{}]); 65*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqualToDictionary:@{}]); 66*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict isEqual:@{ @"foo" : @"bar" }]); 67*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict isEqualToDictionary:@{ @"foo" : @"bar" }]); 68*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqual:@{ @"bar" : @"baz" }]); 69*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqualToDictionary:@{ @"bar" : @"baz" }]); 70*1b3f573fSAndroid Build Coastguard Worker 71*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedDictionary *dict2 = [[GPBAutocreatedDictionary alloc] init]; 72*1b3f573fSAndroid Build Coastguard Worker 73*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqual:dict2]); 74*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqualToDictionary:dict2]); 75*1b3f573fSAndroid Build Coastguard Worker 76*1b3f573fSAndroid Build Coastguard Worker [dict2 setObject:@"mumble" forKey:@"foo"]; 77*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqual:dict2]); 78*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict isEqualToDictionary:dict2]); 79*1b3f573fSAndroid Build Coastguard Worker 80*1b3f573fSAndroid Build Coastguard Worker [dict2 setObject:@"bar" forKey:@"foo"]; 81*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict isEqual:dict2]); 82*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict isEqualToDictionary:dict2]); 83*1b3f573fSAndroid Build Coastguard Worker 84*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 85*1b3f573fSAndroid Build Coastguard Worker [dict release]; 86*1b3f573fSAndroid Build Coastguard Worker} 87*1b3f573fSAndroid Build Coastguard Worker 88*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 89*1b3f573fSAndroid Build Coastguard Worker { 90*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init]; 91*1b3f573fSAndroid Build Coastguard Worker 92*1b3f573fSAndroid Build Coastguard Worker NSDictionary *cpy = [dict copy]; 93*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy != dict); // Ptr compare 94*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]); 95*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]); 96*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy.count, (NSUInteger)0); 97*1b3f573fSAndroid Build Coastguard Worker 98*1b3f573fSAndroid Build Coastguard Worker NSDictionary *cpy2 = [dict copy]; 99*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != dict); // Ptr compare 100*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != cpy); // Ptr compare 101*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]); 102*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]); 103*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy2.count, (NSUInteger)0); 104*1b3f573fSAndroid Build Coastguard Worker 105*1b3f573fSAndroid Build Coastguard Worker [cpy2 release]; 106*1b3f573fSAndroid Build Coastguard Worker [cpy release]; 107*1b3f573fSAndroid Build Coastguard Worker [dict release]; 108*1b3f573fSAndroid Build Coastguard Worker } 109*1b3f573fSAndroid Build Coastguard Worker 110*1b3f573fSAndroid Build Coastguard Worker { 111*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init]; 112*1b3f573fSAndroid Build Coastguard Worker 113*1b3f573fSAndroid Build Coastguard Worker NSMutableDictionary *cpy = [dict mutableCopy]; 114*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy != dict); // Ptr compare 115*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]); 116*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]); 117*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy.count, (NSUInteger)0); 118*1b3f573fSAndroid Build Coastguard Worker 119*1b3f573fSAndroid Build Coastguard Worker NSMutableDictionary *cpy2 = [dict mutableCopy]; 120*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != dict); // Ptr compare 121*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != cpy); // Ptr compare 122*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]); 123*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]); 124*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy2.count, (NSUInteger)0); 125*1b3f573fSAndroid Build Coastguard Worker 126*1b3f573fSAndroid Build Coastguard Worker [cpy2 release]; 127*1b3f573fSAndroid Build Coastguard Worker [cpy release]; 128*1b3f573fSAndroid Build Coastguard Worker [dict release]; 129*1b3f573fSAndroid Build Coastguard Worker } 130*1b3f573fSAndroid Build Coastguard Worker 131*1b3f573fSAndroid Build Coastguard Worker { 132*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init]; 133*1b3f573fSAndroid Build Coastguard Worker dict[@"foo"] = @"bar"; 134*1b3f573fSAndroid Build Coastguard Worker dict[@"baz"] = @"mumble"; 135*1b3f573fSAndroid Build Coastguard Worker 136*1b3f573fSAndroid Build Coastguard Worker NSDictionary *cpy = [dict copy]; 137*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy != dict); // Ptr compare 138*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]); 139*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]); 140*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy.count, (NSUInteger)2); 141*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy[@"foo"], @"bar"); 142*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy[@"baz"], @"mumble"); 143*1b3f573fSAndroid Build Coastguard Worker 144*1b3f573fSAndroid Build Coastguard Worker NSDictionary *cpy2 = [dict copy]; 145*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != dict); // Ptr compare 146*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != cpy); // Ptr compare 147*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]); 148*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]); 149*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy2.count, (NSUInteger)2); 150*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy2[@"foo"], @"bar"); 151*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy2[@"baz"], @"mumble"); 152*1b3f573fSAndroid Build Coastguard Worker 153*1b3f573fSAndroid Build Coastguard Worker [cpy2 release]; 154*1b3f573fSAndroid Build Coastguard Worker [cpy release]; 155*1b3f573fSAndroid Build Coastguard Worker [dict release]; 156*1b3f573fSAndroid Build Coastguard Worker } 157*1b3f573fSAndroid Build Coastguard Worker 158*1b3f573fSAndroid Build Coastguard Worker { 159*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init]; 160*1b3f573fSAndroid Build Coastguard Worker dict[@"foo"] = @"bar"; 161*1b3f573fSAndroid Build Coastguard Worker dict[@"baz"] = @"mumble"; 162*1b3f573fSAndroid Build Coastguard Worker 163*1b3f573fSAndroid Build Coastguard Worker NSMutableDictionary *cpy = [dict mutableCopy]; 164*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy != dict); // Ptr compare 165*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]); 166*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]); 167*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy.count, (NSUInteger)2); 168*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy[@"foo"], @"bar"); 169*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy[@"baz"], @"mumble"); 170*1b3f573fSAndroid Build Coastguard Worker 171*1b3f573fSAndroid Build Coastguard Worker NSMutableDictionary *cpy2 = [dict mutableCopy]; 172*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != dict); // Ptr compare 173*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(cpy2 != cpy); // Ptr compare 174*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]); 175*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]); 176*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(cpy2.count, (NSUInteger)2); 177*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy2[@"foo"], @"bar"); 178*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(cpy2[@"baz"], @"mumble"); 179*1b3f573fSAndroid Build Coastguard Worker 180*1b3f573fSAndroid Build Coastguard Worker [cpy2 release]; 181*1b3f573fSAndroid Build Coastguard Worker [cpy release]; 182*1b3f573fSAndroid Build Coastguard Worker [dict release]; 183*1b3f573fSAndroid Build Coastguard Worker } 184*1b3f573fSAndroid Build Coastguard Worker} 185*1b3f573fSAndroid Build Coastguard Worker 186*1b3f573fSAndroid Build Coastguard Worker@end 187