GPBMessageTests.m 68 KB

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