GPBMessageTests+Serialization.m 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  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. static NSData *DataFromCStr(const char *str) {
  41. return [NSData dataWithBytes:str length:strlen(str)];
  42. }
  43. @interface MessageSerializationTests : GPBTestCase
  44. @end
  45. @implementation MessageSerializationTests
  46. // TODO(thomasvl): Pull tests over from GPBMessageTests that are serialization
  47. // specific.
  48. - (void)testProto3SerializationHandlingDefaults {
  49. // Proto2 covered in other tests.
  50. Message3 *msg = [[Message3 alloc] init];
  51. // Add defaults, no output.
  52. NSData *data = [msg data];
  53. XCTAssertEqual([data length], 0U);
  54. // All zeros, still nothing.
  55. msg.optionalInt32 = 0;
  56. msg.optionalInt64 = 0;
  57. msg.optionalUint32 = 0;
  58. msg.optionalUint64 = 0;
  59. msg.optionalSint32 = 0;
  60. msg.optionalSint64 = 0;
  61. msg.optionalFixed32 = 0;
  62. msg.optionalFixed64 = 0;
  63. msg.optionalSfixed32 = 0;
  64. msg.optionalSfixed64 = 0;
  65. msg.optionalFloat = 0.0f;
  66. msg.optionalDouble = 0.0;
  67. msg.optionalBool = NO;
  68. msg.optionalString = @"";
  69. msg.optionalBytes = [NSData data];
  70. msg.optionalEnum = Message3_Enum_Foo; // first value
  71. data = [msg data];
  72. XCTAssertEqual([data length], 0U);
  73. // The two that also take nil as nothing.
  74. msg.optionalString = nil;
  75. msg.optionalBytes = nil;
  76. data = [msg data];
  77. XCTAssertEqual([data length], 0U);
  78. // Set one field...
  79. msg.optionalInt32 = 1;
  80. data = [msg data];
  81. const uint8_t expectedBytes[] = {0x08, 0x01};
  82. NSData *expected = [NSData dataWithBytes:expectedBytes length:2];
  83. XCTAssertEqualObjects(data, expected);
  84. // Back to zero...
  85. msg.optionalInt32 = 0;
  86. data = [msg data];
  87. XCTAssertEqual([data length], 0U);
  88. [msg release];
  89. }
  90. - (void)testProto3DroppingUnknownFields {
  91. DropUnknownsFooWithExtraFields *fooWithExtras =
  92. [[DropUnknownsFooWithExtraFields alloc] init];
  93. fooWithExtras.int32Value = 1;
  94. fooWithExtras.enumValue = DropUnknownsFooWithExtraFields_NestedEnum_Baz;
  95. fooWithExtras.extraInt32Value = 2;
  96. DropUnknownsFoo *foo =
  97. [DropUnknownsFoo parseFromData:[fooWithExtras data] error:NULL];
  98. XCTAssertEqual(foo.int32Value, 1);
  99. XCTAssertEqual(foo.enumValue, DropUnknownsFoo_NestedEnum_Baz);
  100. // Nothing should end up in the unknowns.
  101. XCTAssertEqual([foo.unknownFields countOfFields], 0U);
  102. [fooWithExtras release];
  103. fooWithExtras =
  104. [DropUnknownsFooWithExtraFields parseFromData:[foo data] error:NULL];
  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.oneofEnum = Message3_Enum_Extra3;
  119. Message2 *msg = [[Message2 alloc] initWithData:[orig data] error:NULL];
  120. // None of the fields should be set.
  121. XCTAssertFalse(msg.hasOptionalEnum);
  122. XCTAssertEqual(msg.repeatedEnumArray.count, 0U);
  123. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
  124. // All the values should be in unknown fields.
  125. GPBUnknownFieldSet *unknownFields = msg.unknownFields;
  126. XCTAssertEqual([unknownFields countOfFields], 3U);
  127. XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OptionalEnum]);
  128. XCTAssertTrue(
  129. [unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
  130. XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OneofEnum]);
  131. GPBUnknownField *field =
  132. [unknownFields getField:Message2_FieldNumber_OptionalEnum];
  133. XCTAssertEqual(field.varintList.count, 1U);
  134. XCTAssertEqual([field.varintList valueAtIndex:0],
  135. (uint64_t)Message3_Enum_Extra3);
  136. field = [unknownFields getField:Message2_FieldNumber_RepeatedEnumArray];
  137. XCTAssertEqual(field.varintList.count, 1U);
  138. XCTAssertEqual([field.varintList valueAtIndex:0], (uint64_t)Message3_Enum_Extra3);
  139. field = [unknownFields getField:Message2_FieldNumber_OneofEnum];
  140. XCTAssertEqual(field.varintList.count, 1U);
  141. XCTAssertEqual([field.varintList valueAtIndex:0],
  142. (uint64_t)Message3_Enum_Extra3);
  143. [msg release];
  144. [orig release];
  145. }
  146. - (void)testProto3UnknownEnumPreserving {
  147. UnknownEnumsMyMessagePlusExtra *orig =
  148. [UnknownEnumsMyMessagePlusExtra message];
  149. orig.e = UnknownEnumsMyEnumPlusExtra_EExtra;
  150. orig.repeatedEArray = [GPBEnumArray
  151. arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
  152. rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
  153. orig.repeatedPackedEArray = [GPBEnumArray
  154. arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
  155. rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
  156. orig.oneofE1 = UnknownEnumsMyEnumPlusExtra_EExtra;
  157. // Everything should be there via raw values.
  158. UnknownEnumsMyMessage *msg =
  159. [UnknownEnumsMyMessage parseFromData:[orig data] error:NULL];
  160. XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  161. XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg),
  162. UnknownEnumsMyEnumPlusExtra_EExtra);
  163. XCTAssertEqual(msg.repeatedEArray.count, 1U);
  164. XCTAssertEqual([msg.repeatedEArray valueAtIndex:0],
  165. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  166. XCTAssertEqual([msg.repeatedEArray rawValueAtIndex:0],
  167. (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
  168. XCTAssertEqual(msg.repeatedPackedEArray.count, 1U);
  169. XCTAssertEqual([msg.repeatedPackedEArray valueAtIndex:0],
  170. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  171. XCTAssertEqual([msg.repeatedPackedEArray rawValueAtIndex:0],
  172. (UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
  173. XCTAssertEqual(msg.oneofE1,
  174. UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
  175. XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg),
  176. UnknownEnumsMyEnumPlusExtra_EExtra);
  177. // Everything should go out and come back.
  178. orig = [UnknownEnumsMyMessagePlusExtra parseFromData:[msg data] error:NULL];
  179. XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra);
  180. XCTAssertEqual(orig.repeatedEArray.count, 1U);
  181. XCTAssertEqual([orig.repeatedEArray valueAtIndex:0],
  182. UnknownEnumsMyEnumPlusExtra_EExtra);
  183. XCTAssertEqual(orig.repeatedPackedEArray.count, 1U);
  184. XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0],
  185. UnknownEnumsMyEnumPlusExtra_EExtra);
  186. XCTAssertEqual(orig.oneofE1, UnknownEnumsMyEnumPlusExtra_EExtra);
  187. }
  188. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF(MESSAGE, FIELD, VALUE)
  189. //%TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, )
  190. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, EQ_SUFFIX)
  191. //% { // oneof##FIELD
  192. //% MESSAGE *orig = [[MESSAGE alloc] init];
  193. //% orig.oneof##FIELD = VALUE;
  194. //% XCTAssertEqual(orig.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
  195. //% MESSAGE *msg = [MESSAGE parseFromData:[orig data] error:NULL];
  196. //% XCTAssertEqual(msg.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD);
  197. //% XCTAssertEqual##EQ_SUFFIX(msg.oneof##FIELD, VALUE);
  198. //% [orig release];
  199. //% }
  200. //%
  201. //%PDDM-DEFINE TEST_ROUNDTRIP_ONEOFS(SYNTAX, BOOL_NON_DEFAULT)
  202. //%- (void)testProto##SYNTAX##RoundTripOneof {
  203. //%
  204. //%GROUP_INIT##SYNTAX() Message##SYNTAX *subMessage = [[Message##SYNTAX alloc] init];
  205. //% XCTAssertNotNil(subMessage);
  206. //% subMessage.optionalInt32 = 666;
  207. //%
  208. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int32, 1)
  209. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Int64, 2)
  210. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint32, 3U)
  211. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Uint64, 4U)
  212. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint32, 5)
  213. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sint64, 6)
  214. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed32, 7U)
  215. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Fixed64, 8U)
  216. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed32, 9)
  217. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Sfixed64, 10)
  218. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Float, 11.0f)
  219. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Double, 12.0)
  220. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Bool, BOOL_NON_DEFAULT)
  221. //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, String, @"foo", Objects)
  222. //%TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Bytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding], Objects)
  223. //%GROUP_TEST##SYNTAX()TEST_ROUNDTRIP_ONEOF_ADV(Message##SYNTAX, Message, subMessage, Objects)
  224. //%TEST_ROUNDTRIP_ONEOF(Message##SYNTAX, Enum, Message2_Enum_Bar)
  225. //%GROUP_CLEANUP##SYNTAX() [subMessage release];
  226. //%}
  227. //%
  228. //%PDDM-DEFINE GROUP_INIT2()
  229. //% Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
  230. //% XCTAssertNotNil(group);
  231. //% group.a = 777;
  232. //%
  233. //%PDDM-DEFINE GROUP_CLEANUP2()
  234. //% [group release];
  235. //%
  236. //%PDDM-DEFINE GROUP_TEST2()
  237. //%TEST_ROUNDTRIP_ONEOF_ADV(Message2, Group, group, Objects)
  238. //%
  239. //%PDDM-DEFINE GROUP_INIT3()
  240. // Empty
  241. //%PDDM-DEFINE GROUP_CLEANUP3()
  242. // Empty
  243. //%PDDM-DEFINE GROUP_TEST3()
  244. //% // Not "group" in proto3.
  245. //%
  246. //%
  247. //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(2, NO)
  248. // This block of code is generated, do not edit it directly.
  249. - (void)testProto2RoundTripOneof {
  250. Message2_OneofGroup *group = [[Message2_OneofGroup alloc] init];
  251. XCTAssertNotNil(group);
  252. group.a = 777;
  253. Message2 *subMessage = [[Message2 alloc] init];
  254. XCTAssertNotNil(subMessage);
  255. subMessage.optionalInt32 = 666;
  256. { // oneofInt32
  257. Message2 *orig = [[Message2 alloc] init];
  258. orig.oneofInt32 = 1;
  259. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
  260. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  261. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32);
  262. XCTAssertEqual(msg.oneofInt32, 1);
  263. [orig release];
  264. }
  265. { // oneofInt64
  266. Message2 *orig = [[Message2 alloc] init];
  267. orig.oneofInt64 = 2;
  268. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
  269. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  270. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64);
  271. XCTAssertEqual(msg.oneofInt64, 2);
  272. [orig release];
  273. }
  274. { // oneofUint32
  275. Message2 *orig = [[Message2 alloc] init];
  276. orig.oneofUint32 = 3U;
  277. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
  278. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  279. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32);
  280. XCTAssertEqual(msg.oneofUint32, 3U);
  281. [orig release];
  282. }
  283. { // oneofUint64
  284. Message2 *orig = [[Message2 alloc] init];
  285. orig.oneofUint64 = 4U;
  286. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
  287. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  288. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64);
  289. XCTAssertEqual(msg.oneofUint64, 4U);
  290. [orig release];
  291. }
  292. { // oneofSint32
  293. Message2 *orig = [[Message2 alloc] init];
  294. orig.oneofSint32 = 5;
  295. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
  296. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  297. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32);
  298. XCTAssertEqual(msg.oneofSint32, 5);
  299. [orig release];
  300. }
  301. { // oneofSint64
  302. Message2 *orig = [[Message2 alloc] init];
  303. orig.oneofSint64 = 6;
  304. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
  305. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  306. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64);
  307. XCTAssertEqual(msg.oneofSint64, 6);
  308. [orig release];
  309. }
  310. { // oneofFixed32
  311. Message2 *orig = [[Message2 alloc] init];
  312. orig.oneofFixed32 = 7U;
  313. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
  314. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  315. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32);
  316. XCTAssertEqual(msg.oneofFixed32, 7U);
  317. [orig release];
  318. }
  319. { // oneofFixed64
  320. Message2 *orig = [[Message2 alloc] init];
  321. orig.oneofFixed64 = 8U;
  322. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
  323. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  324. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64);
  325. XCTAssertEqual(msg.oneofFixed64, 8U);
  326. [orig release];
  327. }
  328. { // oneofSfixed32
  329. Message2 *orig = [[Message2 alloc] init];
  330. orig.oneofSfixed32 = 9;
  331. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
  332. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  333. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32);
  334. XCTAssertEqual(msg.oneofSfixed32, 9);
  335. [orig release];
  336. }
  337. { // oneofSfixed64
  338. Message2 *orig = [[Message2 alloc] init];
  339. orig.oneofSfixed64 = 10;
  340. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
  341. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  342. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64);
  343. XCTAssertEqual(msg.oneofSfixed64, 10);
  344. [orig release];
  345. }
  346. { // oneofFloat
  347. Message2 *orig = [[Message2 alloc] init];
  348. orig.oneofFloat = 11.0f;
  349. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
  350. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  351. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat);
  352. XCTAssertEqual(msg.oneofFloat, 11.0f);
  353. [orig release];
  354. }
  355. { // oneofDouble
  356. Message2 *orig = [[Message2 alloc] init];
  357. orig.oneofDouble = 12.0;
  358. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
  359. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  360. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble);
  361. XCTAssertEqual(msg.oneofDouble, 12.0);
  362. [orig release];
  363. }
  364. { // oneofBool
  365. Message2 *orig = [[Message2 alloc] init];
  366. orig.oneofBool = NO;
  367. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBool);
  368. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  369. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool);
  370. XCTAssertEqual(msg.oneofBool, NO);
  371. [orig release];
  372. }
  373. { // oneofString
  374. Message2 *orig = [[Message2 alloc] init];
  375. orig.oneofString = @"foo";
  376. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofString);
  377. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  378. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString);
  379. XCTAssertEqualObjects(msg.oneofString, @"foo");
  380. [orig release];
  381. }
  382. { // oneofBytes
  383. Message2 *orig = [[Message2 alloc] init];
  384. orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
  385. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
  386. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  387. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
  388. XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
  389. [orig release];
  390. }
  391. { // oneofGroup
  392. Message2 *orig = [[Message2 alloc] init];
  393. orig.oneofGroup = group;
  394. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
  395. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  396. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup);
  397. XCTAssertEqualObjects(msg.oneofGroup, group);
  398. [orig release];
  399. }
  400. { // oneofMessage
  401. Message2 *orig = [[Message2 alloc] init];
  402. orig.oneofMessage = subMessage;
  403. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
  404. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  405. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage);
  406. XCTAssertEqualObjects(msg.oneofMessage, subMessage);
  407. [orig release];
  408. }
  409. { // oneofEnum
  410. Message2 *orig = [[Message2 alloc] init];
  411. orig.oneofEnum = Message2_Enum_Bar;
  412. XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
  413. Message2 *msg = [Message2 parseFromData:[orig data] error:NULL];
  414. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum);
  415. XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
  416. [orig release];
  417. }
  418. [group release];
  419. [subMessage release];
  420. }
  421. //%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(3, YES)
  422. // This block of code is generated, do not edit it directly.
  423. - (void)testProto3RoundTripOneof {
  424. Message3 *subMessage = [[Message3 alloc] init];
  425. XCTAssertNotNil(subMessage);
  426. subMessage.optionalInt32 = 666;
  427. { // oneofInt32
  428. Message3 *orig = [[Message3 alloc] init];
  429. orig.oneofInt32 = 1;
  430. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
  431. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  432. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32);
  433. XCTAssertEqual(msg.oneofInt32, 1);
  434. [orig release];
  435. }
  436. { // oneofInt64
  437. Message3 *orig = [[Message3 alloc] init];
  438. orig.oneofInt64 = 2;
  439. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
  440. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  441. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64);
  442. XCTAssertEqual(msg.oneofInt64, 2);
  443. [orig release];
  444. }
  445. { // oneofUint32
  446. Message3 *orig = [[Message3 alloc] init];
  447. orig.oneofUint32 = 3U;
  448. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
  449. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  450. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32);
  451. XCTAssertEqual(msg.oneofUint32, 3U);
  452. [orig release];
  453. }
  454. { // oneofUint64
  455. Message3 *orig = [[Message3 alloc] init];
  456. orig.oneofUint64 = 4U;
  457. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
  458. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  459. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64);
  460. XCTAssertEqual(msg.oneofUint64, 4U);
  461. [orig release];
  462. }
  463. { // oneofSint32
  464. Message3 *orig = [[Message3 alloc] init];
  465. orig.oneofSint32 = 5;
  466. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
  467. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  468. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32);
  469. XCTAssertEqual(msg.oneofSint32, 5);
  470. [orig release];
  471. }
  472. { // oneofSint64
  473. Message3 *orig = [[Message3 alloc] init];
  474. orig.oneofSint64 = 6;
  475. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
  476. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  477. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64);
  478. XCTAssertEqual(msg.oneofSint64, 6);
  479. [orig release];
  480. }
  481. { // oneofFixed32
  482. Message3 *orig = [[Message3 alloc] init];
  483. orig.oneofFixed32 = 7U;
  484. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
  485. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  486. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32);
  487. XCTAssertEqual(msg.oneofFixed32, 7U);
  488. [orig release];
  489. }
  490. { // oneofFixed64
  491. Message3 *orig = [[Message3 alloc] init];
  492. orig.oneofFixed64 = 8U;
  493. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
  494. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  495. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64);
  496. XCTAssertEqual(msg.oneofFixed64, 8U);
  497. [orig release];
  498. }
  499. { // oneofSfixed32
  500. Message3 *orig = [[Message3 alloc] init];
  501. orig.oneofSfixed32 = 9;
  502. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
  503. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  504. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32);
  505. XCTAssertEqual(msg.oneofSfixed32, 9);
  506. [orig release];
  507. }
  508. { // oneofSfixed64
  509. Message3 *orig = [[Message3 alloc] init];
  510. orig.oneofSfixed64 = 10;
  511. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
  512. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  513. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64);
  514. XCTAssertEqual(msg.oneofSfixed64, 10);
  515. [orig release];
  516. }
  517. { // oneofFloat
  518. Message3 *orig = [[Message3 alloc] init];
  519. orig.oneofFloat = 11.0f;
  520. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
  521. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  522. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat);
  523. XCTAssertEqual(msg.oneofFloat, 11.0f);
  524. [orig release];
  525. }
  526. { // oneofDouble
  527. Message3 *orig = [[Message3 alloc] init];
  528. orig.oneofDouble = 12.0;
  529. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
  530. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  531. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble);
  532. XCTAssertEqual(msg.oneofDouble, 12.0);
  533. [orig release];
  534. }
  535. { // oneofBool
  536. Message3 *orig = [[Message3 alloc] init];
  537. orig.oneofBool = YES;
  538. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBool);
  539. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  540. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool);
  541. XCTAssertEqual(msg.oneofBool, YES);
  542. [orig release];
  543. }
  544. { // oneofString
  545. Message3 *orig = [[Message3 alloc] init];
  546. orig.oneofString = @"foo";
  547. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofString);
  548. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  549. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString);
  550. XCTAssertEqualObjects(msg.oneofString, @"foo");
  551. [orig release];
  552. }
  553. { // oneofBytes
  554. Message3 *orig = [[Message3 alloc] init];
  555. orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
  556. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
  557. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  558. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
  559. XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
  560. [orig release];
  561. }
  562. // Not "group" in proto3.
  563. { // oneofMessage
  564. Message3 *orig = [[Message3 alloc] init];
  565. orig.oneofMessage = subMessage;
  566. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
  567. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  568. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage);
  569. XCTAssertEqualObjects(msg.oneofMessage, subMessage);
  570. [orig release];
  571. }
  572. { // oneofEnum
  573. Message3 *orig = [[Message3 alloc] init];
  574. orig.oneofEnum = Message2_Enum_Bar;
  575. XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
  576. Message3 *msg = [Message3 parseFromData:[orig data] error:NULL];
  577. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum);
  578. XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
  579. [orig release];
  580. }
  581. [subMessage release];
  582. }
  583. //%PDDM-EXPAND-END (2 expansions)
  584. - (void)testPackedUnpackedMessageParsing {
  585. // packed is optional, a repeated field should parse when packed or unpacked.
  586. TestPackedTypes *packedOrig = [TestPackedTypes message];
  587. TestUnpackedTypes *unpackedOrig = [TestUnpackedTypes message];
  588. [self setPackedFields:packedOrig repeatedCount:4];
  589. [self setUnpackedFields:unpackedOrig repeatedCount:4];
  590. NSData *packedData = [packedOrig data];
  591. NSData *unpackedData = [unpackedOrig data];
  592. XCTAssertNotNil(packedData);
  593. XCTAssertNotNil(unpackedData);
  594. XCTAssertNotEqualObjects(packedData, unpackedData,
  595. @"Data should differ (packed vs unpacked) use");
  596. NSError *error = nil;
  597. TestPackedTypes *packedParse =
  598. [TestPackedTypes parseFromData:unpackedData error:&error];
  599. XCTAssertNotNil(packedParse);
  600. XCTAssertNil(error);
  601. XCTAssertEqualObjects(packedParse, packedOrig);
  602. error = nil;
  603. TestUnpackedTypes *unpackedParsed =
  604. [TestUnpackedTypes parseFromData:packedData error:&error];
  605. XCTAssertNotNil(unpackedParsed);
  606. XCTAssertNil(error);
  607. XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
  608. }
  609. - (void)testPackedUnpackedExtensionParsing {
  610. // packed is optional, a repeated extension should parse when packed or
  611. // unpacked.
  612. TestPackedExtensions *packedOrig = [TestPackedExtensions message];
  613. TestUnpackedExtensions *unpackedOrig = [TestUnpackedExtensions message];
  614. [self setPackedExtensions:packedOrig repeatedCount:kGPBDefaultRepeatCount];
  615. [self setUnpackedExtensions:unpackedOrig repeatedCount:kGPBDefaultRepeatCount];
  616. NSData *packedData = [packedOrig data];
  617. NSData *unpackedData = [unpackedOrig data];
  618. XCTAssertNotNil(packedData);
  619. XCTAssertNotNil(unpackedData);
  620. XCTAssertNotEqualObjects(packedData, unpackedData,
  621. @"Data should differ (packed vs unpacked) use");
  622. NSError *error = nil;
  623. TestPackedExtensions *packedParse =
  624. [TestPackedExtensions parseFromData:unpackedData
  625. extensionRegistry:[UnittestRoot extensionRegistry]
  626. error:&error];
  627. XCTAssertNotNil(packedParse);
  628. XCTAssertNil(error);
  629. XCTAssertEqualObjects(packedParse, packedOrig);
  630. error = nil;
  631. TestUnpackedExtensions *unpackedParsed =
  632. [TestUnpackedExtensions parseFromData:packedData
  633. extensionRegistry:[UnittestRoot extensionRegistry]
  634. error:&error];
  635. XCTAssertNotNil(unpackedParsed);
  636. XCTAssertNil(error);
  637. XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
  638. }
  639. - (void)testPackedExtensionVsFieldParsing {
  640. // Extensions and fields end up on the wire the same way, so they can parse
  641. // each other.
  642. TestPackedTypes *fieldsOrig = [TestPackedTypes message];
  643. TestPackedExtensions *extsOrig = [TestPackedExtensions message];
  644. [self setPackedFields:fieldsOrig repeatedCount:kGPBDefaultRepeatCount];
  645. [self setPackedExtensions:extsOrig repeatedCount:kGPBDefaultRepeatCount];
  646. NSData *fieldsData = [fieldsOrig data];
  647. NSData *extsData = [extsOrig data];
  648. XCTAssertNotNil(fieldsData);
  649. XCTAssertNotNil(extsData);
  650. XCTAssertEqualObjects(fieldsData, extsData);
  651. NSError *error = nil;
  652. TestPackedTypes *fieldsParse =
  653. [TestPackedTypes parseFromData:extsData error:&error];
  654. XCTAssertNotNil(fieldsParse);
  655. XCTAssertNil(error);
  656. XCTAssertEqualObjects(fieldsParse, fieldsOrig);
  657. error = nil;
  658. TestPackedExtensions *extsParse =
  659. [TestPackedExtensions parseFromData:fieldsData
  660. extensionRegistry:[UnittestRoot extensionRegistry]
  661. error:&error];
  662. XCTAssertNotNil(extsParse);
  663. XCTAssertNil(error);
  664. XCTAssertEqualObjects(extsParse, extsOrig);
  665. }
  666. - (void)testUnpackedExtensionVsFieldParsing {
  667. // Extensions and fields end up on the wire the same way, so they can parse
  668. // each other.
  669. TestUnpackedTypes *fieldsOrig = [TestUnpackedTypes message];
  670. TestUnpackedExtensions *extsOrig = [TestUnpackedExtensions message];
  671. [self setUnpackedFields:fieldsOrig repeatedCount:3];
  672. [self setUnpackedExtensions:extsOrig repeatedCount:3];
  673. NSData *fieldsData = [fieldsOrig data];
  674. NSData *extsData = [extsOrig data];
  675. XCTAssertNotNil(fieldsData);
  676. XCTAssertNotNil(extsData);
  677. XCTAssertEqualObjects(fieldsData, extsData);
  678. TestUnpackedTypes *fieldsParse =
  679. [TestUnpackedTypes parseFromData:extsData error:NULL];
  680. XCTAssertNotNil(fieldsParse);
  681. XCTAssertEqualObjects(fieldsParse, fieldsOrig);
  682. TestUnpackedExtensions *extsParse =
  683. [TestUnpackedExtensions parseFromData:fieldsData
  684. extensionRegistry:[UnittestRoot extensionRegistry]
  685. error:NULL];
  686. XCTAssertNotNil(extsParse);
  687. XCTAssertEqualObjects(extsParse, extsOrig);
  688. }
  689. #pragma mark - Subset from from map_tests.cc
  690. // TEST(GeneratedMapFieldTest, StandardWireFormat)
  691. - (void)testMap_StandardWireFormat {
  692. NSData *data = DataFromCStr("\x0A\x04\x08\x01\x10\x01");
  693. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  694. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  695. int32_t val = 666;
  696. XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
  697. XCTAssertEqual(val, 1);
  698. [msg release];
  699. }
  700. // TEST(GeneratedMapFieldTest, UnorderedWireFormat)
  701. - (void)testMap_UnorderedWireFormat {
  702. // put value before key in wire format
  703. NSData *data = DataFromCStr("\x0A\x04\x10\x01\x08\x02");
  704. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  705. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  706. int32_t val = 666;
  707. XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
  708. XCTAssertEqual(val, 1);
  709. [msg release];
  710. }
  711. // TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat)
  712. - (void)testMap_DuplicatedKeyWireFormat {
  713. // Two key fields in wire format
  714. NSData *data = DataFromCStr("\x0A\x06\x08\x01\x08\x02\x10\x01");
  715. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  716. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  717. int32_t val = 666;
  718. XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
  719. XCTAssertEqual(val, 1);
  720. [msg release];
  721. }
  722. // TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat)
  723. - (void)testMap_DuplicatedValueWireFormat {
  724. // Two value fields in wire format
  725. NSData *data = DataFromCStr("\x0A\x06\x08\x01\x10\x01\x10\x02");
  726. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  727. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  728. int32_t val = 666;
  729. XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
  730. XCTAssertEqual(val, 2);
  731. [msg release];
  732. }
  733. // TEST(GeneratedMapFieldTest, MissedKeyWireFormat)
  734. - (void)testMap_MissedKeyWireFormat {
  735. // No key field in wire format
  736. NSData *data = DataFromCStr("\x0A\x02\x10\x01");
  737. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  738. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  739. int32_t val = 666;
  740. XCTAssertTrue([msg.mapInt32Int32 valueForKey:0 value:&val]);
  741. XCTAssertEqual(val, 1);
  742. [msg release];
  743. }
  744. // TEST(GeneratedMapFieldTest, MissedValueWireFormat)
  745. - (void)testMap_MissedValueWireFormat {
  746. // No value field in wire format
  747. NSData *data = DataFromCStr("\x0A\x02\x08\x01");
  748. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  749. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  750. int32_t val = 666;
  751. XCTAssertTrue([msg.mapInt32Int32 valueForKey:1 value:&val]);
  752. XCTAssertEqual(val, 0);
  753. [msg release];
  754. }
  755. // TEST(GeneratedMapFieldTest, UnknownFieldWireFormat)
  756. - (void)testMap_UnknownFieldWireFormat {
  757. // Unknown field in wire format
  758. NSData *data = DataFromCStr("\x0A\x06\x08\x02\x10\x03\x18\x01");
  759. TestMap *msg = [[TestMap alloc] initWithData:data error:NULL];
  760. XCTAssertEqual(msg.mapInt32Int32.count, 1U);
  761. int32_t val = 666;
  762. XCTAssertTrue([msg.mapInt32Int32 valueForKey:2 value:&val]);
  763. XCTAssertEqual(val, 3);
  764. [msg release];
  765. }
  766. // TEST(GeneratedMapFieldTest, CorruptedWireFormat)
  767. - (void)testMap_CorruptedWireFormat {
  768. // corrupted data in wire format
  769. NSData *data = DataFromCStr("\x0A\x06\x08\x02\x11\x03");
  770. NSError *error = nil;
  771. TestMap *msg = [TestMap parseFromData:data error:&error];
  772. XCTAssertNil(msg);
  773. XCTAssertNotNil(error);
  774. XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
  775. XCTAssertEqual(error.code, GPBMessageErrorCodeMalformedData);
  776. }
  777. // TEST(GeneratedMapFieldTest, Proto2UnknownEnum)
  778. - (void)testMap_Proto2UnknownEnum {
  779. TestEnumMapPlusExtra *orig = [[TestEnumMapPlusExtra alloc] init];
  780. orig.knownMapField = [GPBInt32EnumDictionary
  781. dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
  782. orig.unknownMapField = [GPBInt32EnumDictionary
  783. dictionaryWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue];
  784. [orig.knownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
  785. forKey:0];
  786. [orig.unknownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
  787. forKey:0];
  788. TestEnumMap *msg1 = [TestEnumMap parseFromData:[orig data] error:NULL];
  789. XCTAssertEqual(msg1.knownMapField.count, 1U);
  790. int32_t val = -1;
  791. XCTAssertTrue([msg1.knownMapField valueForKey:0 value:&val]);
  792. XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo);
  793. XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
  794. TestEnumMapPlusExtra *msg2 =
  795. [TestEnumMapPlusExtra parseFromData:[msg1 data] error:NULL];
  796. val = -1;
  797. XCTAssertEqual(msg2.knownMapField.count, 1U);
  798. XCTAssertTrue([msg2.knownMapField valueForKey:0 value:&val]);
  799. XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumFoo);
  800. val = -1;
  801. XCTAssertEqual(msg2.unknownMapField.count, 1U);
  802. XCTAssertTrue([msg2.unknownMapField valueForKey:0 value:&val]);
  803. XCTAssertEqual(val, Proto2MapEnumPlusExtra_EProto2MapEnumExtra);
  804. XCTAssertEqual(msg2.unknownFields.countOfFields, 0U);
  805. XCTAssertEqualObjects(orig, msg2);
  806. [orig release];
  807. }
  808. #pragma mark - Map Round Tripping
  809. - (void)testProto2MapRoundTripping {
  810. Message2 *msg = [[Message2 alloc] init];
  811. // Key/Value data should result in different byte lengths on wire to ensure
  812. // everything is right.
  813. [msg.mapInt32Int32 setValue:1000 forKey:200];
  814. [msg.mapInt32Int32 setValue:101 forKey:2001];
  815. [msg.mapInt64Int64 setValue:1002 forKey:202];
  816. [msg.mapInt64Int64 setValue:103 forKey:2003];
  817. [msg.mapUint32Uint32 setValue:1004 forKey:204];
  818. [msg.mapUint32Uint32 setValue:105 forKey:2005];
  819. [msg.mapUint64Uint64 setValue:1006 forKey:206];
  820. [msg.mapUint64Uint64 setValue:107 forKey:2007];
  821. [msg.mapSint32Sint32 setValue:1008 forKey:208];
  822. [msg.mapSint32Sint32 setValue:109 forKey:2009];
  823. [msg.mapSint64Sint64 setValue:1010 forKey:210];
  824. [msg.mapSint64Sint64 setValue:111 forKey:2011];
  825. [msg.mapFixed32Fixed32 setValue:1012 forKey:212];
  826. [msg.mapFixed32Fixed32 setValue:113 forKey:2013];
  827. [msg.mapFixed64Fixed64 setValue:1014 forKey:214];
  828. [msg.mapFixed64Fixed64 setValue:115 forKey:2015];
  829. [msg.mapSfixed32Sfixed32 setValue:1016 forKey:216];
  830. [msg.mapSfixed32Sfixed32 setValue:117 forKey:2017];
  831. [msg.mapSfixed64Sfixed64 setValue:1018 forKey:218];
  832. [msg.mapSfixed64Sfixed64 setValue:119 forKey:2019];
  833. [msg.mapInt32Float setValue:1020.f forKey:220];
  834. [msg.mapInt32Float setValue:121.f forKey:2021];
  835. [msg.mapInt32Double setValue:1022. forKey:222];
  836. [msg.mapInt32Double setValue:123. forKey:2023];
  837. [msg.mapBoolBool setValue:false forKey:true];
  838. [msg.mapBoolBool setValue:true forKey:false];
  839. msg.mapStringString[@"224"] = @"1024";
  840. msg.mapStringString[@"2025"] = @"125";
  841. msg.mapStringBytes[@"226"] = DataFromCStr("1026");
  842. msg.mapStringBytes[@"2027"] = DataFromCStr("127");
  843. Message2 *val1 = [[Message2 alloc] init];
  844. val1.optionalInt32 = 1028;
  845. Message2 *val2 = [[Message2 alloc] init];
  846. val2.optionalInt32 = 129;
  847. [msg.mapStringMessage setValue:val1 forKey:@"228"];
  848. [msg.mapStringMessage setValue:val2 forKey:@"2029"];
  849. [msg.mapInt32Bytes setValue:DataFromCStr("1030 bytes") forKey:230];
  850. [msg.mapInt32Bytes setValue:DataFromCStr("131") forKey:2031];
  851. [msg.mapInt32Enum setValue:Message2_Enum_Bar forKey:232];
  852. [msg.mapInt32Enum setValue:Message2_Enum_Baz forKey:2033];
  853. Message2 *val3 = [[Message2 alloc] init];
  854. val3.optionalInt32 = 1034;
  855. Message2 *val4 = [[Message2 alloc] init];
  856. val4.optionalInt32 = 135;
  857. [msg.mapInt32Message setValue:val3 forKey:234];
  858. [msg.mapInt32Message setValue:val4 forKey:2035];
  859. NSData *data = [msg data];
  860. Message2 *msg2 = [[Message2 alloc] initWithData:data error:NULL];
  861. XCTAssertNotEqual(msg2, msg); // Pointer comparison
  862. XCTAssertEqualObjects(msg2, msg);
  863. [val4 release];
  864. [val3 release];
  865. [val2 release];
  866. [val1 release];
  867. [msg2 release];
  868. [msg release];
  869. }
  870. @end