@@ -510,6 +510,82 @@ - (void)testGetFields {
510510 XCTAssertNil ([ufs fields: 99 ]); // Not present
511511}
512512
513+ - (void )testRemoveField {
514+ GPBUnknownFields* ufs = [[[GPBUnknownFields alloc ] init ] autorelease ];
515+ [ufs addFieldNumber: 1 varint: 1 ];
516+ [ufs addFieldNumber: 1 fixed32: 1 ];
517+ [ufs addFieldNumber: 1 fixed64: 1 ];
518+ XCTAssertEqual (ufs.count , 3 );
519+
520+ NSArray <GPBUnknownField*>* fields = [ufs fields: 1 ];
521+ XCTAssertEqual (fields.count , 3 );
522+ GPBUnknownField* field = fields[0 ];
523+ XCTAssertEqual (field.number , 1 );
524+ XCTAssertEqual (field.type , GPBUnknownFieldTypeVarint);
525+ XCTAssertEqual (field.varint , 1 );
526+ [ufs removeField: field]; // Remove first (varint)
527+ XCTAssertEqual (ufs.count , 2 );
528+
529+ fields = [ufs fields: 1 ];
530+ XCTAssertEqual (fields.count , 2 );
531+ field = fields[0 ];
532+ XCTAssertEqual (field.number , 1 );
533+ XCTAssertEqual (field.type , GPBUnknownFieldTypeFixed32);
534+ field = fields[1 ];
535+ XCTAssertEqual (field.number , 1 );
536+ XCTAssertEqual (field.type , GPBUnknownFieldTypeFixed64);
537+ [ufs removeField: field]; // Remove the second (fixed64)
538+ XCTAssertEqual (ufs.count , 1 );
539+
540+ fields = [ufs fields: 1 ];
541+ XCTAssertEqual (fields.count , 1 );
542+ field = fields[0 ];
543+ XCTAssertEqual (field.number , 1 );
544+ XCTAssertEqual (field.type , GPBUnknownFieldTypeFixed32);
545+
546+ field = [[field retain ] autorelease ]; // Hold on to this last one.
547+ [ufs removeField: field]; // Remove the last one (fixed32)
548+ XCTAssertEqual (ufs.count , 0 );
549+
550+ // Trying to remove something not in the set should fail.
551+ XCTAssertThrowsSpecificNamed ([ufs removeField: field], NSException , NSInvalidArgumentException );
552+ }
553+
554+ - (void )testClearFieldNumber {
555+ GPBUnknownFields* ufs = [[[GPBUnknownFields alloc ] init ] autorelease ];
556+ [ufs addFieldNumber: 1 varint: 1 ];
557+ [ufs addFieldNumber: 2 fixed32: 2 ];
558+ [ufs addFieldNumber: 1 fixed64: 1 ];
559+ [ufs addFieldNumber: 3 varint: 3 ];
560+ XCTAssertEqual (ufs.count , 4 );
561+
562+ [ufs clearFieldNumber: 999 ]; // Not present, noop.
563+ XCTAssertEqual (ufs.count , 4 );
564+
565+ [ufs clearFieldNumber: 1 ]; // Should remove slot zero and slot two.
566+ XCTAssertEqual (ufs.count , 2 );
567+ NSArray <GPBUnknownField*>* fields = [ufs fields: 2 ];
568+ XCTAssertEqual (fields.count , 1 );
569+ GPBUnknownField* field = fields[0 ];
570+ XCTAssertEqual (field.number , 2 );
571+ XCTAssertEqual (field.type , GPBUnknownFieldTypeFixed32);
572+ XCTAssertEqual (field.fixed32 , 2 );
573+ fields = [ufs fields: 3 ];
574+ XCTAssertEqual (fields.count , 1 );
575+ field = fields[0 ];
576+ XCTAssertEqual (field.number , 3 );
577+ XCTAssertEqual (field.type , GPBUnknownFieldTypeVarint);
578+ XCTAssertEqual (field.varint , 3 );
579+
580+ [ufs clearFieldNumber: 2 ]; // Should remove slot one.
581+ fields = [ufs fields: 3 ];
582+ XCTAssertEqual (fields.count , 1 );
583+ field = fields[0 ];
584+ XCTAssertEqual (field.number , 3 );
585+ XCTAssertEqual (field.type , GPBUnknownFieldTypeVarint);
586+ XCTAssertEqual (field.varint , 3 );
587+ }
588+
513589- (void )testFastEnumeration {
514590 GPBUnknownFields* ufs = [[[GPBUnknownFields alloc ] init ] autorelease ];
515591 [ufs addFieldNumber: 1 varint: 1 ];
0 commit comments