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