|  | @@ -39,6 +39,7 @@
 | 
	
		
			
				|  |  |  #import "GPBDescriptor.h"
 | 
	
		
			
				|  |  |  #import "GPBDescriptor_PackagePrivate.h"
 | 
	
		
			
				|  |  |  #import "GPBMessage.h"
 | 
	
		
			
				|  |  | +#import "GPBUnknownField_PackagePrivate.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #import "google/protobuf/MapUnittest.pbobjc.h"
 | 
	
		
			
				|  |  |  #import "google/protobuf/Unittest.pbobjc.h"
 | 
	
	
		
			
				|  | @@ -197,4 +198,203 @@
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Helper to make an unknown field set with something in it.
 | 
	
		
			
				|  |  | +static GPBUnknownFieldSet *UnknownFieldsSetHelper(int num) {
 | 
	
		
			
				|  |  | +  GPBUnknownFieldSet *result =
 | 
	
		
			
				|  |  | +      [[[GPBUnknownFieldSet alloc] init] autorelease];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  GPBUnknownField *field =
 | 
	
		
			
				|  |  | +      [[[GPBUnknownField alloc] initWithNumber:num] autorelease];
 | 
	
		
			
				|  |  | +  [field addVarint:num];
 | 
	
		
			
				|  |  | +  [result addField:field];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return result;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- (void)testDropMessageUnknownFieldsRecursively {
 | 
	
		
			
				|  |  | +  TestAllExtensions *message = [TestAllExtensions message];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Give it unknownFields.
 | 
	
		
			
				|  |  | +  message.unknownFields = UnknownFieldsSetHelper(777);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Given it extensions that include a message with unknown fields of its own.
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    // Int
 | 
	
		
			
				|  |  | +    [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Group
 | 
	
		
			
				|  |  | +    OptionalGroup_extension *optionalGroup = [OptionalGroup_extension message];
 | 
	
		
			
				|  |  | +    optionalGroup.a = 123;
 | 
	
		
			
				|  |  | +    optionalGroup.unknownFields = UnknownFieldsSetHelper(779);
 | 
	
		
			
				|  |  | +    [message setExtension:[UnittestRoot optionalGroupExtension]
 | 
	
		
			
				|  |  | +                    value:optionalGroup];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Message
 | 
	
		
			
				|  |  | +    TestAllTypes_NestedMessage *nestedMessage =
 | 
	
		
			
				|  |  | +        [TestAllTypes_NestedMessage message];
 | 
	
		
			
				|  |  | +    nestedMessage.bb = 456;
 | 
	
		
			
				|  |  | +    nestedMessage.unknownFields = UnknownFieldsSetHelper(778);
 | 
	
		
			
				|  |  | +    [message setExtension:[UnittestRoot optionalNestedMessageExtension]
 | 
	
		
			
				|  |  | +                    value:nestedMessage];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Repeated Group
 | 
	
		
			
				|  |  | +    RepeatedGroup_extension *repeatedGroup =
 | 
	
		
			
				|  |  | +      [[RepeatedGroup_extension alloc] init];
 | 
	
		
			
				|  |  | +    repeatedGroup.a = 567;
 | 
	
		
			
				|  |  | +    repeatedGroup.unknownFields = UnknownFieldsSetHelper(780);
 | 
	
		
			
				|  |  | +    [message addExtension:[UnittestRoot repeatedGroupExtension]
 | 
	
		
			
				|  |  | +                    value:repeatedGroup];
 | 
	
		
			
				|  |  | +    [repeatedGroup release];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Repeated Message
 | 
	
		
			
				|  |  | +    nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
 | 
	
		
			
				|  |  | +    nestedMessage.bb = 678;
 | 
	
		
			
				|  |  | +    nestedMessage.unknownFields = UnknownFieldsSetHelper(781);
 | 
	
		
			
				|  |  | +    [message addExtension:[UnittestRoot repeatedNestedMessageExtension]
 | 
	
		
			
				|  |  | +                    value:nestedMessage];
 | 
	
		
			
				|  |  | +    [nestedMessage release];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Confirm everything is there.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  XCTAssertNotNil(message);
 | 
	
		
			
				|  |  | +  XCTAssertNotNil(message.unknownFields);
 | 
	
		
			
				|  |  | +  XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt32Extension]]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot optionalGroupExtension]]);
 | 
	
		
			
				|  |  | +    OptionalGroup_extension *optionalGroup =
 | 
	
		
			
				|  |  | +        [message getExtension:[UnittestRoot optionalGroupExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(optionalGroup);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(optionalGroup.a, 123);
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(optionalGroup.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
 | 
	
		
			
				|  |  | +    TestAllTypes_NestedMessage *nestedMessage =
 | 
	
		
			
				|  |  | +        [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(nestedMessage);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(nestedMessage.bb, 456);
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(nestedMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedGroupExtension]]);
 | 
	
		
			
				|  |  | +    NSArray *repeatedGroups = [message getExtension:[UnittestRoot repeatedGroupExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedGroups.count, (NSUInteger)1);
 | 
	
		
			
				|  |  | +    RepeatedGroup_extension *repeatedGroup = repeatedGroups.firstObject;
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(repeatedGroup);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedGroup.a, 567);
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(repeatedGroup.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedNestedMessageExtension]]);
 | 
	
		
			
				|  |  | +    NSArray *repeatedNestedMessages = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedNestedMessages.count, (NSUInteger)1);
 | 
	
		
			
				|  |  | +    TestAllTypes_NestedMessage *repeatedNestedMessage = repeatedNestedMessages.firstObject;
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(repeatedNestedMessage);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedNestedMessage.bb, 678);
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(repeatedNestedMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Drop them.
 | 
	
		
			
				|  |  | +  GPBMessageDropUnknownFieldsRecursively(message);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Confirm unknowns are gone from within the messages.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  XCTAssertNotNil(message);
 | 
	
		
			
				|  |  | +  XCTAssertNil(message.unknownFields);
 | 
	
		
			
				|  |  | +  XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt32Extension]]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot optionalGroupExtension]]);
 | 
	
		
			
				|  |  | +    OptionalGroup_extension *optionalGroup =
 | 
	
		
			
				|  |  | +        [message getExtension:[UnittestRoot optionalGroupExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(optionalGroup);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(optionalGroup.a, 123);
 | 
	
		
			
				|  |  | +    XCTAssertNil(optionalGroup.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
 | 
	
		
			
				|  |  | +    TestAllTypes_NestedMessage *nestedMessage =
 | 
	
		
			
				|  |  | +        [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(nestedMessage);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(nestedMessage.bb, 456);
 | 
	
		
			
				|  |  | +    XCTAssertNil(nestedMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedGroupExtension]]);
 | 
	
		
			
				|  |  | +    NSArray *repeatedGroups = [message getExtension:[UnittestRoot repeatedGroupExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedGroups.count, (NSUInteger)1);
 | 
	
		
			
				|  |  | +    RepeatedGroup_extension *repeatedGroup = repeatedGroups.firstObject;
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(repeatedGroup);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedGroup.a, 567);
 | 
	
		
			
				|  |  | +    XCTAssertNil(repeatedGroup.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    XCTAssertTrue([message hasExtension:[UnittestRoot repeatedNestedMessageExtension]]);
 | 
	
		
			
				|  |  | +    NSArray *repeatedNestedMessages = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedNestedMessages.count, (NSUInteger)1);
 | 
	
		
			
				|  |  | +    TestAllTypes_NestedMessage *repeatedNestedMessage = repeatedNestedMessages.firstObject;
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(repeatedNestedMessage);
 | 
	
		
			
				|  |  | +    XCTAssertEqual(repeatedNestedMessage.bb, 678);
 | 
	
		
			
				|  |  | +    XCTAssertNil(repeatedNestedMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- (void)testDropMessageUnknownFieldsRecursively_Maps {
 | 
	
		
			
				|  |  | +  TestMap *message = [TestMap message];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    ForeignMessage *foreignMessage = [ForeignMessage message];
 | 
	
		
			
				|  |  | +    foreignMessage.unknownFields = UnknownFieldsSetHelper(100);
 | 
	
		
			
				|  |  | +    [message.mapInt32ForeignMessage setObject:foreignMessage forKey:100];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    foreignMessage = [ForeignMessage message];
 | 
	
		
			
				|  |  | +    foreignMessage.unknownFields = UnknownFieldsSetHelper(101);
 | 
	
		
			
				|  |  | +    [message.mapStringForeignMessage setObject:foreignMessage forKey:@"101"];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Confirm everything is there.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  XCTAssertNotNil(message);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    ForeignMessage *foreignMessage = [message.mapInt32ForeignMessage objectForKey:100];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(foreignMessage);
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(foreignMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    ForeignMessage *foreignMessage = [message.mapStringForeignMessage objectForKey:@"101"];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(foreignMessage);
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(foreignMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  GPBMessageDropUnknownFieldsRecursively(message);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Confirm unknowns are gone from within the messages.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  XCTAssertNotNil(message);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    ForeignMessage *foreignMessage = [message.mapInt32ForeignMessage objectForKey:100];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(foreignMessage);
 | 
	
		
			
				|  |  | +    XCTAssertNil(foreignMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    ForeignMessage *foreignMessage = [message.mapStringForeignMessage objectForKey:@"101"];
 | 
	
		
			
				|  |  | +    XCTAssertNotNil(foreignMessage);
 | 
	
		
			
				|  |  | +    XCTAssertNil(foreignMessage.unknownFields);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  @end
 |