|
@@ -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.0f;
|
|
|
+ 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, 102U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofUint64, 103U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSint32, 104, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSint64, 105, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofFixed32, 106U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofFixed64, 107U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSfixed32, 108, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSfixed64, 109, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofFloat, 110.0f, "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.0f;
|
|
|
+ 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, 0U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofUint64, 0U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSint32, 0, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSint64, 0, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofFixed32, 0U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofFixed64, 0U, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSfixed32, 0, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofSfixed64, 0, "Loop: %zd", i);
|
|
|
+ XCTAssertEqual(msg.oneofFloat, 0.0f, "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];
|