@@ -683,25 +683,30 @@ - (void)testCopy {
683683 [ufs addFieldNumber: 3 fixed64: 3 ];
684684 [ufs addFieldNumber: 4 lengthDelimited: DataFromCStr (" foo" )];
685685 GPBUnknownFields* group = [ufs addGroupWithFieldNumber: 5 ];
686+ [group addFieldNumber: 10 varint: 10 ];
687+ GPBUnknownFields* subGroup = [group addGroupWithFieldNumber: 100 ];
688+ [subGroup addFieldNumber: 20 varint: 20 ];
686689
687690 GPBUnknownFields* ufs2 = [[ufs copy ] autorelease ];
688691 XCTAssertTrue (ufs != ufs2); // Different objects
689692 XCTAssertEqualObjects (ufs, ufs2); // Equal contents
690- // All the actual field objects should be the same since they are immutable.
693+ // All field objects but the group should be the same since they are immutable.
691694 XCTAssertTrue ([[ufs fields: 1 ] firstObject ] == [[ufs2 fields: 1 ] firstObject ]); // Same object
692695 XCTAssertTrue ([[ufs fields: 2 ] firstObject ] == [[ufs2 fields: 2 ] firstObject ]); // Same object
693696 XCTAssertTrue ([[ufs fields: 3 ] firstObject ] == [[ufs2 fields: 3 ] firstObject ]); // Same object
694697 XCTAssertTrue ([[ufs fields: 4 ] firstObject ] == [[ufs2 fields: 4 ] firstObject ]); // Same object
695698 XCTAssertTrue ([[ufs fields: 4 ] firstObject ].lengthDelimited ==
696- [[ufs2 fields: 4 ] firstObject ].lengthDelimited ); // Same object
697- XCTAssertTrue ([[ufs fields: 5 ] firstObject ] == [[ufs2 fields: 5 ] firstObject ]); // Same object
698- XCTAssertTrue (group == [[ufs2 fields: 5 ] firstObject ].group ); // Same object
699-
700- // Now force copies on the fields to confirm that is not making new objects either.
701- for (GPBUnknownField* field in ufs) {
702- GPBUnknownField* field2 = [[field copy ] autorelease ];
703- XCTAssertTrue (field == field2); // Same object (since they aren't mutable).
704- }
699+ [[ufs2 fields: 4 ] firstObject ].lengthDelimited ); // Same object
700+ // Since the group holds another `GPBUnknownFields` object (which is mutable), it will be a
701+ // different object.
702+ XCTAssertTrue ([[ufs fields: 5 ] firstObject ] != [[ufs2 fields: 5 ] firstObject ]);
703+ XCTAssertTrue (group != [[ufs2 fields: 5 ] firstObject ].group );
704+ XCTAssertEqualObjects (group, [[ufs2 fields: 5 ] firstObject ].group );
705+ // And confirm that copy went deep so the nested group also is a different object.
706+ GPBUnknownFields* groupCopied = [[ufs2 fields: 5 ] firstObject ].group ;
707+ XCTAssertTrue ([[group fields: 100 ] firstObject ] != [[groupCopied fields: 100 ] firstObject ]);
708+ XCTAssertTrue (subGroup != [[groupCopied fields: 100 ] firstObject ].group );
709+ XCTAssertEqualObjects (subGroup, [[groupCopied fields: 100 ] firstObject ].group );
705710}
706711
707712- (void )testInvalidFieldNumbers {
0 commit comments