GPBMessageTests.m 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 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 "GPBArray_PackagePrivate.h"
  33. #import "GPBDescriptor.h"
  34. #import "GPBDictionary_PackagePrivate.h"
  35. #import "GPBMessage_PackagePrivate.h"
  36. #import "GPBUnknownField_PackagePrivate.h"
  37. #import "GPBUnknownFieldSet_PackagePrivate.h"
  38. #import "google/protobuf/Unittest.pbobjc.h"
  39. #import "google/protobuf/UnittestObjc.pbobjc.h"
  40. @interface MessageTests : GPBTestCase
  41. @end
  42. @implementation MessageTests
  43. // TODO(thomasvl): this should get split into a few files of logic junks, it is
  44. // a jumble of things at the moment (and the testutils have a bunch of the real
  45. // assertions).
  46. - (TestAllTypes *)mergeSource {
  47. TestAllTypes *message = [TestAllTypes message];
  48. [message setOptionalInt32:1];
  49. [message setOptionalString:@"foo"];
  50. [message setOptionalForeignMessage:[ForeignMessage message]];
  51. message.repeatedStringArray = [NSMutableArray array];
  52. [message.repeatedStringArray addObject:@"bar"];
  53. return message;
  54. }
  55. - (TestAllTypes *)mergeDestination {
  56. TestAllTypes *message = [TestAllTypes message];
  57. [message setOptionalInt64:2];
  58. [message setOptionalString:@"baz"];
  59. ForeignMessage *foreignMessage = [ForeignMessage message];
  60. [foreignMessage setC:3];
  61. [message setOptionalForeignMessage:foreignMessage];
  62. message.repeatedStringArray = [NSMutableArray array];
  63. [message.repeatedStringArray addObject:@"qux"];
  64. return message;
  65. }
  66. - (TestAllTypes *)mergeDestinationWithoutForeignMessageIvar {
  67. TestAllTypes *message = [TestAllTypes message];
  68. [message setOptionalInt64:2];
  69. [message setOptionalString:@"baz"];
  70. message.repeatedStringArray = [NSMutableArray array];
  71. [message.repeatedStringArray addObject:@"qux"];
  72. return message;
  73. }
  74. - (TestAllTypes *)mergeResult {
  75. TestAllTypes *message = [TestAllTypes message];
  76. [message setOptionalInt32:1];
  77. [message setOptionalInt64:2];
  78. [message setOptionalString:@"foo"];
  79. ForeignMessage *foreignMessage = [ForeignMessage message];
  80. [foreignMessage setC:3];
  81. [message setOptionalForeignMessage:foreignMessage];
  82. message.repeatedStringArray = [NSMutableArray array];
  83. [message.repeatedStringArray addObject:@"qux"];
  84. [message.repeatedStringArray addObject:@"bar"];
  85. return message;
  86. }
  87. - (TestAllTypes *)mergeResultForDestinationWithoutForeignMessageIvar {
  88. TestAllTypes *message = [TestAllTypes message];
  89. [message setOptionalInt32:1];
  90. [message setOptionalInt64:2];
  91. [message setOptionalString:@"foo"];
  92. ForeignMessage *foreignMessage = [ForeignMessage message];
  93. [message setOptionalForeignMessage:foreignMessage];
  94. message.repeatedStringArray = [NSMutableArray array];
  95. [message.repeatedStringArray addObject:@"qux"];
  96. [message.repeatedStringArray addObject:@"bar"];
  97. return message;
  98. }
  99. - (TestAllExtensions *)mergeExtensionsDestination {
  100. TestAllExtensions *message = [TestAllExtensions message];
  101. [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
  102. [message setExtension:[UnittestRoot optionalStringExtension] value:@"foo"];
  103. ForeignMessage *foreignMessage = [ForeignMessage message];
  104. foreignMessage.c = 4;
  105. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  106. value:foreignMessage];
  107. TestAllTypes_NestedMessage *nestedMessage =
  108. [TestAllTypes_NestedMessage message];
  109. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  110. value:nestedMessage];
  111. return message;
  112. }
  113. - (TestAllExtensions *)mergeExtensionsSource {
  114. TestAllExtensions *message = [TestAllExtensions message];
  115. [message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
  116. [message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
  117. ForeignMessage *foreignMessage = [ForeignMessage message];
  118. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  119. value:foreignMessage];
  120. TestAllTypes_NestedMessage *nestedMessage =
  121. [TestAllTypes_NestedMessage message];
  122. nestedMessage.bb = 7;
  123. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  124. value:nestedMessage];
  125. return message;
  126. }
  127. - (TestAllExtensions *)mergeExtensionsResult {
  128. TestAllExtensions *message = [TestAllExtensions message];
  129. [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
  130. [message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
  131. [message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
  132. ForeignMessage *foreignMessage = [ForeignMessage message];
  133. foreignMessage.c = 4;
  134. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  135. value:foreignMessage];
  136. TestAllTypes_NestedMessage *nestedMessage =
  137. [TestAllTypes_NestedMessage message];
  138. nestedMessage.bb = 7;
  139. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  140. value:nestedMessage];
  141. return message;
  142. }
  143. - (void)testMergeFrom {
  144. TestAllTypes *result = [[self.mergeDestination copy] autorelease];
  145. [result mergeFrom:self.mergeSource];
  146. NSData *resultData = [result data];
  147. NSData *mergeResultData = [self.mergeResult data];
  148. XCTAssertEqualObjects(resultData, mergeResultData);
  149. XCTAssertEqualObjects(result, self.mergeResult);
  150. // Test when destination does not have an Ivar (type is an object) but source
  151. // has such Ivar.
  152. // The result must has the Ivar which is same as the one in source.
  153. result = [[self.mergeDestinationWithoutForeignMessageIvar copy] autorelease];
  154. [result mergeFrom:self.mergeSource];
  155. resultData = [result data];
  156. mergeResultData =
  157. [self.mergeResultForDestinationWithoutForeignMessageIvar data];
  158. XCTAssertEqualObjects(resultData, mergeResultData);
  159. XCTAssertEqualObjects(
  160. result, self.mergeResultForDestinationWithoutForeignMessageIvar);
  161. // Test when destination is empty.
  162. // The result must is same as the source.
  163. result = [TestAllTypes message];
  164. [result mergeFrom:self.mergeSource];
  165. resultData = [result data];
  166. mergeResultData = [self.mergeSource data];
  167. XCTAssertEqualObjects(resultData, mergeResultData);
  168. XCTAssertEqualObjects(result, self.mergeSource);
  169. }
  170. - (void)testMergeFromWithExtensions {
  171. TestAllExtensions *result = [self mergeExtensionsDestination];
  172. [result mergeFrom:[self mergeExtensionsSource]];
  173. NSData *resultData = [result data];
  174. NSData *mergeResultData = [[self mergeExtensionsResult] data];
  175. XCTAssertEqualObjects(resultData, mergeResultData);
  176. XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
  177. // Test merging from data.
  178. result = [self mergeExtensionsDestination];
  179. [result mergeFromData:[[self mergeExtensionsSource] data]
  180. extensionRegistry:[UnittestRoot extensionRegistry]];
  181. resultData = [result data];
  182. XCTAssertEqualObjects(resultData, mergeResultData);
  183. XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
  184. }
  185. - (void)testIsEquals {
  186. TestAllTypes *result = [[self.mergeDestination copy] autorelease];
  187. [result mergeFrom:self.mergeSource];
  188. XCTAssertEqualObjects(result.data, self.mergeResult.data);
  189. XCTAssertEqualObjects(result, self.mergeResult);
  190. TestAllTypes *result2 = [[self.mergeDestination copy] autorelease];
  191. XCTAssertNotEqualObjects(result2.data, self.mergeResult.data);
  192. XCTAssertNotEqualObjects(result2, self.mergeResult);
  193. }
  194. // =================================================================
  195. // Required-field-related tests.
  196. - (TestRequired *)testRequiredInitialized {
  197. TestRequired *message = [TestRequired message];
  198. [message setA:1];
  199. [message setB:2];
  200. [message setC:3];
  201. return message;
  202. }
  203. - (void)testRequired {
  204. TestRequired *message = [TestRequired message];
  205. XCTAssertFalse(message.initialized);
  206. [message setA:1];
  207. XCTAssertFalse(message.initialized);
  208. [message setB:1];
  209. XCTAssertFalse(message.initialized);
  210. [message setC:1];
  211. XCTAssertTrue(message.initialized);
  212. }
  213. - (void)testRequiredForeign {
  214. TestRequiredForeign *message = [TestRequiredForeign message];
  215. XCTAssertTrue(message.initialized);
  216. [message setOptionalMessage:[TestRequired message]];
  217. XCTAssertFalse(message.initialized);
  218. [message setOptionalMessage:self.testRequiredInitialized];
  219. XCTAssertTrue(message.initialized);
  220. message.repeatedMessageArray = [NSMutableArray array];
  221. [message.repeatedMessageArray addObject:[TestRequired message]];
  222. XCTAssertFalse(message.initialized);
  223. [message.repeatedMessageArray removeAllObjects];
  224. [message.repeatedMessageArray addObject:self.testRequiredInitialized];
  225. XCTAssertTrue(message.initialized);
  226. }
  227. - (void)testRequiredExtension {
  228. TestAllExtensions *message = [TestAllExtensions message];
  229. XCTAssertTrue(message.initialized);
  230. [message setExtension:[TestRequired single] value:[TestRequired message]];
  231. XCTAssertFalse(message.initialized);
  232. [message setExtension:[TestRequired single]
  233. value:self.testRequiredInitialized];
  234. XCTAssertTrue(message.initialized);
  235. [message addExtension:[TestRequired multi] value:[TestRequired message]];
  236. XCTAssertFalse(message.initialized);
  237. [message setExtension:[TestRequired multi]
  238. index:0
  239. value:self.testRequiredInitialized];
  240. XCTAssertTrue(message.initialized);
  241. }
  242. - (void)testDataFromUninitialized {
  243. TestRequired *message = [TestRequired message];
  244. NSData *data = [message data];
  245. // In DEBUG, the data generation will fail, but in non DEBUG, it passes
  246. // because the check isn't done (for speed).
  247. #ifdef DEBUG
  248. XCTAssertNil(data);
  249. #else
  250. XCTAssertNotNil(data);
  251. XCTAssertFalse(message.initialized);
  252. #endif // DEBUG
  253. }
  254. - (void)testInitialized {
  255. // We're mostly testing that no exception is thrown.
  256. TestRequired *message = [TestRequired message];
  257. XCTAssertFalse(message.initialized);
  258. }
  259. - (void)testDataFromNestedUninitialized {
  260. TestRequiredForeign *message = [TestRequiredForeign message];
  261. [message setOptionalMessage:[TestRequired message]];
  262. message.repeatedMessageArray = [NSMutableArray array];
  263. [message.repeatedMessageArray addObject:[TestRequired message]];
  264. [message.repeatedMessageArray addObject:[TestRequired message]];
  265. NSData *data = [message data];
  266. // In DEBUG, the data generation will fail, but in non DEBUG, it passes
  267. // because the check isn't done (for speed).
  268. #ifdef DEBUG
  269. XCTAssertNil(data);
  270. #else
  271. XCTAssertNotNil(data);
  272. XCTAssertFalse(message.initialized);
  273. #endif // DEBUG
  274. }
  275. - (void)testNestedInitialized {
  276. // We're mostly testing that no exception is thrown.
  277. TestRequiredForeign *message = [TestRequiredForeign message];
  278. [message setOptionalMessage:[TestRequired message]];
  279. message.repeatedMessageArray = [NSMutableArray array];
  280. [message.repeatedMessageArray addObject:[TestRequired message]];
  281. [message.repeatedMessageArray addObject:[TestRequired message]];
  282. XCTAssertFalse(message.initialized);
  283. }
  284. - (void)testParseUninitialized {
  285. NSError *error = nil;
  286. TestRequired *msg =
  287. [TestRequired parseFromData:GPBEmptyNSData() error:&error];
  288. // In DEBUG, the parse will fail, but in non DEBUG, it passes because
  289. // the check isn't done (for speed).
  290. #ifdef DEBUG
  291. XCTAssertNil(msg);
  292. XCTAssertNotNil(error);
  293. XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
  294. XCTAssertEqual(error.code, GPBMessageErrorCodeMissingRequiredField);
  295. #else
  296. XCTAssertNotNil(msg);
  297. XCTAssertNil(error);
  298. XCTAssertFalse(msg.initialized);
  299. #endif // DEBUG
  300. }
  301. - (void)testCoding {
  302. NSData *data =
  303. [NSKeyedArchiver archivedDataWithRootObject:[self mergeResult]];
  304. id unarchivedObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  305. XCTAssertEqualObjects(unarchivedObject, [self mergeResult]);
  306. // Intentionally doing a pointer comparison.
  307. XCTAssertNotEqual(unarchivedObject, [self mergeResult]);
  308. }
  309. - (void)testObjectReset {
  310. // Tests a failure where clearing out defaults values caused an over release.
  311. TestAllTypes *message = [TestAllTypes message];
  312. message.hasOptionalNestedMessage = NO;
  313. [message setOptionalNestedMessage:[TestAllTypes_NestedMessage message]];
  314. message.hasOptionalNestedMessage = NO;
  315. [message setOptionalNestedMessage:[TestAllTypes_NestedMessage message]];
  316. [message setOptionalNestedMessage:nil];
  317. message.hasOptionalNestedMessage = NO;
  318. }
  319. - (void)testSettingHasToYes {
  320. TestAllTypes *message = [TestAllTypes message];
  321. XCTAssertThrows([message setHasOptionalNestedMessage:YES]);
  322. }
  323. - (void)testRoot {
  324. XCTAssertNotNil([UnittestRoot extensionRegistry]);
  325. }
  326. - (void)testGPBMessageSize {
  327. // See the note in GPBMessage_PackagePrivate.h about why we want to keep the
  328. // base instance size pointer size aligned.
  329. size_t messageSize = class_getInstanceSize([GPBMessage class]);
  330. XCTAssertEqual((messageSize % sizeof(void *)), (size_t)0,
  331. @"Base size isn't pointer size aligned");
  332. // Since we add storage ourselves (see +allocWithZone: in GPBMessage), confirm
  333. // that the size of some generated classes is still the same as the base for
  334. // that logic to work as desired.
  335. size_t testMessageSize = class_getInstanceSize([TestAllTypes class]);
  336. XCTAssertEqual(testMessageSize, messageSize);
  337. }
  338. - (void)testInit {
  339. TestAllTypes *message = [TestAllTypes message];
  340. [self assertClear:message];
  341. }
  342. - (void)testAccessors {
  343. TestAllTypes *message = [TestAllTypes message];
  344. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  345. [self assertAllFieldsSet:message repeatedCount:kGPBDefaultRepeatCount];
  346. }
  347. - (void)testKVC_ValueForKey {
  348. TestAllTypes *message = [TestAllTypes message];
  349. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  350. [self assertAllFieldsKVCMatch:message];
  351. }
  352. - (void)testKVC_SetValue_ForKey {
  353. TestAllTypes *message = [TestAllTypes message];
  354. [self setAllFieldsViaKVC:message repeatedCount:kGPBDefaultRepeatCount];
  355. [self assertAllFieldsKVCMatch:message];
  356. [self assertAllFieldsSet:message repeatedCount:kGPBDefaultRepeatCount];
  357. [self assertAllFieldsKVCMatch:message];
  358. }
  359. - (void)testDescription {
  360. // No real test, just exercise code
  361. TestAllTypes *message = [TestAllTypes message];
  362. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  363. GPBUnknownFieldSet *unknownFields =
  364. [[[GPBUnknownFieldSet alloc] init] autorelease];
  365. GPBUnknownField *field =
  366. [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
  367. [field addVarint:2];
  368. [unknownFields addField:field];
  369. field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
  370. [field addVarint:4];
  371. [unknownFields addField:field];
  372. [message setUnknownFields:unknownFields];
  373. NSString *description = [message description];
  374. XCTAssertGreaterThan([description length], 0U);
  375. GPBMessage *message2 = [TestAllExtensions message];
  376. [message2 setExtension:[UnittestRoot optionalInt32Extension] value:@1];
  377. [message2 addExtension:[UnittestRoot repeatedInt32Extension] value:@2];
  378. description = [message2 description];
  379. XCTAssertGreaterThan([description length], 0U);
  380. }
  381. - (void)testSetter {
  382. // Test to make sure that if we set a value that has a default value
  383. // with the default, that the has is set, and the value gets put into the
  384. // message correctly.
  385. TestAllTypes *message = [TestAllTypes message];
  386. GPBDescriptor *descriptor = [[message class] descriptor];
  387. XCTAssertNotNil(descriptor);
  388. GPBFieldDescriptor *fieldDescriptor =
  389. [descriptor fieldWithName:@"defaultInt32"];
  390. XCTAssertNotNil(fieldDescriptor);
  391. GPBGenericValue defaultValue = [fieldDescriptor defaultValue];
  392. [message setDefaultInt32:defaultValue.valueInt32];
  393. XCTAssertTrue(message.hasDefaultInt32);
  394. XCTAssertEqual(message.defaultInt32, defaultValue.valueInt32);
  395. // Do the same thing with an object type.
  396. message = [TestAllTypes message];
  397. fieldDescriptor = [descriptor fieldWithName:@"defaultString"];
  398. XCTAssertNotNil(fieldDescriptor);
  399. defaultValue = [fieldDescriptor defaultValue];
  400. [message setDefaultString:defaultValue.valueString];
  401. XCTAssertTrue(message.hasDefaultString);
  402. XCTAssertEqualObjects(message.defaultString, defaultValue.valueString);
  403. // Test default string type.
  404. message = [TestAllTypes message];
  405. XCTAssertEqualObjects(message.defaultString, @"hello");
  406. XCTAssertFalse(message.hasDefaultString);
  407. fieldDescriptor = [descriptor fieldWithName:@"defaultString"];
  408. XCTAssertNotNil(fieldDescriptor);
  409. defaultValue = [fieldDescriptor defaultValue];
  410. [message setDefaultString:defaultValue.valueString];
  411. XCTAssertEqualObjects(message.defaultString, @"hello");
  412. XCTAssertTrue(message.hasDefaultString);
  413. [message setDefaultString:nil];
  414. XCTAssertEqualObjects(message.defaultString, @"hello");
  415. XCTAssertFalse(message.hasDefaultString);
  416. message.hasDefaultString = NO;
  417. XCTAssertFalse(message.hasDefaultString);
  418. XCTAssertEqualObjects(message.defaultString, @"hello");
  419. // Test default bytes type.
  420. NSData *defaultBytes = [@"world" dataUsingEncoding:NSUTF8StringEncoding];
  421. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  422. XCTAssertFalse(message.hasDefaultString);
  423. fieldDescriptor = [descriptor fieldWithName:@"defaultBytes"];
  424. XCTAssertNotNil(fieldDescriptor);
  425. defaultValue = [fieldDescriptor defaultValue];
  426. [message setDefaultBytes:defaultValue.valueData];
  427. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  428. XCTAssertTrue(message.hasDefaultBytes);
  429. [message setDefaultBytes:nil];
  430. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  431. XCTAssertFalse(message.hasDefaultBytes);
  432. message.hasDefaultBytes = NO;
  433. XCTAssertFalse(message.hasDefaultBytes);
  434. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  435. // Test optional string.
  436. XCTAssertFalse(message.hasOptionalString);
  437. XCTAssertEqualObjects(message.optionalString, @"");
  438. XCTAssertFalse(message.hasOptionalString);
  439. message.optionalString = nil;
  440. XCTAssertFalse(message.hasOptionalString);
  441. XCTAssertEqualObjects(message.optionalString, @"");
  442. NSString *string = @"string";
  443. message.optionalString = string;
  444. XCTAssertEqualObjects(message.optionalString, string);
  445. XCTAssertTrue(message.hasOptionalString);
  446. message.optionalString = nil;
  447. XCTAssertFalse(message.hasOptionalString);
  448. XCTAssertEqualObjects(message.optionalString, @"");
  449. // Test optional data.
  450. XCTAssertFalse(message.hasOptionalBytes);
  451. XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
  452. XCTAssertFalse(message.hasOptionalBytes);
  453. message.optionalBytes = nil;
  454. XCTAssertFalse(message.hasOptionalBytes);
  455. XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
  456. NSData *data = [@"bytes" dataUsingEncoding:NSUTF8StringEncoding];
  457. message.optionalBytes = data;
  458. XCTAssertEqualObjects(message.optionalBytes, data);
  459. XCTAssertTrue(message.hasOptionalBytes);
  460. message.optionalBytes = nil;
  461. XCTAssertFalse(message.hasOptionalBytes);
  462. XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
  463. // Test lazy message setting
  464. XCTAssertFalse(message.hasOptionalLazyMessage);
  465. XCTAssertNotNil(message.optionalLazyMessage);
  466. XCTAssertFalse(message.hasOptionalLazyMessage);
  467. message.hasOptionalLazyMessage = NO;
  468. XCTAssertFalse(message.hasOptionalLazyMessage);
  469. XCTAssertNotNil(message.optionalLazyMessage);
  470. XCTAssertFalse(message.hasOptionalLazyMessage);
  471. message.optionalLazyMessage = nil;
  472. XCTAssertFalse(message.hasOptionalLazyMessage);
  473. // Test nested messages
  474. XCTAssertFalse(message.hasOptionalLazyMessage);
  475. message.optionalLazyMessage.bb = 1;
  476. XCTAssertTrue(message.hasOptionalLazyMessage);
  477. XCTAssertEqual(message.optionalLazyMessage.bb, 1);
  478. XCTAssertNotNil(message.optionalLazyMessage);
  479. message.optionalLazyMessage = nil;
  480. XCTAssertFalse(message.hasOptionalLazyMessage);
  481. XCTAssertEqual(message.optionalLazyMessage.bb, 0);
  482. XCTAssertFalse(message.hasOptionalLazyMessage);
  483. XCTAssertNotNil(message.optionalLazyMessage);
  484. // -testDefaultSubMessages tests the "defaulting" handling of fields
  485. // containing messages.
  486. }
  487. - (void)testRepeatedSetters {
  488. TestAllTypes *message = [TestAllTypes message];
  489. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  490. [self modifyRepeatedFields:message];
  491. [self assertRepeatedFieldsModified:message
  492. repeatedCount:kGPBDefaultRepeatCount];
  493. }
  494. - (void)testClear {
  495. TestAllTypes *message = [TestAllTypes message];
  496. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  497. [self clearAllFields:message];
  498. [self assertClear:message];
  499. TestAllTypes *message2 = [TestAllTypes message];
  500. XCTAssertEqualObjects(message, message2);
  501. }
  502. - (void)testClearKVC {
  503. TestAllTypes *message = [TestAllTypes message];
  504. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  505. [self clearAllFields:message];
  506. [self assertClear:message];
  507. [self assertClearKVC:message];
  508. }
  509. - (void)testClearExtension {
  510. // clearExtension() is not actually used in TestUtil, so try it manually.
  511. GPBMessage *message1 = [TestAllExtensions message];
  512. [message1 setExtension:[UnittestRoot optionalInt32Extension] value:@1];
  513. XCTAssertTrue([message1 hasExtension:[UnittestRoot optionalInt32Extension]]);
  514. [message1 clearExtension:[UnittestRoot optionalInt32Extension]];
  515. XCTAssertFalse([message1 hasExtension:[UnittestRoot optionalInt32Extension]]);
  516. GPBMessage *message2 = [TestAllExtensions message];
  517. [message2 addExtension:[UnittestRoot repeatedInt32Extension] value:@1];
  518. XCTAssertEqual(
  519. [[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
  520. (NSUInteger)1);
  521. [message2 clearExtension:[UnittestRoot repeatedInt32Extension]];
  522. XCTAssertEqual(
  523. [[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
  524. (NSUInteger)0);
  525. // Clearing an unset extension field shouldn't make the target message
  526. // visible.
  527. GPBMessage *message3 = [TestAllExtensions message];
  528. GPBMessage *extension_msg =
  529. [message3 getExtension:[UnittestObjcRoot recursiveExtension]];
  530. XCTAssertFalse([message3 hasExtension:[UnittestObjcRoot recursiveExtension]]);
  531. [extension_msg clearExtension:[UnittestRoot optionalInt32Extension]];
  532. XCTAssertFalse([message3 hasExtension:[UnittestObjcRoot recursiveExtension]]);
  533. }
  534. - (void)testDefaultingSubMessages {
  535. TestAllTypes *message = [TestAllTypes message];
  536. // Initially they should all not have values.
  537. XCTAssertFalse(message.hasOptionalGroup);
  538. XCTAssertFalse(message.hasOptionalNestedMessage);
  539. XCTAssertFalse(message.hasOptionalForeignMessage);
  540. XCTAssertFalse(message.hasOptionalImportMessage);
  541. XCTAssertFalse(message.hasOptionalPublicImportMessage);
  542. XCTAssertFalse(message.hasOptionalLazyMessage);
  543. // They should auto create something when fetched.
  544. TestAllTypes_OptionalGroup *optionalGroup = [message.optionalGroup retain];
  545. TestAllTypes_NestedMessage *optionalNestedMessage =
  546. [message.optionalNestedMessage retain];
  547. ForeignMessage *optionalForeignMessage =
  548. [message.optionalForeignMessage retain];
  549. ImportMessage *optionalImportMessage = [message.optionalImportMessage retain];
  550. PublicImportMessage *optionalPublicImportMessage =
  551. [message.optionalPublicImportMessage retain];
  552. TestAllTypes_NestedMessage *optionalLazyMessage =
  553. [message.optionalLazyMessage retain];
  554. XCTAssertNotNil(optionalGroup);
  555. XCTAssertNotNil(optionalNestedMessage);
  556. XCTAssertNotNil(optionalForeignMessage);
  557. XCTAssertNotNil(optionalImportMessage);
  558. XCTAssertNotNil(optionalPublicImportMessage);
  559. XCTAssertNotNil(optionalLazyMessage);
  560. // Although they were created, they should not respond to hasValue until that
  561. // submessage is mutated.
  562. XCTAssertFalse(message.hasOptionalGroup);
  563. XCTAssertFalse(message.hasOptionalNestedMessage);
  564. XCTAssertFalse(message.hasOptionalForeignMessage);
  565. XCTAssertFalse(message.hasOptionalImportMessage);
  566. XCTAssertFalse(message.hasOptionalPublicImportMessage);
  567. XCTAssertFalse(message.hasOptionalLazyMessage);
  568. // And they set that value back in to the message since the value created was
  569. // mutable (so a second fetch should give the same object).
  570. XCTAssertEqual(message.optionalGroup, optionalGroup);
  571. XCTAssertEqual(message.optionalNestedMessage, optionalNestedMessage);
  572. XCTAssertEqual(message.optionalForeignMessage, optionalForeignMessage);
  573. XCTAssertEqual(message.optionalImportMessage, optionalImportMessage);
  574. XCTAssertEqual(message.optionalPublicImportMessage,
  575. optionalPublicImportMessage);
  576. XCTAssertEqual(message.optionalLazyMessage, optionalLazyMessage);
  577. // And the default objects for a second message should be distinct (again,
  578. // since they are mutable, each needs their own copy).
  579. TestAllTypes *message2 = [TestAllTypes message];
  580. // Intentionally doing a pointer comparison.
  581. XCTAssertNotEqual(message2.optionalGroup, optionalGroup);
  582. XCTAssertNotEqual(message2.optionalNestedMessage, optionalNestedMessage);
  583. XCTAssertNotEqual(message2.optionalForeignMessage, optionalForeignMessage);
  584. XCTAssertNotEqual(message2.optionalImportMessage, optionalImportMessage);
  585. XCTAssertNotEqual(message2.optionalPublicImportMessage,
  586. optionalPublicImportMessage);
  587. XCTAssertNotEqual(message2.optionalLazyMessage, optionalLazyMessage);
  588. // Setting the values to nil will clear the has flag, and on next access you
  589. // get back new submessages.
  590. message.optionalGroup = nil;
  591. message.optionalNestedMessage = nil;
  592. message.optionalForeignMessage = nil;
  593. message.optionalImportMessage = nil;
  594. message.optionalPublicImportMessage = nil;
  595. message.optionalLazyMessage = nil;
  596. XCTAssertFalse(message.hasOptionalGroup);
  597. XCTAssertFalse(message.hasOptionalNestedMessage);
  598. XCTAssertFalse(message.hasOptionalForeignMessage);
  599. XCTAssertFalse(message.hasOptionalImportMessage);
  600. XCTAssertFalse(message.hasOptionalPublicImportMessage);
  601. XCTAssertFalse(message.hasOptionalLazyMessage);
  602. // Intentionally doing a pointer comparison.
  603. XCTAssertNotEqual(message.optionalGroup, optionalGroup);
  604. XCTAssertNotEqual(message.optionalNestedMessage, optionalNestedMessage);
  605. XCTAssertNotEqual(message.optionalForeignMessage, optionalForeignMessage);
  606. XCTAssertNotEqual(message.optionalImportMessage, optionalImportMessage);
  607. XCTAssertNotEqual(message.optionalPublicImportMessage,
  608. optionalPublicImportMessage);
  609. XCTAssertNotEqual(message.optionalLazyMessage, optionalLazyMessage);
  610. [optionalGroup release];
  611. [optionalNestedMessage release];
  612. [optionalForeignMessage release];
  613. [optionalImportMessage release];
  614. [optionalPublicImportMessage release];
  615. [optionalLazyMessage release];
  616. }
  617. - (void)testMultiplePointersToAutocreatedMessage {
  618. // Multiple objects pointing to the same autocreated message.
  619. TestAllTypes *message = [TestAllTypes message];
  620. TestAllTypes *message2 = [TestAllTypes message];
  621. message2.optionalGroup = message.optionalGroup;
  622. XCTAssertTrue([message2 hasOptionalGroup]);
  623. XCTAssertFalse([message hasOptionalGroup]);
  624. message2.optionalGroup.a = 42;
  625. XCTAssertTrue([message hasOptionalGroup]);
  626. XCTAssertTrue([message2 hasOptionalGroup]);
  627. }
  628. - (void)testCopyWithAutocreatedMessage {
  629. // Mutable copy should not copy autocreated messages.
  630. TestAllTypes *message = [TestAllTypes message];
  631. message.optionalGroup.a = 42;
  632. XCTAssertNotNil(message.optionalNestedMessage);
  633. TestAllTypes *message2 = [[message copy] autorelease];
  634. XCTAssertTrue([message2 hasOptionalGroup]);
  635. XCTAssertFalse([message2 hasOptionalNestedMessage]);
  636. // Intentionally doing a pointer comparison.
  637. XCTAssertNotEqual(message.optionalNestedMessage,
  638. message2.optionalNestedMessage);
  639. }
  640. - (void)testClearAutocreatedSubmessage {
  641. // Call clear on an intermediate submessage should cause it to get recreated
  642. // on the next call.
  643. TestRecursiveMessage *message = [TestRecursiveMessage message];
  644. TestRecursiveMessage *message_inner = [message.a.a.a retain];
  645. XCTAssertNotNil(message_inner);
  646. XCTAssertTrue(GPBWasMessageAutocreatedBy(message_inner, message.a.a));
  647. [message.a.a clear];
  648. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_inner, message.a.a));
  649. // Intentionally doing a pointer comparison.
  650. XCTAssertNotEqual(message.a.a.a, message_inner);
  651. [message_inner release];
  652. }
  653. - (void)testRetainAutocreatedSubmessage {
  654. // Should be able to retain autocreated submessage while the creator is
  655. // dealloced.
  656. TestAllTypes *message = [TestAllTypes message];
  657. ForeignMessage *subMessage;
  658. @autoreleasepool {
  659. TestAllTypes *message2 = [TestAllTypes message];
  660. subMessage = message2.optionalForeignMessage; // Autocreated
  661. message.optionalForeignMessage = subMessage;
  662. XCTAssertTrue(GPBWasMessageAutocreatedBy(message.optionalForeignMessage,
  663. message2));
  664. }
  665. // Should be the same object, and should still be live.
  666. XCTAssertEqual(message.optionalForeignMessage, subMessage);
  667. XCTAssertNotNil([subMessage description]);
  668. }
  669. - (void)testSetNilAutocreatedSubmessage {
  670. TestRecursiveMessage *message = [TestRecursiveMessage message];
  671. TestRecursiveMessage *message_inner = [message.a.a retain];
  672. XCTAssertFalse([message hasA]);
  673. XCTAssertFalse([message.a hasA]);
  674. message.a.a = nil;
  675. // |message.a| has to be made visible, but |message.a.a| was set to nil so
  676. // shouldn't be.
  677. XCTAssertTrue([message hasA]);
  678. XCTAssertFalse([message.a hasA]);
  679. // Setting submessage to nil should cause it to lose its creator.
  680. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_inner, message.a));
  681. // After setting to nil, getting it again should create a new autocreated
  682. // message.
  683. // Intentionally doing a pointer comparison.
  684. XCTAssertNotEqual(message.a.a, message_inner);
  685. [message_inner release];
  686. }
  687. - (void)testSetDoesntHaveAutocreatedSubmessage {
  688. // Clearing submessage (set has == NO) should NOT cause it to lose its
  689. // creator.
  690. TestAllTypes *message = [TestAllTypes message];
  691. TestAllTypes_NestedMessage *nestedMessage = message.optionalNestedMessage;
  692. XCTAssertFalse([message hasOptionalNestedMessage]);
  693. [message setHasOptionalNestedMessage:NO];
  694. XCTAssertFalse([message hasOptionalNestedMessage]);
  695. XCTAssertEqual(message.optionalNestedMessage, nestedMessage);
  696. }
  697. - (void)testSetAutocreatedMessageBecomesVisible {
  698. // Setting a value should cause the submessage to appear to its creator.
  699. // Test this several levels deep.
  700. TestRecursiveMessage *message = [TestRecursiveMessage message];
  701. message.a.a.a.a.i = 42;
  702. XCTAssertTrue([message hasA]);
  703. XCTAssertTrue([message.a hasA]);
  704. XCTAssertTrue([message.a.a hasA]);
  705. XCTAssertTrue([message.a.a.a hasA]);
  706. XCTAssertFalse([message.a.a.a.a hasA]);
  707. XCTAssertEqual(message.a.a.a.a.i, 42);
  708. }
  709. - (void)testClearUnsetFieldOfAutocreatedMessage {
  710. // Clearing an unset field should not cause the submessage to appear to its
  711. // creator.
  712. TestRecursiveMessage *message = [TestRecursiveMessage message];
  713. message.a.a.a.a.hasI = NO;
  714. XCTAssertFalse([message hasA]);
  715. XCTAssertFalse([message.a hasA]);
  716. XCTAssertFalse([message.a.a hasA]);
  717. XCTAssertFalse([message.a.a.a hasA]);
  718. }
  719. - (void)testAutocreatedSubmessageAssignSkip {
  720. TestRecursiveMessage *message = [TestRecursiveMessage message];
  721. TestRecursiveMessage *messageLevel1 = [message.a retain];
  722. TestRecursiveMessage *messageLevel2 = [message.a.a retain];
  723. TestRecursiveMessage *messageLevel3 = [message.a.a.a retain];
  724. TestRecursiveMessage *messageLevel4 = [message.a.a.a.a retain];
  725. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel1, message));
  726. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel2, messageLevel1));
  727. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel3, messageLevel2));
  728. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel4, messageLevel3));
  729. // Test skipping over an autocreated submessage and ensure it gets unset.
  730. message.a = message.a.a;
  731. XCTAssertEqual(message.a, messageLevel2);
  732. XCTAssertTrue([message hasA]);
  733. XCTAssertEqual(message.a.a, messageLevel3);
  734. XCTAssertFalse([message.a hasA]);
  735. XCTAssertEqual(message.a.a.a, messageLevel4);
  736. XCTAssertFalse(GPBWasMessageAutocreatedBy(messageLevel1,
  737. message)); // Because it was orphaned.
  738. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel2, messageLevel1));
  739. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel3, messageLevel2));
  740. [messageLevel1 release];
  741. [messageLevel2 release];
  742. [messageLevel3 release];
  743. [messageLevel4 release];
  744. }
  745. - (void)testAutocreatedSubmessageAssignLoop {
  746. TestRecursiveMessage *message = [TestRecursiveMessage message];
  747. TestRecursiveMessage *messageLevel1 = [message.a retain];
  748. TestRecursiveMessage *messageLevel2 = [message.a.a retain];
  749. TestRecursiveMessage *messageLevel3 = [message.a.a.a retain];
  750. TestRecursiveMessage *messageLevel4 = [message.a.a.a.a retain];
  751. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel1, message));
  752. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel2, messageLevel1));
  753. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel3, messageLevel2));
  754. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel4, messageLevel3));
  755. // Test a property with a loop. You'd never do this but at least ensure the
  756. // autocreated submessages behave sanely.
  757. message.a.a = message.a;
  758. XCTAssertTrue([message hasA]);
  759. XCTAssertEqual(message.a, messageLevel1);
  760. XCTAssertTrue([message.a hasA]);
  761. XCTAssertEqual(message.a.a, messageLevel1);
  762. XCTAssertTrue([message.a.a hasA]);
  763. XCTAssertEqual(message.a.a.a, messageLevel1);
  764. XCTAssertFalse(GPBWasMessageAutocreatedBy(messageLevel1,
  765. message)); // Because it was assigned.
  766. XCTAssertFalse(GPBWasMessageAutocreatedBy(messageLevel2,
  767. messageLevel1)); // Because it was orphaned.
  768. XCTAssertFalse([messageLevel2 hasA]);
  769. // Break the retain loop.
  770. message.a.a = nil;
  771. XCTAssertTrue([message hasA]);
  772. XCTAssertFalse([message.a hasA]);
  773. [messageLevel1 release];
  774. [messageLevel2 release];
  775. [messageLevel3 release];
  776. [messageLevel4 release];
  777. }
  778. - (void)testSetAutocreatedSubmessage {
  779. // Setting autocreated submessage to another value should cause the old one to
  780. // lose its creator.
  781. TestAllTypes *message = [TestAllTypes message];
  782. TestAllTypes_NestedMessage *nestedMessage =
  783. [message.optionalNestedMessage retain];
  784. message.optionalNestedMessage = [TestAllTypes_NestedMessage message];
  785. XCTAssertTrue([message hasOptionalNestedMessage]);
  786. XCTAssertTrue(message.optionalNestedMessage != nestedMessage);
  787. XCTAssertFalse(GPBWasMessageAutocreatedBy(nestedMessage, message));
  788. [nestedMessage release];
  789. }
  790. - (void)testAutocreatedUnknownFields {
  791. // Doing anything with (except reading) unknown fields should cause the
  792. // submessage to become visible.
  793. TestAllTypes *message = [TestAllTypes message];
  794. XCTAssertNotNil(message.optionalNestedMessage);
  795. XCTAssertFalse([message hasOptionalNestedMessage]);
  796. XCTAssertNil(message.optionalNestedMessage.unknownFields);
  797. XCTAssertFalse([message hasOptionalNestedMessage]);
  798. GPBUnknownFieldSet *unknownFields =
  799. [[[GPBUnknownFieldSet alloc] init] autorelease];
  800. message.optionalNestedMessage.unknownFields = unknownFields;
  801. XCTAssertTrue([message hasOptionalNestedMessage]);
  802. message.optionalNestedMessage = nil;
  803. XCTAssertFalse([message hasOptionalNestedMessage]);
  804. [message.optionalNestedMessage setUnknownFields:unknownFields];
  805. XCTAssertTrue([message hasOptionalNestedMessage]);
  806. }
  807. - (void)testSetAutocreatedSubmessageToSelf {
  808. // Setting submessage to itself should cause it to become visible.
  809. TestAllTypes *message = [TestAllTypes message];
  810. XCTAssertNotNil(message.optionalNestedMessage);
  811. XCTAssertFalse([message hasOptionalNestedMessage]);
  812. message.optionalNestedMessage = message.optionalNestedMessage;
  813. XCTAssertTrue([message hasOptionalNestedMessage]);
  814. }
  815. - (void)testAutocreatedSubmessageMemoryLeaks {
  816. // Test for memory leaks with autocreated submessages.
  817. TestRecursiveMessage *message;
  818. TestRecursiveMessage *messageLevel1;
  819. TestRecursiveMessage *messageLevel2;
  820. TestRecursiveMessage *messageLevel3;
  821. TestRecursiveMessage *messageLevel4;
  822. @autoreleasepool {
  823. message = [[TestRecursiveMessage alloc] init];
  824. messageLevel1 = [message.a retain];
  825. messageLevel2 = [message.a.a retain];
  826. messageLevel3 = [message.a.a.a retain];
  827. messageLevel4 = [message.a.a.a.a retain];
  828. message.a.i = 1;
  829. }
  830. XCTAssertEqual(message.retainCount, (NSUInteger)1);
  831. [message release];
  832. XCTAssertEqual(messageLevel1.retainCount, (NSUInteger)1);
  833. [messageLevel1 release];
  834. XCTAssertEqual(messageLevel2.retainCount, (NSUInteger)1);
  835. [messageLevel2 release];
  836. XCTAssertEqual(messageLevel3.retainCount, (NSUInteger)1);
  837. [messageLevel3 release];
  838. XCTAssertEqual(messageLevel4.retainCount, (NSUInteger)1);
  839. [messageLevel4 release];
  840. }
  841. - (void)testDefaultingArrays {
  842. // Basic tests for default creation of arrays in a message.
  843. TestRecursiveMessageWithRepeatedField *message =
  844. [TestRecursiveMessageWithRepeatedField message];
  845. TestRecursiveMessageWithRepeatedField *message2 =
  846. [TestRecursiveMessageWithRepeatedField message];
  847. // Simply accessing the array should not make any fields visible.
  848. XCTAssertNotNil(message.a.a.iArray);
  849. XCTAssertFalse([message hasA]);
  850. XCTAssertFalse([message.a hasA]);
  851. XCTAssertNotNil(message2.a.a.strArray);
  852. XCTAssertFalse([message2 hasA]);
  853. XCTAssertFalse([message2.a hasA]);
  854. // But adding an element to the array should.
  855. [message.a.a.iArray addValue:42];
  856. XCTAssertTrue([message hasA]);
  857. XCTAssertTrue([message.a hasA]);
  858. XCTAssertEqual([message.a.a.iArray count], (NSUInteger)1);
  859. [message2.a.a.strArray addObject:@"foo"];
  860. XCTAssertTrue([message2 hasA]);
  861. XCTAssertTrue([message2.a hasA]);
  862. XCTAssertEqual([message2.a.a.strArray count], (NSUInteger)1);
  863. }
  864. - (void)testAutocreatedArrayShared {
  865. // Multiple objects pointing to the same array.
  866. TestRecursiveMessageWithRepeatedField *message1a =
  867. [TestRecursiveMessageWithRepeatedField message];
  868. TestRecursiveMessageWithRepeatedField *message1b =
  869. [TestRecursiveMessageWithRepeatedField message];
  870. message1a.a.iArray = message1b.a.iArray;
  871. XCTAssertTrue([message1a hasA]);
  872. XCTAssertFalse([message1b hasA]);
  873. [message1a.a.iArray addValue:1];
  874. XCTAssertTrue([message1a hasA]);
  875. XCTAssertTrue([message1b hasA]);
  876. XCTAssertEqual(message1a.a.iArray, message1b.a.iArray);
  877. TestRecursiveMessageWithRepeatedField *message2a =
  878. [TestRecursiveMessageWithRepeatedField message];
  879. TestRecursiveMessageWithRepeatedField *message2b =
  880. [TestRecursiveMessageWithRepeatedField message];
  881. message2a.a.strArray = message2b.a.strArray;
  882. XCTAssertTrue([message2a hasA]);
  883. XCTAssertFalse([message2b hasA]);
  884. [message2a.a.strArray addObject:@"bar"];
  885. XCTAssertTrue([message2a hasA]);
  886. XCTAssertTrue([message2b hasA]);
  887. XCTAssertEqual(message2a.a.strArray, message2b.a.strArray);
  888. }
  889. - (void)testAutocreatedArrayCopy {
  890. // Copy should not copy autocreated arrays.
  891. TestAllTypes *message = [TestAllTypes message];
  892. XCTAssertNotNil(message.repeatedStringArray);
  893. XCTAssertNotNil(message.repeatedInt32Array);
  894. TestAllTypes *message2 = [[message copy] autorelease];
  895. // Pointer conparisions.
  896. XCTAssertNotEqual(message.repeatedStringArray, message2.repeatedStringArray);
  897. XCTAssertNotEqual(message.repeatedInt32Array, message2.repeatedInt32Array);
  898. // Mutable copy should copy empty arrays that were explicitly set (end up
  899. // with different objects that are equal).
  900. TestAllTypes *message3 = [TestAllTypes message];
  901. message3.repeatedInt32Array = [GPBInt32Array arrayWithValue:42];
  902. message3.repeatedStringArray = [NSMutableArray arrayWithObject:@"wee"];
  903. XCTAssertNotNil(message.repeatedInt32Array);
  904. XCTAssertNotNil(message.repeatedStringArray);
  905. TestAllTypes *message4 = [[message3 copy] autorelease];
  906. XCTAssertNotEqual(message3.repeatedInt32Array, message4.repeatedInt32Array);
  907. XCTAssertEqualObjects(message3.repeatedInt32Array,
  908. message4.repeatedInt32Array);
  909. XCTAssertNotEqual(message3.repeatedStringArray, message4.repeatedStringArray);
  910. XCTAssertEqualObjects(message3.repeatedStringArray,
  911. message4.repeatedStringArray);
  912. }
  913. - (void)testAutocreatedArrayRetain {
  914. // Should be able to retain autocreated array while the creator is dealloced.
  915. TestAllTypes *message = [TestAllTypes message];
  916. @autoreleasepool {
  917. TestAllTypes *message2 = [TestAllTypes message];
  918. message.repeatedInt32Array = message2.repeatedInt32Array;
  919. message.repeatedStringArray = message2.repeatedStringArray;
  920. // Pointer conparision
  921. XCTAssertEqual(message.repeatedInt32Array->_autocreator, message2);
  922. XCTAssertTrue([message.repeatedStringArray
  923. isKindOfClass:[GPBAutocreatedArray class]]);
  924. XCTAssertEqual(
  925. ((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator,
  926. message2);
  927. }
  928. XCTAssertNil(message.repeatedInt32Array->_autocreator);
  929. XCTAssertTrue(
  930. [message.repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
  931. XCTAssertNil(
  932. ((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator);
  933. }
  934. - (void)testSetNilAutocreatedArray {
  935. // Setting array to nil should cause it to lose its delegate.
  936. TestAllTypes *message = [TestAllTypes message];
  937. GPBInt32Array *repeatedInt32Array = [message.repeatedInt32Array retain];
  938. GPBAutocreatedArray *repeatedStringArray =
  939. (GPBAutocreatedArray *)[message.repeatedStringArray retain];
  940. XCTAssertTrue([repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
  941. XCTAssertEqual(repeatedInt32Array->_autocreator, message);
  942. XCTAssertEqual(repeatedStringArray->_autocreator, message);
  943. message.repeatedInt32Array = nil;
  944. message.repeatedStringArray = nil;
  945. XCTAssertNil(repeatedInt32Array->_autocreator);
  946. XCTAssertNil(repeatedStringArray->_autocreator);
  947. [repeatedInt32Array release];
  948. [repeatedStringArray release];
  949. }
  950. - (void)testReplaceAutocreatedArray {
  951. // Replacing array should orphan the old one and cause its creator to become
  952. // visible.
  953. {
  954. TestRecursiveMessageWithRepeatedField *message =
  955. [TestRecursiveMessageWithRepeatedField message];
  956. XCTAssertNotNil(message.a);
  957. XCTAssertNotNil(message.a.iArray);
  958. XCTAssertFalse([message hasA]);
  959. GPBInt32Array *iArray = [message.a.iArray retain];
  960. XCTAssertEqual(iArray->_autocreator, message.a); // Pointer comparision
  961. message.a.iArray = [GPBInt32Array arrayWithValue:1];
  962. XCTAssertTrue([message hasA]);
  963. XCTAssertNotEqual(message.a.iArray, iArray); // Pointer comparision
  964. XCTAssertNil(iArray->_autocreator);
  965. [iArray release];
  966. }
  967. {
  968. TestRecursiveMessageWithRepeatedField *message =
  969. [TestRecursiveMessageWithRepeatedField message];
  970. XCTAssertNotNil(message.a);
  971. XCTAssertNotNil(message.a.strArray);
  972. XCTAssertFalse([message hasA]);
  973. GPBAutocreatedArray *strArray =
  974. (GPBAutocreatedArray *)[message.a.strArray retain];
  975. XCTAssertTrue([strArray isKindOfClass:[GPBAutocreatedArray class]]);
  976. XCTAssertEqual(strArray->_autocreator, message.a); // Pointer comparision
  977. message.a.strArray = [NSMutableArray arrayWithObject:@"foo"];
  978. XCTAssertTrue([message hasA]);
  979. XCTAssertNotEqual(message.a.strArray, strArray); // Pointer comparision
  980. XCTAssertNil(strArray->_autocreator);
  981. [strArray release];
  982. }
  983. }
  984. - (void)testSetAutocreatedArrayToSelf {
  985. // Setting array to itself should cause it to become visible.
  986. {
  987. TestRecursiveMessageWithRepeatedField *message =
  988. [TestRecursiveMessageWithRepeatedField message];
  989. XCTAssertNotNil(message.a);
  990. XCTAssertNotNil(message.a.iArray);
  991. XCTAssertFalse([message hasA]);
  992. message.a.iArray = message.a.iArray;
  993. XCTAssertTrue([message hasA]);
  994. XCTAssertNil(message.a.iArray->_autocreator);
  995. }
  996. {
  997. TestRecursiveMessageWithRepeatedField *message =
  998. [TestRecursiveMessageWithRepeatedField message];
  999. XCTAssertNotNil(message.a);
  1000. XCTAssertNotNil(message.a.strArray);
  1001. XCTAssertFalse([message hasA]);
  1002. message.a.strArray = message.a.strArray;
  1003. XCTAssertTrue([message hasA]);
  1004. XCTAssertTrue([message.a.strArray isKindOfClass:[GPBAutocreatedArray class]]);
  1005. XCTAssertNil(((GPBAutocreatedArray *)message.a.strArray)->_autocreator);
  1006. }
  1007. }
  1008. - (void)testAutocreatedArrayRemoveAllValues {
  1009. // Calling removeAllValues on autocreated array should not cause it to be
  1010. // visible.
  1011. TestRecursiveMessageWithRepeatedField *message =
  1012. [TestRecursiveMessageWithRepeatedField message];
  1013. [message.a.iArray removeAll];
  1014. XCTAssertFalse([message hasA]);
  1015. [message.a.strArray removeAllObjects];
  1016. XCTAssertFalse([message hasA]);
  1017. }
  1018. - (void)testDefaultingMaps {
  1019. // Basic tests for default creation of maps in a message.
  1020. TestRecursiveMessageWithRepeatedField *message =
  1021. [TestRecursiveMessageWithRepeatedField message];
  1022. TestRecursiveMessageWithRepeatedField *message2 =
  1023. [TestRecursiveMessageWithRepeatedField message];
  1024. // Simply accessing the map should not make any fields visible.
  1025. XCTAssertNotNil(message.a.a.iToI);
  1026. XCTAssertFalse([message hasA]);
  1027. XCTAssertFalse([message.a hasA]);
  1028. XCTAssertNotNil(message2.a.a.strToStr);
  1029. XCTAssertFalse([message2 hasA]);
  1030. XCTAssertFalse([message2.a hasA]);
  1031. // But adding an element to the map should.
  1032. [message.a.a.iToI setValue:100 forKey:200];
  1033. XCTAssertTrue([message hasA]);
  1034. XCTAssertTrue([message.a hasA]);
  1035. XCTAssertEqual([message.a.a.iToI count], (NSUInteger)1);
  1036. [message2.a.a.strToStr setObject:@"foo" forKey:@"bar"];
  1037. XCTAssertTrue([message2 hasA]);
  1038. XCTAssertTrue([message2.a hasA]);
  1039. XCTAssertEqual([message2.a.a.strToStr count], (NSUInteger)1);
  1040. }
  1041. - (void)testAutocreatedMapShared {
  1042. // Multiple objects pointing to the same map.
  1043. TestRecursiveMessageWithRepeatedField *message1a =
  1044. [TestRecursiveMessageWithRepeatedField message];
  1045. TestRecursiveMessageWithRepeatedField *message1b =
  1046. [TestRecursiveMessageWithRepeatedField message];
  1047. message1a.a.iToI = message1b.a.iToI;
  1048. XCTAssertTrue([message1a hasA]);
  1049. XCTAssertFalse([message1b hasA]);
  1050. [message1a.a.iToI setValue:1 forKey:2];
  1051. XCTAssertTrue([message1a hasA]);
  1052. XCTAssertTrue([message1b hasA]);
  1053. XCTAssertEqual(message1a.a.iToI, message1b.a.iToI);
  1054. TestRecursiveMessageWithRepeatedField *message2a =
  1055. [TestRecursiveMessageWithRepeatedField message];
  1056. TestRecursiveMessageWithRepeatedField *message2b =
  1057. [TestRecursiveMessageWithRepeatedField message];
  1058. message2a.a.strToStr = message2b.a.strToStr;
  1059. XCTAssertTrue([message2a hasA]);
  1060. XCTAssertFalse([message2b hasA]);
  1061. [message2a.a.strToStr setObject:@"bar" forKey:@"foo"];
  1062. XCTAssertTrue([message2a hasA]);
  1063. XCTAssertTrue([message2b hasA]);
  1064. XCTAssertEqual(message2a.a.strToStr, message2b.a.strToStr);
  1065. }
  1066. - (void)testAutocreatedMapCopy {
  1067. // Copy should not copy autocreated maps.
  1068. TestRecursiveMessageWithRepeatedField *message =
  1069. [TestRecursiveMessageWithRepeatedField message];
  1070. XCTAssertNotNil(message.strToStr);
  1071. XCTAssertNotNil(message.iToI);
  1072. TestRecursiveMessageWithRepeatedField *message2 =
  1073. [[message copy] autorelease];
  1074. // Pointer conparisions.
  1075. XCTAssertNotEqual(message.strToStr, message2.strToStr);
  1076. XCTAssertNotEqual(message.iToI, message2.iToI);
  1077. // Mutable copy should copy empty arrays that were explicitly set (end up
  1078. // with different objects that are equal).
  1079. TestRecursiveMessageWithRepeatedField *message3 =
  1080. [TestRecursiveMessageWithRepeatedField message];
  1081. message3.iToI = [GPBInt32Int32Dictionary dictionaryWithValue:10 forKey:20];
  1082. message3.strToStr =
  1083. [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"123"];
  1084. XCTAssertNotNil(message.iToI);
  1085. XCTAssertNotNil(message.iToI);
  1086. TestRecursiveMessageWithRepeatedField *message4 =
  1087. [[message3 copy] autorelease];
  1088. XCTAssertNotEqual(message3.iToI, message4.iToI);
  1089. XCTAssertEqualObjects(message3.iToI, message4.iToI);
  1090. XCTAssertNotEqual(message3.strToStr, message4.strToStr);
  1091. XCTAssertEqualObjects(message3.strToStr, message4.strToStr);
  1092. }
  1093. - (void)testAutocreatedMapRetain {
  1094. // Should be able to retain autocreated map while the creator is dealloced.
  1095. TestRecursiveMessageWithRepeatedField *message =
  1096. [TestRecursiveMessageWithRepeatedField message];
  1097. @autoreleasepool {
  1098. TestRecursiveMessageWithRepeatedField *message2 =
  1099. [TestRecursiveMessageWithRepeatedField message];
  1100. message.iToI = message2.iToI;
  1101. message.strToStr = message2.strToStr;
  1102. // Pointer conparision
  1103. XCTAssertEqual(message.iToI->_autocreator, message2);
  1104. XCTAssertTrue([message.strToStr
  1105. isKindOfClass:[GPBAutocreatedDictionary class]]);
  1106. XCTAssertEqual(
  1107. ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator,
  1108. message2);
  1109. }
  1110. XCTAssertNil(message.iToI->_autocreator);
  1111. XCTAssertTrue(
  1112. [message.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1113. XCTAssertNil(
  1114. ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator);
  1115. }
  1116. - (void)testSetNilAutocreatedMap {
  1117. // Setting map to nil should cause it to lose its delegate.
  1118. TestRecursiveMessageWithRepeatedField *message =
  1119. [TestRecursiveMessageWithRepeatedField message];
  1120. GPBInt32Int32Dictionary *iToI = [message.iToI retain];
  1121. GPBAutocreatedDictionary *strToStr =
  1122. (GPBAutocreatedDictionary *)[message.strToStr retain];
  1123. XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1124. XCTAssertEqual(iToI->_autocreator, message);
  1125. XCTAssertEqual(strToStr->_autocreator, message);
  1126. message.iToI = nil;
  1127. message.strToStr = nil;
  1128. XCTAssertNil(iToI->_autocreator);
  1129. XCTAssertNil(strToStr->_autocreator);
  1130. [iToI release];
  1131. [strToStr release];
  1132. }
  1133. - (void)testReplaceAutocreatedMap {
  1134. // Replacing map should orphan the old one and cause its creator to become
  1135. // visible.
  1136. {
  1137. TestRecursiveMessageWithRepeatedField *message =
  1138. [TestRecursiveMessageWithRepeatedField message];
  1139. XCTAssertNotNil(message.a);
  1140. XCTAssertNotNil(message.a.iToI);
  1141. XCTAssertFalse([message hasA]);
  1142. GPBInt32Int32Dictionary *iToI = [message.a.iToI retain];
  1143. XCTAssertEqual(iToI->_autocreator, message.a); // Pointer comparision
  1144. message.a.iToI = [GPBInt32Int32Dictionary dictionaryWithValue:6 forKey:7];
  1145. XCTAssertTrue([message hasA]);
  1146. XCTAssertNotEqual(message.a.iToI, iToI); // Pointer comparision
  1147. XCTAssertNil(iToI->_autocreator);
  1148. [iToI release];
  1149. }
  1150. {
  1151. TestRecursiveMessageWithRepeatedField *message =
  1152. [TestRecursiveMessageWithRepeatedField message];
  1153. XCTAssertNotNil(message.a);
  1154. XCTAssertNotNil(message.a.strToStr);
  1155. XCTAssertFalse([message hasA]);
  1156. GPBAutocreatedDictionary *strToStr =
  1157. (GPBAutocreatedDictionary *)[message.a.strToStr retain];
  1158. XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1159. XCTAssertEqual(strToStr->_autocreator, message.a); // Pointer comparision
  1160. message.a.strToStr =
  1161. [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"def"];
  1162. XCTAssertTrue([message hasA]);
  1163. XCTAssertNotEqual(message.a.strToStr, strToStr); // Pointer comparision
  1164. XCTAssertNil(strToStr->_autocreator);
  1165. [strToStr release];
  1166. }
  1167. }
  1168. - (void)testSetAutocreatedMapToSelf {
  1169. // Setting map to itself should cause it to become visible.
  1170. {
  1171. TestRecursiveMessageWithRepeatedField *message =
  1172. [TestRecursiveMessageWithRepeatedField message];
  1173. XCTAssertNotNil(message.a);
  1174. XCTAssertNotNil(message.a.iToI);
  1175. XCTAssertFalse([message hasA]);
  1176. message.a.iToI = message.a.iToI;
  1177. XCTAssertTrue([message hasA]);
  1178. XCTAssertNil(message.a.iToI->_autocreator);
  1179. }
  1180. {
  1181. TestRecursiveMessageWithRepeatedField *message =
  1182. [TestRecursiveMessageWithRepeatedField message];
  1183. XCTAssertNotNil(message.a);
  1184. XCTAssertNotNil(message.a.strToStr);
  1185. XCTAssertFalse([message hasA]);
  1186. message.a.strToStr = message.a.strToStr;
  1187. XCTAssertTrue([message hasA]);
  1188. XCTAssertTrue([message.a.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1189. XCTAssertNil(((GPBAutocreatedDictionary *)message.a.strToStr)->_autocreator);
  1190. }
  1191. }
  1192. - (void)testAutocreatedMapRemoveAllValues {
  1193. // Calling removeAll on autocreated map should not cause it to be visible.
  1194. TestRecursiveMessageWithRepeatedField *message =
  1195. [TestRecursiveMessageWithRepeatedField message];
  1196. [message.a.iToI removeAll];
  1197. XCTAssertFalse([message hasA]);
  1198. [message.a.strToStr removeAllObjects];
  1199. XCTAssertFalse([message hasA]);
  1200. }
  1201. - (void)testExtensionAccessors {
  1202. TestAllExtensions *message = [TestAllExtensions message];
  1203. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1204. [self assertAllExtensionsSet:message repeatedCount:kGPBDefaultRepeatCount];
  1205. }
  1206. - (void)testExtensionRepeatedSetters {
  1207. TestAllExtensions *message = [TestAllExtensions message];
  1208. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1209. [self modifyRepeatedExtensions:message];
  1210. [self assertRepeatedExtensionsModified:message
  1211. repeatedCount:kGPBDefaultRepeatCount];
  1212. }
  1213. - (void)testExtensionDefaults {
  1214. [self assertExtensionsClear:[TestAllExtensions message]];
  1215. }
  1216. - (void)testExtensionIsEquals {
  1217. TestAllExtensions *message = [TestAllExtensions message];
  1218. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1219. [self modifyRepeatedExtensions:message];
  1220. TestAllExtensions *message2 = [TestAllExtensions message];
  1221. [self setAllExtensions:message2 repeatedCount:kGPBDefaultRepeatCount];
  1222. XCTAssertFalse([message isEqual:message2]);
  1223. message2 = [TestAllExtensions message];
  1224. [self setAllExtensions:message2 repeatedCount:kGPBDefaultRepeatCount];
  1225. [self modifyRepeatedExtensions:message2];
  1226. XCTAssertEqualObjects(message, message2);
  1227. }
  1228. - (void)testExtensionsMergeFrom {
  1229. TestAllExtensions *message = [TestAllExtensions message];
  1230. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1231. [self modifyRepeatedExtensions:message];
  1232. message = [TestAllExtensions message];
  1233. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1234. TestAllExtensions *message2 = [TestAllExtensions message];
  1235. [self modifyRepeatedExtensions:message2];
  1236. [message2 mergeFrom:message];
  1237. XCTAssertEqualObjects(message, message2);
  1238. }
  1239. - (void)testDefaultingExtensionMessages {
  1240. TestAllExtensions *message = [TestAllExtensions message];
  1241. // Initially they should all not have values.
  1242. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1243. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1244. XCTAssertFalse(
  1245. [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1246. XCTAssertFalse(
  1247. [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1248. XCTAssertFalse(
  1249. [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1250. XCTAssertFalse([message
  1251. hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1252. XCTAssertFalse(
  1253. [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1254. // They should auto create something when fetched.
  1255. TestAllTypes_OptionalGroup *optionalGroup =
  1256. [message getExtension:[UnittestRoot optionalGroupExtension]];
  1257. TestAllTypes_NestedMessage *optionalNestedMessage =
  1258. [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
  1259. ForeignMessage *optionalForeignMessage =
  1260. [message getExtension:[UnittestRoot optionalForeignMessageExtension]];
  1261. ImportMessage *optionalImportMessage =
  1262. [message getExtension:[UnittestRoot optionalImportMessageExtension]];
  1263. PublicImportMessage *optionalPublicImportMessage = [message
  1264. getExtension:[UnittestRoot optionalPublicImportMessageExtension]];
  1265. TestAllTypes_NestedMessage *optionalLazyMessage =
  1266. [message getExtension:[UnittestRoot optionalLazyMessageExtension]];
  1267. XCTAssertNotNil(optionalGroup);
  1268. XCTAssertNotNil(optionalNestedMessage);
  1269. XCTAssertNotNil(optionalForeignMessage);
  1270. XCTAssertNotNil(optionalImportMessage);
  1271. XCTAssertNotNil(optionalPublicImportMessage);
  1272. XCTAssertNotNil(optionalLazyMessage);
  1273. // Although it auto-created empty messages, it should not show that it has
  1274. // them.
  1275. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1276. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1277. XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1278. XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1279. XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1280. XCTAssertFalse([message hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1281. XCTAssertFalse([message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1282. // And they set that value back in to the message since the value created was
  1283. // mutable (so a second fetch should give the same object).
  1284. XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
  1285. optionalGroup);
  1286. XCTAssertEqual(
  1287. [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1288. optionalNestedMessage);
  1289. XCTAssertEqual(
  1290. [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1291. optionalForeignMessage);
  1292. XCTAssertEqual(
  1293. [message getExtension:[UnittestRoot optionalImportMessageExtension]],
  1294. optionalImportMessage);
  1295. XCTAssertEqual(
  1296. [message getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1297. optionalPublicImportMessage);
  1298. XCTAssertEqual(
  1299. [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1300. optionalLazyMessage);
  1301. // And the default objects for a second message should be distinct (again,
  1302. // since they are mutable, each needs their own copy).
  1303. TestAllExtensions *message2 = [TestAllExtensions message];
  1304. // Intentionally doing a pointer comparison.
  1305. XCTAssertNotEqual(
  1306. [message2 getExtension:[UnittestRoot optionalGroupExtension]],
  1307. optionalGroup);
  1308. XCTAssertNotEqual(
  1309. [message2 getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1310. optionalNestedMessage);
  1311. XCTAssertNotEqual(
  1312. [message2 getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1313. optionalForeignMessage);
  1314. XCTAssertNotEqual(
  1315. [message2 getExtension:[UnittestRoot optionalImportMessageExtension]],
  1316. optionalImportMessage);
  1317. XCTAssertNotEqual(
  1318. [message2 getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1319. optionalPublicImportMessage);
  1320. XCTAssertNotEqual(
  1321. [message2 getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1322. optionalLazyMessage);
  1323. // Clear values, and on next access you get back new submessages.
  1324. [message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
  1325. [message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
  1326. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  1327. value:nil];
  1328. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  1329. value:nil];
  1330. [message setExtension:[UnittestRoot optionalImportMessageExtension]
  1331. value:nil];
  1332. [message setExtension:[UnittestRoot optionalPublicImportMessageExtension]
  1333. value:nil];
  1334. [message setExtension:[UnittestRoot optionalLazyMessageExtension] value:nil];
  1335. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1336. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1337. XCTAssertFalse(
  1338. [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1339. XCTAssertFalse(
  1340. [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1341. XCTAssertFalse(
  1342. [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1343. XCTAssertFalse([message
  1344. hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1345. XCTAssertFalse(
  1346. [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1347. XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
  1348. optionalGroup);
  1349. XCTAssertEqual(
  1350. [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1351. optionalNestedMessage);
  1352. XCTAssertEqual(
  1353. [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1354. optionalForeignMessage);
  1355. XCTAssertEqual(
  1356. [message getExtension:[UnittestRoot optionalImportMessageExtension]],
  1357. optionalImportMessage);
  1358. XCTAssertEqual(
  1359. [message
  1360. getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1361. optionalPublicImportMessage);
  1362. XCTAssertEqual(
  1363. [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1364. optionalLazyMessage);
  1365. }
  1366. - (void)testMultiplePointersToAutocreatedExtension {
  1367. // 2 objects point to the same auto-created extension. One should "has" it.
  1368. // The other should not.
  1369. TestAllExtensions *message = [TestAllExtensions message];
  1370. TestAllExtensions *message2 = [TestAllExtensions message];
  1371. GPBExtensionDescriptor *extension = [UnittestRoot optionalGroupExtension];
  1372. [message setExtension:extension value:[message2 getExtension:extension]];
  1373. XCTAssertEqual([message getExtension:extension],
  1374. [message2 getExtension:extension]);
  1375. XCTAssertFalse([message2 hasExtension:extension]);
  1376. XCTAssertTrue([message hasExtension:extension]);
  1377. TestAllTypes_OptionalGroup *extensionValue =
  1378. [message2 getExtension:extension];
  1379. extensionValue.a = 1;
  1380. XCTAssertTrue([message2 hasExtension:extension]);
  1381. XCTAssertTrue([message hasExtension:extension]);
  1382. }
  1383. - (void)testCopyWithAutocreatedExtension {
  1384. // Mutable copy shouldn't copy autocreated extensions.
  1385. TestAllExtensions *message = [TestAllExtensions message];
  1386. GPBExtensionDescriptor *optionalGroupExtension =
  1387. [UnittestRoot optionalGroupExtension];
  1388. GPBExtensionDescriptor *optionalNestedMessageExtesion =
  1389. [UnittestRoot optionalNestedMessageExtension];
  1390. TestAllTypes_OptionalGroup *optionalGroup =
  1391. [message getExtension:optionalGroupExtension];
  1392. optionalGroup.a = 42;
  1393. XCTAssertNotNil(optionalGroup);
  1394. XCTAssertNotNil([message getExtension:optionalNestedMessageExtesion]);
  1395. XCTAssertTrue([message hasExtension:optionalGroupExtension]);
  1396. XCTAssertFalse([message hasExtension:optionalNestedMessageExtesion]);
  1397. TestAllExtensions *message2 = [[message copy] autorelease];
  1398. // message2 should end up with its own copy of the optional group.
  1399. XCTAssertTrue([message2 hasExtension:optionalGroupExtension]);
  1400. XCTAssertEqualObjects([message getExtension:optionalGroupExtension],
  1401. [message2 getExtension:optionalGroupExtension]);
  1402. // Intentionally doing a pointer comparison.
  1403. XCTAssertNotEqual([message getExtension:optionalGroupExtension],
  1404. [message2 getExtension:optionalGroupExtension]);
  1405. XCTAssertFalse([message2 hasExtension:optionalNestedMessageExtesion]);
  1406. // Intentionally doing a pointer comparison (auto creation should be
  1407. // different)
  1408. XCTAssertNotEqual([message getExtension:optionalNestedMessageExtesion],
  1409. [message2 getExtension:optionalNestedMessageExtesion]);
  1410. }
  1411. - (void)testClearMessageAutocreatedExtension {
  1412. // Call clear should cause it to recreate its autocreated extensions.
  1413. TestAllExtensions *message = [TestAllExtensions message];
  1414. GPBExtensionDescriptor *optionalGroupExtension =
  1415. [UnittestRoot optionalGroupExtension];
  1416. TestAllTypes_OptionalGroup *optionalGroup =
  1417. [[message getExtension:optionalGroupExtension] retain];
  1418. [message clear];
  1419. TestAllTypes_OptionalGroup *optionalGroupNew =
  1420. [message getExtension:optionalGroupExtension];
  1421. // Intentionally doing a pointer comparison.
  1422. XCTAssertNotEqual(optionalGroup, optionalGroupNew);
  1423. [optionalGroup release];
  1424. }
  1425. - (void)testRetainAutocreatedExtension {
  1426. // Should be able to retain autocreated extension while the creator is
  1427. // dealloced.
  1428. TestAllExtensions *message = [TestAllExtensions message];
  1429. GPBExtensionDescriptor *optionalGroupExtension =
  1430. [UnittestRoot optionalGroupExtension];
  1431. @autoreleasepool {
  1432. TestAllExtensions *message2 = [TestAllExtensions message];
  1433. [message setExtension:optionalGroupExtension
  1434. value:[message2 getExtension:optionalGroupExtension]];
  1435. XCTAssertTrue(GPBWasMessageAutocreatedBy(
  1436. [message getExtension:optionalGroupExtension], message2));
  1437. }
  1438. XCTAssertFalse(GPBWasMessageAutocreatedBy(
  1439. [message getExtension:optionalGroupExtension], message));
  1440. }
  1441. - (void)testClearAutocreatedExtension {
  1442. // Clearing autocreated extension should NOT cause it to lose its creator.
  1443. TestAllExtensions *message = [TestAllExtensions message];
  1444. GPBExtensionDescriptor *optionalGroupExtension =
  1445. [UnittestRoot optionalGroupExtension];
  1446. TestAllTypes_OptionalGroup *optionalGroup =
  1447. [[message getExtension:optionalGroupExtension] retain];
  1448. [message clearExtension:optionalGroupExtension];
  1449. TestAllTypes_OptionalGroup *optionalGroupNew =
  1450. [message getExtension:optionalGroupExtension];
  1451. XCTAssertEqual(optionalGroup, optionalGroupNew);
  1452. XCTAssertFalse([message hasExtension:optionalGroupExtension]);
  1453. [optionalGroup release];
  1454. // Clearing autocreated extension should not cause its creator to become
  1455. // visible
  1456. GPBExtensionDescriptor *recursiveExtension =
  1457. [UnittestObjcRoot recursiveExtension];
  1458. TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
  1459. TestAllExtensions *message_lvl3 =
  1460. [message_lvl2 getExtension:recursiveExtension];
  1461. [message_lvl3 clearExtension:recursiveExtension];
  1462. XCTAssertFalse([message hasExtension:recursiveExtension]);
  1463. }
  1464. - (void)testSetAutocreatedExtensionBecomesVisible {
  1465. // Setting an extension should cause the extension to appear to its creator.
  1466. // Test this several levels deep.
  1467. TestAllExtensions *message = [TestAllExtensions message];
  1468. GPBExtensionDescriptor *recursiveExtension =
  1469. [UnittestObjcRoot recursiveExtension];
  1470. TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
  1471. TestAllExtensions *message_lvl3 =
  1472. [message_lvl2 getExtension:recursiveExtension];
  1473. TestAllExtensions *message_lvl4 =
  1474. [message_lvl3 getExtension:recursiveExtension];
  1475. XCTAssertFalse([message hasExtension:recursiveExtension]);
  1476. XCTAssertFalse([message_lvl2 hasExtension:recursiveExtension]);
  1477. XCTAssertFalse([message_lvl3 hasExtension:recursiveExtension]);
  1478. XCTAssertFalse([message_lvl4 hasExtension:recursiveExtension]);
  1479. [message_lvl4 setExtension:[UnittestRoot optionalInt32Extension] value:@(1)];
  1480. XCTAssertTrue([message hasExtension:recursiveExtension]);
  1481. XCTAssertTrue([message_lvl2 hasExtension:recursiveExtension]);
  1482. XCTAssertTrue([message_lvl3 hasExtension:recursiveExtension]);
  1483. XCTAssertFalse([message_lvl4 hasExtension:recursiveExtension]);
  1484. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl4, message_lvl3));
  1485. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl3, message_lvl2));
  1486. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl2, message));
  1487. }
  1488. - (void)testSetAutocreatedExtensionToSelf {
  1489. // Setting extension to itself should cause it to become visible.
  1490. TestAllExtensions *message = [TestAllExtensions message];
  1491. GPBExtensionDescriptor *optionalGroupExtension =
  1492. [UnittestRoot optionalGroupExtension];
  1493. XCTAssertNotNil([message getExtension:optionalGroupExtension]);
  1494. XCTAssertFalse([message hasExtension:optionalGroupExtension]);
  1495. [message setExtension:optionalGroupExtension
  1496. value:[message getExtension:optionalGroupExtension]];
  1497. XCTAssertTrue([message hasExtension:optionalGroupExtension]);
  1498. }
  1499. - (void)testAutocreatedExtensionMemoryLeaks {
  1500. GPBExtensionDescriptor *recursiveExtension =
  1501. [UnittestObjcRoot recursiveExtension];
  1502. // Test for memory leaks with autocreated extensions.
  1503. TestAllExtensions *message;
  1504. TestAllExtensions *message_lvl2;
  1505. TestAllExtensions *message_lvl3;
  1506. TestAllExtensions *message_lvl4;
  1507. @autoreleasepool {
  1508. message = [[TestAllExtensions alloc] init];
  1509. message_lvl2 = [[message getExtension:recursiveExtension] retain];
  1510. message_lvl3 = [[message_lvl2 getExtension:recursiveExtension] retain];
  1511. message_lvl4 = [[message_lvl3 getExtension:recursiveExtension] retain];
  1512. [message_lvl2 setExtension:[UnittestRoot optionalInt32Extension]
  1513. value:@(1)];
  1514. }
  1515. XCTAssertEqual(message.retainCount, (NSUInteger)1);
  1516. @autoreleasepool {
  1517. [message release];
  1518. }
  1519. XCTAssertEqual(message_lvl2.retainCount, (NSUInteger)1);
  1520. @autoreleasepool {
  1521. [message_lvl2 release];
  1522. }
  1523. XCTAssertEqual(message_lvl3.retainCount, (NSUInteger)1);
  1524. @autoreleasepool {
  1525. [message_lvl3 release];
  1526. }
  1527. XCTAssertEqual(message_lvl4.retainCount, (NSUInteger)1);
  1528. [message_lvl4 release];
  1529. }
  1530. - (void)testSetExtensionWithAutocreatedValue {
  1531. GPBExtensionDescriptor *recursiveExtension =
  1532. [UnittestObjcRoot recursiveExtension];
  1533. TestAllExtensions *message;
  1534. @autoreleasepool {
  1535. message = [[TestAllExtensions alloc] init];
  1536. [message getExtension:recursiveExtension];
  1537. }
  1538. // This statements checks that the extension value isn't accidentally
  1539. // dealloced when removing it from the autocreated map.
  1540. [message setExtension:recursiveExtension
  1541. value:[message getExtension:recursiveExtension]];
  1542. XCTAssertTrue([message hasExtension:recursiveExtension]);
  1543. [message release];
  1544. }
  1545. - (void)testRecursion {
  1546. TestRecursiveMessage *message = [TestRecursiveMessage message];
  1547. XCTAssertNotNil(message.a);
  1548. XCTAssertNotNil(message.a.a);
  1549. XCTAssertEqual(message.a.a.i, 0);
  1550. }
  1551. - (void)testGenerateAndParseUnknownMessage {
  1552. GPBUnknownFieldSet *unknowns =
  1553. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1554. [unknowns mergeVarintField:123 value:456];
  1555. GPBMessage *message = [GPBMessage message];
  1556. [message setUnknownFields:unknowns];
  1557. NSData *data = [message data];
  1558. GPBMessage *message2 =
  1559. [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
  1560. XCTAssertEqualObjects(message, message2);
  1561. }
  1562. - (void)testDelimitedWriteAndParseMultipleMessages {
  1563. GPBUnknownFieldSet *unknowns1 =
  1564. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1565. [unknowns1 mergeVarintField:123 value:456];
  1566. GPBMessage *message1 = [GPBMessage message];
  1567. [message1 setUnknownFields:unknowns1];
  1568. GPBUnknownFieldSet *unknowns2 =
  1569. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1570. [unknowns2 mergeVarintField:789 value:987];
  1571. [unknowns2 mergeVarintField:654 value:321];
  1572. GPBMessage *message2 = [GPBMessage message];
  1573. [message2 setUnknownFields:unknowns2];
  1574. NSMutableData *delimitedData = [NSMutableData data];
  1575. [delimitedData appendData:[message1 delimitedData]];
  1576. [delimitedData appendData:[message2 delimitedData]];
  1577. GPBCodedInputStream *input =
  1578. [GPBCodedInputStream streamWithData:delimitedData];
  1579. GPBMessage *message3 = [GPBMessage parseDelimitedFromCodedInputStream:input
  1580. extensionRegistry:nil
  1581. error:NULL];
  1582. GPBMessage *message4 = [GPBMessage parseDelimitedFromCodedInputStream:input
  1583. extensionRegistry:nil
  1584. error:NULL];
  1585. XCTAssertEqualObjects(message1, message3);
  1586. XCTAssertEqualObjects(message2, message4);
  1587. }
  1588. - (void)testDuplicateEnums {
  1589. XCTAssertEqual(TestEnumWithDupValue_Foo1, TestEnumWithDupValue_Foo2);
  1590. }
  1591. - (void)testWeirdDefaults {
  1592. ObjcWeirdDefaults *message = [ObjcWeirdDefaults message];
  1593. GPBDescriptor *descriptor = [[message class] descriptor];
  1594. GPBFieldDescriptor *fieldDesc = [descriptor fieldWithName:@"foo"];
  1595. XCTAssertNotNil(fieldDesc);
  1596. XCTAssertTrue(fieldDesc.hasDefaultValue);
  1597. XCTAssertFalse(message.hasFoo);
  1598. XCTAssertEqualObjects(message.foo, @"");
  1599. fieldDesc = [descriptor fieldWithName:@"bar"];
  1600. XCTAssertNotNil(fieldDesc);
  1601. XCTAssertTrue(fieldDesc.hasDefaultValue);
  1602. XCTAssertFalse(message.hasBar);
  1603. XCTAssertEqualObjects(message.bar, GPBEmptyNSData());
  1604. }
  1605. - (void)testEnumDescriptorFromExtensionDescriptor {
  1606. GPBExtensionDescriptor *extDescriptor =
  1607. [UnittestRoot optionalForeignEnumExtension];
  1608. XCTAssertEqual(extDescriptor.dataType, GPBDataTypeEnum);
  1609. GPBEnumDescriptor *enumDescriptor = extDescriptor.enumDescriptor;
  1610. GPBEnumDescriptor *expectedDescriptor = ForeignEnum_EnumDescriptor();
  1611. XCTAssertEqualObjects(enumDescriptor, expectedDescriptor);
  1612. }
  1613. - (void)testEnumNaming {
  1614. // objectivec_helpers.cc has some interesting cases to deal with in
  1615. // EnumValueName/EnumValueShortName. Confirm that things generated as
  1616. // expected.
  1617. // This block just has to compile to confirm we got the expected types/names.
  1618. // The *_IsValidValue() calls are just there to keep the projects warnings
  1619. // flags happy by providing use of the variables/values.
  1620. Foo aFoo = Foo_SerializedSize;
  1621. Foo_IsValidValue(aFoo);
  1622. aFoo = Foo_Size;
  1623. Foo_IsValidValue(aFoo);
  1624. Category_Enum aCat = Category_Enum_Red;
  1625. Category_Enum_IsValidValue(aCat);
  1626. Time aTime = Time_Base;
  1627. Time_IsValidValue(aTime);
  1628. aTime = Time_SomethingElse;
  1629. Time_IsValidValue(aTime);
  1630. // This block confirms the names in the decriptors is what we wanted.
  1631. GPBEnumDescriptor *descriptor;
  1632. NSString *valueName;
  1633. descriptor = Foo_EnumDescriptor();
  1634. XCTAssertNotNil(descriptor);
  1635. XCTAssertEqualObjects(@"Foo", descriptor.name);
  1636. valueName = [descriptor enumNameForValue:Foo_SerializedSize];
  1637. XCTAssertEqualObjects(@"Foo_SerializedSize", valueName);
  1638. valueName = [descriptor enumNameForValue:Foo_Size];
  1639. XCTAssertEqualObjects(@"Foo_Size", valueName);
  1640. descriptor = Category_Enum_EnumDescriptor();
  1641. XCTAssertNotNil(descriptor);
  1642. XCTAssertEqualObjects(@"Category_Enum", descriptor.name);
  1643. valueName = [descriptor enumNameForValue:Category_Enum_Red];
  1644. XCTAssertEqualObjects(@"Category_Enum_Red", valueName);
  1645. descriptor = Time_EnumDescriptor();
  1646. XCTAssertNotNil(descriptor);
  1647. XCTAssertEqualObjects(@"Time", descriptor.name);
  1648. valueName = [descriptor enumNameForValue:Time_Base];
  1649. XCTAssertEqualObjects(@"Time_Base", valueName);
  1650. valueName = [descriptor enumNameForValue:Time_SomethingElse];
  1651. XCTAssertEqualObjects(@"Time_SomethingElse", valueName);
  1652. }
  1653. - (void)testNegativeEnums {
  1654. EnumTestMsg *msg = [EnumTestMsg message];
  1655. // Defaults
  1656. XCTAssertEqual(msg.foo, EnumTestMsg_MyEnum_Zero);
  1657. XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_One);
  1658. XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegOne);
  1659. // Bounce to wire and back.
  1660. EnumTestMsg *msgPrime = [EnumTestMsg parseFromData:[msg data] error:NULL];
  1661. XCTAssertEqualObjects(msgPrime, msg);
  1662. XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero);
  1663. XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_One);
  1664. XCTAssertEqual(msgPrime.baz, EnumTestMsg_MyEnum_NegOne);
  1665. // Other values
  1666. msg.bar = EnumTestMsg_MyEnum_Two;
  1667. msg.baz = EnumTestMsg_MyEnum_NegTwo;
  1668. XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_Two);
  1669. XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegTwo);
  1670. // Bounce to wire and back.
  1671. msgPrime = [EnumTestMsg parseFromData:[msg data] error:NULL];
  1672. XCTAssertEqualObjects(msgPrime, msg);
  1673. XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero);
  1674. XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_Two);
  1675. XCTAssertEqual(msgPrime.baz, EnumTestMsg_MyEnum_NegTwo);
  1676. // Repeated field (shouldn't ever be an issue since developer has to use the
  1677. // right GPBArray methods themselves).
  1678. msg.mumbleArray = [GPBEnumArray
  1679. arrayWithValidationFunction:EnumTestMsg_MyEnum_IsValidValue];
  1680. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_Zero];
  1681. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_One];
  1682. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_Two];
  1683. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_NegOne];
  1684. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_NegTwo];
  1685. XCTAssertEqual([msg.mumbleArray valueAtIndex:0], EnumTestMsg_MyEnum_Zero);
  1686. XCTAssertEqual([msg.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
  1687. XCTAssertEqual([msg.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
  1688. XCTAssertEqual([msg.mumbleArray valueAtIndex:3], EnumTestMsg_MyEnum_NegOne);
  1689. XCTAssertEqual([msg.mumbleArray valueAtIndex:4], EnumTestMsg_MyEnum_NegTwo);
  1690. // Bounce to wire and back.
  1691. msgPrime = [EnumTestMsg parseFromData:[msg data] error:NULL];
  1692. XCTAssertEqualObjects(msgPrime, msg);
  1693. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:0],
  1694. EnumTestMsg_MyEnum_Zero);
  1695. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
  1696. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
  1697. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:3],
  1698. EnumTestMsg_MyEnum_NegOne);
  1699. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:4],
  1700. EnumTestMsg_MyEnum_NegTwo);
  1701. }
  1702. @end