1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2015 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 36*1b3f573fSAndroid Build Coastguard Worker#import "GPBTestUtilities.h" 37*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h" 38*1b3f573fSAndroid Build Coastguard Worker 39*1b3f573fSAndroid Build Coastguard Worker// Pull in the macros (using an external file because expanding all tests 40*1b3f573fSAndroid Build Coastguard Worker// in a single file makes a file that is failing to work with within Xcode. 41*1b3f573fSAndroid Build Coastguard Worker//%PDDM-IMPORT-DEFINES GPBDictionaryTests.pddm 42*1b3f573fSAndroid Build Coastguard Worker 43*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(UInt32, uint32_t, 100U, 101U) 44*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 45*1b3f573fSAndroid Build Coastguard Worker// clang-format off 46*1b3f573fSAndroid Build Coastguard Worker 47*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> UInt32 48*1b3f573fSAndroid Build Coastguard Worker 49*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolUInt32DictionaryTests : XCTestCase 50*1b3f573fSAndroid Build Coastguard Worker@end 51*1b3f573fSAndroid Build Coastguard Worker 52*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolUInt32DictionaryTests 53*1b3f573fSAndroid Build Coastguard Worker 54*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 55*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = [[GPBBoolUInt32Dictionary alloc] init]; 56*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 57*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 58*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt32:NULL forKey:YES]); 59*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) { 60*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 61*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 62*1b3f573fSAndroid Build Coastguard Worker }]; 63*1b3f573fSAndroid Build Coastguard Worker [dict release]; 64*1b3f573fSAndroid Build Coastguard Worker} 65*1b3f573fSAndroid Build Coastguard Worker 66*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 67*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = [[GPBBoolUInt32Dictionary alloc] init]; 68*1b3f573fSAndroid Build Coastguard Worker [dict setUInt32:100U forKey:YES]; 69*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 70*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 71*1b3f573fSAndroid Build Coastguard Worker uint32_t value; 72*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 73*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 74*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 75*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt32:NULL forKey:NO]); 76*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) { 77*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 78*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, 100U); 79*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 80*1b3f573fSAndroid Build Coastguard Worker }]; 81*1b3f573fSAndroid Build Coastguard Worker [dict release]; 82*1b3f573fSAndroid Build Coastguard Worker} 83*1b3f573fSAndroid Build Coastguard Worker 84*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 85*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 86*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues[] = { 100U, 101U }; 87*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = 88*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues 89*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 90*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 91*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 92*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 93*1b3f573fSAndroid Build Coastguard Worker uint32_t value; 94*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 95*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 96*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 97*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:NO]); 98*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:NO]); 99*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 100*1b3f573fSAndroid Build Coastguard Worker 101*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 102*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 103*1b3f573fSAndroid Build Coastguard Worker uint32_t *seenValues = malloc(2 * sizeof(uint32_t)); 104*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) { 105*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 106*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 107*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 108*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 109*1b3f573fSAndroid Build Coastguard Worker ++idx; 110*1b3f573fSAndroid Build Coastguard Worker }]; 111*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 112*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 113*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 114*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 115*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 116*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 117*1b3f573fSAndroid Build Coastguard Worker } 118*1b3f573fSAndroid Build Coastguard Worker } 119*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 120*1b3f573fSAndroid Build Coastguard Worker } 121*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 122*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 123*1b3f573fSAndroid Build Coastguard Worker 124*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 125*1b3f573fSAndroid Build Coastguard Worker idx = 0; 126*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) { 127*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 128*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 129*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 130*1b3f573fSAndroid Build Coastguard Worker ++idx; 131*1b3f573fSAndroid Build Coastguard Worker }]; 132*1b3f573fSAndroid Build Coastguard Worker [dict release]; 133*1b3f573fSAndroid Build Coastguard Worker} 134*1b3f573fSAndroid Build Coastguard Worker 135*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 136*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 137*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 138*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues1[] = { 100U, 101U }; 139*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues2[] = { 101U, 100U }; 140*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues3[] = { 101U }; 141*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict1 = 142*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues1 143*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 144*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 145*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 146*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict1prime = 147*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues1 148*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 149*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 150*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 151*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict2 = 152*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues2 153*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 154*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 155*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 156*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict3 = 157*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues1 158*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 159*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 160*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 161*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict4 = 162*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues3 163*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 164*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 165*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 166*1b3f573fSAndroid Build Coastguard Worker 167*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 168*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 169*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 170*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 171*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 172*1b3f573fSAndroid Build Coastguard Worker 173*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 174*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 175*1b3f573fSAndroid Build Coastguard Worker 176*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 177*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 178*1b3f573fSAndroid Build Coastguard Worker 179*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 180*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 181*1b3f573fSAndroid Build Coastguard Worker 182*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 183*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 184*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 185*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 186*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 187*1b3f573fSAndroid Build Coastguard Worker} 188*1b3f573fSAndroid Build Coastguard Worker 189*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 190*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 191*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues[] = { 100U, 101U }; 192*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = 193*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues 194*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 195*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 196*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 197*1b3f573fSAndroid Build Coastguard Worker 198*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict2 = [dict copy]; 199*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 200*1b3f573fSAndroid Build Coastguard Worker 201*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 202*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 203*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 204*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolUInt32Dictionary class]]); 205*1b3f573fSAndroid Build Coastguard Worker 206*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 207*1b3f573fSAndroid Build Coastguard Worker [dict release]; 208*1b3f573fSAndroid Build Coastguard Worker} 209*1b3f573fSAndroid Build Coastguard Worker 210*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 211*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 212*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues[] = { 100U, 101U }; 213*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = 214*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues 215*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 216*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 217*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 218*1b3f573fSAndroid Build Coastguard Worker 219*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict2 = 220*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithDictionary:dict]; 221*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 222*1b3f573fSAndroid Build Coastguard Worker 223*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 224*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 225*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 226*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 227*1b3f573fSAndroid Build Coastguard Worker [dict release]; 228*1b3f573fSAndroid Build Coastguard Worker} 229*1b3f573fSAndroid Build Coastguard Worker 230*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 231*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = [[GPBBoolUInt32Dictionary alloc] init]; 232*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 233*1b3f573fSAndroid Build Coastguard Worker 234*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 235*1b3f573fSAndroid Build Coastguard Worker [dict setUInt32:100U forKey:YES]; 236*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 237*1b3f573fSAndroid Build Coastguard Worker 238*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 239*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues[] = { 101U }; 240*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict2 = 241*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues 242*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 243*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 244*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 245*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 246*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 247*1b3f573fSAndroid Build Coastguard Worker 248*1b3f573fSAndroid Build Coastguard Worker uint32_t value; 249*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 250*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 251*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 252*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:NO]); 253*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:NO]); 254*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 255*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 256*1b3f573fSAndroid Build Coastguard Worker [dict release]; 257*1b3f573fSAndroid Build Coastguard Worker} 258*1b3f573fSAndroid Build Coastguard Worker 259*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 260*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 261*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues[] = { 100U, 101U }; 262*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = 263*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues 264*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 265*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 266*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 267*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 268*1b3f573fSAndroid Build Coastguard Worker 269*1b3f573fSAndroid Build Coastguard Worker [dict removeUInt32ForKey:NO]; 270*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 271*1b3f573fSAndroid Build Coastguard Worker uint32_t value; 272*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 273*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 274*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 275*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt32:NULL forKey:NO]); 276*1b3f573fSAndroid Build Coastguard Worker 277*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 278*1b3f573fSAndroid Build Coastguard Worker [dict removeUInt32ForKey:NO]; 279*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 280*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 281*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 282*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 283*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt32:NULL forKey:NO]); 284*1b3f573fSAndroid Build Coastguard Worker 285*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 286*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 287*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt32:NULL forKey:YES]); 288*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt32:NULL forKey:NO]); 289*1b3f573fSAndroid Build Coastguard Worker [dict release]; 290*1b3f573fSAndroid Build Coastguard Worker} 291*1b3f573fSAndroid Build Coastguard Worker 292*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 293*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 294*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues[] = { 100U, 101U }; 295*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict = 296*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues 297*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 298*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 299*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 300*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 301*1b3f573fSAndroid Build Coastguard Worker uint32_t value; 302*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 303*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 304*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 305*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:NO]); 306*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:NO]); 307*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 308*1b3f573fSAndroid Build Coastguard Worker 309*1b3f573fSAndroid Build Coastguard Worker [dict setUInt32:101U forKey:YES]; 310*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 311*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 312*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 313*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 314*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:NO]); 315*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:NO]); 316*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 317*1b3f573fSAndroid Build Coastguard Worker 318*1b3f573fSAndroid Build Coastguard Worker [dict setUInt32:100U forKey:NO]; 319*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 320*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 321*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 322*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 323*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:NO]); 324*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:NO]); 325*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 326*1b3f573fSAndroid Build Coastguard Worker 327*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 328*1b3f573fSAndroid Build Coastguard Worker const uint32_t kValues2[] = { 101U, 100U }; 329*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt32Dictionary *dict2 = 330*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt32Dictionary alloc] initWithUInt32s:kValues2 331*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 332*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 333*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 334*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 335*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 336*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:YES]); 337*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:YES]); 338*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 100U); 339*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:NULL forKey:NO]); 340*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt32:&value forKey:NO]); 341*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 101U); 342*1b3f573fSAndroid Build Coastguard Worker 343*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 344*1b3f573fSAndroid Build Coastguard Worker [dict release]; 345*1b3f573fSAndroid Build Coastguard Worker} 346*1b3f573fSAndroid Build Coastguard Worker 347*1b3f573fSAndroid Build Coastguard Worker@end 348*1b3f573fSAndroid Build Coastguard Worker 349*1b3f573fSAndroid Build Coastguard Worker// clang-format on 350*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Int32, int32_t, 200, 201) 351*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 352*1b3f573fSAndroid Build Coastguard Worker// clang-format off 353*1b3f573fSAndroid Build Coastguard Worker 354*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Int32 355*1b3f573fSAndroid Build Coastguard Worker 356*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolInt32DictionaryTests : XCTestCase 357*1b3f573fSAndroid Build Coastguard Worker@end 358*1b3f573fSAndroid Build Coastguard Worker 359*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolInt32DictionaryTests 360*1b3f573fSAndroid Build Coastguard Worker 361*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 362*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = [[GPBBoolInt32Dictionary alloc] init]; 363*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 364*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 365*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt32:NULL forKey:YES]); 366*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) { 367*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 368*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 369*1b3f573fSAndroid Build Coastguard Worker }]; 370*1b3f573fSAndroid Build Coastguard Worker [dict release]; 371*1b3f573fSAndroid Build Coastguard Worker} 372*1b3f573fSAndroid Build Coastguard Worker 373*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 374*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = [[GPBBoolInt32Dictionary alloc] init]; 375*1b3f573fSAndroid Build Coastguard Worker [dict setInt32:200 forKey:YES]; 376*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 377*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 378*1b3f573fSAndroid Build Coastguard Worker int32_t value; 379*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 380*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 381*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 382*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt32:NULL forKey:NO]); 383*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) { 384*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 385*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, 200); 386*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 387*1b3f573fSAndroid Build Coastguard Worker }]; 388*1b3f573fSAndroid Build Coastguard Worker [dict release]; 389*1b3f573fSAndroid Build Coastguard Worker} 390*1b3f573fSAndroid Build Coastguard Worker 391*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 392*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 393*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues[] = { 200, 201 }; 394*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = 395*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues 396*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 397*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 398*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 399*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 400*1b3f573fSAndroid Build Coastguard Worker int32_t value; 401*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 402*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 403*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 404*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:NO]); 405*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:NO]); 406*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 407*1b3f573fSAndroid Build Coastguard Worker 408*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 409*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 410*1b3f573fSAndroid Build Coastguard Worker int32_t *seenValues = malloc(2 * sizeof(int32_t)); 411*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) { 412*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 413*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 414*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 415*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 416*1b3f573fSAndroid Build Coastguard Worker ++idx; 417*1b3f573fSAndroid Build Coastguard Worker }]; 418*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 419*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 420*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 421*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 422*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 423*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 424*1b3f573fSAndroid Build Coastguard Worker } 425*1b3f573fSAndroid Build Coastguard Worker } 426*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 427*1b3f573fSAndroid Build Coastguard Worker } 428*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 429*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 430*1b3f573fSAndroid Build Coastguard Worker 431*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 432*1b3f573fSAndroid Build Coastguard Worker idx = 0; 433*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) { 434*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 435*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 436*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 437*1b3f573fSAndroid Build Coastguard Worker ++idx; 438*1b3f573fSAndroid Build Coastguard Worker }]; 439*1b3f573fSAndroid Build Coastguard Worker [dict release]; 440*1b3f573fSAndroid Build Coastguard Worker} 441*1b3f573fSAndroid Build Coastguard Worker 442*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 443*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 444*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 445*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues1[] = { 200, 201 }; 446*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues2[] = { 201, 200 }; 447*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues3[] = { 201 }; 448*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict1 = 449*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues1 450*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 451*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 452*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 453*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict1prime = 454*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues1 455*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 456*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 457*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 458*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict2 = 459*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues2 460*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 461*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 462*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 463*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict3 = 464*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues1 465*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 466*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 467*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 468*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict4 = 469*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues3 470*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 471*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 472*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 473*1b3f573fSAndroid Build Coastguard Worker 474*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 475*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 476*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 477*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 478*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 479*1b3f573fSAndroid Build Coastguard Worker 480*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 481*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 482*1b3f573fSAndroid Build Coastguard Worker 483*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 484*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 485*1b3f573fSAndroid Build Coastguard Worker 486*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 487*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 488*1b3f573fSAndroid Build Coastguard Worker 489*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 490*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 491*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 492*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 493*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 494*1b3f573fSAndroid Build Coastguard Worker} 495*1b3f573fSAndroid Build Coastguard Worker 496*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 497*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 498*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues[] = { 200, 201 }; 499*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = 500*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues 501*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 502*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 503*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 504*1b3f573fSAndroid Build Coastguard Worker 505*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict2 = [dict copy]; 506*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 507*1b3f573fSAndroid Build Coastguard Worker 508*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 509*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 510*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 511*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolInt32Dictionary class]]); 512*1b3f573fSAndroid Build Coastguard Worker 513*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 514*1b3f573fSAndroid Build Coastguard Worker [dict release]; 515*1b3f573fSAndroid Build Coastguard Worker} 516*1b3f573fSAndroid Build Coastguard Worker 517*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 518*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 519*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues[] = { 200, 201 }; 520*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = 521*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues 522*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 523*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 524*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 525*1b3f573fSAndroid Build Coastguard Worker 526*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict2 = 527*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithDictionary:dict]; 528*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 529*1b3f573fSAndroid Build Coastguard Worker 530*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 531*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 532*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 533*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 534*1b3f573fSAndroid Build Coastguard Worker [dict release]; 535*1b3f573fSAndroid Build Coastguard Worker} 536*1b3f573fSAndroid Build Coastguard Worker 537*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 538*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = [[GPBBoolInt32Dictionary alloc] init]; 539*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 540*1b3f573fSAndroid Build Coastguard Worker 541*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 542*1b3f573fSAndroid Build Coastguard Worker [dict setInt32:200 forKey:YES]; 543*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 544*1b3f573fSAndroid Build Coastguard Worker 545*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 546*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues[] = { 201 }; 547*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict2 = 548*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues 549*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 550*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 551*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 552*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 553*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 554*1b3f573fSAndroid Build Coastguard Worker 555*1b3f573fSAndroid Build Coastguard Worker int32_t value; 556*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 557*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 558*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 559*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:NO]); 560*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:NO]); 561*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 562*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 563*1b3f573fSAndroid Build Coastguard Worker [dict release]; 564*1b3f573fSAndroid Build Coastguard Worker} 565*1b3f573fSAndroid Build Coastguard Worker 566*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 567*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 568*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues[] = { 200, 201 }; 569*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = 570*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues 571*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 572*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 573*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 574*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 575*1b3f573fSAndroid Build Coastguard Worker 576*1b3f573fSAndroid Build Coastguard Worker [dict removeInt32ForKey:NO]; 577*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 578*1b3f573fSAndroid Build Coastguard Worker int32_t value; 579*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 580*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 581*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 582*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt32:NULL forKey:NO]); 583*1b3f573fSAndroid Build Coastguard Worker 584*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 585*1b3f573fSAndroid Build Coastguard Worker [dict removeInt32ForKey:NO]; 586*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 587*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 588*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 589*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 590*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt32:NULL forKey:NO]); 591*1b3f573fSAndroid Build Coastguard Worker 592*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 593*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 594*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt32:NULL forKey:YES]); 595*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt32:NULL forKey:NO]); 596*1b3f573fSAndroid Build Coastguard Worker [dict release]; 597*1b3f573fSAndroid Build Coastguard Worker} 598*1b3f573fSAndroid Build Coastguard Worker 599*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 600*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 601*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues[] = { 200, 201 }; 602*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict = 603*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues 604*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 605*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 606*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 607*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 608*1b3f573fSAndroid Build Coastguard Worker int32_t value; 609*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 610*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 611*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 612*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:NO]); 613*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:NO]); 614*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 615*1b3f573fSAndroid Build Coastguard Worker 616*1b3f573fSAndroid Build Coastguard Worker [dict setInt32:201 forKey:YES]; 617*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 618*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 619*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 620*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 621*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:NO]); 622*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:NO]); 623*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 624*1b3f573fSAndroid Build Coastguard Worker 625*1b3f573fSAndroid Build Coastguard Worker [dict setInt32:200 forKey:NO]; 626*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 627*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 628*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 629*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 630*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:NO]); 631*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:NO]); 632*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 633*1b3f573fSAndroid Build Coastguard Worker 634*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 635*1b3f573fSAndroid Build Coastguard Worker const int32_t kValues2[] = { 201, 200 }; 636*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt32Dictionary *dict2 = 637*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt32Dictionary alloc] initWithInt32s:kValues2 638*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 639*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 640*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 641*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 642*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 643*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:YES]); 644*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:YES]); 645*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 200); 646*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:NULL forKey:NO]); 647*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt32:&value forKey:NO]); 648*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 201); 649*1b3f573fSAndroid Build Coastguard Worker 650*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 651*1b3f573fSAndroid Build Coastguard Worker [dict release]; 652*1b3f573fSAndroid Build Coastguard Worker} 653*1b3f573fSAndroid Build Coastguard Worker 654*1b3f573fSAndroid Build Coastguard Worker@end 655*1b3f573fSAndroid Build Coastguard Worker 656*1b3f573fSAndroid Build Coastguard Worker// clang-format on 657*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(UInt64, uint64_t, 300U, 301U) 658*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 659*1b3f573fSAndroid Build Coastguard Worker// clang-format off 660*1b3f573fSAndroid Build Coastguard Worker 661*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> UInt64 662*1b3f573fSAndroid Build Coastguard Worker 663*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolUInt64DictionaryTests : XCTestCase 664*1b3f573fSAndroid Build Coastguard Worker@end 665*1b3f573fSAndroid Build Coastguard Worker 666*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolUInt64DictionaryTests 667*1b3f573fSAndroid Build Coastguard Worker 668*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 669*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = [[GPBBoolUInt64Dictionary alloc] init]; 670*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 671*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 672*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt64:NULL forKey:YES]); 673*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) { 674*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 675*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 676*1b3f573fSAndroid Build Coastguard Worker }]; 677*1b3f573fSAndroid Build Coastguard Worker [dict release]; 678*1b3f573fSAndroid Build Coastguard Worker} 679*1b3f573fSAndroid Build Coastguard Worker 680*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 681*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = [[GPBBoolUInt64Dictionary alloc] init]; 682*1b3f573fSAndroid Build Coastguard Worker [dict setUInt64:300U forKey:YES]; 683*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 684*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 685*1b3f573fSAndroid Build Coastguard Worker uint64_t value; 686*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 687*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 688*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 689*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt64:NULL forKey:NO]); 690*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) { 691*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 692*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, 300U); 693*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 694*1b3f573fSAndroid Build Coastguard Worker }]; 695*1b3f573fSAndroid Build Coastguard Worker [dict release]; 696*1b3f573fSAndroid Build Coastguard Worker} 697*1b3f573fSAndroid Build Coastguard Worker 698*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 699*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 700*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues[] = { 300U, 301U }; 701*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = 702*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues 703*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 704*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 705*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 706*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 707*1b3f573fSAndroid Build Coastguard Worker uint64_t value; 708*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 709*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 710*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 711*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:NO]); 712*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:NO]); 713*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 714*1b3f573fSAndroid Build Coastguard Worker 715*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 716*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 717*1b3f573fSAndroid Build Coastguard Worker uint64_t *seenValues = malloc(2 * sizeof(uint64_t)); 718*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) { 719*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 720*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 721*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 722*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 723*1b3f573fSAndroid Build Coastguard Worker ++idx; 724*1b3f573fSAndroid Build Coastguard Worker }]; 725*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 726*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 727*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 728*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 729*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 730*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 731*1b3f573fSAndroid Build Coastguard Worker } 732*1b3f573fSAndroid Build Coastguard Worker } 733*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 734*1b3f573fSAndroid Build Coastguard Worker } 735*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 736*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 737*1b3f573fSAndroid Build Coastguard Worker 738*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 739*1b3f573fSAndroid Build Coastguard Worker idx = 0; 740*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) { 741*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 742*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 743*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 744*1b3f573fSAndroid Build Coastguard Worker ++idx; 745*1b3f573fSAndroid Build Coastguard Worker }]; 746*1b3f573fSAndroid Build Coastguard Worker [dict release]; 747*1b3f573fSAndroid Build Coastguard Worker} 748*1b3f573fSAndroid Build Coastguard Worker 749*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 750*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 751*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 752*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues1[] = { 300U, 301U }; 753*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues2[] = { 301U, 300U }; 754*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues3[] = { 301U }; 755*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict1 = 756*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues1 757*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 758*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 759*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 760*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict1prime = 761*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues1 762*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 763*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 764*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 765*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict2 = 766*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues2 767*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 768*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 769*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 770*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict3 = 771*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues1 772*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 773*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 774*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 775*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict4 = 776*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues3 777*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 778*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 779*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 780*1b3f573fSAndroid Build Coastguard Worker 781*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 782*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 783*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 784*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 785*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 786*1b3f573fSAndroid Build Coastguard Worker 787*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 788*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 789*1b3f573fSAndroid Build Coastguard Worker 790*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 791*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 792*1b3f573fSAndroid Build Coastguard Worker 793*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 794*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 795*1b3f573fSAndroid Build Coastguard Worker 796*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 797*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 798*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 799*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 800*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 801*1b3f573fSAndroid Build Coastguard Worker} 802*1b3f573fSAndroid Build Coastguard Worker 803*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 804*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 805*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues[] = { 300U, 301U }; 806*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = 807*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues 808*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 809*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 810*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 811*1b3f573fSAndroid Build Coastguard Worker 812*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict2 = [dict copy]; 813*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 814*1b3f573fSAndroid Build Coastguard Worker 815*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 816*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 817*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 818*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolUInt64Dictionary class]]); 819*1b3f573fSAndroid Build Coastguard Worker 820*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 821*1b3f573fSAndroid Build Coastguard Worker [dict release]; 822*1b3f573fSAndroid Build Coastguard Worker} 823*1b3f573fSAndroid Build Coastguard Worker 824*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 825*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 826*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues[] = { 300U, 301U }; 827*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = 828*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues 829*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 830*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 831*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 832*1b3f573fSAndroid Build Coastguard Worker 833*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict2 = 834*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithDictionary:dict]; 835*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 836*1b3f573fSAndroid Build Coastguard Worker 837*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 838*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 839*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 840*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 841*1b3f573fSAndroid Build Coastguard Worker [dict release]; 842*1b3f573fSAndroid Build Coastguard Worker} 843*1b3f573fSAndroid Build Coastguard Worker 844*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 845*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = [[GPBBoolUInt64Dictionary alloc] init]; 846*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 847*1b3f573fSAndroid Build Coastguard Worker 848*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 849*1b3f573fSAndroid Build Coastguard Worker [dict setUInt64:300U forKey:YES]; 850*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 851*1b3f573fSAndroid Build Coastguard Worker 852*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 853*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues[] = { 301U }; 854*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict2 = 855*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues 856*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 857*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 858*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 859*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 860*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 861*1b3f573fSAndroid Build Coastguard Worker 862*1b3f573fSAndroid Build Coastguard Worker uint64_t value; 863*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 864*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 865*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 866*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:NO]); 867*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:NO]); 868*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 869*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 870*1b3f573fSAndroid Build Coastguard Worker [dict release]; 871*1b3f573fSAndroid Build Coastguard Worker} 872*1b3f573fSAndroid Build Coastguard Worker 873*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 874*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 875*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues[] = { 300U, 301U }; 876*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = 877*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues 878*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 879*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 880*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 881*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 882*1b3f573fSAndroid Build Coastguard Worker 883*1b3f573fSAndroid Build Coastguard Worker [dict removeUInt64ForKey:NO]; 884*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 885*1b3f573fSAndroid Build Coastguard Worker uint64_t value; 886*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 887*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 888*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 889*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt64:NULL forKey:NO]); 890*1b3f573fSAndroid Build Coastguard Worker 891*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 892*1b3f573fSAndroid Build Coastguard Worker [dict removeUInt64ForKey:NO]; 893*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 894*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 895*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 896*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 897*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt64:NULL forKey:NO]); 898*1b3f573fSAndroid Build Coastguard Worker 899*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 900*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 901*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt64:NULL forKey:YES]); 902*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getUInt64:NULL forKey:NO]); 903*1b3f573fSAndroid Build Coastguard Worker [dict release]; 904*1b3f573fSAndroid Build Coastguard Worker} 905*1b3f573fSAndroid Build Coastguard Worker 906*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 907*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 908*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues[] = { 300U, 301U }; 909*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict = 910*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues 911*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 912*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 913*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 914*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 915*1b3f573fSAndroid Build Coastguard Worker uint64_t value; 916*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 917*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 918*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 919*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:NO]); 920*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:NO]); 921*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 922*1b3f573fSAndroid Build Coastguard Worker 923*1b3f573fSAndroid Build Coastguard Worker [dict setUInt64:301U forKey:YES]; 924*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 925*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 926*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 927*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 928*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:NO]); 929*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:NO]); 930*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 931*1b3f573fSAndroid Build Coastguard Worker 932*1b3f573fSAndroid Build Coastguard Worker [dict setUInt64:300U forKey:NO]; 933*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 934*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 935*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 936*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 937*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:NO]); 938*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:NO]); 939*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 940*1b3f573fSAndroid Build Coastguard Worker 941*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 942*1b3f573fSAndroid Build Coastguard Worker const uint64_t kValues2[] = { 301U, 300U }; 943*1b3f573fSAndroid Build Coastguard Worker GPBBoolUInt64Dictionary *dict2 = 944*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolUInt64Dictionary alloc] initWithUInt64s:kValues2 945*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 946*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 947*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 948*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 949*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 950*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:YES]); 951*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:YES]); 952*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 300U); 953*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:NULL forKey:NO]); 954*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getUInt64:&value forKey:NO]); 955*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 301U); 956*1b3f573fSAndroid Build Coastguard Worker 957*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 958*1b3f573fSAndroid Build Coastguard Worker [dict release]; 959*1b3f573fSAndroid Build Coastguard Worker} 960*1b3f573fSAndroid Build Coastguard Worker 961*1b3f573fSAndroid Build Coastguard Worker@end 962*1b3f573fSAndroid Build Coastguard Worker 963*1b3f573fSAndroid Build Coastguard Worker// clang-format on 964*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Int64, int64_t, 400, 401) 965*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 966*1b3f573fSAndroid Build Coastguard Worker// clang-format off 967*1b3f573fSAndroid Build Coastguard Worker 968*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Int64 969*1b3f573fSAndroid Build Coastguard Worker 970*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolInt64DictionaryTests : XCTestCase 971*1b3f573fSAndroid Build Coastguard Worker@end 972*1b3f573fSAndroid Build Coastguard Worker 973*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolInt64DictionaryTests 974*1b3f573fSAndroid Build Coastguard Worker 975*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 976*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = [[GPBBoolInt64Dictionary alloc] init]; 977*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 978*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 979*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt64:NULL forKey:YES]); 980*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) { 981*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 982*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 983*1b3f573fSAndroid Build Coastguard Worker }]; 984*1b3f573fSAndroid Build Coastguard Worker [dict release]; 985*1b3f573fSAndroid Build Coastguard Worker} 986*1b3f573fSAndroid Build Coastguard Worker 987*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 988*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = [[GPBBoolInt64Dictionary alloc] init]; 989*1b3f573fSAndroid Build Coastguard Worker [dict setInt64:400 forKey:YES]; 990*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 991*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 992*1b3f573fSAndroid Build Coastguard Worker int64_t value; 993*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 994*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 995*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 996*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt64:NULL forKey:NO]); 997*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) { 998*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 999*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, 400); 1000*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1001*1b3f573fSAndroid Build Coastguard Worker }]; 1002*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1003*1b3f573fSAndroid Build Coastguard Worker} 1004*1b3f573fSAndroid Build Coastguard Worker 1005*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 1006*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1007*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues[] = { 400, 401 }; 1008*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = 1009*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues 1010*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1011*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1012*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1013*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1014*1b3f573fSAndroid Build Coastguard Worker int64_t value; 1015*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1016*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1017*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1018*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:NO]); 1019*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:NO]); 1020*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1021*1b3f573fSAndroid Build Coastguard Worker 1022*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 1023*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 1024*1b3f573fSAndroid Build Coastguard Worker int64_t *seenValues = malloc(2 * sizeof(int64_t)); 1025*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) { 1026*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 1027*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 1028*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 1029*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1030*1b3f573fSAndroid Build Coastguard Worker ++idx; 1031*1b3f573fSAndroid Build Coastguard Worker }]; 1032*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 1033*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 1034*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 1035*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 1036*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 1037*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 1038*1b3f573fSAndroid Build Coastguard Worker } 1039*1b3f573fSAndroid Build Coastguard Worker } 1040*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 1041*1b3f573fSAndroid Build Coastguard Worker } 1042*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 1043*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 1044*1b3f573fSAndroid Build Coastguard Worker 1045*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 1046*1b3f573fSAndroid Build Coastguard Worker idx = 0; 1047*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) { 1048*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 1049*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 1050*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 1051*1b3f573fSAndroid Build Coastguard Worker ++idx; 1052*1b3f573fSAndroid Build Coastguard Worker }]; 1053*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1054*1b3f573fSAndroid Build Coastguard Worker} 1055*1b3f573fSAndroid Build Coastguard Worker 1056*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 1057*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 1058*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1059*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues1[] = { 400, 401 }; 1060*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues2[] = { 401, 400 }; 1061*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues3[] = { 401 }; 1062*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict1 = 1063*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues1 1064*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1065*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1066*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 1067*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict1prime = 1068*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues1 1069*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1070*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1071*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 1072*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict2 = 1073*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues2 1074*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1075*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1076*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1077*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict3 = 1078*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues1 1079*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 1080*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1081*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 1082*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict4 = 1083*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues3 1084*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1085*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 1086*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 1087*1b3f573fSAndroid Build Coastguard Worker 1088*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 1089*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 1090*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 1091*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 1092*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 1093*1b3f573fSAndroid Build Coastguard Worker 1094*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 1095*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 1096*1b3f573fSAndroid Build Coastguard Worker 1097*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 1098*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 1099*1b3f573fSAndroid Build Coastguard Worker 1100*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 1101*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 1102*1b3f573fSAndroid Build Coastguard Worker 1103*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 1104*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 1105*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1106*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 1107*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 1108*1b3f573fSAndroid Build Coastguard Worker} 1109*1b3f573fSAndroid Build Coastguard Worker 1110*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 1111*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1112*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues[] = { 400, 401 }; 1113*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = 1114*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues 1115*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1116*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1117*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1118*1b3f573fSAndroid Build Coastguard Worker 1119*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict2 = [dict copy]; 1120*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1121*1b3f573fSAndroid Build Coastguard Worker 1122*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 1123*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 1124*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 1125*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolInt64Dictionary class]]); 1126*1b3f573fSAndroid Build Coastguard Worker 1127*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1128*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1129*1b3f573fSAndroid Build Coastguard Worker} 1130*1b3f573fSAndroid Build Coastguard Worker 1131*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 1132*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1133*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues[] = { 400, 401 }; 1134*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = 1135*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues 1136*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1137*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1138*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1139*1b3f573fSAndroid Build Coastguard Worker 1140*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict2 = 1141*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithDictionary:dict]; 1142*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1143*1b3f573fSAndroid Build Coastguard Worker 1144*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 1145*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 1146*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 1147*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1148*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1149*1b3f573fSAndroid Build Coastguard Worker} 1150*1b3f573fSAndroid Build Coastguard Worker 1151*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 1152*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = [[GPBBoolInt64Dictionary alloc] init]; 1153*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1154*1b3f573fSAndroid Build Coastguard Worker 1155*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1156*1b3f573fSAndroid Build Coastguard Worker [dict setInt64:400 forKey:YES]; 1157*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1158*1b3f573fSAndroid Build Coastguard Worker 1159*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 1160*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues[] = { 401 }; 1161*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict2 = 1162*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues 1163*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1164*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1165*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1166*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 1167*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1168*1b3f573fSAndroid Build Coastguard Worker 1169*1b3f573fSAndroid Build Coastguard Worker int64_t value; 1170*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1171*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1172*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1173*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:NO]); 1174*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:NO]); 1175*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1176*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1177*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1178*1b3f573fSAndroid Build Coastguard Worker} 1179*1b3f573fSAndroid Build Coastguard Worker 1180*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 1181*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 1182*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues[] = { 400, 401 }; 1183*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = 1184*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues 1185*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1186*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1187*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1188*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1189*1b3f573fSAndroid Build Coastguard Worker 1190*1b3f573fSAndroid Build Coastguard Worker [dict removeInt64ForKey:NO]; 1191*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1192*1b3f573fSAndroid Build Coastguard Worker int64_t value; 1193*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1194*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1195*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1196*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt64:NULL forKey:NO]); 1197*1b3f573fSAndroid Build Coastguard Worker 1198*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 1199*1b3f573fSAndroid Build Coastguard Worker [dict removeInt64ForKey:NO]; 1200*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1201*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1202*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1203*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1204*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt64:NULL forKey:NO]); 1205*1b3f573fSAndroid Build Coastguard Worker 1206*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 1207*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1208*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt64:NULL forKey:YES]); 1209*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getInt64:NULL forKey:NO]); 1210*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1211*1b3f573fSAndroid Build Coastguard Worker} 1212*1b3f573fSAndroid Build Coastguard Worker 1213*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 1214*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1215*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues[] = { 400, 401 }; 1216*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict = 1217*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues 1218*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1219*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1220*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1221*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1222*1b3f573fSAndroid Build Coastguard Worker int64_t value; 1223*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1224*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1225*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1226*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:NO]); 1227*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:NO]); 1228*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1229*1b3f573fSAndroid Build Coastguard Worker 1230*1b3f573fSAndroid Build Coastguard Worker [dict setInt64:401 forKey:YES]; 1231*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1232*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1233*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1234*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1235*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:NO]); 1236*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:NO]); 1237*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1238*1b3f573fSAndroid Build Coastguard Worker 1239*1b3f573fSAndroid Build Coastguard Worker [dict setInt64:400 forKey:NO]; 1240*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1241*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1242*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1243*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1244*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:NO]); 1245*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:NO]); 1246*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1247*1b3f573fSAndroid Build Coastguard Worker 1248*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1249*1b3f573fSAndroid Build Coastguard Worker const int64_t kValues2[] = { 401, 400 }; 1250*1b3f573fSAndroid Build Coastguard Worker GPBBoolInt64Dictionary *dict2 = 1251*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolInt64Dictionary alloc] initWithInt64s:kValues2 1252*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 1253*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1254*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1255*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 1256*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1257*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:YES]); 1258*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:YES]); 1259*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 400); 1260*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:NULL forKey:NO]); 1261*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getInt64:&value forKey:NO]); 1262*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 401); 1263*1b3f573fSAndroid Build Coastguard Worker 1264*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1265*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1266*1b3f573fSAndroid Build Coastguard Worker} 1267*1b3f573fSAndroid Build Coastguard Worker 1268*1b3f573fSAndroid Build Coastguard Worker@end 1269*1b3f573fSAndroid Build Coastguard Worker 1270*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1271*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Bool, BOOL, NO, YES) 1272*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1273*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1274*1b3f573fSAndroid Build Coastguard Worker 1275*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Bool 1276*1b3f573fSAndroid Build Coastguard Worker 1277*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolBoolDictionaryTests : XCTestCase 1278*1b3f573fSAndroid Build Coastguard Worker@end 1279*1b3f573fSAndroid Build Coastguard Worker 1280*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolBoolDictionaryTests 1281*1b3f573fSAndroid Build Coastguard Worker 1282*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 1283*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = [[GPBBoolBoolDictionary alloc] init]; 1284*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1285*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1286*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getBool:NULL forKey:YES]); 1287*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) { 1288*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 1289*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 1290*1b3f573fSAndroid Build Coastguard Worker }]; 1291*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1292*1b3f573fSAndroid Build Coastguard Worker} 1293*1b3f573fSAndroid Build Coastguard Worker 1294*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 1295*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = [[GPBBoolBoolDictionary alloc] init]; 1296*1b3f573fSAndroid Build Coastguard Worker [dict setBool:NO forKey:YES]; 1297*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1298*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1299*1b3f573fSAndroid Build Coastguard Worker BOOL value; 1300*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1301*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1302*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1303*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getBool:NULL forKey:NO]); 1304*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) { 1305*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 1306*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, NO); 1307*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1308*1b3f573fSAndroid Build Coastguard Worker }]; 1309*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1310*1b3f573fSAndroid Build Coastguard Worker} 1311*1b3f573fSAndroid Build Coastguard Worker 1312*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 1313*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1314*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues[] = { NO, YES }; 1315*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = 1316*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues 1317*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1318*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1319*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1320*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1321*1b3f573fSAndroid Build Coastguard Worker BOOL value; 1322*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1323*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1324*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1325*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:NO]); 1326*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:NO]); 1327*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1328*1b3f573fSAndroid Build Coastguard Worker 1329*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 1330*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 1331*1b3f573fSAndroid Build Coastguard Worker BOOL *seenValues = malloc(2 * sizeof(BOOL)); 1332*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) { 1333*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 1334*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 1335*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 1336*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1337*1b3f573fSAndroid Build Coastguard Worker ++idx; 1338*1b3f573fSAndroid Build Coastguard Worker }]; 1339*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 1340*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 1341*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 1342*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 1343*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 1344*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 1345*1b3f573fSAndroid Build Coastguard Worker } 1346*1b3f573fSAndroid Build Coastguard Worker } 1347*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 1348*1b3f573fSAndroid Build Coastguard Worker } 1349*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 1350*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 1351*1b3f573fSAndroid Build Coastguard Worker 1352*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 1353*1b3f573fSAndroid Build Coastguard Worker idx = 0; 1354*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) { 1355*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 1356*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 1357*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 1358*1b3f573fSAndroid Build Coastguard Worker ++idx; 1359*1b3f573fSAndroid Build Coastguard Worker }]; 1360*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1361*1b3f573fSAndroid Build Coastguard Worker} 1362*1b3f573fSAndroid Build Coastguard Worker 1363*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 1364*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 1365*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1366*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues1[] = { NO, YES }; 1367*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues2[] = { YES, NO }; 1368*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues3[] = { YES }; 1369*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict1 = 1370*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues1 1371*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1372*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1373*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 1374*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict1prime = 1375*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues1 1376*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1377*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1378*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 1379*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict2 = 1380*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues2 1381*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1382*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1383*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1384*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict3 = 1385*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues1 1386*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 1387*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1388*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 1389*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict4 = 1390*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues3 1391*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1392*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 1393*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 1394*1b3f573fSAndroid Build Coastguard Worker 1395*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 1396*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 1397*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 1398*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 1399*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 1400*1b3f573fSAndroid Build Coastguard Worker 1401*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 1402*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 1403*1b3f573fSAndroid Build Coastguard Worker 1404*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 1405*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 1406*1b3f573fSAndroid Build Coastguard Worker 1407*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 1408*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 1409*1b3f573fSAndroid Build Coastguard Worker 1410*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 1411*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 1412*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1413*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 1414*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 1415*1b3f573fSAndroid Build Coastguard Worker} 1416*1b3f573fSAndroid Build Coastguard Worker 1417*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 1418*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1419*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues[] = { NO, YES }; 1420*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = 1421*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues 1422*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1423*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1424*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1425*1b3f573fSAndroid Build Coastguard Worker 1426*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict2 = [dict copy]; 1427*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1428*1b3f573fSAndroid Build Coastguard Worker 1429*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 1430*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 1431*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 1432*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolBoolDictionary class]]); 1433*1b3f573fSAndroid Build Coastguard Worker 1434*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1435*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1436*1b3f573fSAndroid Build Coastguard Worker} 1437*1b3f573fSAndroid Build Coastguard Worker 1438*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 1439*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1440*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues[] = { NO, YES }; 1441*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = 1442*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues 1443*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1444*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1445*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1446*1b3f573fSAndroid Build Coastguard Worker 1447*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict2 = 1448*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithDictionary:dict]; 1449*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1450*1b3f573fSAndroid Build Coastguard Worker 1451*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 1452*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 1453*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 1454*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1455*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1456*1b3f573fSAndroid Build Coastguard Worker} 1457*1b3f573fSAndroid Build Coastguard Worker 1458*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 1459*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = [[GPBBoolBoolDictionary alloc] init]; 1460*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1461*1b3f573fSAndroid Build Coastguard Worker 1462*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1463*1b3f573fSAndroid Build Coastguard Worker [dict setBool:NO forKey:YES]; 1464*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1465*1b3f573fSAndroid Build Coastguard Worker 1466*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 1467*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues[] = { YES }; 1468*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict2 = 1469*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues 1470*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1471*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1472*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1473*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 1474*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1475*1b3f573fSAndroid Build Coastguard Worker 1476*1b3f573fSAndroid Build Coastguard Worker BOOL value; 1477*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1478*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1479*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1480*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:NO]); 1481*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:NO]); 1482*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1483*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1484*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1485*1b3f573fSAndroid Build Coastguard Worker} 1486*1b3f573fSAndroid Build Coastguard Worker 1487*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 1488*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 1489*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues[] = { NO, YES }; 1490*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = 1491*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues 1492*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1493*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1494*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1495*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1496*1b3f573fSAndroid Build Coastguard Worker 1497*1b3f573fSAndroid Build Coastguard Worker [dict removeBoolForKey:NO]; 1498*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1499*1b3f573fSAndroid Build Coastguard Worker BOOL value; 1500*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1501*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1502*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1503*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getBool:NULL forKey:NO]); 1504*1b3f573fSAndroid Build Coastguard Worker 1505*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 1506*1b3f573fSAndroid Build Coastguard Worker [dict removeBoolForKey:NO]; 1507*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1508*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1509*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1510*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1511*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getBool:NULL forKey:NO]); 1512*1b3f573fSAndroid Build Coastguard Worker 1513*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 1514*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1515*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getBool:NULL forKey:YES]); 1516*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getBool:NULL forKey:NO]); 1517*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1518*1b3f573fSAndroid Build Coastguard Worker} 1519*1b3f573fSAndroid Build Coastguard Worker 1520*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 1521*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1522*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues[] = { NO, YES }; 1523*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict = 1524*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues 1525*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1526*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1527*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1528*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1529*1b3f573fSAndroid Build Coastguard Worker BOOL value; 1530*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1531*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1532*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1533*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:NO]); 1534*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:NO]); 1535*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1536*1b3f573fSAndroid Build Coastguard Worker 1537*1b3f573fSAndroid Build Coastguard Worker [dict setBool:YES forKey:YES]; 1538*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1539*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1540*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1541*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1542*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:NO]); 1543*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:NO]); 1544*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1545*1b3f573fSAndroid Build Coastguard Worker 1546*1b3f573fSAndroid Build Coastguard Worker [dict setBool:NO forKey:NO]; 1547*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1548*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1549*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1550*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1551*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:NO]); 1552*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:NO]); 1553*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1554*1b3f573fSAndroid Build Coastguard Worker 1555*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1556*1b3f573fSAndroid Build Coastguard Worker const BOOL kValues2[] = { YES, NO }; 1557*1b3f573fSAndroid Build Coastguard Worker GPBBoolBoolDictionary *dict2 = 1558*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolBoolDictionary alloc] initWithBools:kValues2 1559*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 1560*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1561*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1562*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 1563*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1564*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:YES]); 1565*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:YES]); 1566*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, NO); 1567*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:NULL forKey:NO]); 1568*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getBool:&value forKey:NO]); 1569*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, YES); 1570*1b3f573fSAndroid Build Coastguard Worker 1571*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1572*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1573*1b3f573fSAndroid Build Coastguard Worker} 1574*1b3f573fSAndroid Build Coastguard Worker 1575*1b3f573fSAndroid Build Coastguard Worker@end 1576*1b3f573fSAndroid Build Coastguard Worker 1577*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1578*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Float, float, 500.f, 501.f) 1579*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1580*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1581*1b3f573fSAndroid Build Coastguard Worker 1582*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Float 1583*1b3f573fSAndroid Build Coastguard Worker 1584*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolFloatDictionaryTests : XCTestCase 1585*1b3f573fSAndroid Build Coastguard Worker@end 1586*1b3f573fSAndroid Build Coastguard Worker 1587*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolFloatDictionaryTests 1588*1b3f573fSAndroid Build Coastguard Worker 1589*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 1590*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = [[GPBBoolFloatDictionary alloc] init]; 1591*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1592*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1593*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getFloat:NULL forKey:YES]); 1594*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) { 1595*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 1596*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 1597*1b3f573fSAndroid Build Coastguard Worker }]; 1598*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1599*1b3f573fSAndroid Build Coastguard Worker} 1600*1b3f573fSAndroid Build Coastguard Worker 1601*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 1602*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = [[GPBBoolFloatDictionary alloc] init]; 1603*1b3f573fSAndroid Build Coastguard Worker [dict setFloat:500.f forKey:YES]; 1604*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1605*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1606*1b3f573fSAndroid Build Coastguard Worker float value; 1607*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1608*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1609*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1610*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getFloat:NULL forKey:NO]); 1611*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) { 1612*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 1613*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, 500.f); 1614*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1615*1b3f573fSAndroid Build Coastguard Worker }]; 1616*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1617*1b3f573fSAndroid Build Coastguard Worker} 1618*1b3f573fSAndroid Build Coastguard Worker 1619*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 1620*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1621*1b3f573fSAndroid Build Coastguard Worker const float kValues[] = { 500.f, 501.f }; 1622*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = 1623*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues 1624*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1625*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1626*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1627*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1628*1b3f573fSAndroid Build Coastguard Worker float value; 1629*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1630*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1631*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1632*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:NO]); 1633*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:NO]); 1634*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1635*1b3f573fSAndroid Build Coastguard Worker 1636*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 1637*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 1638*1b3f573fSAndroid Build Coastguard Worker float *seenValues = malloc(2 * sizeof(float)); 1639*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) { 1640*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 1641*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 1642*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 1643*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1644*1b3f573fSAndroid Build Coastguard Worker ++idx; 1645*1b3f573fSAndroid Build Coastguard Worker }]; 1646*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 1647*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 1648*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 1649*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 1650*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 1651*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 1652*1b3f573fSAndroid Build Coastguard Worker } 1653*1b3f573fSAndroid Build Coastguard Worker } 1654*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 1655*1b3f573fSAndroid Build Coastguard Worker } 1656*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 1657*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 1658*1b3f573fSAndroid Build Coastguard Worker 1659*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 1660*1b3f573fSAndroid Build Coastguard Worker idx = 0; 1661*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) { 1662*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 1663*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 1664*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 1665*1b3f573fSAndroid Build Coastguard Worker ++idx; 1666*1b3f573fSAndroid Build Coastguard Worker }]; 1667*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1668*1b3f573fSAndroid Build Coastguard Worker} 1669*1b3f573fSAndroid Build Coastguard Worker 1670*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 1671*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 1672*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1673*1b3f573fSAndroid Build Coastguard Worker const float kValues1[] = { 500.f, 501.f }; 1674*1b3f573fSAndroid Build Coastguard Worker const float kValues2[] = { 501.f, 500.f }; 1675*1b3f573fSAndroid Build Coastguard Worker const float kValues3[] = { 501.f }; 1676*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict1 = 1677*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues1 1678*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1679*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1680*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 1681*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict1prime = 1682*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues1 1683*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1684*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1685*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 1686*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict2 = 1687*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues2 1688*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1689*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1690*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1691*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict3 = 1692*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues1 1693*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 1694*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1695*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 1696*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict4 = 1697*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues3 1698*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1699*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 1700*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 1701*1b3f573fSAndroid Build Coastguard Worker 1702*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 1703*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 1704*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 1705*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 1706*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 1707*1b3f573fSAndroid Build Coastguard Worker 1708*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 1709*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 1710*1b3f573fSAndroid Build Coastguard Worker 1711*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 1712*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 1713*1b3f573fSAndroid Build Coastguard Worker 1714*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 1715*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 1716*1b3f573fSAndroid Build Coastguard Worker 1717*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 1718*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 1719*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1720*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 1721*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 1722*1b3f573fSAndroid Build Coastguard Worker} 1723*1b3f573fSAndroid Build Coastguard Worker 1724*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 1725*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1726*1b3f573fSAndroid Build Coastguard Worker const float kValues[] = { 500.f, 501.f }; 1727*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = 1728*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues 1729*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1730*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1731*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1732*1b3f573fSAndroid Build Coastguard Worker 1733*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict2 = [dict copy]; 1734*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1735*1b3f573fSAndroid Build Coastguard Worker 1736*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 1737*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 1738*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 1739*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolFloatDictionary class]]); 1740*1b3f573fSAndroid Build Coastguard Worker 1741*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1742*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1743*1b3f573fSAndroid Build Coastguard Worker} 1744*1b3f573fSAndroid Build Coastguard Worker 1745*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 1746*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1747*1b3f573fSAndroid Build Coastguard Worker const float kValues[] = { 500.f, 501.f }; 1748*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = 1749*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues 1750*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1751*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1752*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1753*1b3f573fSAndroid Build Coastguard Worker 1754*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict2 = 1755*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithDictionary:dict]; 1756*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1757*1b3f573fSAndroid Build Coastguard Worker 1758*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 1759*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 1760*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 1761*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1762*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1763*1b3f573fSAndroid Build Coastguard Worker} 1764*1b3f573fSAndroid Build Coastguard Worker 1765*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 1766*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = [[GPBBoolFloatDictionary alloc] init]; 1767*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1768*1b3f573fSAndroid Build Coastguard Worker 1769*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1770*1b3f573fSAndroid Build Coastguard Worker [dict setFloat:500.f forKey:YES]; 1771*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1772*1b3f573fSAndroid Build Coastguard Worker 1773*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 1774*1b3f573fSAndroid Build Coastguard Worker const float kValues[] = { 501.f }; 1775*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict2 = 1776*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues 1777*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1778*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1779*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1780*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 1781*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1782*1b3f573fSAndroid Build Coastguard Worker 1783*1b3f573fSAndroid Build Coastguard Worker float value; 1784*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1785*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1786*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1787*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:NO]); 1788*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:NO]); 1789*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1790*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1791*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1792*1b3f573fSAndroid Build Coastguard Worker} 1793*1b3f573fSAndroid Build Coastguard Worker 1794*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 1795*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 1796*1b3f573fSAndroid Build Coastguard Worker const float kValues[] = { 500.f, 501.f }; 1797*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = 1798*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues 1799*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1800*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1801*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1802*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1803*1b3f573fSAndroid Build Coastguard Worker 1804*1b3f573fSAndroid Build Coastguard Worker [dict removeFloatForKey:NO]; 1805*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1806*1b3f573fSAndroid Build Coastguard Worker float value; 1807*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1808*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1809*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1810*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getFloat:NULL forKey:NO]); 1811*1b3f573fSAndroid Build Coastguard Worker 1812*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 1813*1b3f573fSAndroid Build Coastguard Worker [dict removeFloatForKey:NO]; 1814*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1815*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1816*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1817*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1818*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getFloat:NULL forKey:NO]); 1819*1b3f573fSAndroid Build Coastguard Worker 1820*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 1821*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1822*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getFloat:NULL forKey:YES]); 1823*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getFloat:NULL forKey:NO]); 1824*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1825*1b3f573fSAndroid Build Coastguard Worker} 1826*1b3f573fSAndroid Build Coastguard Worker 1827*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 1828*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1829*1b3f573fSAndroid Build Coastguard Worker const float kValues[] = { 500.f, 501.f }; 1830*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict = 1831*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues 1832*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1833*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1834*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1835*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1836*1b3f573fSAndroid Build Coastguard Worker float value; 1837*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1838*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1839*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1840*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:NO]); 1841*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:NO]); 1842*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1843*1b3f573fSAndroid Build Coastguard Worker 1844*1b3f573fSAndroid Build Coastguard Worker [dict setFloat:501.f forKey:YES]; 1845*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1846*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1847*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1848*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1849*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:NO]); 1850*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:NO]); 1851*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1852*1b3f573fSAndroid Build Coastguard Worker 1853*1b3f573fSAndroid Build Coastguard Worker [dict setFloat:500.f forKey:NO]; 1854*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1855*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1856*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1857*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1858*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:NO]); 1859*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:NO]); 1860*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1861*1b3f573fSAndroid Build Coastguard Worker 1862*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1863*1b3f573fSAndroid Build Coastguard Worker const float kValues2[] = { 501.f, 500.f }; 1864*1b3f573fSAndroid Build Coastguard Worker GPBBoolFloatDictionary *dict2 = 1865*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolFloatDictionary alloc] initWithFloats:kValues2 1866*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 1867*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1868*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1869*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 1870*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1871*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:YES]); 1872*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:YES]); 1873*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 500.f); 1874*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:NULL forKey:NO]); 1875*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getFloat:&value forKey:NO]); 1876*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 501.f); 1877*1b3f573fSAndroid Build Coastguard Worker 1878*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 1879*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1880*1b3f573fSAndroid Build Coastguard Worker} 1881*1b3f573fSAndroid Build Coastguard Worker 1882*1b3f573fSAndroid Build Coastguard Worker@end 1883*1b3f573fSAndroid Build Coastguard Worker 1884*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1885*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Double, double, 600., 601.) 1886*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1887*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1888*1b3f573fSAndroid Build Coastguard Worker 1889*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Double 1890*1b3f573fSAndroid Build Coastguard Worker 1891*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolDoubleDictionaryTests : XCTestCase 1892*1b3f573fSAndroid Build Coastguard Worker@end 1893*1b3f573fSAndroid Build Coastguard Worker 1894*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolDoubleDictionaryTests 1895*1b3f573fSAndroid Build Coastguard Worker 1896*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 1897*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = [[GPBBoolDoubleDictionary alloc] init]; 1898*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1899*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 1900*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getDouble:NULL forKey:YES]); 1901*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) { 1902*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue, stop) 1903*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 1904*1b3f573fSAndroid Build Coastguard Worker }]; 1905*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1906*1b3f573fSAndroid Build Coastguard Worker} 1907*1b3f573fSAndroid Build Coastguard Worker 1908*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 1909*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = [[GPBBoolDoubleDictionary alloc] init]; 1910*1b3f573fSAndroid Build Coastguard Worker [dict setDouble:600. forKey:YES]; 1911*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1912*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 1913*1b3f573fSAndroid Build Coastguard Worker double value; 1914*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 1915*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 1916*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 1917*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getDouble:NULL forKey:NO]); 1918*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) { 1919*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 1920*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aValue, 600.); 1921*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1922*1b3f573fSAndroid Build Coastguard Worker }]; 1923*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1924*1b3f573fSAndroid Build Coastguard Worker} 1925*1b3f573fSAndroid Build Coastguard Worker 1926*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 1927*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 1928*1b3f573fSAndroid Build Coastguard Worker const double kValues[] = { 600., 601. }; 1929*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = 1930*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues 1931*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 1932*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 1933*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 1934*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 1935*1b3f573fSAndroid Build Coastguard Worker double value; 1936*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 1937*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 1938*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 1939*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:NO]); 1940*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:NO]); 1941*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 1942*1b3f573fSAndroid Build Coastguard Worker 1943*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 1944*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 1945*1b3f573fSAndroid Build Coastguard Worker double *seenValues = malloc(2 * sizeof(double)); 1946*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) { 1947*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 1948*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 1949*1b3f573fSAndroid Build Coastguard Worker seenValues[idx] = aValue; 1950*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 1951*1b3f573fSAndroid Build Coastguard Worker ++idx; 1952*1b3f573fSAndroid Build Coastguard Worker }]; 1953*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 1954*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 1955*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 1956*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 1957*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 1958*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(kValues[i], seenValues[j], @"i = %d, j = %d", i, j); 1959*1b3f573fSAndroid Build Coastguard Worker } 1960*1b3f573fSAndroid Build Coastguard Worker } 1961*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 1962*1b3f573fSAndroid Build Coastguard Worker } 1963*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 1964*1b3f573fSAndroid Build Coastguard Worker free(seenValues); 1965*1b3f573fSAndroid Build Coastguard Worker 1966*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 1967*1b3f573fSAndroid Build Coastguard Worker idx = 0; 1968*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) { 1969*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aValue) 1970*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 1971*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 1972*1b3f573fSAndroid Build Coastguard Worker ++idx; 1973*1b3f573fSAndroid Build Coastguard Worker }]; 1974*1b3f573fSAndroid Build Coastguard Worker [dict release]; 1975*1b3f573fSAndroid Build Coastguard Worker} 1976*1b3f573fSAndroid Build Coastguard Worker 1977*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 1978*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 1979*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 1980*1b3f573fSAndroid Build Coastguard Worker const double kValues1[] = { 600., 601. }; 1981*1b3f573fSAndroid Build Coastguard Worker const double kValues2[] = { 601., 600. }; 1982*1b3f573fSAndroid Build Coastguard Worker const double kValues3[] = { 601. }; 1983*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict1 = 1984*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues1 1985*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1986*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1987*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 1988*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict1prime = 1989*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues1 1990*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1991*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 1992*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 1993*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict2 = 1994*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues2 1995*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 1996*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 1997*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 1998*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict3 = 1999*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues1 2000*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 2001*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues1)]; 2002*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 2003*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict4 = 2004*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues3 2005*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 2006*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues3)]; 2007*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 2008*1b3f573fSAndroid Build Coastguard Worker 2009*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 2010*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 2011*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 2012*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 2013*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 2014*1b3f573fSAndroid Build Coastguard Worker 2015*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different values; not equal. 2016*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 2017*1b3f573fSAndroid Build Coastguard Worker 2018*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same values; not equal. 2019*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 2020*1b3f573fSAndroid Build Coastguard Worker 2021*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 2022*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 2023*1b3f573fSAndroid Build Coastguard Worker 2024*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 2025*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 2026*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2027*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 2028*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 2029*1b3f573fSAndroid Build Coastguard Worker} 2030*1b3f573fSAndroid Build Coastguard Worker 2031*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 2032*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2033*1b3f573fSAndroid Build Coastguard Worker const double kValues[] = { 600., 601. }; 2034*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = 2035*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues 2036*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2037*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 2038*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2039*1b3f573fSAndroid Build Coastguard Worker 2040*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict2 = [dict copy]; 2041*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2042*1b3f573fSAndroid Build Coastguard Worker 2043*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 2044*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 2045*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 2046*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolDoubleDictionary class]]); 2047*1b3f573fSAndroid Build Coastguard Worker 2048*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2049*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2050*1b3f573fSAndroid Build Coastguard Worker} 2051*1b3f573fSAndroid Build Coastguard Worker 2052*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 2053*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2054*1b3f573fSAndroid Build Coastguard Worker const double kValues[] = { 600., 601. }; 2055*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = 2056*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues 2057*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2058*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 2059*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2060*1b3f573fSAndroid Build Coastguard Worker 2061*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict2 = 2062*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDictionary:dict]; 2063*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2064*1b3f573fSAndroid Build Coastguard Worker 2065*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 2066*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 2067*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 2068*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2069*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2070*1b3f573fSAndroid Build Coastguard Worker} 2071*1b3f573fSAndroid Build Coastguard Worker 2072*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 2073*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = [[GPBBoolDoubleDictionary alloc] init]; 2074*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2075*1b3f573fSAndroid Build Coastguard Worker 2076*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 2077*1b3f573fSAndroid Build Coastguard Worker [dict setDouble:600. forKey:YES]; 2078*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2079*1b3f573fSAndroid Build Coastguard Worker 2080*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 2081*1b3f573fSAndroid Build Coastguard Worker const double kValues[] = { 601. }; 2082*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict2 = 2083*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues 2084*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2085*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 2086*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2087*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 2088*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2089*1b3f573fSAndroid Build Coastguard Worker 2090*1b3f573fSAndroid Build Coastguard Worker double value; 2091*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2092*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2093*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 2094*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:NO]); 2095*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:NO]); 2096*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 2097*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2098*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2099*1b3f573fSAndroid Build Coastguard Worker} 2100*1b3f573fSAndroid Build Coastguard Worker 2101*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 2102*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 2103*1b3f573fSAndroid Build Coastguard Worker const double kValues[] = { 600., 601. }; 2104*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = 2105*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues 2106*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2107*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 2108*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2109*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2110*1b3f573fSAndroid Build Coastguard Worker 2111*1b3f573fSAndroid Build Coastguard Worker [dict removeDoubleForKey:NO]; 2112*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2113*1b3f573fSAndroid Build Coastguard Worker double value; 2114*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2115*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2116*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 2117*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getDouble:NULL forKey:NO]); 2118*1b3f573fSAndroid Build Coastguard Worker 2119*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 2120*1b3f573fSAndroid Build Coastguard Worker [dict removeDoubleForKey:NO]; 2121*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2122*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2123*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2124*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 2125*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getDouble:NULL forKey:NO]); 2126*1b3f573fSAndroid Build Coastguard Worker 2127*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 2128*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 2129*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getDouble:NULL forKey:YES]); 2130*1b3f573fSAndroid Build Coastguard Worker XCTAssertFalse([dict getDouble:NULL forKey:NO]); 2131*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2132*1b3f573fSAndroid Build Coastguard Worker} 2133*1b3f573fSAndroid Build Coastguard Worker 2134*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 2135*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2136*1b3f573fSAndroid Build Coastguard Worker const double kValues[] = { 600., 601. }; 2137*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict = 2138*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues 2139*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2140*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues)]; 2141*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2142*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2143*1b3f573fSAndroid Build Coastguard Worker double value; 2144*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2145*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2146*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 2147*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:NO]); 2148*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:NO]); 2149*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 2150*1b3f573fSAndroid Build Coastguard Worker 2151*1b3f573fSAndroid Build Coastguard Worker [dict setDouble:601. forKey:YES]; 2152*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2153*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2154*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2155*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 2156*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:NO]); 2157*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:NO]); 2158*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 2159*1b3f573fSAndroid Build Coastguard Worker 2160*1b3f573fSAndroid Build Coastguard Worker [dict setDouble:600. forKey:NO]; 2161*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2162*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2163*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2164*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 2165*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:NO]); 2166*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:NO]); 2167*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 2168*1b3f573fSAndroid Build Coastguard Worker 2169*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 2170*1b3f573fSAndroid Build Coastguard Worker const double kValues2[] = { 601., 600. }; 2171*1b3f573fSAndroid Build Coastguard Worker GPBBoolDoubleDictionary *dict2 = 2172*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolDoubleDictionary alloc] initWithDoubles:kValues2 2173*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 2174*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kValues2)]; 2175*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2176*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 2177*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2178*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:YES]); 2179*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:YES]); 2180*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 600.); 2181*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:NULL forKey:NO]); 2182*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict getDouble:&value forKey:NO]); 2183*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(value, 601.); 2184*1b3f573fSAndroid Build Coastguard Worker 2185*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2186*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2187*1b3f573fSAndroid Build Coastguard Worker} 2188*1b3f573fSAndroid Build Coastguard Worker 2189*1b3f573fSAndroid Build Coastguard Worker@end 2190*1b3f573fSAndroid Build Coastguard Worker 2191*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2192*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND TESTS_FOR_BOOL_KEY_OBJECT_VALUE(Object, NSString*, @"abc", @"def") 2193*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 2194*1b3f573fSAndroid Build Coastguard Worker// clang-format off 2195*1b3f573fSAndroid Build Coastguard Worker 2196*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool -> Object 2197*1b3f573fSAndroid Build Coastguard Worker 2198*1b3f573fSAndroid Build Coastguard Worker@interface GPBBoolObjectDictionaryTests : XCTestCase 2199*1b3f573fSAndroid Build Coastguard Worker@end 2200*1b3f573fSAndroid Build Coastguard Worker 2201*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolObjectDictionaryTests 2202*1b3f573fSAndroid Build Coastguard Worker 2203*1b3f573fSAndroid Build Coastguard Worker- (void)testEmpty { 2204*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = [[GPBBoolObjectDictionary alloc] init]; 2205*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2206*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 2207*1b3f573fSAndroid Build Coastguard Worker XCTAssertNil([dict objectForKey:YES]); 2208*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndObjectsUsingBlock:^(BOOL aKey, NSString* aObject, BOOL *stop) { 2209*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aObject, stop) 2210*1b3f573fSAndroid Build Coastguard Worker XCTFail(@"Shouldn't get here!"); 2211*1b3f573fSAndroid Build Coastguard Worker }]; 2212*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2213*1b3f573fSAndroid Build Coastguard Worker} 2214*1b3f573fSAndroid Build Coastguard Worker 2215*1b3f573fSAndroid Build Coastguard Worker- (void)testOne { 2216*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = [[GPBBoolObjectDictionary alloc] init]; 2217*1b3f573fSAndroid Build Coastguard Worker [dict setObject:@"abc" forKey:YES]; 2218*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2219*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2220*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2221*1b3f573fSAndroid Build Coastguard Worker XCTAssertNil([dict objectForKey:NO]); 2222*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndObjectsUsingBlock:^(BOOL aKey, NSString* aObject, BOOL *stop) { 2223*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(aKey, YES); 2224*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(aObject, @"abc"); 2225*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 2226*1b3f573fSAndroid Build Coastguard Worker }]; 2227*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2228*1b3f573fSAndroid Build Coastguard Worker} 2229*1b3f573fSAndroid Build Coastguard Worker 2230*1b3f573fSAndroid Build Coastguard Worker- (void)testBasics { 2231*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2232*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects[] = { @"abc", @"def" }; 2233*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = 2234*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects 2235*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2236*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects)]; 2237*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2238*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2239*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2240*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:NO], @"def"); 2241*1b3f573fSAndroid Build Coastguard Worker 2242*1b3f573fSAndroid Build Coastguard Worker __block NSUInteger idx = 0; 2243*1b3f573fSAndroid Build Coastguard Worker BOOL *seenKeys = malloc(2 * sizeof(BOOL)); 2244*1b3f573fSAndroid Build Coastguard Worker NSString* *seenObjects = malloc(2 * sizeof(NSString*)); 2245*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndObjectsUsingBlock:^(BOOL aKey, NSString* aObject, BOOL *stop) { 2246*1b3f573fSAndroid Build Coastguard Worker XCTAssertLessThan(idx, 2U); 2247*1b3f573fSAndroid Build Coastguard Worker seenKeys[idx] = aKey; 2248*1b3f573fSAndroid Build Coastguard Worker seenObjects[idx] = aObject; 2249*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(stop, NULL); 2250*1b3f573fSAndroid Build Coastguard Worker ++idx; 2251*1b3f573fSAndroid Build Coastguard Worker }]; 2252*1b3f573fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 2253*1b3f573fSAndroid Build Coastguard Worker BOOL foundKey = NO; 2254*1b3f573fSAndroid Build Coastguard Worker for (int j = 0; (j < 2) && !foundKey; ++j) { 2255*1b3f573fSAndroid Build Coastguard Worker if (kKeys[i] == seenKeys[j]) { 2256*1b3f573fSAndroid Build Coastguard Worker foundKey = YES; 2257*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(kObjects[i], seenObjects[j], @"i = %d, j = %d", i, j); 2258*1b3f573fSAndroid Build Coastguard Worker } 2259*1b3f573fSAndroid Build Coastguard Worker } 2260*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue(foundKey, @"i = %d", i); 2261*1b3f573fSAndroid Build Coastguard Worker } 2262*1b3f573fSAndroid Build Coastguard Worker free(seenKeys); 2263*1b3f573fSAndroid Build Coastguard Worker free(seenObjects); 2264*1b3f573fSAndroid Build Coastguard Worker 2265*1b3f573fSAndroid Build Coastguard Worker // Stopping the enumeration. 2266*1b3f573fSAndroid Build Coastguard Worker idx = 0; 2267*1b3f573fSAndroid Build Coastguard Worker [dict enumerateKeysAndObjectsUsingBlock:^(BOOL aKey, NSString* aObject, BOOL *stop) { 2268*1b3f573fSAndroid Build Coastguard Worker #pragma unused(aKey, aObject) 2269*1b3f573fSAndroid Build Coastguard Worker if (idx == 0) *stop = YES; 2270*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(idx, 2U); 2271*1b3f573fSAndroid Build Coastguard Worker ++idx; 2272*1b3f573fSAndroid Build Coastguard Worker }]; 2273*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2274*1b3f573fSAndroid Build Coastguard Worker} 2275*1b3f573fSAndroid Build Coastguard Worker 2276*1b3f573fSAndroid Build Coastguard Worker- (void)testEquality { 2277*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys1[] = { YES, NO }; 2278*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 2279*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects1[] = { @"abc", @"def" }; 2280*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects2[] = { @"def", @"abc" }; 2281*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects3[] = { @"def" }; 2282*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict1 = 2283*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects1 2284*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 2285*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects1)]; 2286*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1); 2287*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict1prime = 2288*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects1 2289*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 2290*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects1)]; 2291*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict1prime); 2292*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict2 = 2293*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects2 2294*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 2295*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects2)]; 2296*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2297*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict3 = 2298*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects1 2299*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 2300*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects1)]; 2301*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict3); 2302*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict4 = 2303*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects3 2304*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys1 2305*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects3)]; 2306*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict4); 2307*1b3f573fSAndroid Build Coastguard Worker 2308*1b3f573fSAndroid Build Coastguard Worker // 1/1Prime should be different objects, but equal. 2309*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict1, dict1prime); 2310*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict1, dict1prime); 2311*1b3f573fSAndroid Build Coastguard Worker // Equal, so they must have same hash. 2312*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual([dict1 hash], [dict1prime hash]); 2313*1b3f573fSAndroid Build Coastguard Worker 2314*1b3f573fSAndroid Build Coastguard Worker // 2 is same keys, different objects; not equal. 2315*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict2); 2316*1b3f573fSAndroid Build Coastguard Worker 2317*1b3f573fSAndroid Build Coastguard Worker // 3 is different keys, same objects; not equal. 2318*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict3); 2319*1b3f573fSAndroid Build Coastguard Worker 2320*1b3f573fSAndroid Build Coastguard Worker // 4 Fewer pairs; not equal 2321*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqualObjects(dict1, dict4); 2322*1b3f573fSAndroid Build Coastguard Worker 2323*1b3f573fSAndroid Build Coastguard Worker [dict1 release]; 2324*1b3f573fSAndroid Build Coastguard Worker [dict1prime release]; 2325*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2326*1b3f573fSAndroid Build Coastguard Worker [dict3 release]; 2327*1b3f573fSAndroid Build Coastguard Worker [dict4 release]; 2328*1b3f573fSAndroid Build Coastguard Worker} 2329*1b3f573fSAndroid Build Coastguard Worker 2330*1b3f573fSAndroid Build Coastguard Worker- (void)testCopy { 2331*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2332*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects[] = { @"abc", @"def" }; 2333*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = 2334*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects 2335*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2336*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects)]; 2337*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2338*1b3f573fSAndroid Build Coastguard Worker 2339*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict2 = [dict copy]; 2340*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2341*1b3f573fSAndroid Build Coastguard Worker 2342*1b3f573fSAndroid Build Coastguard Worker // Should be new object but equal. 2343*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 2344*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 2345*1b3f573fSAndroid Build Coastguard Worker XCTAssertTrue([dict2 isKindOfClass:[GPBBoolObjectDictionary class]]); 2346*1b3f573fSAndroid Build Coastguard Worker 2347*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2348*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2349*1b3f573fSAndroid Build Coastguard Worker} 2350*1b3f573fSAndroid Build Coastguard Worker 2351*1b3f573fSAndroid Build Coastguard Worker- (void)testDictionaryFromDictionary { 2352*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2353*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects[] = { @"abc", @"def" }; 2354*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = 2355*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects 2356*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2357*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects)]; 2358*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2359*1b3f573fSAndroid Build Coastguard Worker 2360*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict2 = 2361*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithDictionary:dict]; 2362*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2363*1b3f573fSAndroid Build Coastguard Worker 2364*1b3f573fSAndroid Build Coastguard Worker // Should be new pointer, but equal objects. 2365*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotEqual(dict, dict2); 2366*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects(dict, dict2); 2367*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2368*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2369*1b3f573fSAndroid Build Coastguard Worker} 2370*1b3f573fSAndroid Build Coastguard Worker 2371*1b3f573fSAndroid Build Coastguard Worker- (void)testAdds { 2372*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = [[GPBBoolObjectDictionary alloc] init]; 2373*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2374*1b3f573fSAndroid Build Coastguard Worker 2375*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 2376*1b3f573fSAndroid Build Coastguard Worker [dict setObject:@"abc" forKey:YES]; 2377*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2378*1b3f573fSAndroid Build Coastguard Worker 2379*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { NO }; 2380*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects[] = { @"def" }; 2381*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict2 = 2382*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects 2383*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2384*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects)]; 2385*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2386*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 2387*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2388*1b3f573fSAndroid Build Coastguard Worker 2389*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2390*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:NO], @"def"); 2391*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2392*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2393*1b3f573fSAndroid Build Coastguard Worker} 2394*1b3f573fSAndroid Build Coastguard Worker 2395*1b3f573fSAndroid Build Coastguard Worker- (void)testRemove { 2396*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO}; 2397*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects[] = { @"abc", @"def" }; 2398*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = 2399*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects 2400*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2401*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects)]; 2402*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2403*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2404*1b3f573fSAndroid Build Coastguard Worker 2405*1b3f573fSAndroid Build Coastguard Worker [dict removeObjectForKey:NO]; 2406*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2407*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2408*1b3f573fSAndroid Build Coastguard Worker XCTAssertNil([dict objectForKey:NO]); 2409*1b3f573fSAndroid Build Coastguard Worker 2410*1b3f573fSAndroid Build Coastguard Worker // Remove again does nothing. 2411*1b3f573fSAndroid Build Coastguard Worker [dict removeObjectForKey:NO]; 2412*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 1U); 2413*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2414*1b3f573fSAndroid Build Coastguard Worker XCTAssertNil([dict objectForKey:NO]); 2415*1b3f573fSAndroid Build Coastguard Worker 2416*1b3f573fSAndroid Build Coastguard Worker [dict removeAll]; 2417*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 0U); 2418*1b3f573fSAndroid Build Coastguard Worker XCTAssertNil([dict objectForKey:YES]); 2419*1b3f573fSAndroid Build Coastguard Worker XCTAssertNil([dict objectForKey:NO]); 2420*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2421*1b3f573fSAndroid Build Coastguard Worker} 2422*1b3f573fSAndroid Build Coastguard Worker 2423*1b3f573fSAndroid Build Coastguard Worker- (void)testInplaceMutation { 2424*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys[] = { YES, NO }; 2425*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects[] = { @"abc", @"def" }; 2426*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict = 2427*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects 2428*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys 2429*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects)]; 2430*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict); 2431*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2432*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2433*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:NO], @"def"); 2434*1b3f573fSAndroid Build Coastguard Worker 2435*1b3f573fSAndroid Build Coastguard Worker [dict setObject:@"def" forKey:YES]; 2436*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2437*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"def"); 2438*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:NO], @"def"); 2439*1b3f573fSAndroid Build Coastguard Worker 2440*1b3f573fSAndroid Build Coastguard Worker [dict setObject:@"abc" forKey:NO]; 2441*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2442*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"def"); 2443*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:NO], @"abc"); 2444*1b3f573fSAndroid Build Coastguard Worker 2445*1b3f573fSAndroid Build Coastguard Worker const BOOL kKeys2[] = { NO, YES }; 2446*1b3f573fSAndroid Build Coastguard Worker const NSString* kObjects2[] = { @"def", @"abc" }; 2447*1b3f573fSAndroid Build Coastguard Worker GPBBoolObjectDictionary<NSString*> *dict2 = 2448*1b3f573fSAndroid Build Coastguard Worker [[GPBBoolObjectDictionary alloc] initWithObjects:kObjects2 2449*1b3f573fSAndroid Build Coastguard Worker forKeys:kKeys2 2450*1b3f573fSAndroid Build Coastguard Worker count:GPBARRAYSIZE(kObjects2)]; 2451*1b3f573fSAndroid Build Coastguard Worker XCTAssertNotNil(dict2); 2452*1b3f573fSAndroid Build Coastguard Worker [dict addEntriesFromDictionary:dict2]; 2453*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqual(dict.count, 2U); 2454*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:YES], @"abc"); 2455*1b3f573fSAndroid Build Coastguard Worker XCTAssertEqualObjects([dict objectForKey:NO], @"def"); 2456*1b3f573fSAndroid Build Coastguard Worker 2457*1b3f573fSAndroid Build Coastguard Worker [dict2 release]; 2458*1b3f573fSAndroid Build Coastguard Worker [dict release]; 2459*1b3f573fSAndroid Build Coastguard Worker} 2460*1b3f573fSAndroid Build Coastguard Worker 2461*1b3f573fSAndroid Build Coastguard Worker@end 2462*1b3f573fSAndroid Build Coastguard Worker 2463*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2464*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (8 expansions) 2465*1b3f573fSAndroid Build Coastguard Worker 2466*1b3f573fSAndroid Build Coastguard Worker 2467