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