GPBMessageTests+Serialization.m 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542
  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/Unittest.pbobjc.h"
  36. #import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
  37. #import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
  38. #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
  39. #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
  40. @interface MessageSerializationTests : GPBTestCase
  41. @end
  42. @implementation MessageSerializationTests
  43. // TODO(thomasvl): Pull tests over from GPBMessageTests that are serialization
  44. // specific.
  45. - (void)testProto3SerializationHandlingDefaults {
  46. // Proto2 covered in other tests.
  47. Message3 *msg = [[Message3 alloc] init];
  48. // Add defaults, no output.
  49. NSData *data = [msg data];
  50. XCTAssertEqual([data length], 0U);
  51. // All zeros, still nothing.
  52. msg.optionalInt32 = 0;
  53. msg.optionalInt64 = 0;
  54. msg.optionalUint32 = 0;
  55. msg.optionalUint64 = 0;
  56. msg.optionalSint32 = 0;
  57. msg.optionalSint64 = 0;
  58. msg.optionalFixed32 = 0;
  59. msg.optionalFixed64 = 0;
  60. msg.optionalSfixed32 = 0;
  61. msg.optionalSfixed64 = 0;
  62. msg.optionalFloat = 0.0f;
  63. msg.optionalDouble = 0.0;
  64. msg.optionalBool = NO;
  65. msg.optionalString = @"";
  66. msg.optionalBytes = [NSData data];
  67. msg.optionalEnum = Message3_Enum_Foo; // first value
  68. data = [msg data];
  69. XCTAssertEqual([data length], 0U);
  70. // The two that also take nil as nothing.
  71. msg.optionalString = nil;
  72. msg.optionalBytes = nil;
  73. data = [msg data];
  74. XCTAssertEqual([data length], 0U);
  75. // Set one field...
  76. msg.optionalInt32 = 1;
  77. data = [msg data];
  78. const uint8_t expectedBytes[] = {0x08, 0x01};
  79. NSData *expected = [NSData dataWithBytes:expectedBytes length:2];
  80. XCTAssertEqualObjects(data, expected);
  81. // Back to zero...
  82. msg.optionalInt32 = 0;
  83. data = [msg data];
  84. XCTAssertEqual([data length], 0U);
  85. [msg release];
  86. }
  87. - (void)testProto3SerializationHandlingOptionals {
  88. //
  89. // Proto3 optionals should be just like proto2, zero values also get serialized.
  90. //
  91. //%PDDM-DEFINE PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(FIELD, ZERO_VALUE, EXPECTED_LEN)
  92. //% { // optional##FIELD
  93. //% Message3Optional *msg = [[Message3Optional alloc] init];
  94. //% NSData *data = [msg data];
  95. //% XCTAssertEqual([data length], 0U);
  96. //% msg.optional##FIELD = ZERO_VALUE;
  97. //% data = [msg data];
  98. //% XCTAssertEqual(data.length, EXPECTED_LEN);
  99. //% NSError *err = nil;
  100. //% Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  101. //% XCTAssertNotNil(msg2);
  102. //% XCTAssertNil(err);
  103. //% XCTAssertTrue(msg2.hasOptional##FIELD);
  104. //% XCTAssertEqualObjects(msg, msg2);
  105. //% [msg release];
  106. //% }
  107. //%
  108. //%PDDM-DEFINE PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
  109. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Int32, 0, 2)
  110. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Int64, 0, 2)
  111. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Uint32, 0, 2)
  112. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Uint64, 0, 2)
  113. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sint32, 0, 2)
  114. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sint64, 0, 2)
  115. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Fixed32, 0, 5)
  116. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Fixed64, 0, 9)
  117. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sfixed32, 0, 5)
  118. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Sfixed64, 0, 9)
  119. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Float, 0.0f, 5)
  120. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Double, 0.0, 9)
  121. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Bool, NO, 2)
  122. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(String, @"", 2)
  123. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Bytes, [NSData data], 2)
  124. //% //
  125. //% // Test doesn't apply to optionalMessage (no groups in proto3).
  126. //% //
  127. //%
  128. //%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Enum, Message3Optional_Enum_Foo, 3)
  129. //%PDDM-EXPAND PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
  130. // This block of code is generated, do not edit it directly.
  131. // clang-format off
  132. { // optionalInt32
  133. Message3Optional *msg = [[Message3Optional alloc] init];
  134. NSData *data = [msg data];
  135. XCTAssertEqual([data length], 0U);
  136. msg.optionalInt32 = 0;
  137. data = [msg data];
  138. XCTAssertEqual(data.length, 2);
  139. NSError *err = nil;
  140. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  141. XCTAssertNotNil(msg2);
  142. XCTAssertNil(err);
  143. XCTAssertTrue(msg2.hasOptionalInt32);
  144. XCTAssertEqualObjects(msg, msg2);
  145. [msg release];
  146. }
  147. { // optionalInt64
  148. Message3Optional *msg = [[Message3Optional alloc] init];
  149. NSData *data = [msg data];
  150. XCTAssertEqual([data length], 0U);
  151. msg.optionalInt64 = 0;
  152. data = [msg data];
  153. XCTAssertEqual(data.length, 2);
  154. NSError *err = nil;
  155. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  156. XCTAssertNotNil(msg2);
  157. XCTAssertNil(err);
  158. XCTAssertTrue(msg2.hasOptionalInt64);
  159. XCTAssertEqualObjects(msg, msg2);
  160. [msg release];
  161. }
  162. { // optionalUint32
  163. Message3Optional *msg = [[Message3Optional alloc] init];
  164. NSData *data = [msg data];
  165. XCTAssertEqual([data length], 0U);
  166. msg.optionalUint32 = 0;
  167. data = [msg data];
  168. XCTAssertEqual(data.length, 2);
  169. NSError *err = nil;
  170. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  171. XCTAssertNotNil(msg2);
  172. XCTAssertNil(err);
  173. XCTAssertTrue(msg2.hasOptionalUint32);
  174. XCTAssertEqualObjects(msg, msg2);
  175. [msg release];
  176. }
  177. { // optionalUint64
  178. Message3Optional *msg = [[Message3Optional alloc] init];
  179. NSData *data = [msg data];
  180. XCTAssertEqual([data length], 0U);
  181. msg.optionalUint64 = 0;
  182. data = [msg data];
  183. XCTAssertEqual(data.length, 2);
  184. NSError *err = nil;
  185. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  186. XCTAssertNotNil(msg2);
  187. XCTAssertNil(err);
  188. XCTAssertTrue(msg2.hasOptionalUint64);
  189. XCTAssertEqualObjects(msg, msg2);
  190. [msg release];
  191. }
  192. { // optionalSint32
  193. Message3Optional *msg = [[Message3Optional alloc] init];
  194. NSData *data = [msg data];
  195. XCTAssertEqual([data length], 0U);
  196. msg.optionalSint32 = 0;
  197. data = [msg data];
  198. XCTAssertEqual(data.length, 2);
  199. NSError *err = nil;
  200. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  201. XCTAssertNotNil(msg2);
  202. XCTAssertNil(err);
  203. XCTAssertTrue(msg2.hasOptionalSint32);
  204. XCTAssertEqualObjects(msg, msg2);
  205. [msg release];
  206. }
  207. { // optionalSint64
  208. Message3Optional *msg = [[Message3Optional alloc] init];
  209. NSData *data = [msg data];
  210. XCTAssertEqual([data length], 0U);
  211. msg.optionalSint64 = 0;
  212. data = [msg data];
  213. XCTAssertEqual(data.length, 2);
  214. NSError *err = nil;
  215. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  216. XCTAssertNotNil(msg2);
  217. XCTAssertNil(err);
  218. XCTAssertTrue(msg2.hasOptionalSint64);
  219. XCTAssertEqualObjects(msg, msg2);
  220. [msg release];
  221. }
  222. { // optionalFixed32
  223. Message3Optional *msg = [[Message3Optional alloc] init];
  224. NSData *data = [msg data];
  225. XCTAssertEqual([data length], 0U);
  226. msg.optionalFixed32 = 0;
  227. data = [msg data];
  228. XCTAssertEqual(data.length, 5);
  229. NSError *err = nil;
  230. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  231. XCTAssertNotNil(msg2);
  232. XCTAssertNil(err);
  233. XCTAssertTrue(msg2.hasOptionalFixed32);
  234. XCTAssertEqualObjects(msg, msg2);
  235. [msg release];
  236. }
  237. { // optionalFixed64
  238. Message3Optional *msg = [[Message3Optional alloc] init];
  239. NSData *data = [msg data];
  240. XCTAssertEqual([data length], 0U);
  241. msg.optionalFixed64 = 0;
  242. data = [msg data];
  243. XCTAssertEqual(data.length, 9);
  244. NSError *err = nil;
  245. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  246. XCTAssertNotNil(msg2);
  247. XCTAssertNil(err);
  248. XCTAssertTrue(msg2.hasOptionalFixed64);
  249. XCTAssertEqualObjects(msg, msg2);
  250. [msg release];
  251. }
  252. { // optionalSfixed32
  253. Message3Optional *msg = [[Message3Optional alloc] init];
  254. NSData *data = [msg data];
  255. XCTAssertEqual([data length], 0U);
  256. msg.optionalSfixed32 = 0;
  257. data = [msg data];
  258. XCTAssertEqual(data.length, 5);
  259. NSError *err = nil;
  260. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  261. XCTAssertNotNil(msg2);
  262. XCTAssertNil(err);
  263. XCTAssertTrue(msg2.hasOptionalSfixed32);
  264. XCTAssertEqualObjects(msg, msg2);
  265. [msg release];
  266. }
  267. { // optionalSfixed64
  268. Message3Optional *msg = [[Message3Optional alloc] init];
  269. NSData *data = [msg data];
  270. XCTAssertEqual([data length], 0U);
  271. msg.optionalSfixed64 = 0;
  272. data = [msg data];
  273. XCTAssertEqual(data.length, 9);
  274. NSError *err = nil;
  275. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  276. XCTAssertNotNil(msg2);
  277. XCTAssertNil(err);
  278. XCTAssertTrue(msg2.hasOptionalSfixed64);
  279. XCTAssertEqualObjects(msg, msg2);
  280. [msg release];
  281. }
  282. { // optionalFloat
  283. Message3Optional *msg = [[Message3Optional alloc] init];
  284. NSData *data = [msg data];
  285. XCTAssertEqual([data length], 0U);
  286. msg.optionalFloat = 0.0f;
  287. data = [msg data];
  288. XCTAssertEqual(data.length, 5);
  289. NSError *err = nil;
  290. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  291. XCTAssertNotNil(msg2);
  292. XCTAssertNil(err);
  293. XCTAssertTrue(msg2.hasOptionalFloat);
  294. XCTAssertEqualObjects(msg, msg2);
  295. [msg release];
  296. }
  297. { // optionalDouble
  298. Message3Optional *msg = [[Message3Optional alloc] init];
  299. NSData *data = [msg data];
  300. XCTAssertEqual([data length], 0U);
  301. msg.optionalDouble = 0.0;
  302. data = [msg data];
  303. XCTAssertEqual(data.length, 9);
  304. NSError *err = nil;
  305. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  306. XCTAssertNotNil(msg2);
  307. XCTAssertNil(err);
  308. XCTAssertTrue(msg2.hasOptionalDouble);
  309. XCTAssertEqualObjects(msg, msg2);
  310. [msg release];
  311. }
  312. { // optionalBool
  313. Message3Optional *msg = [[Message3Optional alloc] init];
  314. NSData *data = [msg data];
  315. XCTAssertEqual([data length], 0U);
  316. msg.optionalBool = NO;
  317. data = [msg data];
  318. XCTAssertEqual(data.length, 2);
  319. NSError *err = nil;
  320. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  321. XCTAssertNotNil(msg2);
  322. XCTAssertNil(err);
  323. XCTAssertTrue(msg2.hasOptionalBool);
  324. XCTAssertEqualObjects(msg, msg2);
  325. [msg release];
  326. }
  327. { // optionalString
  328. Message3Optional *msg = [[Message3Optional alloc] init];
  329. NSData *data = [msg data];
  330. XCTAssertEqual([data length], 0U);
  331. msg.optionalString = @"";
  332. data = [msg data];
  333. XCTAssertEqual(data.length, 2);
  334. NSError *err = nil;
  335. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  336. XCTAssertNotNil(msg2);
  337. XCTAssertNil(err);
  338. XCTAssertTrue(msg2.hasOptionalString);
  339. XCTAssertEqualObjects(msg, msg2);
  340. [msg release];
  341. }
  342. { // optionalBytes
  343. Message3Optional *msg = [[Message3Optional alloc] init];
  344. NSData *data = [msg data];
  345. XCTAssertEqual([data length], 0U);
  346. msg.optionalBytes = [NSData data];
  347. data = [msg data];
  348. XCTAssertEqual(data.length, 2);
  349. NSError *err = nil;
  350. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  351. XCTAssertNotNil(msg2);
  352. XCTAssertNil(err);
  353. XCTAssertTrue(msg2.hasOptionalBytes);
  354. XCTAssertEqualObjects(msg, msg2);
  355. [msg release];
  356. }
  357. //
  358. // Test doesn't apply to optionalMessage (no groups in proto3).
  359. //
  360. { // optionalEnum
  361. Message3Optional *msg = [[Message3Optional alloc] init];
  362. NSData *data = [msg data];
  363. XCTAssertEqual([data length], 0U);
  364. msg.optionalEnum = Message3Optional_Enum_Foo;
  365. data = [msg data];
  366. XCTAssertEqual(data.length, 3);
  367. NSError *err = nil;
  368. Message3Optional *msg2 = [Message3Optional parseFromData:data error:&err];
  369. XCTAssertNotNil(msg2);
  370. XCTAssertNil(err);
  371. XCTAssertTrue(msg2.hasOptionalEnum);
  372. XCTAssertEqualObjects(msg, msg2);
  373. [msg release];
  374. }
  375. // clang-format on
  376. //%PDDM-EXPAND-END PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
  377. }
  378. - (void)testProto2UnknownEnumToUnknownField {
  379. Message3 *orig = [[Message3 alloc] init];
  380. orig.optionalEnum = Message3_Enum_Extra3;
  381. orig.repeatedEnumArray =
  382. [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
  383. rawValue:Message3_Enum_Extra3];
  384. orig.oneofEnum = Message3_Enum_Extra3;
  385. NSData *data = [orig data];
  386. XCTAssertNotNil(data);
  387. Message2 *msg = [[Message2 alloc] initWithData:data error:NULL];
  388. // None of the fields should be set.
  389. XCTAssertFalse(msg.hasOptionalEnum);
  390. XCTAssertEqual(msg.repeatedEnumArray.count, 0U);
  391. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
  392. // All the values should be in unknown fields.
  393. GPBUnknownFieldSet *unknownFields = msg.unknownFields;
  394. XCTAssertEqual([unknownFields countOfFields], 3U);
  395. XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OptionalEnum]);
  396. XCTAssertTrue(
  397. [unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
  398. XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OneofEnum]);
  399. GPBUnknownField *field =
  400. [unknownFields getField:Message2_FieldNumber_OptionalEnum];
  401. XCTAssertEqual(field.varintList.count, 1U);
  402. XCTAssertEqual([field.varintList valueAtIndex:0],
  403. (uint64_t)Message3_Enum_Extra3);
  404. field = [unknownFields getField:Message2_FieldNumber_RepeatedEnumArray];
  405. XCTAssertEqual(field.varintList.count, 1U);
  406. XCTAssertEqual([field.varintList valueAtIndex:0], (uint64_t)Message3_Enum_Extra3);
  407. field = [unknownFields getField:Message2_FieldNumber_OneofEnum];
  408. XCTAssertEqual(field.varintList.count, 1U);
  409. XCTAssertEqual([field.varintList valueAtIndex:0],
  410. (uint64_t)Message3_Enum_Extra3);
  411. [msg release];
  412. [orig release];
  413. }
  414. - (void)testProto3UnknownEnumPreserving {
  415. UnknownEnumsMyMessagePlusExtra *orig =
  416. [UnknownEnumsMyMessagePlusExtra message];
  417. orig.e = UnknownEnumsMyEnumPlusExtra_EExtra;
  418. orig.repeatedEArray = [GPBEnumArray
  419. arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
  420. rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
  421. orig.repeatedPackedEArray = [GPBEnumArray
  422. arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
  423. rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
  424. orig.oneofE1 = UnknownEnumsMyEnumPlusExtra_EExtra;
  425. // Everything should be there via raw values.
  426. NSData *data = [orig data];
  427. XCTAssertNotNil(data);
  428. UnknownEnumsMyMessage *msg =
  429. [UnknownEnumsMyMessage parseFromData:data error:NULL];
  430. XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  431. XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg),
  432. UnknownEnumsMyEnumPlusExtra_EExtra);
  433. XCTAssertEqual(msg.repeatedEArray.count, 1U);
  434. XCTAssertEqual([msg.repeatedEArray valueAtIndex:0],
  435. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  436. XCTAssertEqual([msg.repeatedEArray rawValueAtIndex:0],
  437. (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
  438. XCTAssertEqual(msg.repeatedPackedEArray.count, 1U);
  439. XCTAssertEqual([msg.repeatedPackedEArray valueAtIndex:0],
  440. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  441. XCTAssertEqual([msg.repeatedPackedEArray rawValueAtIndex:0],
  442. (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
  443. XCTAssertEqual(msg.oneofE1,
  444. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  445. XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg),
  446. UnknownEnumsMyEnumPlusExtra_EExtra);
  447. // Everything should go out and come back.
  448. data = [msg data];
  449. orig = [UnknownEnumsMyMessagePlusExtra parseFromData:data error:NULL];
  450. XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra);
  451. XCTAssertEqual(orig.repeatedEArray.count, 1U);
  452. XCTAssertEqual([orig.repeatedEArray valueAtIndex:0],
  453. UnknownEnumsMyEnumPlusExtra_EExtra);
  454. XCTAssertEqual(orig.repeatedPackedEArray.count, 1U);
  455. XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0],
  456. UnknownEnumsMyEnumPlusExtra_EExtra);
  457. XCTAssertEqual(orig.oneofE1, UnknownEnumsMyEnumPlusExtra_EExtra);
  458. }
  459. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF(MESSAGE, FIELD, VALUE)
  460. //%TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, )
  461. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, EQ_SUFFIX)
  462. //% { // oneof##FIELD
  463. //% MESSAGE *orig = [[MESSAGE alloc] init];
  464. //% orig.oneof##FIELD = VALUE;
  465. //% XCTAssertEqual(orig.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
  466. //% NSData *data = [orig data];
  467. //% XCTAssertNotNil(data);
  468. //% MESSAGE *msg = [MESSAGE parseFromData:data error:NULL];
  469. //% XCTAssertEqual(msg.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
  470. //% XCTAssertEqual##EQ_SUFFIX(msg.oneof##FIELD, VALUE);
  471. //% [orig release];
  472. //% }
  473. //%
  474. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOFS(SYNTAX, BOOL_NON_DEFAULT)
  475. //%- (void)testProto##SYNTAX##RoundTripOneof {
  476. //%
  477. //%GROUP_INIT##SYNTAX() Message##SYNTAX *subMessage = [[Message##SYNTAX alloc] init];
  478. //% XCTAssertNotNil(subMessage);
  479. //% subMessage.optionalInt32 = 666;
  480. //%
  481. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int32, 1)
  482. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int64, 2)
  483. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint32, 3U)
  484. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint64, 4U)
  485. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint32, 5)
  486. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint64, 6)
  487. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed32, 7U)
  488. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed64, 8U)
  489. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed32, 9)
  490. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed64, 10)
  491. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Float, 11.0f)
  492. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Double, 12.0)
  493. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Bool, BOOL_NON_DEFAULT)
  494. //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, String, @"foo", Objects)
  495. //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Bytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding], Objects)
  496. //%GROUP_TEST##SYNTAX()TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Message, subMessage, Objects)
  497. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Enum, Message##SYNTAX##_Enum_Bar)
  498. //%GROUP_CLEANUP##SYNTAX() [subMessage release];
  499. //%}
  500. //%
  501. //%PDDM-DEFINE GROUP_INIT2()
  502. //% Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
  503. //% XCTAssertNotNil(group);
  504. //% group.a = 777;
  505. //%
  506. //%PDDM-DEFINE GROUP_CLEANUP2()
  507. //% [group release];
  508. //%
  509. //%PDDM-DEFINE GROUP_TEST2()
  510. //%TEST_ROUNDTRIP_ONEOF_ADV(Message2, Group, group, Objects)
  511. //%
  512. //%PDDM-DEFINE GROUP_INIT3()
  513. // Empty
  514. //%PDDM-DEFINE GROUP_CLEANUP3()
  515. // Empty
  516. //%PDDM-DEFINE GROUP_TEST3()
  517. //% // Not "group" in proto3.
  518. //%
  519. //%
  520. //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(2, NO)
  521. // This block of code is generated, do not edit it directly.
  522. // clang-format off
  523. - (void)testProto2RoundTripOneof {
  524. Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
  525. XCTAssertNotNil(group);
  526. group.a = 777;
  527. Message2 *subMessage = [[Message2 alloc] init];
  528. XCTAssertNotNil(subMessage);
  529. subMessage.optionalInt32 = 666;
  530. { // oneofInt32
  531. Message2 *orig = [[Message2 alloc] init];
  532. orig.oneofInt32 = 1;
  533. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
  534. NSData *data = [orig data];
  535. XCTAssertNotNil(data);
  536. Message2 *msg = [Message2 parseFromData:data error:NULL];
  537. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
  538. XCTAssertEqual(msg.oneofInt32, 1);
  539. [orig release];
  540. }
  541. { // oneofInt64
  542. Message2 *orig = [[Message2 alloc] init];
  543. orig.oneofInt64 = 2;
  544. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
  545. NSData *data = [orig data];
  546. XCTAssertNotNil(data);
  547. Message2 *msg = [Message2 parseFromData:data error:NULL];
  548. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
  549. XCTAssertEqual(msg.oneofInt64, 2);
  550. [orig release];
  551. }
  552. { // oneofUint32
  553. Message2 *orig = [[Message2 alloc] init];
  554. orig.oneofUint32 = 3U;
  555. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
  556. NSData *data = [orig data];
  557. XCTAssertNotNil(data);
  558. Message2 *msg = [Message2 parseFromData:data error:NULL];
  559. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
  560. XCTAssertEqual(msg.oneofUint32, 3U);
  561. [orig release];
  562. }
  563. { // oneofUint64
  564. Message2 *orig = [[Message2 alloc] init];
  565. orig.oneofUint64 = 4U;
  566. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
  567. NSData *data = [orig data];
  568. XCTAssertNotNil(data);
  569. Message2 *msg = [Message2 parseFromData:data error:NULL];
  570. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
  571. XCTAssertEqual(msg.oneofUint64, 4U);
  572. [orig release];
  573. }
  574. { // oneofSint32
  575. Message2 *orig = [[Message2 alloc] init];
  576. orig.oneofSint32 = 5;
  577. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
  578. NSData *data = [orig data];
  579. XCTAssertNotNil(data);
  580. Message2 *msg = [Message2 parseFromData:data error:NULL];
  581. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
  582. XCTAssertEqual(msg.oneofSint32, 5);
  583. [orig release];
  584. }
  585. { // oneofSint64
  586. Message2 *orig = [[Message2 alloc] init];
  587. orig.oneofSint64 = 6;
  588. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
  589. NSData *data = [orig data];
  590. XCTAssertNotNil(data);
  591. Message2 *msg = [Message2 parseFromData:data error:NULL];
  592. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
  593. XCTAssertEqual(msg.oneofSint64, 6);
  594. [orig release];
  595. }
  596. { // oneofFixed32
  597. Message2 *orig = [[Message2 alloc] init];
  598. orig.oneofFixed32 = 7U;
  599. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
  600. NSData *data = [orig data];
  601. XCTAssertNotNil(data);
  602. Message2 *msg = [Message2 parseFromData:data error:NULL];
  603. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
  604. XCTAssertEqual(msg.oneofFixed32, 7U);
  605. [orig release];
  606. }
  607. { // oneofFixed64
  608. Message2 *orig = [[Message2 alloc] init];
  609. orig.oneofFixed64 = 8U;
  610. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
  611. NSData *data = [orig data];
  612. XCTAssertNotNil(data);
  613. Message2 *msg = [Message2 parseFromData:data error:NULL];
  614. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
  615. XCTAssertEqual(msg.oneofFixed64, 8U);
  616. [orig release];
  617. }
  618. { // oneofSfixed32
  619. Message2 *orig = [[Message2 alloc] init];
  620. orig.oneofSfixed32 = 9;
  621. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
  622. NSData *data = [orig data];
  623. XCTAssertNotNil(data);
  624. Message2 *msg = [Message2 parseFromData:data error:NULL];
  625. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
  626. XCTAssertEqual(msg.oneofSfixed32, 9);
  627. [orig release];
  628. }
  629. { // oneofSfixed64
  630. Message2 *orig = [[Message2 alloc] init];
  631. orig.oneofSfixed64 = 10;
  632. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
  633. NSData *data = [orig data];
  634. XCTAssertNotNil(data);
  635. Message2 *msg = [Message2 parseFromData:data error:NULL];
  636. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
  637. XCTAssertEqual(msg.oneofSfixed64, 10);
  638. [orig release];
  639. }
  640. { // oneofFloat
  641. Message2 *orig = [[Message2 alloc] init];
  642. orig.oneofFloat = 11.0f;
  643. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
  644. NSData *data = [orig data];
  645. XCTAssertNotNil(data);
  646. Message2 *msg = [Message2 parseFromData:data error:NULL];
  647. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
  648. XCTAssertEqual(msg.oneofFloat, 11.0f);
  649. [orig release];
  650. }
  651. { // oneofDouble
  652. Message2 *orig = [[Message2 alloc] init];
  653. orig.oneofDouble = 12.0;
  654. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
  655. NSData *data = [orig data];
  656. XCTAssertNotNil(data);
  657. Message2 *msg = [Message2 parseFromData:data error:NULL];
  658. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
  659. XCTAssertEqual(msg.oneofDouble, 12.0);
  660. [orig release];
  661. }
  662. { // oneofBool
  663. Message2 *orig = [[Message2 alloc] init];
  664. orig.oneofBool = NO;
  665. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBool);
  666. NSData *data = [orig data];
  667. XCTAssertNotNil(data);
  668. Message2 *msg = [Message2 parseFromData:data error:NULL];
  669. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
  670. XCTAssertEqual(msg.oneofBool, NO);
  671. [orig release];
  672. }
  673. { // oneofString
  674. Message2 *orig = [[Message2 alloc] init];
  675. orig.oneofString = @"foo";
  676. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofString);
  677. NSData *data = [orig data];
  678. XCTAssertNotNil(data);
  679. Message2 *msg = [Message2 parseFromData:data error:NULL];
  680. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
  681. XCTAssertEqualObjects(msg.oneofString, @"foo");
  682. [orig release];
  683. }
  684. { // oneofBytes
  685. Message2 *orig = [[Message2 alloc] init];
  686. orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
  687. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
  688. NSData *data = [orig data];
  689. XCTAssertNotNil(data);
  690. Message2 *msg = [Message2 parseFromData:data error:NULL];
  691. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
  692. XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
  693. [orig release];
  694. }
  695. { // oneofGroup
  696. Message2 *orig = [[Message2 alloc] init];
  697. orig.oneofGroup = group;
  698. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
  699. NSData *data = [orig data];
  700. XCTAssertNotNil(data);
  701. Message2 *msg = [Message2 parseFromData:data error:NULL];
  702. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
  703. XCTAssertEqualObjects(msg.oneofGroup, group);
  704. [orig release];
  705. }
  706. { // oneofMessage
  707. Message2 *orig = [[Message2 alloc] init];
  708. orig.oneofMessage = subMessage;
  709. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
  710. NSData *data = [orig data];
  711. XCTAssertNotNil(data);
  712. Message2 *msg = [Message2 parseFromData:data error:NULL];
  713. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
  714. XCTAssertEqualObjects(msg.oneofMessage, subMessage);
  715. [orig release];
  716. }
  717. { // oneofEnum
  718. Message2 *orig = [[Message2 alloc] init];
  719. orig.oneofEnum = Message2_Enum_Bar;
  720. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
  721. NSData *data = [orig data];
  722. XCTAssertNotNil(data);
  723. Message2 *msg = [Message2 parseFromData:data error:NULL];
  724. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
  725. XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
  726. [orig release];
  727. }
  728. [group release];
  729. [subMessage release];
  730. }
  731. // clang-format on
  732. //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(3, YES)
  733. // This block of code is generated, do not edit it directly.
  734. // clang-format off
  735. - (void)testProto3RoundTripOneof {
  736. Message3 *subMessage = [[Message3 alloc] init];
  737. XCTAssertNotNil(subMessage);
  738. subMessage.optionalInt32 = 666;
  739. { // oneofInt32
  740. Message3 *orig = [[Message3 alloc] init];
  741. orig.oneofInt32 = 1;
  742. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
  743. NSData *data = [orig data];
  744. XCTAssertNotNil(data);
  745. Message3 *msg = [Message3 parseFromData:data error:NULL];
  746. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
  747. XCTAssertEqual(msg.oneofInt32, 1);
  748. [orig release];
  749. }
  750. { // oneofInt64
  751. Message3 *orig = [[Message3 alloc] init];
  752. orig.oneofInt64 = 2;
  753. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
  754. NSData *data = [orig data];
  755. XCTAssertNotNil(data);
  756. Message3 *msg = [Message3 parseFromData:data error:NULL];
  757. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
  758. XCTAssertEqual(msg.oneofInt64, 2);
  759. [orig release];
  760. }
  761. { // oneofUint32
  762. Message3 *orig = [[Message3 alloc] init];
  763. orig.oneofUint32 = 3U;
  764. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
  765. NSData *data = [orig data];
  766. XCTAssertNotNil(data);
  767. Message3 *msg = [Message3 parseFromData:data error:NULL];
  768. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
  769. XCTAssertEqual(msg.oneofUint32, 3U);
  770. [orig release];
  771. }
  772. { // oneofUint64
  773. Message3 *orig = [[Message3 alloc] init];
  774. orig.oneofUint64 = 4U;
  775. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
  776. NSData *data = [orig data];
  777. XCTAssertNotNil(data);
  778. Message3 *msg = [Message3 parseFromData:data error:NULL];
  779. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
  780. XCTAssertEqual(msg.oneofUint64, 4U);
  781. [orig release];
  782. }
  783. { // oneofSint32
  784. Message3 *orig = [[Message3 alloc] init];
  785. orig.oneofSint32 = 5;
  786. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
  787. NSData *data = [orig data];
  788. XCTAssertNotNil(data);
  789. Message3 *msg = [Message3 parseFromData:data error:NULL];
  790. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
  791. XCTAssertEqual(msg.oneofSint32, 5);
  792. [orig release];
  793. }
  794. { // oneofSint64
  795. Message3 *orig = [[Message3 alloc] init];
  796. orig.oneofSint64 = 6;
  797. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
  798. NSData *data = [orig data];
  799. XCTAssertNotNil(data);
  800. Message3 *msg = [Message3 parseFromData:data error:NULL];
  801. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
  802. XCTAssertEqual(msg.oneofSint64, 6);
  803. [orig release];
  804. }
  805. { // oneofFixed32
  806. Message3 *orig = [[Message3 alloc] init];
  807. orig.oneofFixed32 = 7U;
  808. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
  809. NSData *data = [orig data];
  810. XCTAssertNotNil(data);
  811. Message3 *msg = [Message3 parseFromData:data error:NULL];
  812. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
  813. XCTAssertEqual(msg.oneofFixed32, 7U);
  814. [orig release];
  815. }
  816. { // oneofFixed64
  817. Message3 *orig = [[Message3 alloc] init];
  818. orig.oneofFixed64 = 8U;
  819. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
  820. NSData *data = [orig data];
  821. XCTAssertNotNil(data);
  822. Message3 *msg = [Message3 parseFromData:data error:NULL];
  823. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
  824. XCTAssertEqual(msg.oneofFixed64, 8U);
  825. [orig release];
  826. }
  827. { // oneofSfixed32
  828. Message3 *orig = [[Message3 alloc] init];
  829. orig.oneofSfixed32 = 9;
  830. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
  831. NSData *data = [orig data];
  832. XCTAssertNotNil(data);
  833. Message3 *msg = [Message3 parseFromData:data error:NULL];
  834. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
  835. XCTAssertEqual(msg.oneofSfixed32, 9);
  836. [orig release];
  837. }
  838. { // oneofSfixed64
  839. Message3 *orig = [[Message3 alloc] init];
  840. orig.oneofSfixed64 = 10;
  841. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
  842. NSData *data = [orig data];
  843. XCTAssertNotNil(data);
  844. Message3 *msg = [Message3 parseFromData:data error:NULL];
  845. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
  846. XCTAssertEqual(msg.oneofSfixed64, 10);
  847. [orig release];
  848. }
  849. { // oneofFloat
  850. Message3 *orig = [[Message3 alloc] init];
  851. orig.oneofFloat = 11.0f;
  852. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
  853. NSData *data = [orig data];
  854. XCTAssertNotNil(data);
  855. Message3 *msg = [Message3 parseFromData:data error:NULL];
  856. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
  857. XCTAssertEqual(msg.oneofFloat, 11.0f);
  858. [orig release];
  859. }
  860. { // oneofDouble
  861. Message3 *orig = [[Message3 alloc] init];
  862. orig.oneofDouble = 12.0;
  863. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
  864. NSData *data = [orig data];
  865. XCTAssertNotNil(data);
  866. Message3 *msg = [Message3 parseFromData:data error:NULL];
  867. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
  868. XCTAssertEqual(msg.oneofDouble, 12.0);
  869. [orig release];
  870. }
  871. { // oneofBool
  872. Message3 *orig = [[Message3 alloc] init];
  873. orig.oneofBool = YES;
  874. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBool);
  875. NSData *data = [orig data];
  876. XCTAssertNotNil(data);
  877. Message3 *msg = [Message3 parseFromData:data error:NULL];
  878. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
  879. XCTAssertEqual(msg.oneofBool, YES);
  880. [orig release];
  881. }
  882. { // oneofString
  883. Message3 *orig = [[Message3 alloc] init];
  884. orig.oneofString = @"foo";
  885. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofString);
  886. NSData *data = [orig data];
  887. XCTAssertNotNil(data);
  888. Message3 *msg = [Message3 parseFromData:data error:NULL];
  889. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
  890. XCTAssertEqualObjects(msg.oneofString, @"foo");
  891. [orig release];
  892. }
  893. { // oneofBytes
  894. Message3 *orig = [[Message3 alloc] init];
  895. orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
  896. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
  897. NSData *data = [orig data];
  898. XCTAssertNotNil(data);
  899. Message3 *msg = [Message3 parseFromData:data error:NULL];
  900. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
  901. XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
  902. [orig release];
  903. }
  904. // Not "group" in proto3.
  905. { // oneofMessage
  906. Message3 *orig = [[Message3 alloc] init];
  907. orig.oneofMessage = subMessage;
  908. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
  909. NSData *data = [orig data];
  910. XCTAssertNotNil(data);
  911. Message3 *msg = [Message3 parseFromData:data error:NULL];
  912. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
  913. XCTAssertEqualObjects(msg.oneofMessage, subMessage);
  914. [orig release];
  915. }
  916. { // oneofEnum
  917. Message3 *orig = [[Message3 alloc] init];
  918. orig.oneofEnum = Message3_Enum_Bar;
  919. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
  920. NSData *data = [orig data];
  921. XCTAssertNotNil(data);
  922. Message3 *msg = [Message3 parseFromData:data error:NULL];
  923. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
  924. XCTAssertEqual(msg.oneofEnum, Message3_Enum_Bar);
  925. [orig release];
  926. }
  927. [subMessage release];
  928. }
  929. // clang-format on
  930. //%PDDM-EXPAND-END (2 expansions)
  931. - (void)testPackedUnpackedMessageParsing {
  932. // packed is optional, a repeated field should parse when packed or unpacked.
  933. TestPackedTypes *packedOrig = [TestPackedTypes message];
  934. TestUnpackedTypes *unpackedOrig = [TestUnpackedTypes message];
  935. [self setPackedFields:packedOrig repeatedCount:4];
  936. [self setUnpackedFields:unpackedOrig repeatedCount:4];
  937. NSData *packedData = [packedOrig data];
  938. NSData *unpackedData = [unpackedOrig data];
  939. XCTAssertNotNil(packedData);
  940. XCTAssertNotNil(unpackedData);
  941. XCTAssertNotEqualObjects(packedData, unpackedData,
  942. @"Data should differ (packed vs unpacked) use");
  943. NSError *error = nil;
  944. TestPackedTypes *packedParse =
  945. [TestPackedTypes parseFromData:unpackedData error:&error];
  946. XCTAssertNotNil(packedParse);
  947. XCTAssertNil(error);
  948. XCTAssertEqualObjects(packedParse, packedOrig);
  949. error = nil;
  950. TestUnpackedTypes *unpackedParsed =
  951. [TestUnpackedTypes parseFromData:packedData error:&error];
  952. XCTAssertNotNil(unpackedParsed);
  953. XCTAssertNil(error);
  954. XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
  955. }
  956. - (void)testPackedUnpackedExtensionParsing {
  957. // packed is optional, a repeated extension should parse when packed or
  958. // unpacked.
  959. TestPackedExtensions *packedOrig = [TestPackedExtensions message];
  960. TestUnpackedExtensions *unpackedOrig = [TestUnpackedExtensions message];
  961. [self setPackedExtensions:packedOrig repeatedCount:kGPBDefaultRepeatCount];
  962. [self setUnpackedExtensions:unpackedOrig repeatedCount:kGPBDefaultRepeatCount];
  963. NSData *packedData = [packedOrig data];
  964. NSData *unpackedData = [unpackedOrig data];
  965. XCTAssertNotNil(packedData);
  966. XCTAssertNotNil(unpackedData);
  967. XCTAssertNotEqualObjects(packedData, unpackedData,
  968. @"Data should differ (packed vs unpacked) use");
  969. NSError *error = nil;
  970. TestPackedExtensions *packedParse =
  971. [TestPackedExtensions parseFromData:unpackedData
  972. extensionRegistry:[UnittestRoot extensionRegistry]
  973. error:&error];
  974. XCTAssertNotNil(packedParse);
  975. XCTAssertNil(error);
  976. XCTAssertEqualObjects(packedParse, packedOrig);
  977. error = nil;
  978. TestUnpackedExtensions *unpackedParsed =
  979. [TestUnpackedExtensions parseFromData:packedData
  980. extensionRegistry:[UnittestRoot extensionRegistry]
  981. error:&error];
  982. XCTAssertNotNil(unpackedParsed);
  983. XCTAssertNil(error);
  984. XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
  985. }
  986. - (void)testPackedExtensionVsFieldParsing {
  987. // Extensions and fields end up on the wire the same way, so they can parse
  988. // each other.
  989. TestPackedTypes *fieldsOrig = [TestPackedTypes message];
  990. TestPackedExtensions *extsOrig = [TestPackedExtensions message];
  991. [self setPackedFields:fieldsOrig repeatedCount:kGPBDefaultRepeatCount];
  992. [self setPackedExtensions:extsOrig repeatedCount:kGPBDefaultRepeatCount];
  993. NSData *fieldsData = [fieldsOrig data];
  994. NSData *extsData = [extsOrig data];
  995. XCTAssertNotNil(fieldsData);
  996. XCTAssertNotNil(extsData);
  997. XCTAssertEqualObjects(fieldsData, extsData);
  998. NSError *error = nil;
  999. TestPackedTypes *fieldsParse =
  1000. [TestPackedTypes parseFromData:extsData error:&error];
  1001. XCTAssertNotNil(fieldsParse);
  1002. XCTAssertNil(error);
  1003. XCTAssertEqualObjects(fieldsParse, fieldsOrig);
  1004. error = nil;
  1005. TestPackedExtensions *extsParse =
  1006. [TestPackedExtensions parseFromData:fieldsData
  1007. extensionRegistry:[UnittestRoot extensionRegistry]
  1008. error:&error];
  1009. XCTAssertNotNil(extsParse);
  1010. XCTAssertNil(error);
  1011. XCTAssertEqualObjects(extsParse, extsOrig);
  1012. }
  1013. - (void)testUnpackedExtensionVsFieldParsing {
  1014. // Extensions and fields end up on the wire the same way, so they can parse
  1015. // each other.
  1016. TestUnpackedTypes *fieldsOrig = [TestUnpackedTypes message];
  1017. TestUnpackedExtensions *extsOrig = [TestUnpackedExtensions message];
  1018. [self setUnpackedFields:fieldsOrig repeatedCount:3];
  1019. [self setUnpackedExtensions:extsOrig repeatedCount:3];
  1020. NSData *fieldsData = [fieldsOrig data];
  1021. NSData *extsData = [extsOrig data];
  1022. XCTAssertNotNil(fieldsData);
  1023. XCTAssertNotNil(extsData);
  1024. XCTAssertEqualObjects(fieldsData, extsData);
  1025. TestUnpackedTypes *fieldsParse =
  1026. [TestUnpackedTypes parseFromData:extsData error:NULL];
  1027. XCTAssertNotNil(fieldsParse);
  1028. XCTAssertEqualObjects(fieldsParse, fieldsOrig);
  1029. TestUnpackedExtensions *extsParse =
  1030. [TestUnpackedExtensions parseFromData:fieldsData
  1031. extensionRegistry:[UnittestRoot extensionRegistry]
  1032. error:NULL];
  1033. XCTAssertNotNil(extsParse);
  1034. XCTAssertEqualObjects(extsParse, extsOrig);
  1035. }
  1036. - (void)testErrorSubsectionInvalidLimit {
  1037. NSData *data = DataFromCStr(
  1038. "\x0A\x08\x0A\x07\x12\x04\x72\x02\x4B\x50\x12\x04\x72\x02\x4B\x50");
  1039. NSError *error = nil;
  1040. NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
  1041. error:&error];
  1042. XCTAssertNil(msg);
  1043. XCTAssertNotNil(error);
  1044. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1045. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
  1046. }
  1047. - (void)testErrorSubsectionLimitReached {
  1048. NSData *data = DataFromCStr("\x0A\x06\x12\x03\x72\x02\x4B\x50");
  1049. NSError *error = nil;
  1050. NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
  1051. error:&error];
  1052. XCTAssertNil(msg);
  1053. XCTAssertNotNil(error);
  1054. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1055. XCTAssertEqual(error.code, GPBCodedInputStreamErrorSubsectionLimitReached);
  1056. }
  1057. - (void)testErrorInvalidVarint {
  1058. NSData *data = DataFromCStr("\x72\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF");
  1059. NSError *error = nil;
  1060. TestAllTypes *msg = [TestAllTypes parseFromData:data error:&error];
  1061. XCTAssertNil(msg);
  1062. XCTAssertNotNil(error);
  1063. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1064. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidVarInt);
  1065. }
  1066. - (void)testErrorInvalidUTF8 {
  1067. NSData *data = DataFromCStr("\x72\x04\xF4\xFF\xFF\xFF");
  1068. NSError *error = nil;
  1069. TestAllTypes *msg = [TestAllTypes parseFromData:data error:&error];
  1070. XCTAssertNil(msg);
  1071. XCTAssertNotNil(error);
  1072. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1073. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidUTF8);
  1074. }
  1075. - (void)testErrorInvalidSize {
  1076. NSData *data = DataFromCStr("\x72\x03\x4B\x50");
  1077. NSError *error = nil;
  1078. NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
  1079. error:&error];
  1080. XCTAssertNil(msg);
  1081. XCTAssertNotNil(error);
  1082. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1083. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSize);
  1084. }
  1085. - (void)testErrorInvalidTag {
  1086. NSData *data = DataFromCStr("\x0F");
  1087. NSError *error = nil;
  1088. NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
  1089. error:&error];
  1090. XCTAssertNil(msg);
  1091. XCTAssertNotNil(error);
  1092. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1093. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag);
  1094. }
  1095. - (void)testZeroFieldNum {
  1096. // These are ConformanceTestSuite::TestIllegalTags.
  1097. const char *tests[] = {
  1098. "\1DEADBEEF",
  1099. "\2\1\1",
  1100. "\3\4",
  1101. "\5DEAD"
  1102. };
  1103. for (size_t i = 0; i < GPBARRAYSIZE(tests); ++i) {
  1104. NSData *data = DataFromCStr(tests[i]);
  1105. {
  1106. // Message from proto2 syntax file
  1107. NSError *error = nil;
  1108. Message2 *msg = [Message2 parseFromData:data error:&error];
  1109. XCTAssertNil(msg, @"i = %zd", i);
  1110. XCTAssertNotNil(error, @"i = %zd", i);
  1111. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain, @"i = %zd", i);
  1112. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag, @"i = %zd", i);
  1113. }
  1114. {
  1115. // Message from proto3 syntax file
  1116. NSError *error = nil;
  1117. Message3 *msg = [Message3 parseFromData:data error:&error];
  1118. XCTAssertNil(msg, @"i = %zd", i);
  1119. XCTAssertNotNil(error, @"i = %zd", i);
  1120. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain, @"i = %zd", i);
  1121. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidTag, @"i = %zd", i);
  1122. }
  1123. }
  1124. }
  1125. - (void)testErrorRecursionDepthReached {
  1126. NSData *data = DataFromCStr(
  1127. "\x0A\xF2\x01\x0A\xEF\x01\x0A\xEC\x01\x0A\xE9\x01\x0A\xE6\x01"
  1128. "\x0A\xE3\x01\x0A\xE0\x01\x0A\xDD\x01\x0A\xDA\x01\x0A\xD7\x01"
  1129. "\x0A\xD4\x01\x0A\xD1\x01\x0A\xCE\x01\x0A\xCB\x01\x0A\xC8\x01"
  1130. "\x0A\xC5\x01\x0A\xC2\x01\x0A\xBF\x01\x0A\xBC\x01\x0A\xB9\x01"
  1131. "\x0A\xB6\x01\x0A\xB3\x01\x0A\xB0\x01\x0A\xAD\x01\x0A\xAA\x01"
  1132. "\x0A\xA7\x01\x0A\xA4\x01\x0A\xA1\x01\x0A\x9E\x01\x0A\x9B\x01"
  1133. "\x0A\x98\x01\x0A\x95\x01\x0A\x92\x01\x0A\x8F\x01\x0A\x8C\x01"
  1134. "\x0A\x89\x01\x0A\x86\x01\x0A\x83\x01\x0A\x80\x01\x0A\x7E"
  1135. "\x0A\x7C\x0A\x7A\x0A\x78\x0A\x76\x0A\x74\x0A\x72\x0A\x70"
  1136. "\x0A\x6E\x0A\x6C\x0A\x6A\x0A\x68\x0A\x66\x0A\x64\x0A\x62"
  1137. "\x0A\x60\x0A\x5E\x0A\x5C\x0A\x5A\x0A\x58\x0A\x56\x0A\x54"
  1138. "\x0A\x52\x0A\x50\x0A\x4E\x0A\x4C\x0A\x4A\x0A\x48\x0A\x46"
  1139. "\x0A\x44\x0A\x42\x0A\x40\x0A\x3E\x0A\x3C\x0A\x3A\x0A\x38"
  1140. "\x0A\x36\x0A\x34\x0A\x32\x0A\x30\x0A\x2E\x0A\x2C\x0A\x2A"
  1141. "\x0A\x28\x0A\x26\x0A\x24\x0A\x22\x0A\x20\x0A\x1E\x0A\x1C"
  1142. "\x0A\x1A\x0A\x18\x0A\x16\x0A\x14\x0A\x12\x0A\x10\x0A\x0E"
  1143. "\x0A\x0C\x0A\x0A\x0A\x08\x0A\x06\x12\x04\x72\x02\x4B\x50");
  1144. NSError *error = nil;
  1145. NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
  1146. error:&error];
  1147. XCTAssertNil(msg);
  1148. XCTAssertNotNil(error);
  1149. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1150. XCTAssertEqual(error.code, GPBCodedInputStreamErrorRecursionDepthExceeded);
  1151. }
  1152. - (void)testParseDelimitedDataWithNegativeSize {
  1153. NSData *data = DataFromCStr("\xFF\xFF\xFF\xFF\x0F");
  1154. GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:data];
  1155. NSError *error;
  1156. [GPBMessage parseDelimitedFromCodedInputStream:input
  1157. extensionRegistry:nil
  1158. error:&error];
  1159. XCTAssertNil(error);
  1160. }
  1161. #ifdef DEBUG
  1162. - (void)testErrorMissingRequiredField {
  1163. NSData *data = DataFromCStr("");
  1164. NSError *error = nil;
  1165. TestRequired *msg = [TestRequired parseFromData:data error:&error];
  1166. XCTAssertNil(msg);
  1167. XCTAssertNotNil(error);
  1168. XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
  1169. XCTAssertEqual(error.code, GPBMessageErrorCodeMissingRequiredField);
  1170. }
  1171. #endif
  1172. #pragma mark - Subset from from map_tests.cc
  1173. // TEST(GeneratedMapFieldTest, StandardWireFormat)
  1174. - (void)testMap_StandardWireFormat {
  1175. NSData *data = DataFromCStr("\x0A\x04\x08\x01\x10\x01");
  1176. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1177. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1178. int32_t val = 666;
  1179. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
  1180. XCTAssertEqual(val, 1);
  1181. [msg release];
  1182. }
  1183. // TEST(GeneratedMapFieldTest, UnorderedWireFormat)
  1184. - (void)testMap_UnorderedWireFormat {
  1185. // put value before key in wire format
  1186. NSData *data = DataFromCStr("\x0A\x04\x10\x01\x08\x02");
  1187. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1188. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1189. int32_t val = 666;
  1190. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
  1191. XCTAssertEqual(val, 1);
  1192. [msg release];
  1193. }
  1194. // TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat)
  1195. - (void)testMap_DuplicatedKeyWireFormat {
  1196. // Two key fields in wire format
  1197. NSData *data = DataFromCStr("\x0A\x06\x08\x01\x08\x02\x10\x01");
  1198. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1199. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1200. int32_t val = 666;
  1201. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
  1202. XCTAssertEqual(val, 1);
  1203. [msg release];
  1204. }
  1205. // TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat)
  1206. - (void)testMap_DuplicatedValueWireFormat {
  1207. // Two value fields in wire format
  1208. NSData *data = DataFromCStr("\x0A\x06\x08\x01\x10\x01\x10\x02");
  1209. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1210. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1211. int32_t val = 666;
  1212. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
  1213. XCTAssertEqual(val, 2);
  1214. [msg release];
  1215. }
  1216. // TEST(GeneratedMapFieldTest, MissedKeyWireFormat)
  1217. - (void)testMap_MissedKeyWireFormat {
  1218. // No key field in wire format
  1219. NSData *data = DataFromCStr("\x0A\x02\x10\x01");
  1220. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1221. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1222. int32_t val = 666;
  1223. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:0]);
  1224. XCTAssertEqual(val, 1);
  1225. [msg release];
  1226. }
  1227. // TEST(GeneratedMapFieldTest, MissedValueWireFormat)
  1228. - (void)testMap_MissedValueWireFormat {
  1229. // No value field in wire format
  1230. NSData *data = DataFromCStr("\x0A\x02\x08\x01");
  1231. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1232. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1233. int32_t val = 666;
  1234. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:1]);
  1235. XCTAssertEqual(val, 0);
  1236. [msg release];
  1237. }
  1238. // TEST(GeneratedMapFieldTest, UnknownFieldWireFormat)
  1239. - (void)testMap_UnknownFieldWireFormat {
  1240. // Unknown field in wire format
  1241. NSData *data = DataFromCStr("\x0A\x06\x08\x02\x10\x03\x18\x01");
  1242. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  1243. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  1244. int32_t val = 666;
  1245. XCTAssertTrue([msg.mapInt32Int32 getInt32:&val forKey:2]);
  1246. XCTAssertEqual(val, 3);
  1247. [msg release];
  1248. }
  1249. // TEST(GeneratedMapFieldTest, CorruptedWireFormat)
  1250. - (void)testMap_CorruptedWireFormat {
  1251. // corrupted data in wire format
  1252. NSData *data = DataFromCStr("\x0A\x06\x08\x02\x11\x03");
  1253. NSError *error = nil;
  1254. TestMap *msg = [TestMap parseFromData:data error:&error];
  1255. XCTAssertNil(msg);
  1256. XCTAssertNotNil(error);
  1257. XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
  1258. XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
  1259. }
  1260. // TEST(GeneratedMapFieldTest, Proto2UnknownEnum)
  1261. - (void)testMap_Proto2UnknownEnum {
  1262. TestEnumMapPlusExtra *orig = [[TestEnumMapPlusExtra alloc] init];
  1263. orig.knownMapField = [[[GPBInt32EnumDictionary alloc]
  1264. initWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue] autorelease];
  1265. orig.unknownMapField = [[[GPBInt32EnumDictionary alloc]
  1266. initWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue] autorelease];
  1267. [orig.knownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
  1268. forKey:0];
  1269. [orig.unknownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
  1270. forKey:0];
  1271. NSData *data = [orig data];
  1272. XCTAssertNotNil(data);
  1273. TestEnumMap *msg1 = [TestEnumMap parseFromData:data error:NULL];
  1274. XCTAssertEqual(msg1.knownMapField.count, 1U);
  1275. int32_t val = -1;
  1276. XCTAssertTrue([msg1.knownMapField getEnum:&val forKey:0]);
  1277. XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
  1278. XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
  1279. data = [msg1 data];
  1280. TestEnumMapPlusExtra *msg2 =
  1281. [TestEnumMapPlusExtra parseFromData:data error:NULL];
  1282. val = -1;
  1283. XCTAssertEqual(msg2.knownMapField.count, 1U);
  1284. XCTAssertTrue([msg2.knownMapField getEnum:&val forKey:0]);
  1285. XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumFoo);
  1286. val = -1;
  1287. XCTAssertEqual(msg2.unknownMapField.count, 1U);
  1288. XCTAssertTrue([msg2.unknownMapField getEnum:&val forKey:0]);
  1289. XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
  1290. XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
  1291. XCTAssertEqualObjects(orig, msg2);
  1292. [orig release];
  1293. }
  1294. #pragma mark - Map Round Tripping
  1295. - (void)testProto2MapRoundTripping {
  1296. Message2 *msg = [[Message2 alloc] init];
  1297. // Key/Value data should result in different byte lengths on wire to ensure
  1298. // everything is right.
  1299. [msg.mapInt32Int32 setInt32:1000 forKey:200];
  1300. [msg.mapInt32Int32 setInt32:101 forKey:2001];
  1301. [msg.mapInt64Int64 setInt64:1002 forKey:202];
  1302. [msg.mapInt64Int64 setInt64:103 forKey:2003];
  1303. [msg.mapInt64Int64 setInt64:4294967296 forKey:4294967297];
  1304. [msg.mapUint32Uint32 setUInt32:1004 forKey:204];
  1305. [msg.mapUint32Uint32 setUInt32:105 forKey:2005];
  1306. [msg.mapUint64Uint64 setUInt64:1006 forKey:206];
  1307. [msg.mapUint64Uint64 setUInt64:107 forKey:2007];
  1308. [msg.mapUint64Uint64 setUInt64:4294967298 forKey:4294967299];
  1309. [msg.mapSint32Sint32 setInt32:1008 forKey:208];
  1310. [msg.mapSint32Sint32 setInt32:109 forKey:2009];
  1311. [msg.mapSint64Sint64 setInt64:1010 forKey:210];
  1312. [msg.mapSint64Sint64 setInt64:111 forKey:2011];
  1313. [msg.mapSint64Sint64 setInt64:4294967300 forKey:4294967301];
  1314. [msg.mapFixed32Fixed32 setUInt32:1012 forKey:212];
  1315. [msg.mapFixed32Fixed32 setUInt32:113 forKey:2013];
  1316. [msg.mapFixed64Fixed64 setUInt64:1014 forKey:214];
  1317. [msg.mapFixed64Fixed64 setUInt64:115 forKey:2015];
  1318. [msg.mapFixed64Fixed64 setUInt64:4294967302 forKey:4294967303];
  1319. [msg.mapSfixed32Sfixed32 setInt32:1016 forKey:216];
  1320. [msg.mapSfixed32Sfixed32 setInt32:117 forKey:2017];
  1321. [msg.mapSfixed64Sfixed64 setInt64:1018 forKey:218];
  1322. [msg.mapSfixed64Sfixed64 setInt64:119 forKey:2019];
  1323. [msg.mapSfixed64Sfixed64 setInt64:4294967304 forKey:4294967305];
  1324. [msg.mapInt32Float setFloat:1020.f forKey:220];
  1325. [msg.mapInt32Float setFloat:121.f forKey:2021];
  1326. [msg.mapInt32Double setDouble:1022. forKey:222];
  1327. [msg.mapInt32Double setDouble:123. forKey:2023];
  1328. [msg.mapBoolBool setBool:false forKey:true];
  1329. [msg.mapBoolBool setBool:true forKey:false];
  1330. msg.mapStringString[@"224"] = @"1024";
  1331. msg.mapStringString[@"2025"] = @"125";
  1332. msg.mapStringBytes[@"226"] = DataFromCStr("1026");
  1333. msg.mapStringBytes[@"2027"] = DataFromCStr("127");
  1334. Message2 *val1 = [[Message2 alloc] init];
  1335. val1.optionalInt32 = 1028;
  1336. Message2 *val2 = [[Message2 alloc] init];
  1337. val2.optionalInt32 = 129;
  1338. [msg.mapStringMessage setObject:val1 forKey:@"228"];
  1339. [msg.mapStringMessage setObject:val2 forKey:@"2029"];
  1340. [msg.mapInt32Bytes setObject:DataFromCStr("1030 bytes") forKey:230];
  1341. [msg.mapInt32Bytes setObject:DataFromCStr("131") forKey:2031];
  1342. [msg.mapInt32Enum setEnum:Message2_Enum_Bar forKey:232];
  1343. [msg.mapInt32Enum setEnum:Message2_Enum_Baz forKey:2033];
  1344. Message2 *val3 = [[Message2 alloc] init];
  1345. val3.optionalInt32 = 1034;
  1346. Message2 *val4 = [[Message2 alloc] init];
  1347. val4.optionalInt32 = 135;
  1348. [msg.mapInt32Message setObject:val3 forKey:234];
  1349. [msg.mapInt32Message setObject:val4 forKey:2035];
  1350. NSData *data = [msg data];
  1351. XCTAssertNotNil(data);
  1352. Message2 *msg2 = [[Message2 alloc] initWithData:data error:NULL];
  1353. XCTAssertNotEqual(msg2, msg); // Pointer comparison
  1354. XCTAssertEqualObjects(msg2, msg);
  1355. [val4 release];
  1356. [val3 release];
  1357. [val2 release];
  1358. [val1 release];
  1359. [msg2 release];
  1360. [msg release];
  1361. }
  1362. @end