@ -1972,6 +1972,254 @@
[ msg release ] ;
}
- ( void ) testProto2OneofSetToDefault {
/ / proto3 doesn ' t normally write out zero ( default ) fields , but if they are
/ / in a oneof it does . proto2 doesn ' t have this special behavior , but we
/ / still confirm setting to the explicit default does set the case to be
/ / sure the runtime is working correctly .
NSString * oneofStringDefault = @ "string ";
NSData * oneofBytesDefault = [ @ "data " dataUsingEncoding : NSUTF8StringEncoding ] ;
Message2 * msg = [ [ Message2 alloc ] init ] ;
uint32_t values [ ] = {
Message2_O_OneOfCase_OneofInt32 ,
Message2_O_OneOfCase_OneofInt64 ,
Message2_O_OneOfCase_OneofUint32 ,
Message2_O_OneOfCase_OneofUint64 ,
Message2_O_OneOfCase_OneofSint32 ,
Message2_O_OneOfCase_OneofSint64 ,
Message2_O_OneOfCase_OneofFixed32 ,
Message2_O_OneOfCase_OneofFixed64 ,
Message2_O_OneOfCase_OneofSfixed32 ,
Message2_O_OneOfCase_OneofSfixed64 ,
Message2_O_OneOfCase_OneofFloat ,
Message2_O_OneOfCase_OneofDouble ,
Message2_O_OneOfCase_OneofBool ,
Message2_O_OneOfCase_OneofString ,
Message2_O_OneOfCase_OneofBytes ,
/ / Skip group
/ / Skip message
Message2_O_OneOfCase_OneofEnum ,
} ;
for ( size_t i = 0 ; i < GPBARRAYSIZE ( values ) ; + + i ) {
switch ( values [ i ] ) {
case Message3_O_OneOfCase_OneofInt32 :
msg . oneofInt32 = 100 ;
break ;
case Message3_O_OneOfCase_OneofInt64 :
msg . oneofInt64 = 101 ;
break ;
case Message3_O_OneOfCase_OneofUint32 :
msg . oneofUint32 = 102 ;
break ;
case Message3_O_OneOfCase_OneofUint64 :
msg . oneofUint64 = 103 ;
break ;
case Message3_O_OneOfCase_OneofSint32 :
msg . oneofSint32 = 104 ;
break ;
case Message3_O_OneOfCase_OneofSint64 :
msg . oneofSint64 = 105 ;
break ;
case Message3_O_OneOfCase_OneofFixed32 :
msg . oneofFixed32 = 106 ;
break ;
case Message3_O_OneOfCase_OneofFixed64 :
msg . oneofFixed64 = 107 ;
break ;
case Message3_O_OneOfCase_OneofSfixed32 :
msg . oneofSfixed32 = 108 ;
break ;
case Message3_O_OneOfCase_OneofSfixed64 :
msg . oneofSfixed64 = 109 ;
break ;
case Message3_O_OneOfCase_OneofFloat :
msg . oneofFloat = 110.0 f ;
break ;
case Message3_O_OneOfCase_OneofDouble :
msg . oneofDouble = 111.0 ;
break ;
case Message3_O_OneOfCase_OneofBool :
msg . oneofBool = YES ;
break ;
case Message3_O_OneOfCase_OneofString :
msg . oneofString = oneofStringDefault ;
break ;
case Message3_O_OneOfCase_OneofBytes :
msg . oneofBytes = oneofBytesDefault ;
break ;
case Message3_O_OneOfCase_OneofEnum :
msg . oneofEnum = Message3_Enum_Baz ;
break ;
default :
XCTFail ( @ "shouldn ' t happen , loop : %zd, value: %d", i, values[i]);
break ;
}
/ / Should be set to the correct case .
XCTAssertEqual ( msg . oOneOfCase , values [ i ] , "Loop : %zd", i);
/ / Confirm everything is back as the defaults .
XCTAssertEqual ( msg . oneofInt32 , 100 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofInt64 , 101 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofUint32 , 102 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofUint64 , 103 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSint32 , 104 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSint64 , 105 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofFixed32 , 106 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofFixed64 , 107 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSfixed32 , 108 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSfixed64 , 109 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofFloat , 110.0 f , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofDouble , 111.0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofBool , YES , "Loop : %zd", i);
XCTAssertEqualObjects ( msg . oneofString , oneofStringDefault , "Loop : %zd", i);
XCTAssertEqualObjects ( msg . oneofBytes , oneofBytesDefault , "Loop : %zd", i);
XCTAssertNotNil ( msg . oneofGroup , "Loop : %zd", i);
/ / Skip group
/ / Skip message
XCTAssertEqual ( msg . oneofEnum , Message2_Enum_Baz , "Loop : %zd", i);
}
/ / We special case nil on string , data , message , ensure they work as expected .
/ / i . e . - it clears the case .
msg . oneofString = nil ;
XCTAssertEqual ( msg . oOneOfCase , Message3_O_OneOfCase_GPBUnsetOneOfCase ) ;
msg . oneofBytes = nil ;
XCTAssertEqual ( msg . oOneOfCase , Message3_O_OneOfCase_GPBUnsetOneOfCase ) ;
msg . oneofMessage = nil ;
XCTAssertEqual ( msg . oOneOfCase , Message3_O_OneOfCase_GPBUnsetOneOfCase ) ;
[ msg release ] ;
}
- ( void ) testProto3OneofSetToZero {
/ / Normally setting a proto3 field to the zero value should result in it being
/ / reset / cleared . But in a oneof , it still gets recored so it can go out
/ / over the wire and the other side can see what was set in the oneof .
NSString * oneofStringDefault = @ "";
NSData * oneofBytesDefault = [ NSData data ] ;
Message3 * msg = [ [ Message3 alloc ] init ] ;
uint32_t values [ ] = {
Message3_O_OneOfCase_OneofInt32 ,
Message3_O_OneOfCase_OneofInt64 ,
Message3_O_OneOfCase_OneofUint32 ,
Message3_O_OneOfCase_OneofUint64 ,
Message3_O_OneOfCase_OneofSint32 ,
Message3_O_OneOfCase_OneofSint64 ,
Message3_O_OneOfCase_OneofFixed32 ,
Message3_O_OneOfCase_OneofFixed64 ,
Message3_O_OneOfCase_OneofSfixed32 ,
Message3_O_OneOfCase_OneofSfixed64 ,
Message3_O_OneOfCase_OneofFloat ,
Message3_O_OneOfCase_OneofDouble ,
Message3_O_OneOfCase_OneofBool ,
Message3_O_OneOfCase_OneofString ,
Message3_O_OneOfCase_OneofBytes ,
Message3_O_OneOfCase_OneofMessage ,
Message3_O_OneOfCase_OneofEnum ,
} ;
for ( size_t i = 0 ; i < GPBARRAYSIZE ( values ) ; + + i ) {
switch ( values [ i ] ) {
case Message3_O_OneOfCase_OneofInt32 :
msg . oneofInt32 = 0 ;
break ;
case Message3_O_OneOfCase_OneofInt64 :
msg . oneofInt64 = 0 ;
break ;
case Message3_O_OneOfCase_OneofUint32 :
msg . oneofUint32 = 0 ;
break ;
case Message3_O_OneOfCase_OneofUint64 :
msg . oneofUint64 = 0 ;
break ;
case Message3_O_OneOfCase_OneofSint32 :
msg . oneofSint32 = 0 ;
break ;
case Message3_O_OneOfCase_OneofSint64 :
msg . oneofSint64 = 0 ;
break ;
case Message3_O_OneOfCase_OneofFixed32 :
msg . oneofFixed32 = 0 ;
break ;
case Message3_O_OneOfCase_OneofFixed64 :
msg . oneofFixed64 = 0 ;
break ;
case Message3_O_OneOfCase_OneofSfixed32 :
msg . oneofSfixed32 = 0 ;
break ;
case Message3_O_OneOfCase_OneofSfixed64 :
msg . oneofSfixed64 = 0 ;
break ;
case Message3_O_OneOfCase_OneofFloat :
msg . oneofFloat = 0.0 f ;
break ;
case Message3_O_OneOfCase_OneofDouble :
msg . oneofDouble = 0.0 ;
break ;
case Message3_O_OneOfCase_OneofBool :
msg . oneofBool = NO ;
break ;
case Message3_O_OneOfCase_OneofString :
msg . oneofString = oneofStringDefault ;
break ;
case Message3_O_OneOfCase_OneofBytes :
msg . oneofBytes = oneofBytesDefault ;
break ;
case Message3_O_OneOfCase_OneofMessage :
msg . oneofMessage . optionalInt32 = 0 ;
break ;
case Message3_O_OneOfCase_OneofEnum :
msg . oneofEnum = Message3_Enum_Foo ;
break ;
default :
XCTFail ( @ "shouldn ' t happen , loop : %zd, value: %d", i, values[i]);
break ;
}
/ / Should be set to the correct case .
XCTAssertEqual ( msg . oOneOfCase , values [ i ] , "Loop : %zd", i);
/ / Confirm everything is still zeros .
XCTAssertEqual ( msg . oneofInt32 , 0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofInt64 , 0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofUint32 , 0 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofUint64 , 0 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSint32 , 0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSint64 , 0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofFixed32 , 0 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofFixed64 , 0 U , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSfixed32 , 0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofSfixed64 , 0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofFloat , 0.0 f , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofDouble , 0.0 , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofBool , NO , "Loop : %zd", i);
XCTAssertEqualObjects ( msg . oneofString , oneofStringDefault , "Loop : %zd", i);
XCTAssertEqualObjects ( msg . oneofBytes , oneofBytesDefault , "Loop : %zd", i);
XCTAssertNotNil ( msg . oneofMessage , "Loop : %zd", i);
XCTAssertEqual ( msg . oneofEnum , Message3_Enum_Foo , "Loop : %zd", i);
}
/ / We special case nil on string , data , message , ensure they work as expected .
msg . oneofString = nil ;
XCTAssertEqual ( msg . oOneOfCase , Message3_O_OneOfCase_GPBUnsetOneOfCase ) ;
msg . oneofBytes = nil ;
XCTAssertEqual ( msg . oOneOfCase , Message3_O_OneOfCase_GPBUnsetOneOfCase ) ;
msg . oneofMessage = nil ;
XCTAssertEqual ( msg . oOneOfCase , Message3_O_OneOfCase_GPBUnsetOneOfCase ) ;
[ msg release ] ;
}
- ( void ) testCopyingMakesUniqueObjects {
const int repeatCount = 5 ;
TestAllTypes * msg1 = [ TestAllTypes message ] ;