GPBMessageTests+Serialization.m 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2015 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #import "GPBTestUtilities.h"
  31. #import <objc/runtime.h>
  32. #import "GPBMessage.h"
  33. #import "google/protobuf/MapProto2Unittest.pbobjc.h"
  34. #import "google/protobuf/MapUnittest.pbobjc.h"
  35. #import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
  36. #import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
  37. #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
  38. #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
  39. #ifndef GPBARRAYSIZE
  40. #define GPBARRAYSIZE(a) ((sizeof(a) / sizeof((a[0]))))
  41. #endif // GPBARRAYSIZE
  42. static NSData *DataFromCStr(const char *str) {
  43. return [NSData dataWithBytes:str length:strlen(str)];
  44. }
  45. @interface MessageSerializationTests : GPBTestCase
  46. @end
  47. @implementation MessageSerializationTests
  48. // TODO(thomasvl): Pull tests over from GPBMessageTests that are serialization
  49. // specific.
  50. - (void)testProto3SerializationHandlingDefaults {
  51. // Proto2 covered in other tests.
  52. Message3 *msg = [[Message3 alloc] init];
  53. // Add defaults, no output.
  54. NSData *data = [msg data];
  55. XCTAssertEqual([data length], 0U);
  56. // All zeros, still nothing.
  57. msg.optionalInt32 = 0;
  58. msg.optionalInt64 = 0;
  59. msg.optionalUint32 = 0;
  60. msg.optionalUint64 = 0;
  61. msg.optionalSint32 = 0;
  62. msg.optionalSint64 = 0;
  63. msg.optionalFixed32 = 0;
  64. msg.optionalFixed64 = 0;
  65. msg.optionalSfixed32 = 0;
  66. msg.optionalSfixed64 = 0;
  67. msg.optionalFloat = 0.0f;
  68. msg.optionalDouble = 0.0;
  69. msg.optionalBool = NO;
  70. msg.optionalString = @"";
  71. msg.optionalBytes = [NSData data];
  72. msg.optionalEnum = Message3_Enum_Foo; // first value
  73. data = [msg data];
  74. XCTAssertEqual([data length], 0U);
  75. // The two that also take nil as nothing.
  76. msg.optionalString = nil;
  77. msg.optionalBytes = nil;
  78. data = [msg data];
  79. XCTAssertEqual([data length], 0U);
  80. // Set one field...
  81. msg.optionalInt32 = 1;
  82. data = [msg data];
  83. const uint8_t expectedBytes[] = {0x08, 0x01};
  84. NSData *expected = [NSData dataWithBytes:expectedBytes length:2];
  85. XCTAssertEqualObjects(data, expected);
  86. // Back to zero...
  87. msg.optionalInt32 = 0;
  88. data = [msg data];
  89. XCTAssertEqual([data length], 0U);
  90. [msg release];
  91. }
  92. - (void)testProto3DroppingUnknownFields {
  93. DropUnknownsFooWithExtraFields *fooWithExtras =
  94. [[DropUnknownsFooWithExtraFields alloc] init];
  95. fooWithExtras.int32Value = 1;
  96. fooWithExtras.enumValue = DropUnknownsFooWithExtraFields_NestedEnum_Baz;
  97. fooWithExtras.extraInt32Value = 2;
  98. DropUnknownsFoo *foo = [DropUnknownsFoo parseFromData:[fooWithExtras data]];
  99. XCTAssertEqual(foo.int32Value, 1);
  100. XCTAssertEqual(foo.enumValue, DropUnknownsFoo_NestedEnum_Baz);
  101. // Nothing should end up in the unknowns.
  102. XCTAssertEqual([foo.unknownFields countOfFields], 0U);
  103. [fooWithExtras release];
  104. fooWithExtras = [DropUnknownsFooWithExtraFields parseFromData:[foo data]];
  105. XCTAssertEqual(fooWithExtras.int32Value, 1);
  106. XCTAssertEqual(fooWithExtras.enumValue,
  107. DropUnknownsFooWithExtraFields_NestedEnum_Baz);
  108. // And the extra value is gone (back to the default).
  109. XCTAssertEqual(fooWithExtras.extraInt32Value, 0);
  110. XCTAssertEqual([foo.unknownFields countOfFields], 0U);
  111. }
  112. - (void)testProto2UnknownEnumToUnknownField {
  113. Message3 *orig = [[Message3 alloc] init];
  114. orig.optionalEnum = Message3_Enum_Extra3;
  115. orig.repeatedEnumArray =
  116. [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
  117. rawValue:Message3_Enum_Extra3];
  118. orig.repeatedPackedEnumArray =
  119. [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
  120. rawValue:Message3_Enum_Extra3];
  121. orig.oneofEnum = Message3_Enum_Extra3;
  122. Message2 *msg = [[Message2 alloc] initWithData:[orig data]];
  123. // None of the fields should be set.
  124. XCTAssertFalse(msg.hasOptionalEnum);
  125. XCTAssertEqual(msg.repeatedEnumArray.count, 0U);
  126. XCTAssertEqual(msg.repeatedPackedEnumArray.count, 0U);
  127. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
  128. // All the values should be in unknown fields.
  129. GPBUnknownFieldSet *unknownFields = msg.unknownFields;
  130. XCTAssertEqual([unknownFields countOfFields], 4U);
  131. XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OptionalEnum]);
  132. XCTAssertTrue(
  133. [unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
  134. XCTAssertTrue(
  135. [unknownFields hasField:Message2_FieldNumber_RepeatedPackedEnumArray]);
  136. XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OneofEnum]);
  137. GPBField *field = [unknownFields getField:Message2_FieldNumber_OptionalEnum];
  138. XCTAssertEqual(field.varintList.count, 1U);
  139. XCTAssertEqual([field.varintList valueAtIndex:0],
  140. (uint64_t)Message3_Enum_Extra3);
  141. field = [unknownFields getField:Message2_FieldNumber_RepeatedEnumArray];
  142. XCTAssertEqual(field.varintList.count, 1U);
  143. XCTAssertEqual([field.varintList valueAtIndex:0],
  144. (uint64_t)Message3_Enum_Extra3);
  145. field = [unknownFields getField:Message2_FieldNumber_RepeatedPackedEnumArray];
  146. XCTAssertEqual(field.varintList.count, 1U);
  147. XCTAssertEqual([field.varintList valueAtIndex:0],
  148. (uint64_t)Message3_Enum_Extra3);
  149. field = [unknownFields getField:Message2_FieldNumber_OneofEnum];
  150. XCTAssertEqual(field.varintList.count, 1U);
  151. XCTAssertEqual([field.varintList valueAtIndex:0],
  152. (uint64_t)Message3_Enum_Extra3);
  153. [msg release];
  154. [orig release];
  155. }
  156. - (void)testProto3UnknownEnumPreserving {
  157. UnknownEnumsMyMessagePlusExtra *orig =
  158. [UnknownEnumsMyMessagePlusExtra message];
  159. orig.e = UnknownEnumsMyEnumPlusExtra_EExtra;
  160. orig.repeatedEArray = [GPBEnumArray
  161. arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
  162. rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
  163. orig.repeatedPackedEArray = [GPBEnumArray
  164. arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
  165. rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
  166. orig.oneofE1 = UnknownEnumsMyEnumPlusExtra_EExtra;
  167. // Everything should be there via raw values.
  168. UnknownEnumsMyMessage *msg =
  169. [UnknownEnumsMyMessage parseFromData:[orig data]];
  170. XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  171. XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg),
  172. UnknownEnumsMyEnumPlusExtra_EExtra);
  173. XCTAssertEqual(msg.repeatedEArray.count, 1U);
  174. XCTAssertEqual([msg.repeatedEArray valueAtIndex:0],
  175. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  176. XCTAssertEqual([msg.repeatedEArray rawValueAtIndex:0],
  177. (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
  178. XCTAssertEqual(msg.repeatedPackedEArray.count, 1U);
  179. XCTAssertEqual([msg.repeatedPackedEArray valueAtIndex:0],
  180. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  181. XCTAssertEqual([msg.repeatedPackedEArray rawValueAtIndex:0],
  182. (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
  183. XCTAssertEqual(msg.oneofE1,
  184. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  185. XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg),
  186. UnknownEnumsMyEnumPlusExtra_EExtra);
  187. // Everything should go out and come back.
  188. orig = [UnknownEnumsMyMessagePlusExtra parseFromData:[msg data]];
  189. XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra);
  190. XCTAssertEqual(orig.repeatedEArray.count, 1U);
  191. XCTAssertEqual([orig.repeatedEArray valueAtIndex:0],
  192. UnknownEnumsMyEnumPlusExtra_EExtra);
  193. XCTAssertEqual(orig.repeatedPackedEArray.count, 1U);
  194. XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0],
  195. UnknownEnumsMyEnumPlusExtra_EExtra);
  196. XCTAssertEqual(orig.oneofE1, UnknownEnumsMyEnumPlusExtra_EExtra);
  197. }
  198. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF(MESSAGE, FIELD, VALUE)
  199. //%TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, )
  200. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, EQ_SUFFIX)
  201. //% { // oneof##FIELD
  202. //% MESSAGE *orig = [[MESSAGE alloc] init];
  203. //% orig.oneof##FIELD = VALUE;
  204. //% XCTAssertEqual(orig.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
  205. //% MESSAGE *msg = [MESSAGE parseFromData:[orig data]];
  206. //% XCTAssertEqual(msg.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
  207. //% XCTAssertEqual##EQ_SUFFIX(msg.oneof##FIELD, VALUE);
  208. //% [orig release];
  209. //% }
  210. //%
  211. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOFS(SYNTAX, BOOL_NON_DEFAULT)
  212. //%- (void)testProto##SYNTAX##RoundTripOneof {
  213. //%
  214. //%GROUP_INIT##SYNTAX() Message##SYNTAX *subMessage = [[Message##SYNTAX alloc] init];
  215. //% XCTAssertNotNil(subMessage);
  216. //% subMessage.optionalInt32 = 666;
  217. //%
  218. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int32, 1)
  219. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int64, 2)
  220. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint32, 3U)
  221. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint64, 4U)
  222. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint32, 5)
  223. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint64, 6)
  224. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed32, 7U)
  225. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed64, 8U)
  226. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed32, 9)
  227. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed64, 10)
  228. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Float, 11.0f)
  229. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Double, 12.0)
  230. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Bool, BOOL_NON_DEFAULT)
  231. //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, String, @"foo", Objects)
  232. //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Bytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding], Objects)
  233. //%GROUP_TEST##SYNTAX()TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Message, subMessage, Objects)
  234. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Enum, Message2_Enum_Bar)
  235. //%GROUP_CLEANUP##SYNTAX() [subMessage release];
  236. //%}
  237. //%
  238. //%PDDM-DEFINE GROUP_INIT2()
  239. //% Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
  240. //% XCTAssertNotNil(group);
  241. //% group.a = 777;
  242. //%
  243. //%PDDM-DEFINE GROUP_CLEANUP2()
  244. //% [group release];
  245. //%
  246. //%PDDM-DEFINE GROUP_TEST2()
  247. //%TEST_ROUNDTRIP_ONEOF_ADV(Message2, Group, group, Objects)
  248. //%
  249. //%PDDM-DEFINE GROUP_INIT3()
  250. // Empty
  251. //%PDDM-DEFINE GROUP_CLEANUP3()
  252. // Empty
  253. //%PDDM-DEFINE GROUP_TEST3()
  254. //% // Not "group" in proto3.
  255. //%
  256. //%
  257. //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(2, NO)
  258. // This block of code is generated, do not edit it directly.
  259. - (void)testProto2RoundTripOneof {
  260. Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
  261. XCTAssertNotNil(group);
  262. group.a = 777;
  263. Message2 *subMessage = [[Message2 alloc] init];
  264. XCTAssertNotNil(subMessage);
  265. subMessage.optionalInt32 = 666;
  266. { // oneofInt32
  267. Message2 *orig = [[Message2 alloc] init];
  268. orig.oneofInt32 = 1;
  269. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
  270. Message2 *msg = [Message2 parseFromData:[orig data]];
  271. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
  272. XCTAssertEqual(msg.oneofInt32, 1);
  273. [orig release];
  274. }
  275. { // oneofInt64
  276. Message2 *orig = [[Message2 alloc] init];
  277. orig.oneofInt64 = 2;
  278. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
  279. Message2 *msg = [Message2 parseFromData:[orig data]];
  280. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
  281. XCTAssertEqual(msg.oneofInt64, 2);
  282. [orig release];
  283. }
  284. { // oneofUint32
  285. Message2 *orig = [[Message2 alloc] init];
  286. orig.oneofUint32 = 3U;
  287. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
  288. Message2 *msg = [Message2 parseFromData:[orig data]];
  289. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
  290. XCTAssertEqual(msg.oneofUint32, 3U);
  291. [orig release];
  292. }
  293. { // oneofUint64
  294. Message2 *orig = [[Message2 alloc] init];
  295. orig.oneofUint64 = 4U;
  296. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
  297. Message2 *msg = [Message2 parseFromData:[orig data]];
  298. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
  299. XCTAssertEqual(msg.oneofUint64, 4U);
  300. [orig release];
  301. }
  302. { // oneofSint32
  303. Message2 *orig = [[Message2 alloc] init];
  304. orig.oneofSint32 = 5;
  305. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
  306. Message2 *msg = [Message2 parseFromData:[orig data]];
  307. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
  308. XCTAssertEqual(msg.oneofSint32, 5);
  309. [orig release];
  310. }
  311. { // oneofSint64
  312. Message2 *orig = [[Message2 alloc] init];
  313. orig.oneofSint64 = 6;
  314. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
  315. Message2 *msg = [Message2 parseFromData:[orig data]];
  316. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
  317. XCTAssertEqual(msg.oneofSint64, 6);
  318. [orig release];
  319. }
  320. { // oneofFixed32
  321. Message2 *orig = [[Message2 alloc] init];
  322. orig.oneofFixed32 = 7U;
  323. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
  324. Message2 *msg = [Message2 parseFromData:[orig data]];
  325. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
  326. XCTAssertEqual(msg.oneofFixed32, 7U);
  327. [orig release];
  328. }
  329. { // oneofFixed64
  330. Message2 *orig = [[Message2 alloc] init];
  331. orig.oneofFixed64 = 8U;
  332. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
  333. Message2 *msg = [Message2 parseFromData:[orig data]];
  334. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
  335. XCTAssertEqual(msg.oneofFixed64, 8U);
  336. [orig release];
  337. }
  338. { // oneofSfixed32
  339. Message2 *orig = [[Message2 alloc] init];
  340. orig.oneofSfixed32 = 9;
  341. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
  342. Message2 *msg = [Message2 parseFromData:[orig data]];
  343. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
  344. XCTAssertEqual(msg.oneofSfixed32, 9);
  345. [orig release];
  346. }
  347. { // oneofSfixed64
  348. Message2 *orig = [[Message2 alloc] init];
  349. orig.oneofSfixed64 = 10;
  350. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
  351. Message2 *msg = [Message2 parseFromData:[orig data]];
  352. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
  353. XCTAssertEqual(msg.oneofSfixed64, 10);
  354. [orig release];
  355. }
  356. { // oneofFloat
  357. Message2 *orig = [[Message2 alloc] init];
  358. orig.oneofFloat = 11.0f;
  359. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
  360. Message2 *msg = [Message2 parseFromData:[orig data]];
  361. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
  362. XCTAssertEqual(msg.oneofFloat, 11.0f);
  363. [orig release];
  364. }
  365. { // oneofDouble
  366. Message2 *orig = [[Message2 alloc] init];
  367. orig.oneofDouble = 12.0;
  368. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
  369. Message2 *msg = [Message2 parseFromData:[orig data]];
  370. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
  371. XCTAssertEqual(msg.oneofDouble, 12.0);
  372. [orig release];
  373. }
  374. { // oneofBool
  375. Message2 *orig = [[Message2 alloc] init];
  376. orig.oneofBool = NO;
  377. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBool);
  378. Message2 *msg = [Message2 parseFromData:[orig data]];
  379. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
  380. XCTAssertEqual(msg.oneofBool, NO);
  381. [orig release];
  382. }
  383. { // oneofString
  384. Message2 *orig = [[Message2 alloc] init];
  385. orig.oneofString = @"foo";
  386. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofString);
  387. Message2 *msg = [Message2 parseFromData:[orig data]];
  388. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
  389. XCTAssertEqualObjects(msg.oneofString, @"foo");
  390. [orig release];
  391. }
  392. { // oneofBytes
  393. Message2 *orig = [[Message2 alloc] init];
  394. orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
  395. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
  396. Message2 *msg = [Message2 parseFromData:[orig data]];
  397. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
  398. XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
  399. [orig release];
  400. }
  401. { // oneofGroup
  402. Message2 *orig = [[Message2 alloc] init];
  403. orig.oneofGroup = group;
  404. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
  405. Message2 *msg = [Message2 parseFromData:[orig data]];
  406. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
  407. XCTAssertEqualObjects(msg.oneofGroup, group);
  408. [orig release];
  409. }
  410. { // oneofMessage
  411. Message2 *orig = [[Message2 alloc] init];
  412. orig.oneofMessage = subMessage;
  413. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
  414. Message2 *msg = [Message2 parseFromData:[orig data]];
  415. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
  416. XCTAssertEqualObjects(msg.oneofMessage, subMessage);
  417. [orig release];
  418. }
  419. { // oneofEnum
  420. Message2 *orig = [[Message2 alloc] init];
  421. orig.oneofEnum = Message2_Enum_Bar;
  422. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
  423. Message2 *msg = [Message2 parseFromData:[orig data]];
  424. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
  425. XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
  426. [orig release];
  427. }
  428. [group release];
  429. [subMessage release];
  430. }
  431. //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(3, YES)
  432. // This block of code is generated, do not edit it directly.
  433. - (void)testProto3RoundTripOneof {
  434. Message3 *subMessage = [[Message3 alloc] init];
  435. XCTAssertNotNil(subMessage);
  436. subMessage.optionalInt32 = 666;
  437. { // oneofInt32
  438. Message3 *orig = [[Message3 alloc] init];
  439. orig.oneofInt32 = 1;
  440. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
  441. Message3 *msg = [Message3 parseFromData:[orig data]];
  442. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
  443. XCTAssertEqual(msg.oneofInt32, 1);
  444. [orig release];
  445. }
  446. { // oneofInt64
  447. Message3 *orig = [[Message3 alloc] init];
  448. orig.oneofInt64 = 2;
  449. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
  450. Message3 *msg = [Message3 parseFromData:[orig data]];
  451. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
  452. XCTAssertEqual(msg.oneofInt64, 2);
  453. [orig release];
  454. }
  455. { // oneofUint32
  456. Message3 *orig = [[Message3 alloc] init];
  457. orig.oneofUint32 = 3U;
  458. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
  459. Message3 *msg = [Message3 parseFromData:[orig data]];
  460. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
  461. XCTAssertEqual(msg.oneofUint32, 3U);
  462. [orig release];
  463. }
  464. { // oneofUint64
  465. Message3 *orig = [[Message3 alloc] init];
  466. orig.oneofUint64 = 4U;
  467. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
  468. Message3 *msg = [Message3 parseFromData:[orig data]];
  469. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
  470. XCTAssertEqual(msg.oneofUint64, 4U);
  471. [orig release];
  472. }
  473. { // oneofSint32
  474. Message3 *orig = [[Message3 alloc] init];
  475. orig.oneofSint32 = 5;
  476. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
  477. Message3 *msg = [Message3 parseFromData:[orig data]];
  478. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
  479. XCTAssertEqual(msg.oneofSint32, 5);
  480. [orig release];
  481. }
  482. { // oneofSint64
  483. Message3 *orig = [[Message3 alloc] init];
  484. orig.oneofSint64 = 6;
  485. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
  486. Message3 *msg = [Message3 parseFromData:[orig data]];
  487. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
  488. XCTAssertEqual(msg.oneofSint64, 6);
  489. [orig release];
  490. }
  491. { // oneofFixed32
  492. Message3 *orig = [[Message3 alloc] init];
  493. orig.oneofFixed32 = 7U;
  494. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
  495. Message3 *msg = [Message3 parseFromData:[orig data]];
  496. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
  497. XCTAssertEqual(msg.oneofFixed32, 7U);
  498. [orig release];
  499. }
  500. { // oneofFixed64
  501. Message3 *orig = [[Message3 alloc] init];
  502. orig.oneofFixed64 = 8U;
  503. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
  504. Message3 *msg = [Message3 parseFromData:[orig data]];
  505. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
  506. XCTAssertEqual(msg.oneofFixed64, 8U);
  507. [orig release];
  508. }
  509. { // oneofSfixed32
  510. Message3 *orig = [[Message3 alloc] init];
  511. orig.oneofSfixed32 = 9;
  512. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
  513. Message3 *msg = [Message3 parseFromData:[orig data]];
  514. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
  515. XCTAssertEqual(msg.oneofSfixed32, 9);
  516. [orig release];
  517. }
  518. { // oneofSfixed64
  519. Message3 *orig = [[Message3 alloc] init];
  520. orig.oneofSfixed64 = 10;
  521. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
  522. Message3 *msg = [Message3 parseFromData:[orig data]];
  523. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
  524. XCTAssertEqual(msg.oneofSfixed64, 10);
  525. [orig release];
  526. }
  527. { // oneofFloat
  528. Message3 *orig = [[Message3 alloc] init];
  529. orig.oneofFloat = 11.0f;
  530. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
  531. Message3 *msg = [Message3 parseFromData:[orig data]];
  532. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
  533. XCTAssertEqual(msg.oneofFloat, 11.0f);
  534. [orig release];
  535. }
  536. { // oneofDouble
  537. Message3 *orig = [[Message3 alloc] init];
  538. orig.oneofDouble = 12.0;
  539. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
  540. Message3 *msg = [Message3 parseFromData:[orig data]];
  541. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
  542. XCTAssertEqual(msg.oneofDouble, 12.0);
  543. [orig release];
  544. }
  545. { // oneofBool
  546. Message3 *orig = [[Message3 alloc] init];
  547. orig.oneofBool = YES;
  548. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBool);
  549. Message3 *msg = [Message3 parseFromData:[orig data]];
  550. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
  551. XCTAssertEqual(msg.oneofBool, YES);
  552. [orig release];
  553. }
  554. { // oneofString
  555. Message3 *orig = [[Message3 alloc] init];
  556. orig.oneofString = @"foo";
  557. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofString);
  558. Message3 *msg = [Message3 parseFromData:[orig data]];
  559. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
  560. XCTAssertEqualObjects(msg.oneofString, @"foo");
  561. [orig release];
  562. }
  563. { // oneofBytes
  564. Message3 *orig = [[Message3 alloc] init];
  565. orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
  566. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
  567. Message3 *msg = [Message3 parseFromData:[orig data]];
  568. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
  569. XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
  570. [orig release];
  571. }
  572. // Not "group" in proto3.
  573. { // oneofMessage
  574. Message3 *orig = [[Message3 alloc] init];
  575. orig.oneofMessage = subMessage;
  576. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
  577. Message3 *msg = [Message3 parseFromData:[orig data]];
  578. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
  579. XCTAssertEqualObjects(msg.oneofMessage, subMessage);
  580. [orig release];
  581. }
  582. { // oneofEnum
  583. Message3 *orig = [[Message3 alloc] init];
  584. orig.oneofEnum = Message2_Enum_Bar;
  585. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
  586. Message3 *msg = [Message3 parseFromData:[orig data]];
  587. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
  588. XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
  589. [orig release];
  590. }
  591. [subMessage release];
  592. }
  593. //%PDDM-EXPAND-END (2 expansions)
  594. #pragma mark - Subset from from map_tests.cc
  595. // TEST(GeneratedMapFieldTest, StandardWireFormat)
  596. - (void)testMap_StandardWireFormat {
  597. NSData *data = DataFromCStr("\x0A\x04\x08\x01\x10\x01");
  598. TestMap *msg = [[TestMap alloc] initWithData:data];
  599. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  600. int32_t val = 666;
  601. XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
  602. XCTAssertEqual(val, 1);
  603. [msg release];
  604. }
  605. // TEST(GeneratedMapFieldTest, UnorderedWireFormat)
  606. - (void)testMap_UnorderedWireFormat {
  607. // put value before key in wire format
  608. NSData *data = DataFromCStr("\x0A\x04\x10\x01\x08\x02");
  609. TestMap *msg = [[TestMap alloc] initWithData:data];
  610. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  611. int32_t val = 666;
  612. XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
  613. XCTAssertEqual(val, 1);
  614. [msg release];
  615. }
  616. // TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat)
  617. - (void)testMap_DuplicatedKeyWireFormat {
  618. // Two key fields in wire format
  619. NSData *data = DataFromCStr("\x0A\x06\x08\x01\x08\x02\x10\x01");
  620. TestMap *msg = [[TestMap alloc] initWithData:data];
  621. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  622. int32_t val = 666;
  623. XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
  624. XCTAssertEqual(val, 1);
  625. [msg release];
  626. }
  627. // TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat)
  628. - (void)testMap_DuplicatedValueWireFormat {
  629. // Two value fields in wire format
  630. NSData *data = DataFromCStr("\x0A\x06\x08\x01\x10\x01\x10\x02");
  631. TestMap *msg = [[TestMap alloc] initWithData:data];
  632. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  633. int32_t val = 666;
  634. XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
  635. XCTAssertEqual(val, 2);
  636. [msg release];
  637. }
  638. // TEST(GeneratedMapFieldTest, MissedKeyWireFormat)
  639. - (void)testMap_MissedKeyWireFormat {
  640. // No key field in wire format
  641. NSData *data = DataFromCStr("\x0A\x02\x10\x01");
  642. TestMap *msg = [[TestMap alloc] initWithData:data];
  643. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  644. int32_t val = 666;
  645. XCTAssertTrue([msg.mapInt32Int32 valueForKey:0 value:&val]);
  646. XCTAssertEqual(val, 1);
  647. [msg release];
  648. }
  649. // TEST(GeneratedMapFieldTest, MissedValueWireFormat)
  650. - (void)testMap_MissedValueWireFormat {
  651. // No value field in wire format
  652. NSData *data = DataFromCStr("\x0A\x02\x08\x01");
  653. TestMap *msg = [[TestMap alloc] initWithData:data];
  654. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  655. int32_t val = 666;
  656. XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
  657. XCTAssertEqual(val, 0);
  658. [msg release];
  659. }
  660. // TEST(GeneratedMapFieldTest, UnknownFieldWireFormat)
  661. - (void)testMap_UnknownFieldWireFormat {
  662. // Unknown field in wire format
  663. NSData *data = DataFromCStr("\x0A\x06\x08\x02\x10\x03\x18\x01");
  664. TestMap *msg = [[TestMap alloc] initWithData:data];
  665. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  666. int32_t val = 666;
  667. XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
  668. XCTAssertEqual(val, 3);
  669. [msg release];
  670. }
  671. // TEST(GeneratedMapFieldTest, CorruptedWireFormat)
  672. - (void)testMap_CorruptedWireFormat {
  673. // corrupted data in wire format
  674. NSData *data = DataFromCStr("\x0A\x06\x08\x02\x11\x03");
  675. XCTAssertThrowsSpecificNamed([TestMap parseFromData:data], NSException,
  676. NSParseErrorException);
  677. }
  678. // TEST(GeneratedMapFieldTest, Proto2UnknownEnum)
  679. - (void)testMap_Proto2UnknownEnum {
  680. TestEnumMapPlusExtra *orig = [[TestEnumMapPlusExtra alloc] init];
  681. orig.knownMapField = [GPBInt32EnumDictionary
  682. dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
  683. orig.unknownMapField = [GPBInt32EnumDictionary
  684. dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
  685. [orig.knownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
  686. forKey:0];
  687. [orig.unknownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
  688. forKey:0];
  689. TestEnumMap *msg1 = [TestEnumMap parseFromData:[orig data]];
  690. XCTAssertEqual(msg1.knownMapField.count, 1U);
  691. int32_t val = -1;
  692. XCTAssertTrue([msg1.knownMapField valueForKey:0 value:&val]);
  693. XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
  694. XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
  695. TestEnumMapPlusExtra *msg2 = [TestEnumMapPlusExtra parseFromData:[msg1 data]];
  696. val = -1;
  697. XCTAssertEqual(msg2.knownMapField.count, 1U);
  698. XCTAssertTrue([msg2.knownMapField valueForKey:0 value:&val]);
  699. XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumFoo);
  700. val = -1;
  701. XCTAssertEqual(msg2.unknownMapField.count, 1U);
  702. XCTAssertTrue([msg2.unknownMapField valueForKey:0 value:&val]);
  703. XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
  704. XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
  705. XCTAssertEqualObjects(orig, msg2);
  706. [orig release];
  707. }
  708. #pragma mark -
  709. @end