xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBDictionaryTests+Bool.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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