xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBDescriptorTests.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2008 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 "GPBTestUtilities.h"
32*1b3f573fSAndroid Build Coastguard Worker
33*1b3f573fSAndroid Build Coastguard Worker#import <objc/runtime.h>
34*1b3f573fSAndroid Build Coastguard Worker
35*1b3f573fSAndroid Build Coastguard Worker#import "GPBDescriptor_PackagePrivate.h"
36*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/Unittest.pbobjc.h"
37*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/UnittestObjc.pbobjc.h"
38*1b3f573fSAndroid Build Coastguard Worker#import "google/protobuf/Descriptor.pbobjc.h"
39*1b3f573fSAndroid Build Coastguard Worker
40*1b3f573fSAndroid Build Coastguard Worker@interface DescriptorTests : GPBTestCase
41*1b3f573fSAndroid Build Coastguard Worker@end
42*1b3f573fSAndroid Build Coastguard Worker
43*1b3f573fSAndroid Build Coastguard Worker@implementation DescriptorTests
44*1b3f573fSAndroid Build Coastguard Worker
45*1b3f573fSAndroid Build Coastguard Worker- (void)testDescriptor_containingType {
46*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor];
47*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor];
48*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(testAllTypesDesc.containingType);
49*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(nestedMessageDesc.containingType);
50*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(nestedMessageDesc.containingType, testAllTypesDesc);  // Ptr comparison
51*1b3f573fSAndroid Build Coastguard Worker}
52*1b3f573fSAndroid Build Coastguard Worker
53*1b3f573fSAndroid Build Coastguard Worker- (void)testDescriptor_fullName {
54*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor];
55*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(testAllTypesDesc.fullName, @"protobuf_unittest.TestAllTypes");
56*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor];
57*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(nestedMessageDesc.fullName, @"protobuf_unittest.TestAllTypes.NestedMessage");
58*1b3f573fSAndroid Build Coastguard Worker
59*1b3f573fSAndroid Build Coastguard Worker  // Prefixes removed.
60*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *descDesc = [GPBDescriptorProto descriptor];
61*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descDesc.fullName, @"google.protobuf.DescriptorProto");
62*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *descExtRngDesc = [GPBDescriptorProto_ExtensionRange descriptor];
63*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descExtRngDesc.fullName, @"google.protobuf.DescriptorProto.ExtensionRange");
64*1b3f573fSAndroid Build Coastguard Worker
65*1b3f573fSAndroid Build Coastguard Worker  // Things that get "_Class" added.
66*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *pointDesc = [Point_Class descriptor];
67*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(pointDesc.fullName, @"protobuf_unittest.Point");
68*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *pointRectDesc = [Point_Rect descriptor];
69*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(pointRectDesc.fullName, @"protobuf_unittest.Point.Rect");
70*1b3f573fSAndroid Build Coastguard Worker}
71*1b3f573fSAndroid Build Coastguard Worker
72*1b3f573fSAndroid Build Coastguard Worker- (void)testFieldDescriptor {
73*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *descriptor = [TestAllTypes descriptor];
74*1b3f573fSAndroid Build Coastguard Worker
75*1b3f573fSAndroid Build Coastguard Worker  // Nested Enum
76*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptorWithName =
77*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithName:@"optionalNestedEnum"];
78*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithName);
79*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptorWithNumber =
80*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithNumber:21];
81*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber);
82*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
83*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
84*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
85*1b3f573fSAndroid Build Coastguard Worker                        @"TestAllTypes_NestedEnum");
86*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
87*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
88*1b3f573fSAndroid Build Coastguard Worker
89*1b3f573fSAndroid Build Coastguard Worker  // Foreign Enum
90*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithName = [descriptor fieldWithName:@"optionalForeignEnum"];
91*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithName);
92*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithNumber = [descriptor fieldWithNumber:22];
93*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber);
94*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
95*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
96*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
97*1b3f573fSAndroid Build Coastguard Worker                        @"ForeignEnum");
98*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
99*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
100*1b3f573fSAndroid Build Coastguard Worker
101*1b3f573fSAndroid Build Coastguard Worker  // Import Enum
102*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithName = [descriptor fieldWithName:@"optionalImportEnum"];
103*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithName);
104*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithNumber = [descriptor fieldWithNumber:23];
105*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber);
106*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
107*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
108*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
109*1b3f573fSAndroid Build Coastguard Worker                        @"ImportEnum");
110*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
111*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
112*1b3f573fSAndroid Build Coastguard Worker
113*1b3f573fSAndroid Build Coastguard Worker  // Nested Message
114*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithName = [descriptor fieldWithName:@"optionalNestedMessage"];
115*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithName);
116*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithNumber = [descriptor fieldWithNumber:18];
117*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber);
118*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
119*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor);
120*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
121*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
122*1b3f573fSAndroid Build Coastguard Worker
123*1b3f573fSAndroid Build Coastguard Worker  // Foreign Message
124*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithName =
125*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithName:@"optionalForeignMessage"];
126*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithName);
127*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithNumber = [descriptor fieldWithNumber:19];
128*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber);
129*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
130*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor);
131*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
132*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
133*1b3f573fSAndroid Build Coastguard Worker
134*1b3f573fSAndroid Build Coastguard Worker  // Import Message
135*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithName = [descriptor fieldWithName:@"optionalImportMessage"];
136*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithName);
137*1b3f573fSAndroid Build Coastguard Worker  fieldDescriptorWithNumber = [descriptor fieldWithNumber:20];
138*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fieldDescriptorWithNumber);
139*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
140*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor);
141*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
142*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
143*1b3f573fSAndroid Build Coastguard Worker
144*1b3f573fSAndroid Build Coastguard Worker  // Some failed lookups.
145*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([descriptor fieldWithName:@"NOT THERE"]);
146*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([descriptor fieldWithNumber:9876543]);
147*1b3f573fSAndroid Build Coastguard Worker}
148*1b3f573fSAndroid Build Coastguard Worker
149*1b3f573fSAndroid Build Coastguard Worker- (void)testEnumDescriptor {
150*1b3f573fSAndroid Build Coastguard Worker  GPBEnumDescriptor *descriptor = TestAllTypes_NestedEnum_EnumDescriptor();
151*1b3f573fSAndroid Build Coastguard Worker
152*1b3f573fSAndroid Build Coastguard Worker  NSString *enumName = [descriptor enumNameForValue:1];
153*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(enumName);
154*1b3f573fSAndroid Build Coastguard Worker  int32_t value;
155*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(
156*1b3f573fSAndroid Build Coastguard Worker      [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Foo"]);
157*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(
158*1b3f573fSAndroid Build Coastguard Worker      [descriptor getValue:NULL forEnumName:@"TestAllTypes_NestedEnum_Foo"]);
159*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, TestAllTypes_NestedEnum_Foo);
160*1b3f573fSAndroid Build Coastguard Worker
161*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor enumNameForValue:2];
162*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(enumName);
163*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(
164*1b3f573fSAndroid Build Coastguard Worker      [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Bar"]);
165*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, TestAllTypes_NestedEnum_Bar);
166*1b3f573fSAndroid Build Coastguard Worker
167*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor enumNameForValue:3];
168*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(enumName);
169*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(
170*1b3f573fSAndroid Build Coastguard Worker      [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Baz"]);
171*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, TestAllTypes_NestedEnum_Baz);
172*1b3f573fSAndroid Build Coastguard Worker
173*1b3f573fSAndroid Build Coastguard Worker  // TextFormat
174*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor textFormatNameForValue:1];
175*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(enumName);
176*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:@"FOO"]);
177*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, TestAllTypes_NestedEnum_Foo);
178*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([descriptor textFormatNameForValue:99999]);
179*1b3f573fSAndroid Build Coastguard Worker
180*1b3f573fSAndroid Build Coastguard Worker  // Bad values
181*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor enumNameForValue:0];
182*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(enumName);
183*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([descriptor getValue:&value forEnumName:@"Unknown"]);
184*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([descriptor getValue:NULL forEnumName:@"Unknown"]);
185*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([descriptor getValue:&value
186*1b3f573fSAndroid Build Coastguard Worker                          forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
187*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([descriptor getValue:NULL
188*1b3f573fSAndroid Build Coastguard Worker                          forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
189*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([descriptor getValue:NULL forEnumTextFormatName:@"Unknown"]);
190*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([descriptor getValue:&value forEnumTextFormatName:@"Unknown"]);
191*1b3f573fSAndroid Build Coastguard Worker}
192*1b3f573fSAndroid Build Coastguard Worker
193*1b3f573fSAndroid Build Coastguard Worker- (void)testEnumDescriptorIntrospection {
194*1b3f573fSAndroid Build Coastguard Worker  GPBEnumDescriptor *descriptor = TestAllTypes_NestedEnum_EnumDescriptor();
195*1b3f573fSAndroid Build Coastguard Worker
196*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.enumNameCount, 4U);
197*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:0],
198*1b3f573fSAndroid Build Coastguard Worker                        @"TestAllTypes_NestedEnum_Foo");
199*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:0], @"FOO");
200*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:1],
201*1b3f573fSAndroid Build Coastguard Worker                 @"TestAllTypes_NestedEnum_Bar");
202*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:1], @"BAR");
203*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:2],
204*1b3f573fSAndroid Build Coastguard Worker                 @"TestAllTypes_NestedEnum_Baz");
205*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:2], @"BAZ");
206*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:3],
207*1b3f573fSAndroid Build Coastguard Worker                 @"TestAllTypes_NestedEnum_Neg");
208*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:3], @"NEG");
209*1b3f573fSAndroid Build Coastguard Worker}
210*1b3f573fSAndroid Build Coastguard Worker
211*1b3f573fSAndroid Build Coastguard Worker- (void)testEnumDescriptorIntrospectionWithAlias {
212*1b3f573fSAndroid Build Coastguard Worker  GPBEnumDescriptor *descriptor = TestEnumWithDupValue_EnumDescriptor();
213*1b3f573fSAndroid Build Coastguard Worker  NSString *enumName;
214*1b3f573fSAndroid Build Coastguard Worker  int32_t value;
215*1b3f573fSAndroid Build Coastguard Worker
216*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.enumNameCount, 5U);
217*1b3f573fSAndroid Build Coastguard Worker
218*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor getEnumNameForIndex:0];
219*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Foo1");
220*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]);
221*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 1);
222*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:0], @"FOO1");
223*1b3f573fSAndroid Build Coastguard Worker
224*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor getEnumNameForIndex:1];
225*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Bar1");
226*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]);
227*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 2);
228*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:1], @"BAR1");
229*1b3f573fSAndroid Build Coastguard Worker
230*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor getEnumNameForIndex:2];
231*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Baz");
232*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]);
233*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 3);
234*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:2], @"BAZ");
235*1b3f573fSAndroid Build Coastguard Worker
236*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor getEnumNameForIndex:3];
237*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Foo2");
238*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]);
239*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 1);
240*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:3], @"FOO2");
241*1b3f573fSAndroid Build Coastguard Worker
242*1b3f573fSAndroid Build Coastguard Worker  enumName = [descriptor getEnumNameForIndex:4];
243*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Bar2");
244*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]);
245*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 2);
246*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:4], @"BAR2");
247*1b3f573fSAndroid Build Coastguard Worker}
248*1b3f573fSAndroid Build Coastguard Worker
249*1b3f573fSAndroid Build Coastguard Worker- (void)testEnumAliasNameCollisions {
250*1b3f573fSAndroid Build Coastguard Worker  GPBEnumDescriptor *descriptor = TestEnumObjCNameCollision_EnumDescriptor();
251*1b3f573fSAndroid Build Coastguard Worker  NSString *textFormatName;
252*1b3f573fSAndroid Build Coastguard Worker  int32_t value;
253*1b3f573fSAndroid Build Coastguard Worker
254*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.enumNameCount, 5U);
255*1b3f573fSAndroid Build Coastguard Worker
256*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:0], @"TestEnumObjCNameCollision_Foo");
257*1b3f573fSAndroid Build Coastguard Worker  textFormatName = [descriptor getEnumTextFormatNameForIndex:0];
258*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(textFormatName, @"FOO");
259*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:textFormatName]);
260*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 1);
261*1b3f573fSAndroid Build Coastguard Worker
262*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:1], @"TestEnumObjCNameCollision_Foo");
263*1b3f573fSAndroid Build Coastguard Worker  textFormatName = [descriptor getEnumTextFormatNameForIndex:1];
264*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(textFormatName, @"foo");
265*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:textFormatName]);
266*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 1);
267*1b3f573fSAndroid Build Coastguard Worker
268*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:2], @"TestEnumObjCNameCollision_Bar");
269*1b3f573fSAndroid Build Coastguard Worker  textFormatName = [descriptor getEnumTextFormatNameForIndex:2];
270*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(textFormatName, @"BAR");
271*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:textFormatName]);
272*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 2);
273*1b3f573fSAndroid Build Coastguard Worker
274*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:3], @"TestEnumObjCNameCollision_Mumble");
275*1b3f573fSAndroid Build Coastguard Worker  textFormatName = [descriptor getEnumTextFormatNameForIndex:3];
276*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(textFormatName, @"mumble");
277*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:textFormatName]);
278*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 2);
279*1b3f573fSAndroid Build Coastguard Worker
280*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects([descriptor getEnumNameForIndex:4], @"TestEnumObjCNameCollision_Mumble");
281*1b3f573fSAndroid Build Coastguard Worker  textFormatName = [descriptor getEnumTextFormatNameForIndex:4];
282*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(textFormatName, @"MUMBLE");
283*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:textFormatName]);
284*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(value, 2);
285*1b3f573fSAndroid Build Coastguard Worker}
286*1b3f573fSAndroid Build Coastguard Worker
287*1b3f573fSAndroid Build Coastguard Worker- (void)testEnumValueValidator {
288*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *descriptor = [TestAllTypes descriptor];
289*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fieldDescriptor =
290*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithName:@"optionalNestedEnum"];
291*1b3f573fSAndroid Build Coastguard Worker
292*1b3f573fSAndroid Build Coastguard Worker  // Valid values
293*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([fieldDescriptor isValidEnumValue:1]);
294*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([fieldDescriptor isValidEnumValue:2]);
295*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([fieldDescriptor isValidEnumValue:3]);
296*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue([fieldDescriptor isValidEnumValue:-1]);
297*1b3f573fSAndroid Build Coastguard Worker
298*1b3f573fSAndroid Build Coastguard Worker  // Invalid values
299*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([fieldDescriptor isValidEnumValue:4]);
300*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([fieldDescriptor isValidEnumValue:0]);
301*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse([fieldDescriptor isValidEnumValue:-2]);
302*1b3f573fSAndroid Build Coastguard Worker}
303*1b3f573fSAndroid Build Coastguard Worker
304*1b3f573fSAndroid Build Coastguard Worker- (void)testOneofDescriptor {
305*1b3f573fSAndroid Build Coastguard Worker  GPBDescriptor *descriptor = [TestOneof2 descriptor];
306*1b3f573fSAndroid Build Coastguard Worker
307*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *fooStringField =
308*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithNumber:TestOneof2_FieldNumber_FooString];
309*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(fooStringField);
310*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *barStringField =
311*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithNumber:TestOneof2_FieldNumber_BarString];
312*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(barStringField);
313*1b3f573fSAndroid Build Coastguard Worker
314*1b3f573fSAndroid Build Coastguard Worker  // Check the oneofs to have what is expected but not other onesofs
315*1b3f573fSAndroid Build Coastguard Worker
316*1b3f573fSAndroid Build Coastguard Worker  GPBOneofDescriptor *oneofFoo = [descriptor oneofWithName:@"foo"];
317*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(oneofFoo);
318*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil([oneofFoo fieldWithName:@"fooString"]);
319*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofFoo fieldWithName:@"barString"]);
320*1b3f573fSAndroid Build Coastguard Worker
321*1b3f573fSAndroid Build Coastguard Worker  GPBOneofDescriptor *oneofBar = [descriptor oneofWithName:@"bar"];
322*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(oneofBar);
323*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofBar fieldWithName:@"fooString"]);
324*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil([oneofBar fieldWithName:@"barString"]);
325*1b3f573fSAndroid Build Coastguard Worker
326*1b3f573fSAndroid Build Coastguard Worker  // Pointer comparisons against lookups from message.
327*1b3f573fSAndroid Build Coastguard Worker
328*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([oneofFoo fieldWithNumber:TestOneof2_FieldNumber_FooString],
329*1b3f573fSAndroid Build Coastguard Worker                 fooStringField);
330*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([oneofFoo fieldWithName:@"fooString"], fooStringField);
331*1b3f573fSAndroid Build Coastguard Worker
332*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([oneofBar fieldWithNumber:TestOneof2_FieldNumber_BarString],
333*1b3f573fSAndroid Build Coastguard Worker                 barStringField);
334*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([oneofBar fieldWithName:@"barString"], barStringField);
335*1b3f573fSAndroid Build Coastguard Worker
336*1b3f573fSAndroid Build Coastguard Worker  // Unknown oneof not found.
337*1b3f573fSAndroid Build Coastguard Worker
338*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([descriptor oneofWithName:@"mumble"]);
339*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([descriptor oneofWithName:@"Foo"]);
340*1b3f573fSAndroid Build Coastguard Worker
341*1b3f573fSAndroid Build Coastguard Worker  // Unknown oneof item.
342*1b3f573fSAndroid Build Coastguard Worker
343*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofFoo fieldWithName:@"mumble"]);
344*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofFoo fieldWithNumber:666]);
345*1b3f573fSAndroid Build Coastguard Worker
346*1b3f573fSAndroid Build Coastguard Worker  // Field exists, but not in this oneof.
347*1b3f573fSAndroid Build Coastguard Worker
348*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofFoo fieldWithName:@"barString"]);
349*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofFoo fieldWithNumber:TestOneof2_FieldNumber_BarString]);
350*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofBar fieldWithName:@"fooString"]);
351*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil([oneofBar fieldWithNumber:TestOneof2_FieldNumber_FooString]);
352*1b3f573fSAndroid Build Coastguard Worker
353*1b3f573fSAndroid Build Coastguard Worker  // Check pointers back to the enclosing oneofs.
354*1b3f573fSAndroid Build Coastguard Worker  // (pointer comparisons)
355*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(fooStringField.containingOneof, oneofFoo);
356*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(barStringField.containingOneof, oneofBar);
357*1b3f573fSAndroid Build Coastguard Worker  GPBFieldDescriptor *bazString =
358*1b3f573fSAndroid Build Coastguard Worker      [descriptor fieldWithNumber:TestOneof2_FieldNumber_BazString];
359*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(bazString);
360*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(bazString.containingOneof);
361*1b3f573fSAndroid Build Coastguard Worker}
362*1b3f573fSAndroid Build Coastguard Worker
363*1b3f573fSAndroid Build Coastguard Worker- (void)testExtensiondDescriptor {
364*1b3f573fSAndroid Build Coastguard Worker  Class msgClass = [TestAllExtensions class];
365*1b3f573fSAndroid Build Coastguard Worker  Class packedMsgClass = [TestPackedExtensions class];
366*1b3f573fSAndroid Build Coastguard Worker
367*1b3f573fSAndroid Build Coastguard Worker  // Int
368*1b3f573fSAndroid Build Coastguard Worker
369*1b3f573fSAndroid Build Coastguard Worker  GPBExtensionDescriptor *descriptor = [UnittestRoot optionalInt32Extension];
370*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
371*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
372*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
373*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descriptor.defaultValue, @0);
374*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.enumDescriptor);
375*1b3f573fSAndroid Build Coastguard Worker
376*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot defaultInt32Extension];
377*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
378*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
379*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
380*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descriptor.defaultValue, @41);
381*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.enumDescriptor);
382*1b3f573fSAndroid Build Coastguard Worker
383*1b3f573fSAndroid Build Coastguard Worker  // Enum
384*1b3f573fSAndroid Build Coastguard Worker
385*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot optionalNestedEnumExtension];
386*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
387*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
388*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
389*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.defaultValue, @1);
390*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum");
391*1b3f573fSAndroid Build Coastguard Worker
392*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot defaultNestedEnumExtension];
393*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
394*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
395*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
396*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.defaultValue, @2);
397*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum");
398*1b3f573fSAndroid Build Coastguard Worker
399*1b3f573fSAndroid Build Coastguard Worker  // Message
400*1b3f573fSAndroid Build Coastguard Worker
401*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot optionalNestedMessageExtension];
402*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
403*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
404*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
405*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.defaultValue);
406*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.enumDescriptor);
407*1b3f573fSAndroid Build Coastguard Worker
408*1b3f573fSAndroid Build Coastguard Worker  // Repeated Int
409*1b3f573fSAndroid Build Coastguard Worker
410*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot repeatedInt32Extension];
411*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
412*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
413*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
414*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.defaultValue);
415*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.enumDescriptor);
416*1b3f573fSAndroid Build Coastguard Worker
417*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot packedInt32Extension];
418*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
419*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, packedMsgClass);  // ptr equality
420*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(descriptor.isPackable);
421*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.defaultValue);
422*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.enumDescriptor);
423*1b3f573fSAndroid Build Coastguard Worker
424*1b3f573fSAndroid Build Coastguard Worker  // Repeated Enum
425*1b3f573fSAndroid Build Coastguard Worker
426*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot repeatedNestedEnumExtension];
427*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
428*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
429*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
430*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.defaultValue);
431*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum");
432*1b3f573fSAndroid Build Coastguard Worker
433*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot packedEnumExtension];
434*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
435*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, packedMsgClass);  // ptr equality
436*1b3f573fSAndroid Build Coastguard Worker  XCTAssertTrue(descriptor.isPackable);
437*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.defaultValue);
438*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"ForeignEnum");
439*1b3f573fSAndroid Build Coastguard Worker
440*1b3f573fSAndroid Build Coastguard Worker  // Repeated Message
441*1b3f573fSAndroid Build Coastguard Worker
442*1b3f573fSAndroid Build Coastguard Worker  descriptor = [UnittestRoot repeatedNestedMessageExtension];
443*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNotNil(descriptor);
444*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(descriptor.containingMessageClass, msgClass);  // ptr equality
445*1b3f573fSAndroid Build Coastguard Worker  XCTAssertFalse(descriptor.isPackable);
446*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.defaultValue);
447*1b3f573fSAndroid Build Coastguard Worker  XCTAssertNil(descriptor.enumDescriptor);
448*1b3f573fSAndroid Build Coastguard Worker
449*1b3f573fSAndroid Build Coastguard Worker  // Compare (used internally for serialization).
450*1b3f573fSAndroid Build Coastguard Worker
451*1b3f573fSAndroid Build Coastguard Worker  GPBExtensionDescriptor *ext1 = [UnittestRoot optionalInt32Extension];
452*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(ext1.fieldNumber, 1u);
453*1b3f573fSAndroid Build Coastguard Worker  GPBExtensionDescriptor *ext2 = [UnittestRoot optionalInt64Extension];
454*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual(ext2.fieldNumber, 2u);
455*1b3f573fSAndroid Build Coastguard Worker
456*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([ext1 compareByFieldNumber:ext2], NSOrderedAscending);
457*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([ext2 compareByFieldNumber:ext1], NSOrderedDescending);
458*1b3f573fSAndroid Build Coastguard Worker  XCTAssertEqual([ext1 compareByFieldNumber:ext1], NSOrderedSame);
459*1b3f573fSAndroid Build Coastguard Worker}
460*1b3f573fSAndroid Build Coastguard Worker
461*1b3f573fSAndroid Build Coastguard Worker@end
462