diff options
Diffstat (limited to 'objectivec/Tests/GPBDescriptorTests.m')
-rw-r--r-- | objectivec/Tests/GPBDescriptorTests.m | 224 |
1 files changed, 210 insertions, 14 deletions
diff --git a/objectivec/Tests/GPBDescriptorTests.m b/objectivec/Tests/GPBDescriptorTests.m index ccdbb645..d47cc30f 100644 --- a/objectivec/Tests/GPBDescriptorTests.m +++ b/objectivec/Tests/GPBDescriptorTests.m @@ -32,14 +32,43 @@ #import <objc/runtime.h> -#import "GPBDescriptor.h" +#import "GPBDescriptor_PackagePrivate.h" #import "google/protobuf/Unittest.pbobjc.h" +#import "google/protobuf/UnittestObjc.pbobjc.h" +#import "google/protobuf/Descriptor.pbobjc.h" @interface DescriptorTests : GPBTestCase @end @implementation DescriptorTests +- (void)testDescriptor_containingType { + GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor]; + GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor]; + XCTAssertNil(testAllTypesDesc.containingType); + XCTAssertNotNil(nestedMessageDesc.containingType); + XCTAssertEqual(nestedMessageDesc.containingType, testAllTypesDesc); // Ptr comparison +} + +- (void)testDescriptor_fullName { + GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor]; + XCTAssertEqualObjects(testAllTypesDesc.fullName, @"protobuf_unittest.TestAllTypes"); + GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor]; + XCTAssertEqualObjects(nestedMessageDesc.fullName, @"protobuf_unittest.TestAllTypes.NestedMessage"); + + // Prefixes removed. + GPBDescriptor *descDesc = [GPBDescriptorProto descriptor]; + XCTAssertEqualObjects(descDesc.fullName, @"google.protobuf.DescriptorProto"); + GPBDescriptor *descExtRngDesc = [GPBDescriptorProto_ExtensionRange descriptor]; + XCTAssertEqualObjects(descExtRngDesc.fullName, @"google.protobuf.DescriptorProto.ExtensionRange"); + + // Things that get "_Class" added. + GPBDescriptor *pointDesc = [Point_Class descriptor]; + XCTAssertEqualObjects(pointDesc.fullName, @"protobuf_unittest.Point"); + GPBDescriptor *pointRectDesc = [Point_Rect descriptor]; + XCTAssertEqualObjects(pointRectDesc.fullName, @"protobuf_unittest.Point.Rect"); +} + - (void)testFieldDescriptor { GPBDescriptor *descriptor = [TestAllTypes descriptor]; @@ -54,6 +83,8 @@ XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor); XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name, @"TestAllTypes_NestedEnum"); + XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number); + XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum); // Foreign Enum fieldDescriptorWithName = [descriptor fieldWithName:@"optionalForeignEnum"]; @@ -64,6 +95,8 @@ XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor); XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name, @"ForeignEnum"); + XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number); + XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum); // Import Enum fieldDescriptorWithName = [descriptor fieldWithName:@"optionalImportEnum"]; @@ -74,6 +107,8 @@ XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor); XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name, @"ImportEnum"); + XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number); + XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum); // Nested Message fieldDescriptorWithName = [descriptor fieldWithName:@"optionalNestedMessage"]; @@ -82,6 +117,8 @@ XCTAssertNotNil(fieldDescriptorWithNumber); XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber); XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor); + XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number); + XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage); // Foreign Message fieldDescriptorWithName = @@ -91,6 +128,8 @@ XCTAssertNotNil(fieldDescriptorWithNumber); XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber); XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor); + XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number); + XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage); // Import Message fieldDescriptorWithName = [descriptor fieldWithName:@"optionalImportMessage"]; @@ -99,6 +138,12 @@ XCTAssertNotNil(fieldDescriptorWithNumber); XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber); XCTAssertNil(fieldDescriptorWithNumber.enumDescriptor); + XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number); + XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage); + + // Some failed lookups. + XCTAssertNil([descriptor fieldWithName:@"NOT THERE"]); + XCTAssertNil([descriptor fieldWithNumber:9876543]); } - (void)testEnumDescriptor { @@ -125,6 +170,13 @@ [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Baz"]); XCTAssertEqual(value, TestAllTypes_NestedEnum_Baz); + // TextFormat + enumName = [descriptor textFormatNameForValue:1]; + XCTAssertNotNil(enumName); + XCTAssertTrue([descriptor getValue:&value forEnumTextFormatName:@"FOO"]); + XCTAssertEqual(value, TestAllTypes_NestedEnum_Foo); + XCTAssertNil([descriptor textFormatNameForValue:99999]); + // Bad values enumName = [descriptor enumNameForValue:0]; XCTAssertNil(enumName); @@ -134,6 +186,65 @@ forEnumName:@"TestAllTypes_NestedEnum_Unknown"]); XCTAssertFalse([descriptor getValue:NULL forEnumName:@"TestAllTypes_NestedEnum_Unknown"]); + XCTAssertFalse([descriptor getValue:NULL forEnumTextFormatName:@"Unknown"]); + XCTAssertFalse([descriptor getValue:&value forEnumTextFormatName:@"Unknown"]); +} + +- (void)testEnumDescriptorIntrospection { + GPBEnumDescriptor *descriptor = TestAllTypes_NestedEnum_EnumDescriptor(); + + XCTAssertEqual(descriptor.enumNameCount, 4U); + XCTAssertEqualObjects([descriptor getEnumNameForIndex:0], + @"TestAllTypes_NestedEnum_Foo"); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:0], @"FOO"); + XCTAssertEqualObjects([descriptor getEnumNameForIndex:1], + @"TestAllTypes_NestedEnum_Bar"); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:1], @"BAR"); + XCTAssertEqualObjects([descriptor getEnumNameForIndex:2], + @"TestAllTypes_NestedEnum_Baz"); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:2], @"BAZ"); + XCTAssertEqualObjects([descriptor getEnumNameForIndex:3], + @"TestAllTypes_NestedEnum_Neg"); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:3], @"NEG"); +} + +- (void)testEnumDescriptorIntrospectionWithAlias { + GPBEnumDescriptor *descriptor = TestEnumWithDupValue_EnumDescriptor(); + NSString *enumName; + int32_t value; + + XCTAssertEqual(descriptor.enumNameCount, 5U); + + enumName = [descriptor getEnumNameForIndex:0]; + XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Foo1"); + XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]); + XCTAssertEqual(value, 1); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:0], @"FOO1"); + + enumName = [descriptor getEnumNameForIndex:1]; + XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Bar1"); + XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]); + XCTAssertEqual(value, 2); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:1], @"BAR1"); + + enumName = [descriptor getEnumNameForIndex:2]; + XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Baz"); + XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]); + XCTAssertEqual(value, 3); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:2], @"BAZ"); + + enumName = [descriptor getEnumNameForIndex:3]; + XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Foo2"); + XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]); + XCTAssertEqual(value, 1); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:3], @"FOO2"); + + enumName = [descriptor getEnumNameForIndex:4]; + XCTAssertEqualObjects(enumName, @"TestEnumWithDupValue_Bar2"); + XCTAssertTrue([descriptor getValue:&value forEnumName:enumName]); + XCTAssertEqual(value, 2); + XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:4], @"BAR2"); + } - (void)testEnumValueValidator { @@ -153,19 +264,6 @@ XCTAssertFalse([fieldDescriptor isValidEnumValue:-2]); } -- (void)testEnumDescriptorLookup { - GPBDescriptor *descriptor = [TestAllTypes descriptor]; - GPBEnumDescriptor *enumDescriptor = - [descriptor enumWithName:@"TestAllTypes_NestedEnum"]; - XCTAssertNotNil(enumDescriptor); - - // Descriptor cannot find foreign or imported enums. - enumDescriptor = [descriptor enumWithName:@"ForeignEnumEnum"]; - XCTAssertNil(enumDescriptor); - enumDescriptor = [descriptor enumWithName:@"ImportEnumEnum"]; - XCTAssertNil(enumDescriptor); -} - - (void)testOneofDescriptor { GPBDescriptor *descriptor = [TestOneof2 descriptor]; @@ -229,4 +327,102 @@ XCTAssertNil(bazString.containingOneof); } +- (void)testExtensiondDescriptor { + Class msgClass = [TestAllExtensions class]; + Class packedMsgClass = [TestPackedExtensions class]; + + // Int + + GPBExtensionDescriptor *descriptor = [UnittestRoot optionalInt32Extension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertEqualObjects(descriptor.defaultValue, @0); + XCTAssertNil(descriptor.enumDescriptor); + + descriptor = [UnittestRoot defaultInt32Extension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertEqualObjects(descriptor.defaultValue, @41); + XCTAssertNil(descriptor.enumDescriptor); + + // Enum + + descriptor = [UnittestRoot optionalNestedEnumExtension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertEqual(descriptor.defaultValue, @1); + XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum"); + + descriptor = [UnittestRoot defaultNestedEnumExtension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertEqual(descriptor.defaultValue, @2); + XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum"); + + // Message + + descriptor = [UnittestRoot optionalNestedMessageExtension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertNil(descriptor.defaultValue); + XCTAssertNil(descriptor.enumDescriptor); + + // Repeated Int + + descriptor = [UnittestRoot repeatedInt32Extension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertNil(descriptor.defaultValue); + XCTAssertNil(descriptor.enumDescriptor); + + descriptor = [UnittestRoot packedInt32Extension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, packedMsgClass); // ptr equality + XCTAssertTrue(descriptor.isPackable); + XCTAssertNil(descriptor.defaultValue); + XCTAssertNil(descriptor.enumDescriptor); + + // Repeated Enum + + descriptor = [UnittestRoot repeatedNestedEnumExtension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertNil(descriptor.defaultValue); + XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"TestAllTypes_NestedEnum"); + + descriptor = [UnittestRoot packedEnumExtension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, packedMsgClass); // ptr equality + XCTAssertTrue(descriptor.isPackable); + XCTAssertNil(descriptor.defaultValue); + XCTAssertEqualObjects(descriptor.enumDescriptor.name, @"ForeignEnum"); + + // Repeated Message + + descriptor = [UnittestRoot repeatedNestedMessageExtension]; + XCTAssertNotNil(descriptor); + XCTAssertEqual(descriptor.containingMessageClass, msgClass); // ptr equality + XCTAssertFalse(descriptor.isPackable); + XCTAssertNil(descriptor.defaultValue); + XCTAssertNil(descriptor.enumDescriptor); + + // Compare (used internally for serialization). + + GPBExtensionDescriptor *ext1 = [UnittestRoot optionalInt32Extension]; + XCTAssertEqual(ext1.fieldNumber, 1u); + GPBExtensionDescriptor *ext2 = [UnittestRoot optionalInt64Extension]; + XCTAssertEqual(ext2.fieldNumber, 2u); + + XCTAssertEqual([ext1 compareByFieldNumber:ext2], NSOrderedAscending); + XCTAssertEqual([ext2 compareByFieldNumber:ext1], NSOrderedDescending); + XCTAssertEqual([ext1 compareByFieldNumber:ext1], NSOrderedSame); +} + @end |