GPBMessageTests.m 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106
  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 addObject:@"bar"];
  52. return message;
  53. }
  54. - (TestAllTypes *)mergeDestination {
  55. TestAllTypes *message = [TestAllTypes message];
  56. [message setOptionalInt64:2];
  57. [message setOptionalString:@"baz"];
  58. ForeignMessage *foreignMessage = [ForeignMessage message];
  59. [foreignMessage setC:3];
  60. [message setOptionalForeignMessage:foreignMessage];
  61. [message.repeatedStringArray addObject:@"qux"];
  62. return message;
  63. }
  64. - (TestAllTypes *)mergeDestinationWithoutForeignMessageIvar {
  65. TestAllTypes *message = [TestAllTypes message];
  66. [message setOptionalInt64:2];
  67. [message setOptionalString:@"baz"];
  68. [message.repeatedStringArray addObject:@"qux"];
  69. return message;
  70. }
  71. - (TestAllTypes *)mergeResult {
  72. TestAllTypes *message = [TestAllTypes message];
  73. [message setOptionalInt32:1];
  74. [message setOptionalInt64:2];
  75. [message setOptionalString:@"foo"];
  76. ForeignMessage *foreignMessage = [ForeignMessage message];
  77. [foreignMessage setC:3];
  78. [message setOptionalForeignMessage:foreignMessage];
  79. [message.repeatedStringArray addObject:@"qux"];
  80. [message.repeatedStringArray addObject:@"bar"];
  81. return message;
  82. }
  83. - (TestAllTypes *)mergeResultForDestinationWithoutForeignMessageIvar {
  84. TestAllTypes *message = [TestAllTypes message];
  85. [message setOptionalInt32:1];
  86. [message setOptionalInt64:2];
  87. [message setOptionalString:@"foo"];
  88. ForeignMessage *foreignMessage = [ForeignMessage message];
  89. [message setOptionalForeignMessage:foreignMessage];
  90. [message.repeatedStringArray addObject:@"qux"];
  91. [message.repeatedStringArray addObject:@"bar"];
  92. return message;
  93. }
  94. - (TestAllExtensions *)mergeExtensionsDestination {
  95. TestAllExtensions *message = [TestAllExtensions message];
  96. [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
  97. [message setExtension:[UnittestRoot optionalStringExtension] value:@"foo"];
  98. ForeignMessage *foreignMessage = [ForeignMessage message];
  99. foreignMessage.c = 4;
  100. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  101. value:foreignMessage];
  102. TestAllTypes_NestedMessage *nestedMessage =
  103. [TestAllTypes_NestedMessage message];
  104. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  105. value:nestedMessage];
  106. return message;
  107. }
  108. - (TestAllExtensions *)mergeExtensionsSource {
  109. TestAllExtensions *message = [TestAllExtensions message];
  110. [message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
  111. [message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
  112. ForeignMessage *foreignMessage = [ForeignMessage message];
  113. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  114. value:foreignMessage];
  115. TestAllTypes_NestedMessage *nestedMessage =
  116. [TestAllTypes_NestedMessage message];
  117. nestedMessage.bb = 7;
  118. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  119. value:nestedMessage];
  120. return message;
  121. }
  122. - (TestAllExtensions *)mergeExtensionsResult {
  123. TestAllExtensions *message = [TestAllExtensions message];
  124. [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
  125. [message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
  126. [message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
  127. ForeignMessage *foreignMessage = [ForeignMessage message];
  128. foreignMessage.c = 4;
  129. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  130. value:foreignMessage];
  131. TestAllTypes_NestedMessage *nestedMessage =
  132. [TestAllTypes_NestedMessage message];
  133. nestedMessage.bb = 7;
  134. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  135. value:nestedMessage];
  136. return message;
  137. }
  138. - (void)testMergeFrom {
  139. TestAllTypes *result = [[self.mergeDestination copy] autorelease];
  140. [result mergeFrom:self.mergeSource];
  141. NSData *resultData = [result data];
  142. NSData *mergeResultData = [self.mergeResult data];
  143. XCTAssertEqualObjects(resultData, mergeResultData);
  144. XCTAssertEqualObjects(result, self.mergeResult);
  145. // Test when destination does not have an Ivar (type is an object) but source
  146. // has such Ivar.
  147. // The result must has the Ivar which is same as the one in source.
  148. result = [[self.mergeDestinationWithoutForeignMessageIvar copy] autorelease];
  149. [result mergeFrom:self.mergeSource];
  150. resultData = [result data];
  151. mergeResultData =
  152. [self.mergeResultForDestinationWithoutForeignMessageIvar data];
  153. XCTAssertEqualObjects(resultData, mergeResultData);
  154. XCTAssertEqualObjects(
  155. result, self.mergeResultForDestinationWithoutForeignMessageIvar);
  156. // Test when destination is empty.
  157. // The result must is same as the source.
  158. result = [TestAllTypes message];
  159. [result mergeFrom:self.mergeSource];
  160. resultData = [result data];
  161. mergeResultData = [self.mergeSource data];
  162. XCTAssertEqualObjects(resultData, mergeResultData);
  163. XCTAssertEqualObjects(result, self.mergeSource);
  164. }
  165. - (void)testMergeFromWithExtensions {
  166. TestAllExtensions *result = [self mergeExtensionsDestination];
  167. [result mergeFrom:[self mergeExtensionsSource]];
  168. NSData *resultData = [result data];
  169. NSData *mergeResultData = [[self mergeExtensionsResult] data];
  170. XCTAssertEqualObjects(resultData, mergeResultData);
  171. XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
  172. // Test merging from data.
  173. result = [self mergeExtensionsDestination];
  174. NSData *data = [[self mergeExtensionsSource] data];
  175. XCTAssertNotNil(data);
  176. [result mergeFromData:data
  177. extensionRegistry:[UnittestRoot extensionRegistry]];
  178. resultData = [result data];
  179. XCTAssertEqualObjects(resultData, mergeResultData);
  180. XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
  181. }
  182. - (void)testIsEquals {
  183. TestAllTypes *result = [[self.mergeDestination copy] autorelease];
  184. [result mergeFrom:self.mergeSource];
  185. XCTAssertEqualObjects(result.data, self.mergeResult.data);
  186. XCTAssertEqualObjects(result, self.mergeResult);
  187. TestAllTypes *result2 = [[self.mergeDestination copy] autorelease];
  188. XCTAssertNotEqualObjects(result2.data, self.mergeResult.data);
  189. XCTAssertNotEqualObjects(result2, self.mergeResult);
  190. }
  191. // =================================================================
  192. // Required-field-related tests.
  193. - (TestRequired *)testRequiredInitialized {
  194. TestRequired *message = [TestRequired message];
  195. [message setA:1];
  196. [message setB:2];
  197. [message setC:3];
  198. return message;
  199. }
  200. - (void)testRequired {
  201. TestRequired *message = [TestRequired message];
  202. XCTAssertFalse(message.initialized);
  203. [message setA:1];
  204. XCTAssertFalse(message.initialized);
  205. [message setB:1];
  206. XCTAssertFalse(message.initialized);
  207. [message setC:1];
  208. XCTAssertTrue(message.initialized);
  209. }
  210. - (void)testRequiredForeign {
  211. TestRequiredForeign *message = [TestRequiredForeign message];
  212. XCTAssertTrue(message.initialized);
  213. [message setOptionalMessage:[TestRequired message]];
  214. XCTAssertFalse(message.initialized);
  215. [message setOptionalMessage:self.testRequiredInitialized];
  216. XCTAssertTrue(message.initialized);
  217. [message.repeatedMessageArray addObject:[TestRequired message]];
  218. XCTAssertFalse(message.initialized);
  219. [message.repeatedMessageArray removeAllObjects];
  220. [message.repeatedMessageArray addObject:self.testRequiredInitialized];
  221. XCTAssertTrue(message.initialized);
  222. }
  223. - (void)testRequiredExtension {
  224. TestAllExtensions *message = [TestAllExtensions message];
  225. XCTAssertTrue(message.initialized);
  226. [message setExtension:[TestRequired single] value:[TestRequired message]];
  227. XCTAssertFalse(message.initialized);
  228. [message setExtension:[TestRequired single]
  229. value:self.testRequiredInitialized];
  230. XCTAssertTrue(message.initialized);
  231. [message addExtension:[TestRequired multi] value:[TestRequired message]];
  232. XCTAssertFalse(message.initialized);
  233. [message setExtension:[TestRequired multi]
  234. index:0
  235. value:self.testRequiredInitialized];
  236. XCTAssertTrue(message.initialized);
  237. }
  238. - (void)testDataFromUninitialized {
  239. TestRequired *message = [TestRequired message];
  240. NSData *data = [message data];
  241. // In DEBUG, the data generation will fail, but in non DEBUG, it passes
  242. // because the check isn't done (for speed).
  243. #ifdef DEBUG
  244. XCTAssertNil(data);
  245. #else
  246. XCTAssertNotNil(data);
  247. XCTAssertFalse(message.initialized);
  248. #endif // DEBUG
  249. }
  250. - (void)testInitialized {
  251. // We're mostly testing that no exception is thrown.
  252. TestRequired *message = [TestRequired message];
  253. XCTAssertFalse(message.initialized);
  254. }
  255. - (void)testDataFromNestedUninitialized {
  256. TestRequiredForeign *message = [TestRequiredForeign message];
  257. [message setOptionalMessage:[TestRequired message]];
  258. [message.repeatedMessageArray addObject:[TestRequired message]];
  259. [message.repeatedMessageArray addObject:[TestRequired message]];
  260. NSData *data = [message data];
  261. // In DEBUG, the data generation will fail, but in non DEBUG, it passes
  262. // because the check isn't done (for speed).
  263. #ifdef DEBUG
  264. XCTAssertNil(data);
  265. #else
  266. XCTAssertNotNil(data);
  267. XCTAssertFalse(message.initialized);
  268. #endif // DEBUG
  269. }
  270. - (void)testNestedInitialized {
  271. // We're mostly testing that no exception is thrown.
  272. TestRequiredForeign *message = [TestRequiredForeign message];
  273. [message setOptionalMessage:[TestRequired message]];
  274. [message.repeatedMessageArray addObject:[TestRequired message]];
  275. [message.repeatedMessageArray addObject:[TestRequired message]];
  276. XCTAssertFalse(message.initialized);
  277. }
  278. - (void)testParseUninitialized {
  279. NSError *error = nil;
  280. TestRequired *msg =
  281. [TestRequired parseFromData:GPBEmptyNSData() error:&error];
  282. // In DEBUG, the parse will fail, but in non DEBUG, it passes because
  283. // the check isn't done (for speed).
  284. #ifdef DEBUG
  285. XCTAssertNil(msg);
  286. XCTAssertNotNil(error);
  287. XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
  288. XCTAssertEqual(error.code, GPBMessageErrorCodeMissingRequiredField);
  289. #else
  290. XCTAssertNotNil(msg);
  291. XCTAssertNil(error);
  292. XCTAssertFalse(msg.initialized);
  293. #endif // DEBUG
  294. }
  295. - (void)testCoding {
  296. NSData *data =
  297. [NSKeyedArchiver archivedDataWithRootObject:[self mergeResult]];
  298. id unarchivedObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  299. XCTAssertEqualObjects(unarchivedObject, [self mergeResult]);
  300. // Intentionally doing a pointer comparison.
  301. XCTAssertNotEqual(unarchivedObject, [self mergeResult]);
  302. }
  303. - (void)testObjectReset {
  304. // Tests a failure where clearing out defaults values caused an over release.
  305. TestAllTypes *message = [TestAllTypes message];
  306. message.hasOptionalNestedMessage = NO;
  307. [message setOptionalNestedMessage:[TestAllTypes_NestedMessage message]];
  308. message.hasOptionalNestedMessage = NO;
  309. [message setOptionalNestedMessage:[TestAllTypes_NestedMessage message]];
  310. [message setOptionalNestedMessage:nil];
  311. message.hasOptionalNestedMessage = NO;
  312. }
  313. - (void)testSettingHasToYes {
  314. TestAllTypes *message = [TestAllTypes message];
  315. XCTAssertThrows([message setHasOptionalNestedMessage:YES]);
  316. }
  317. - (void)testRoot {
  318. XCTAssertNotNil([UnittestRoot extensionRegistry]);
  319. }
  320. - (void)testGPBMessageSize {
  321. // See the note in GPBMessage_PackagePrivate.h about why we want to keep the
  322. // base instance size pointer size aligned.
  323. size_t messageSize = class_getInstanceSize([GPBMessage class]);
  324. XCTAssertEqual((messageSize % sizeof(void *)), (size_t)0,
  325. @"Base size isn't pointer size aligned");
  326. // Since we add storage ourselves (see +allocWithZone: in GPBMessage), confirm
  327. // that the size of some generated classes is still the same as the base for
  328. // that logic to work as desired.
  329. size_t testMessageSize = class_getInstanceSize([TestAllTypes class]);
  330. XCTAssertEqual(testMessageSize, messageSize);
  331. }
  332. - (void)testInit {
  333. TestAllTypes *message = [TestAllTypes message];
  334. [self assertClear:message];
  335. }
  336. - (void)testAccessors {
  337. TestAllTypes *message = [TestAllTypes message];
  338. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  339. [self assertAllFieldsSet:message repeatedCount:kGPBDefaultRepeatCount];
  340. }
  341. - (void)testKVC_ValueForKey {
  342. TestAllTypes *message = [TestAllTypes message];
  343. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  344. [self assertAllFieldsKVCMatch:message];
  345. }
  346. - (void)testKVC_SetValue_ForKey {
  347. TestAllTypes *message = [TestAllTypes message];
  348. [self setAllFieldsViaKVC:message repeatedCount:kGPBDefaultRepeatCount];
  349. [self assertAllFieldsKVCMatch:message];
  350. [self assertAllFieldsSet:message repeatedCount:kGPBDefaultRepeatCount];
  351. [self assertAllFieldsKVCMatch:message];
  352. }
  353. - (void)testDescription {
  354. // No real test, just exercise code
  355. TestAllTypes *message = [TestAllTypes message];
  356. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  357. GPBUnknownFieldSet *unknownFields =
  358. [[[GPBUnknownFieldSet alloc] init] autorelease];
  359. GPBUnknownField *field =
  360. [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
  361. [field addVarint:2];
  362. [unknownFields addField:field];
  363. field = [[[GPBUnknownField 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. GPBGenericValue 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] autorelease];
  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)testSetOverAutocreatedArrayAndSetAgain {
  945. // Ensure when dealing with replacing an array it is handled being either
  946. // an autocreated one or a straight NSArray.
  947. // The real test here is that nothing crashes while doing the work.
  948. TestAllTypes *message = [TestAllTypes message];
  949. [message.repeatedStringArray addObject:@"foo"];
  950. XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)1);
  951. message.repeatedStringArray = [NSMutableArray arrayWithObjects:@"bar", @"bar2", nil];
  952. XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)2);
  953. message.repeatedStringArray = [NSMutableArray arrayWithObject:@"baz"];
  954. XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)1);
  955. }
  956. - (void)testReplaceAutocreatedArray {
  957. // Replacing array should orphan the old one and cause its creator to become
  958. // visible.
  959. {
  960. TestRecursiveMessageWithRepeatedField *message =
  961. [TestRecursiveMessageWithRepeatedField message];
  962. XCTAssertNotNil(message.a);
  963. XCTAssertNotNil(message.a.iArray);
  964. XCTAssertFalse([message hasA]);
  965. GPBInt32Array *iArray = [message.a.iArray retain];
  966. XCTAssertEqual(iArray->_autocreator, message.a); // Pointer comparision
  967. message.a.iArray = [GPBInt32Array arrayWithValue:1];
  968. XCTAssertTrue([message hasA]);
  969. XCTAssertNotEqual(message.a.iArray, iArray); // Pointer comparision
  970. XCTAssertNil(iArray->_autocreator);
  971. [iArray release];
  972. }
  973. {
  974. TestRecursiveMessageWithRepeatedField *message =
  975. [TestRecursiveMessageWithRepeatedField message];
  976. XCTAssertNotNil(message.a);
  977. XCTAssertNotNil(message.a.strArray);
  978. XCTAssertFalse([message hasA]);
  979. GPBAutocreatedArray *strArray =
  980. (GPBAutocreatedArray *)[message.a.strArray retain];
  981. XCTAssertTrue([strArray isKindOfClass:[GPBAutocreatedArray class]]);
  982. XCTAssertEqual(strArray->_autocreator, message.a); // Pointer comparision
  983. message.a.strArray = [NSMutableArray arrayWithObject:@"foo"];
  984. XCTAssertTrue([message hasA]);
  985. XCTAssertNotEqual(message.a.strArray, strArray); // Pointer comparision
  986. XCTAssertNil(strArray->_autocreator);
  987. [strArray release];
  988. }
  989. }
  990. - (void)testSetAutocreatedArrayToSelf {
  991. // Setting array to itself should cause it to become visible.
  992. {
  993. TestRecursiveMessageWithRepeatedField *message =
  994. [TestRecursiveMessageWithRepeatedField message];
  995. XCTAssertNotNil(message.a);
  996. XCTAssertNotNil(message.a.iArray);
  997. XCTAssertFalse([message hasA]);
  998. message.a.iArray = message.a.iArray;
  999. XCTAssertTrue([message hasA]);
  1000. XCTAssertNil(message.a.iArray->_autocreator);
  1001. }
  1002. {
  1003. TestRecursiveMessageWithRepeatedField *message =
  1004. [TestRecursiveMessageWithRepeatedField message];
  1005. XCTAssertNotNil(message.a);
  1006. XCTAssertNotNil(message.a.strArray);
  1007. XCTAssertFalse([message hasA]);
  1008. message.a.strArray = message.a.strArray;
  1009. XCTAssertTrue([message hasA]);
  1010. XCTAssertTrue([message.a.strArray isKindOfClass:[GPBAutocreatedArray class]]);
  1011. XCTAssertNil(((GPBAutocreatedArray *)message.a.strArray)->_autocreator);
  1012. }
  1013. }
  1014. - (void)testAutocreatedArrayRemoveAllValues {
  1015. // Calling removeAllValues on autocreated array should not cause it to be
  1016. // visible.
  1017. TestRecursiveMessageWithRepeatedField *message =
  1018. [TestRecursiveMessageWithRepeatedField message];
  1019. [message.a.iArray removeAll];
  1020. XCTAssertFalse([message hasA]);
  1021. [message.a.strArray removeAllObjects];
  1022. XCTAssertFalse([message hasA]);
  1023. }
  1024. - (void)testDefaultingMaps {
  1025. // Basic tests for default creation of maps in a message.
  1026. TestRecursiveMessageWithRepeatedField *message =
  1027. [TestRecursiveMessageWithRepeatedField message];
  1028. TestRecursiveMessageWithRepeatedField *message2 =
  1029. [TestRecursiveMessageWithRepeatedField message];
  1030. // Simply accessing the map should not make any fields visible.
  1031. XCTAssertNotNil(message.a.a.iToI);
  1032. XCTAssertFalse([message hasA]);
  1033. XCTAssertFalse([message.a hasA]);
  1034. XCTAssertNotNil(message2.a.a.strToStr);
  1035. XCTAssertFalse([message2 hasA]);
  1036. XCTAssertFalse([message2.a hasA]);
  1037. // But adding an element to the map should.
  1038. [message.a.a.iToI setInt32:100 forKey:200];
  1039. XCTAssertTrue([message hasA]);
  1040. XCTAssertTrue([message.a hasA]);
  1041. XCTAssertEqual([message.a.a.iToI count], (NSUInteger)1);
  1042. [message2.a.a.strToStr setObject:@"foo" forKey:@"bar"];
  1043. XCTAssertTrue([message2 hasA]);
  1044. XCTAssertTrue([message2.a hasA]);
  1045. XCTAssertEqual([message2.a.a.strToStr count], (NSUInteger)1);
  1046. }
  1047. - (void)testAutocreatedMapShared {
  1048. // Multiple objects pointing to the same map.
  1049. TestRecursiveMessageWithRepeatedField *message1a =
  1050. [TestRecursiveMessageWithRepeatedField message];
  1051. TestRecursiveMessageWithRepeatedField *message1b =
  1052. [TestRecursiveMessageWithRepeatedField message];
  1053. message1a.a.iToI = message1b.a.iToI;
  1054. XCTAssertTrue([message1a hasA]);
  1055. XCTAssertFalse([message1b hasA]);
  1056. [message1a.a.iToI setInt32:1 forKey:2];
  1057. XCTAssertTrue([message1a hasA]);
  1058. XCTAssertTrue([message1b hasA]);
  1059. XCTAssertEqual(message1a.a.iToI, message1b.a.iToI);
  1060. TestRecursiveMessageWithRepeatedField *message2a =
  1061. [TestRecursiveMessageWithRepeatedField message];
  1062. TestRecursiveMessageWithRepeatedField *message2b =
  1063. [TestRecursiveMessageWithRepeatedField message];
  1064. message2a.a.strToStr = message2b.a.strToStr;
  1065. XCTAssertTrue([message2a hasA]);
  1066. XCTAssertFalse([message2b hasA]);
  1067. [message2a.a.strToStr setObject:@"bar" forKey:@"foo"];
  1068. XCTAssertTrue([message2a hasA]);
  1069. XCTAssertTrue([message2b hasA]);
  1070. XCTAssertEqual(message2a.a.strToStr, message2b.a.strToStr);
  1071. }
  1072. - (void)testAutocreatedMapCopy {
  1073. // Copy should not copy autocreated maps.
  1074. TestRecursiveMessageWithRepeatedField *message =
  1075. [TestRecursiveMessageWithRepeatedField message];
  1076. XCTAssertNotNil(message.strToStr);
  1077. XCTAssertNotNil(message.iToI);
  1078. TestRecursiveMessageWithRepeatedField *message2 =
  1079. [[message copy] autorelease];
  1080. // Pointer conparisions.
  1081. XCTAssertNotEqual(message.strToStr, message2.strToStr);
  1082. XCTAssertNotEqual(message.iToI, message2.iToI);
  1083. // Mutable copy should copy empty arrays that were explicitly set (end up
  1084. // with different objects that are equal).
  1085. TestRecursiveMessageWithRepeatedField *message3 =
  1086. [TestRecursiveMessageWithRepeatedField message];
  1087. message3.iToI = [[[GPBInt32Int32Dictionary alloc] init] autorelease];
  1088. [message3.iToI setInt32:10 forKey:20];
  1089. message3.strToStr =
  1090. [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"123"];
  1091. XCTAssertNotNil(message.iToI);
  1092. XCTAssertNotNil(message.iToI);
  1093. TestRecursiveMessageWithRepeatedField *message4 =
  1094. [[message3 copy] autorelease];
  1095. XCTAssertNotEqual(message3.iToI, message4.iToI);
  1096. XCTAssertEqualObjects(message3.iToI, message4.iToI);
  1097. XCTAssertNotEqual(message3.strToStr, message4.strToStr);
  1098. XCTAssertEqualObjects(message3.strToStr, message4.strToStr);
  1099. }
  1100. - (void)testAutocreatedMapRetain {
  1101. // Should be able to retain autocreated map while the creator is dealloced.
  1102. TestRecursiveMessageWithRepeatedField *message =
  1103. [TestRecursiveMessageWithRepeatedField message];
  1104. @autoreleasepool {
  1105. TestRecursiveMessageWithRepeatedField *message2 =
  1106. [TestRecursiveMessageWithRepeatedField message];
  1107. message.iToI = message2.iToI;
  1108. message.strToStr = message2.strToStr;
  1109. // Pointer conparision
  1110. XCTAssertEqual(message.iToI->_autocreator, message2);
  1111. XCTAssertTrue([message.strToStr
  1112. isKindOfClass:[GPBAutocreatedDictionary class]]);
  1113. XCTAssertEqual(
  1114. ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator,
  1115. message2);
  1116. }
  1117. XCTAssertNil(message.iToI->_autocreator);
  1118. XCTAssertTrue(
  1119. [message.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1120. XCTAssertNil(
  1121. ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator);
  1122. }
  1123. - (void)testSetNilAutocreatedMap {
  1124. // Setting map to nil should cause it to lose its delegate.
  1125. TestRecursiveMessageWithRepeatedField *message =
  1126. [TestRecursiveMessageWithRepeatedField message];
  1127. GPBInt32Int32Dictionary *iToI = [message.iToI retain];
  1128. GPBAutocreatedDictionary *strToStr =
  1129. (GPBAutocreatedDictionary *)[message.strToStr retain];
  1130. XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1131. XCTAssertEqual(iToI->_autocreator, message);
  1132. XCTAssertEqual(strToStr->_autocreator, message);
  1133. message.iToI = nil;
  1134. message.strToStr = nil;
  1135. XCTAssertNil(iToI->_autocreator);
  1136. XCTAssertNil(strToStr->_autocreator);
  1137. [iToI release];
  1138. [strToStr release];
  1139. }
  1140. - (void)testSetOverAutocreatedMapAndSetAgain {
  1141. // Ensure when dealing with replacing a map it is handled being either
  1142. // an autocreated one or a straight NSDictionary.
  1143. // The real test here is that nothing crashes while doing the work.
  1144. TestRecursiveMessageWithRepeatedField *message =
  1145. [TestRecursiveMessageWithRepeatedField message];
  1146. message.strToStr[@"foo"] = @"bar";
  1147. XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
  1148. message.strToStr =
  1149. [NSMutableDictionary dictionaryWithObjectsAndKeys:@"bar", @"key1", @"baz", @"key2", nil];
  1150. XCTAssertEqual(message.strToStr_Count, (NSUInteger)2);
  1151. message.strToStr =
  1152. [NSMutableDictionary dictionaryWithObject:@"baz" forKey:@"mumble"];
  1153. XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
  1154. }
  1155. - (void)testReplaceAutocreatedMap {
  1156. // Replacing map should orphan the old one and cause its creator to become
  1157. // visible.
  1158. {
  1159. TestRecursiveMessageWithRepeatedField *message =
  1160. [TestRecursiveMessageWithRepeatedField message];
  1161. XCTAssertNotNil(message.a);
  1162. XCTAssertNotNil(message.a.iToI);
  1163. XCTAssertFalse([message hasA]);
  1164. GPBInt32Int32Dictionary *iToI = [message.a.iToI retain];
  1165. XCTAssertEqual(iToI->_autocreator, message.a); // Pointer comparision
  1166. message.a.iToI = [[[GPBInt32Int32Dictionary alloc] init] autorelease];
  1167. [message.a.iToI setInt32:6 forKey:7];
  1168. XCTAssertTrue([message hasA]);
  1169. XCTAssertNotEqual(message.a.iToI, iToI); // Pointer comparision
  1170. XCTAssertNil(iToI->_autocreator);
  1171. [iToI release];
  1172. }
  1173. {
  1174. TestRecursiveMessageWithRepeatedField *message =
  1175. [TestRecursiveMessageWithRepeatedField message];
  1176. XCTAssertNotNil(message.a);
  1177. XCTAssertNotNil(message.a.strToStr);
  1178. XCTAssertFalse([message hasA]);
  1179. GPBAutocreatedDictionary *strToStr =
  1180. (GPBAutocreatedDictionary *)[message.a.strToStr retain];
  1181. XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1182. XCTAssertEqual(strToStr->_autocreator, message.a); // Pointer comparision
  1183. message.a.strToStr =
  1184. [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"def"];
  1185. XCTAssertTrue([message hasA]);
  1186. XCTAssertNotEqual(message.a.strToStr, strToStr); // Pointer comparision
  1187. XCTAssertNil(strToStr->_autocreator);
  1188. [strToStr release];
  1189. }
  1190. }
  1191. - (void)testSetAutocreatedMapToSelf {
  1192. // Setting map to itself should cause it to become visible.
  1193. {
  1194. TestRecursiveMessageWithRepeatedField *message =
  1195. [TestRecursiveMessageWithRepeatedField message];
  1196. XCTAssertNotNil(message.a);
  1197. XCTAssertNotNil(message.a.iToI);
  1198. XCTAssertFalse([message hasA]);
  1199. message.a.iToI = message.a.iToI;
  1200. XCTAssertTrue([message hasA]);
  1201. XCTAssertNil(message.a.iToI->_autocreator);
  1202. }
  1203. {
  1204. TestRecursiveMessageWithRepeatedField *message =
  1205. [TestRecursiveMessageWithRepeatedField message];
  1206. XCTAssertNotNil(message.a);
  1207. XCTAssertNotNil(message.a.strToStr);
  1208. XCTAssertFalse([message hasA]);
  1209. message.a.strToStr = message.a.strToStr;
  1210. XCTAssertTrue([message hasA]);
  1211. XCTAssertTrue([message.a.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1212. XCTAssertNil(((GPBAutocreatedDictionary *)message.a.strToStr)->_autocreator);
  1213. }
  1214. }
  1215. - (void)testAutocreatedMapRemoveAllValues {
  1216. // Calling removeAll on autocreated map should not cause it to be visible.
  1217. TestRecursiveMessageWithRepeatedField *message =
  1218. [TestRecursiveMessageWithRepeatedField message];
  1219. [message.a.iToI removeAll];
  1220. XCTAssertFalse([message hasA]);
  1221. [message.a.strToStr removeAllObjects];
  1222. XCTAssertFalse([message hasA]);
  1223. }
  1224. - (void)testExtensionAccessors {
  1225. TestAllExtensions *message = [TestAllExtensions message];
  1226. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1227. [self assertAllExtensionsSet:message repeatedCount:kGPBDefaultRepeatCount];
  1228. }
  1229. - (void)testExtensionRepeatedSetters {
  1230. TestAllExtensions *message = [TestAllExtensions message];
  1231. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1232. [self modifyRepeatedExtensions:message];
  1233. [self assertRepeatedExtensionsModified:message
  1234. repeatedCount:kGPBDefaultRepeatCount];
  1235. }
  1236. - (void)testExtensionDefaults {
  1237. [self assertExtensionsClear:[TestAllExtensions message]];
  1238. }
  1239. - (void)testExtensionIsEquals {
  1240. TestAllExtensions *message = [TestAllExtensions message];
  1241. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1242. [self modifyRepeatedExtensions:message];
  1243. TestAllExtensions *message2 = [TestAllExtensions message];
  1244. [self setAllExtensions:message2 repeatedCount:kGPBDefaultRepeatCount];
  1245. XCTAssertFalse([message isEqual:message2]);
  1246. message2 = [TestAllExtensions message];
  1247. [self setAllExtensions:message2 repeatedCount:kGPBDefaultRepeatCount];
  1248. [self modifyRepeatedExtensions:message2];
  1249. XCTAssertEqualObjects(message, message2);
  1250. }
  1251. - (void)testExtensionsMergeFrom {
  1252. TestAllExtensions *message = [TestAllExtensions message];
  1253. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1254. [self modifyRepeatedExtensions:message];
  1255. message = [TestAllExtensions message];
  1256. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1257. TestAllExtensions *message2 = [TestAllExtensions message];
  1258. [self modifyRepeatedExtensions:message2];
  1259. [message2 mergeFrom:message];
  1260. XCTAssertEqualObjects(message, message2);
  1261. }
  1262. - (void)testDefaultingExtensionMessages {
  1263. TestAllExtensions *message = [TestAllExtensions message];
  1264. // Initially they should all not have values.
  1265. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1266. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1267. XCTAssertFalse(
  1268. [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1269. XCTAssertFalse(
  1270. [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1271. XCTAssertFalse(
  1272. [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1273. XCTAssertFalse([message
  1274. hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1275. XCTAssertFalse(
  1276. [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1277. // They should auto create something when fetched.
  1278. TestAllTypes_OptionalGroup *optionalGroup =
  1279. [message getExtension:[UnittestRoot optionalGroupExtension]];
  1280. TestAllTypes_NestedMessage *optionalNestedMessage =
  1281. [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
  1282. ForeignMessage *optionalForeignMessage =
  1283. [message getExtension:[UnittestRoot optionalForeignMessageExtension]];
  1284. ImportMessage *optionalImportMessage =
  1285. [message getExtension:[UnittestRoot optionalImportMessageExtension]];
  1286. PublicImportMessage *optionalPublicImportMessage = [message
  1287. getExtension:[UnittestRoot optionalPublicImportMessageExtension]];
  1288. TestAllTypes_NestedMessage *optionalLazyMessage =
  1289. [message getExtension:[UnittestRoot optionalLazyMessageExtension]];
  1290. XCTAssertNotNil(optionalGroup);
  1291. XCTAssertNotNil(optionalNestedMessage);
  1292. XCTAssertNotNil(optionalForeignMessage);
  1293. XCTAssertNotNil(optionalImportMessage);
  1294. XCTAssertNotNil(optionalPublicImportMessage);
  1295. XCTAssertNotNil(optionalLazyMessage);
  1296. // Although it auto-created empty messages, it should not show that it has
  1297. // them.
  1298. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1299. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1300. XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1301. XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1302. XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1303. XCTAssertFalse([message hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1304. XCTAssertFalse([message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1305. // And they set that value back in to the message since the value created was
  1306. // mutable (so a second fetch should give the same object).
  1307. XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
  1308. optionalGroup);
  1309. XCTAssertEqual(
  1310. [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1311. optionalNestedMessage);
  1312. XCTAssertEqual(
  1313. [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1314. optionalForeignMessage);
  1315. XCTAssertEqual(
  1316. [message getExtension:[UnittestRoot optionalImportMessageExtension]],
  1317. optionalImportMessage);
  1318. XCTAssertEqual(
  1319. [message getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1320. optionalPublicImportMessage);
  1321. XCTAssertEqual(
  1322. [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1323. optionalLazyMessage);
  1324. // And the default objects for a second message should be distinct (again,
  1325. // since they are mutable, each needs their own copy).
  1326. TestAllExtensions *message2 = [TestAllExtensions message];
  1327. // Intentionally doing a pointer comparison.
  1328. XCTAssertNotEqual(
  1329. [message2 getExtension:[UnittestRoot optionalGroupExtension]],
  1330. optionalGroup);
  1331. XCTAssertNotEqual(
  1332. [message2 getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1333. optionalNestedMessage);
  1334. XCTAssertNotEqual(
  1335. [message2 getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1336. optionalForeignMessage);
  1337. XCTAssertNotEqual(
  1338. [message2 getExtension:[UnittestRoot optionalImportMessageExtension]],
  1339. optionalImportMessage);
  1340. XCTAssertNotEqual(
  1341. [message2 getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1342. optionalPublicImportMessage);
  1343. XCTAssertNotEqual(
  1344. [message2 getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1345. optionalLazyMessage);
  1346. // Clear values, and on next access you get back new submessages.
  1347. [message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
  1348. [message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
  1349. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  1350. value:nil];
  1351. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  1352. value:nil];
  1353. [message setExtension:[UnittestRoot optionalImportMessageExtension]
  1354. value:nil];
  1355. [message setExtension:[UnittestRoot optionalPublicImportMessageExtension]
  1356. value:nil];
  1357. [message setExtension:[UnittestRoot optionalLazyMessageExtension] value:nil];
  1358. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1359. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1360. XCTAssertFalse(
  1361. [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1362. XCTAssertFalse(
  1363. [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1364. XCTAssertFalse(
  1365. [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1366. XCTAssertFalse([message
  1367. hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1368. XCTAssertFalse(
  1369. [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1370. XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
  1371. optionalGroup);
  1372. XCTAssertEqual(
  1373. [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1374. optionalNestedMessage);
  1375. XCTAssertEqual(
  1376. [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1377. optionalForeignMessage);
  1378. XCTAssertEqual(
  1379. [message getExtension:[UnittestRoot optionalImportMessageExtension]],
  1380. optionalImportMessage);
  1381. XCTAssertEqual(
  1382. [message
  1383. getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1384. optionalPublicImportMessage);
  1385. XCTAssertEqual(
  1386. [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1387. optionalLazyMessage);
  1388. }
  1389. - (void)testMultiplePointersToAutocreatedExtension {
  1390. // 2 objects point to the same auto-created extension. One should "has" it.
  1391. // The other should not.
  1392. TestAllExtensions *message = [TestAllExtensions message];
  1393. TestAllExtensions *message2 = [TestAllExtensions message];
  1394. GPBExtensionDescriptor *extension = [UnittestRoot optionalGroupExtension];
  1395. [message setExtension:extension value:[message2 getExtension:extension]];
  1396. XCTAssertEqual([message getExtension:extension],
  1397. [message2 getExtension:extension]);
  1398. XCTAssertFalse([message2 hasExtension:extension]);
  1399. XCTAssertTrue([message hasExtension:extension]);
  1400. TestAllTypes_OptionalGroup *extensionValue =
  1401. [message2 getExtension:extension];
  1402. extensionValue.a = 1;
  1403. XCTAssertTrue([message2 hasExtension:extension]);
  1404. XCTAssertTrue([message hasExtension:extension]);
  1405. }
  1406. - (void)testCopyWithAutocreatedExtension {
  1407. // Mutable copy shouldn't copy autocreated extensions.
  1408. TestAllExtensions *message = [TestAllExtensions message];
  1409. GPBExtensionDescriptor *optionalGroupExtension =
  1410. [UnittestRoot optionalGroupExtension];
  1411. GPBExtensionDescriptor *optionalNestedMessageExtesion =
  1412. [UnittestRoot optionalNestedMessageExtension];
  1413. TestAllTypes_OptionalGroup *optionalGroup =
  1414. [message getExtension:optionalGroupExtension];
  1415. optionalGroup.a = 42;
  1416. XCTAssertNotNil(optionalGroup);
  1417. XCTAssertNotNil([message getExtension:optionalNestedMessageExtesion]);
  1418. XCTAssertTrue([message hasExtension:optionalGroupExtension]);
  1419. XCTAssertFalse([message hasExtension:optionalNestedMessageExtesion]);
  1420. TestAllExtensions *message2 = [[message copy] autorelease];
  1421. // message2 should end up with its own copy of the optional group.
  1422. XCTAssertTrue([message2 hasExtension:optionalGroupExtension]);
  1423. XCTAssertEqualObjects([message getExtension:optionalGroupExtension],
  1424. [message2 getExtension:optionalGroupExtension]);
  1425. // Intentionally doing a pointer comparison.
  1426. XCTAssertNotEqual([message getExtension:optionalGroupExtension],
  1427. [message2 getExtension:optionalGroupExtension]);
  1428. XCTAssertFalse([message2 hasExtension:optionalNestedMessageExtesion]);
  1429. // Intentionally doing a pointer comparison (auto creation should be
  1430. // different)
  1431. XCTAssertNotEqual([message getExtension:optionalNestedMessageExtesion],
  1432. [message2 getExtension:optionalNestedMessageExtesion]);
  1433. }
  1434. - (void)testClearMessageAutocreatedExtension {
  1435. // Call clear should cause it to recreate its autocreated extensions.
  1436. TestAllExtensions *message = [TestAllExtensions message];
  1437. GPBExtensionDescriptor *optionalGroupExtension =
  1438. [UnittestRoot optionalGroupExtension];
  1439. TestAllTypes_OptionalGroup *optionalGroup =
  1440. [[message getExtension:optionalGroupExtension] retain];
  1441. [message clear];
  1442. TestAllTypes_OptionalGroup *optionalGroupNew =
  1443. [message getExtension:optionalGroupExtension];
  1444. // Intentionally doing a pointer comparison.
  1445. XCTAssertNotEqual(optionalGroup, optionalGroupNew);
  1446. [optionalGroup release];
  1447. }
  1448. - (void)testRetainAutocreatedExtension {
  1449. // Should be able to retain autocreated extension while the creator is
  1450. // dealloced.
  1451. TestAllExtensions *message = [TestAllExtensions message];
  1452. GPBExtensionDescriptor *optionalGroupExtension =
  1453. [UnittestRoot optionalGroupExtension];
  1454. @autoreleasepool {
  1455. TestAllExtensions *message2 = [TestAllExtensions message];
  1456. [message setExtension:optionalGroupExtension
  1457. value:[message2 getExtension:optionalGroupExtension]];
  1458. XCTAssertTrue(GPBWasMessageAutocreatedBy(
  1459. [message getExtension:optionalGroupExtension], message2));
  1460. }
  1461. XCTAssertFalse(GPBWasMessageAutocreatedBy(
  1462. [message getExtension:optionalGroupExtension], message));
  1463. }
  1464. - (void)testClearAutocreatedExtension {
  1465. // Clearing autocreated extension should NOT cause it to lose its creator.
  1466. TestAllExtensions *message = [TestAllExtensions message];
  1467. GPBExtensionDescriptor *optionalGroupExtension =
  1468. [UnittestRoot optionalGroupExtension];
  1469. TestAllTypes_OptionalGroup *optionalGroup =
  1470. [[message getExtension:optionalGroupExtension] retain];
  1471. [message clearExtension:optionalGroupExtension];
  1472. TestAllTypes_OptionalGroup *optionalGroupNew =
  1473. [message getExtension:optionalGroupExtension];
  1474. XCTAssertEqual(optionalGroup, optionalGroupNew);
  1475. XCTAssertFalse([message hasExtension:optionalGroupExtension]);
  1476. [optionalGroup release];
  1477. // Clearing autocreated extension should not cause its creator to become
  1478. // visible
  1479. GPBExtensionDescriptor *recursiveExtension =
  1480. [UnittestObjcRoot recursiveExtension];
  1481. TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
  1482. TestAllExtensions *message_lvl3 =
  1483. [message_lvl2 getExtension:recursiveExtension];
  1484. [message_lvl3 clearExtension:recursiveExtension];
  1485. XCTAssertFalse([message hasExtension:recursiveExtension]);
  1486. }
  1487. - (void)testSetAutocreatedExtensionBecomesVisible {
  1488. // Setting an extension should cause the extension to appear to its creator.
  1489. // Test this several levels deep.
  1490. TestAllExtensions *message = [TestAllExtensions message];
  1491. GPBExtensionDescriptor *recursiveExtension =
  1492. [UnittestObjcRoot recursiveExtension];
  1493. TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
  1494. TestAllExtensions *message_lvl3 =
  1495. [message_lvl2 getExtension:recursiveExtension];
  1496. TestAllExtensions *message_lvl4 =
  1497. [message_lvl3 getExtension:recursiveExtension];
  1498. XCTAssertFalse([message hasExtension:recursiveExtension]);
  1499. XCTAssertFalse([message_lvl2 hasExtension:recursiveExtension]);
  1500. XCTAssertFalse([message_lvl3 hasExtension:recursiveExtension]);
  1501. XCTAssertFalse([message_lvl4 hasExtension:recursiveExtension]);
  1502. [message_lvl4 setExtension:[UnittestRoot optionalInt32Extension] value:@(1)];
  1503. XCTAssertTrue([message hasExtension:recursiveExtension]);
  1504. XCTAssertTrue([message_lvl2 hasExtension:recursiveExtension]);
  1505. XCTAssertTrue([message_lvl3 hasExtension:recursiveExtension]);
  1506. XCTAssertFalse([message_lvl4 hasExtension:recursiveExtension]);
  1507. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl4, message_lvl3));
  1508. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl3, message_lvl2));
  1509. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl2, message));
  1510. }
  1511. - (void)testSetAutocreatedExtensionToSelf {
  1512. // Setting extension to itself should cause it to become visible.
  1513. TestAllExtensions *message = [TestAllExtensions message];
  1514. GPBExtensionDescriptor *optionalGroupExtension =
  1515. [UnittestRoot optionalGroupExtension];
  1516. XCTAssertNotNil([message getExtension:optionalGroupExtension]);
  1517. XCTAssertFalse([message hasExtension:optionalGroupExtension]);
  1518. [message setExtension:optionalGroupExtension
  1519. value:[message getExtension:optionalGroupExtension]];
  1520. XCTAssertTrue([message hasExtension:optionalGroupExtension]);
  1521. }
  1522. - (void)testAutocreatedExtensionMemoryLeaks {
  1523. GPBExtensionDescriptor *recursiveExtension =
  1524. [UnittestObjcRoot recursiveExtension];
  1525. // Test for memory leaks with autocreated extensions.
  1526. TestAllExtensions *message;
  1527. TestAllExtensions *message_lvl2;
  1528. TestAllExtensions *message_lvl3;
  1529. TestAllExtensions *message_lvl4;
  1530. @autoreleasepool {
  1531. message = [[TestAllExtensions alloc] init];
  1532. message_lvl2 = [[message getExtension:recursiveExtension] retain];
  1533. message_lvl3 = [[message_lvl2 getExtension:recursiveExtension] retain];
  1534. message_lvl4 = [[message_lvl3 getExtension:recursiveExtension] retain];
  1535. [message_lvl2 setExtension:[UnittestRoot optionalInt32Extension]
  1536. value:@(1)];
  1537. }
  1538. XCTAssertEqual(message.retainCount, (NSUInteger)1);
  1539. @autoreleasepool {
  1540. [message release];
  1541. }
  1542. XCTAssertEqual(message_lvl2.retainCount, (NSUInteger)1);
  1543. @autoreleasepool {
  1544. [message_lvl2 release];
  1545. }
  1546. XCTAssertEqual(message_lvl3.retainCount, (NSUInteger)1);
  1547. @autoreleasepool {
  1548. [message_lvl3 release];
  1549. }
  1550. XCTAssertEqual(message_lvl4.retainCount, (NSUInteger)1);
  1551. [message_lvl4 release];
  1552. }
  1553. - (void)testSetExtensionWithAutocreatedValue {
  1554. GPBExtensionDescriptor *recursiveExtension =
  1555. [UnittestObjcRoot recursiveExtension];
  1556. TestAllExtensions *message;
  1557. @autoreleasepool {
  1558. message = [[TestAllExtensions alloc] init];
  1559. [message getExtension:recursiveExtension];
  1560. }
  1561. // This statements checks that the extension value isn't accidentally
  1562. // dealloced when removing it from the autocreated map.
  1563. [message setExtension:recursiveExtension
  1564. value:[message getExtension:recursiveExtension]];
  1565. XCTAssertTrue([message hasExtension:recursiveExtension]);
  1566. [message release];
  1567. }
  1568. - (void)testRecursion {
  1569. TestRecursiveMessage *message = [TestRecursiveMessage message];
  1570. XCTAssertNotNil(message.a);
  1571. XCTAssertNotNil(message.a.a);
  1572. XCTAssertEqual(message.a.a.i, 0);
  1573. }
  1574. - (void)testGenerateAndParseUnknownMessage {
  1575. GPBUnknownFieldSet *unknowns =
  1576. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1577. [unknowns mergeVarintField:123 value:456];
  1578. GPBMessage *message = [GPBMessage message];
  1579. [message setUnknownFields:unknowns];
  1580. NSData *data = [message data];
  1581. GPBMessage *message2 =
  1582. [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
  1583. XCTAssertEqualObjects(message, message2);
  1584. }
  1585. - (void)testDelimitedWriteAndParseMultipleMessages {
  1586. GPBUnknownFieldSet *unknowns1 =
  1587. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1588. [unknowns1 mergeVarintField:123 value:456];
  1589. GPBMessage *message1 = [GPBMessage message];
  1590. [message1 setUnknownFields:unknowns1];
  1591. GPBUnknownFieldSet *unknowns2 =
  1592. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1593. [unknowns2 mergeVarintField:789 value:987];
  1594. [unknowns2 mergeVarintField:654 value:321];
  1595. GPBMessage *message2 = [GPBMessage message];
  1596. [message2 setUnknownFields:unknowns2];
  1597. NSMutableData *delimitedData = [NSMutableData data];
  1598. [delimitedData appendData:[message1 delimitedData]];
  1599. [delimitedData appendData:[message2 delimitedData]];
  1600. GPBCodedInputStream *input =
  1601. [GPBCodedInputStream streamWithData:delimitedData];
  1602. GPBMessage *message3 = [GPBMessage parseDelimitedFromCodedInputStream:input
  1603. extensionRegistry:nil
  1604. error:NULL];
  1605. GPBMessage *message4 = [GPBMessage parseDelimitedFromCodedInputStream:input
  1606. extensionRegistry:nil
  1607. error:NULL];
  1608. XCTAssertEqualObjects(message1, message3);
  1609. XCTAssertEqualObjects(message2, message4);
  1610. }
  1611. - (void)testDuplicateEnums {
  1612. XCTAssertEqual(TestEnumWithDupValue_Foo1, TestEnumWithDupValue_Foo2);
  1613. }
  1614. - (void)testWeirdDefaults {
  1615. ObjcWeirdDefaults *message = [ObjcWeirdDefaults message];
  1616. GPBDescriptor *descriptor = [[message class] descriptor];
  1617. GPBFieldDescriptor *fieldDesc = [descriptor fieldWithName:@"foo"];
  1618. XCTAssertNotNil(fieldDesc);
  1619. XCTAssertTrue(fieldDesc.hasDefaultValue);
  1620. XCTAssertFalse(message.hasFoo);
  1621. XCTAssertEqualObjects(message.foo, @"");
  1622. fieldDesc = [descriptor fieldWithName:@"bar"];
  1623. XCTAssertNotNil(fieldDesc);
  1624. XCTAssertTrue(fieldDesc.hasDefaultValue);
  1625. XCTAssertFalse(message.hasBar);
  1626. XCTAssertEqualObjects(message.bar, GPBEmptyNSData());
  1627. }
  1628. - (void)testEnumDescriptorFromExtensionDescriptor {
  1629. GPBExtensionDescriptor *extDescriptor =
  1630. [UnittestRoot optionalForeignEnumExtension];
  1631. XCTAssertEqual(extDescriptor.dataType, GPBDataTypeEnum);
  1632. GPBEnumDescriptor *enumDescriptor = extDescriptor.enumDescriptor;
  1633. GPBEnumDescriptor *expectedDescriptor = ForeignEnum_EnumDescriptor();
  1634. XCTAssertEqualObjects(enumDescriptor, expectedDescriptor);
  1635. }
  1636. - (void)testPropertyNaming {
  1637. // objectivec_helpers.cc has some special handing to get proper all caps
  1638. // for a few cases to meet objc developer expectations.
  1639. //
  1640. // This "test" confirms that the expected names are generated, otherwise the
  1641. // test itself will fail to compile.
  1642. ObjCPropertyNaming *msg = [ObjCPropertyNaming message];
  1643. // On their own, at the end, in the middle.
  1644. msg.URL = @"good";
  1645. msg.thumbnailURL = @"good";
  1646. msg.URLFoo = @"good";
  1647. msg.someURLBlah = @"good";
  1648. msg.HTTP = @"good";
  1649. msg.HTTPS = @"good";
  1650. // No caps since it was "urls".
  1651. [msg.urlsArray addObject:@"good"];
  1652. }
  1653. - (void)testEnumNaming {
  1654. // objectivec_helpers.cc has some interesting cases to deal with in
  1655. // EnumValueName/EnumValueShortName. Confirm that things generated as
  1656. // expected.
  1657. // This block just has to compile to confirm we got the expected types/names.
  1658. // The *_IsValidValue() calls are just there to keep the projects warnings
  1659. // flags happy by providing use of the variables/values.
  1660. Foo aFoo = Foo_SerializedSize;
  1661. Foo_IsValidValue(aFoo);
  1662. aFoo = Foo_Size;
  1663. Foo_IsValidValue(aFoo);
  1664. Category_Enum aCat = Category_Enum_Red;
  1665. Category_Enum_IsValidValue(aCat);
  1666. Time aTime = Time_Base;
  1667. Time_IsValidValue(aTime);
  1668. aTime = Time_SomethingElse;
  1669. Time_IsValidValue(aTime);
  1670. // This block confirms the names in the decriptors is what we wanted.
  1671. GPBEnumDescriptor *descriptor;
  1672. NSString *valueName;
  1673. descriptor = Foo_EnumDescriptor();
  1674. XCTAssertNotNil(descriptor);
  1675. XCTAssertEqualObjects(@"Foo", descriptor.name);
  1676. valueName = [descriptor enumNameForValue:Foo_SerializedSize];
  1677. XCTAssertEqualObjects(@"Foo_SerializedSize", valueName);
  1678. valueName = [descriptor enumNameForValue:Foo_Size];
  1679. XCTAssertEqualObjects(@"Foo_Size", valueName);
  1680. descriptor = Category_Enum_EnumDescriptor();
  1681. XCTAssertNotNil(descriptor);
  1682. XCTAssertEqualObjects(@"Category_Enum", descriptor.name);
  1683. valueName = [descriptor enumNameForValue:Category_Enum_Red];
  1684. XCTAssertEqualObjects(@"Category_Enum_Red", valueName);
  1685. descriptor = Time_EnumDescriptor();
  1686. XCTAssertNotNil(descriptor);
  1687. XCTAssertEqualObjects(@"Time", descriptor.name);
  1688. valueName = [descriptor enumNameForValue:Time_Base];
  1689. XCTAssertEqualObjects(@"Time_Base", valueName);
  1690. valueName = [descriptor enumNameForValue:Time_SomethingElse];
  1691. XCTAssertEqualObjects(@"Time_SomethingElse", valueName);
  1692. }
  1693. - (void)testNegativeEnums {
  1694. EnumTestMsg *msg = [EnumTestMsg message];
  1695. // Defaults
  1696. XCTAssertEqual(msg.foo, EnumTestMsg_MyEnum_Zero);
  1697. XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_One);
  1698. XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegOne);
  1699. // Bounce to wire and back.
  1700. NSData *data = [msg data];
  1701. XCTAssertNotNil(data);
  1702. EnumTestMsg *msgPrime = [EnumTestMsg parseFromData:data error:NULL];
  1703. XCTAssertEqualObjects(msgPrime, msg);
  1704. XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero);
  1705. XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_One);
  1706. XCTAssertEqual(msgPrime.baz, EnumTestMsg_MyEnum_NegOne);
  1707. // Other values
  1708. msg.bar = EnumTestMsg_MyEnum_Two;
  1709. msg.baz = EnumTestMsg_MyEnum_NegTwo;
  1710. XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_Two);
  1711. XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegTwo);
  1712. // Bounce to wire and back.
  1713. data = [msg data];
  1714. XCTAssertNotNil(data);
  1715. msgPrime = [EnumTestMsg parseFromData:data error:NULL];
  1716. XCTAssertEqualObjects(msgPrime, msg);
  1717. XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero);
  1718. XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_Two);
  1719. XCTAssertEqual(msgPrime.baz, EnumTestMsg_MyEnum_NegTwo);
  1720. // Repeated field (shouldn't ever be an issue since developer has to use the
  1721. // right GPBArray methods themselves).
  1722. msg.mumbleArray = [GPBEnumArray
  1723. arrayWithValidationFunction:EnumTestMsg_MyEnum_IsValidValue];
  1724. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_Zero];
  1725. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_One];
  1726. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_Two];
  1727. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_NegOne];
  1728. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_NegTwo];
  1729. XCTAssertEqual([msg.mumbleArray valueAtIndex:0], EnumTestMsg_MyEnum_Zero);
  1730. XCTAssertEqual([msg.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
  1731. XCTAssertEqual([msg.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
  1732. XCTAssertEqual([msg.mumbleArray valueAtIndex:3], EnumTestMsg_MyEnum_NegOne);
  1733. XCTAssertEqual([msg.mumbleArray valueAtIndex:4], EnumTestMsg_MyEnum_NegTwo);
  1734. // Bounce to wire and back.
  1735. data = [msg data];
  1736. XCTAssertNotNil(data);
  1737. msgPrime = [EnumTestMsg parseFromData:data error:NULL];
  1738. XCTAssertEqualObjects(msgPrime, msg);
  1739. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:0],
  1740. EnumTestMsg_MyEnum_Zero);
  1741. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
  1742. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
  1743. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:3],
  1744. EnumTestMsg_MyEnum_NegOne);
  1745. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:4],
  1746. EnumTestMsg_MyEnum_NegTwo);
  1747. }
  1748. - (void)testOneBasedEnumHolder {
  1749. // Test case for https://github.com/google/protobuf/issues/1453
  1750. // Message with no explicit defaults, but a non zero default for an enum.
  1751. MessageWithOneBasedEnum *enumMsg = [MessageWithOneBasedEnum message];
  1752. XCTAssertEqual(enumMsg.enumField, MessageWithOneBasedEnum_OneBasedEnum_One);
  1753. }
  1754. - (void)testBoolOffsetUsage {
  1755. // Bools use storage within has_bits; this test ensures that this is honored
  1756. // in all places where things should crash or fail based on reading out of
  1757. // field storage instead.
  1758. BoolOnlyMessage *msg1 = [BoolOnlyMessage message];
  1759. BoolOnlyMessage *msg2 = [BoolOnlyMessage message];
  1760. msg1.boolField1 = YES;
  1761. msg2.boolField1 = YES;
  1762. msg1.boolField3 = YES;
  1763. msg2.boolField3 = YES;
  1764. msg1.boolField5 = YES;
  1765. msg2.boolField5 = YES;
  1766. msg1.boolField7 = YES;
  1767. msg2.boolField7 = YES;
  1768. msg1.boolField9 = YES;
  1769. msg2.boolField9 = YES;
  1770. msg1.boolField11 = YES;
  1771. msg2.boolField11 = YES;
  1772. msg1.boolField13 = YES;
  1773. msg2.boolField13 = YES;
  1774. msg1.boolField15 = YES;
  1775. msg2.boolField15 = YES;
  1776. msg1.boolField17 = YES;
  1777. msg2.boolField17 = YES;
  1778. msg1.boolField19 = YES;
  1779. msg2.boolField19 = YES;
  1780. msg1.boolField21 = YES;
  1781. msg2.boolField21 = YES;
  1782. msg1.boolField23 = YES;
  1783. msg2.boolField23 = YES;
  1784. msg1.boolField25 = YES;
  1785. msg2.boolField25 = YES;
  1786. msg1.boolField27 = YES;
  1787. msg2.boolField27 = YES;
  1788. msg1.boolField29 = YES;
  1789. msg2.boolField29 = YES;
  1790. msg1.boolField31 = YES;
  1791. msg2.boolField31 = YES;
  1792. msg1.boolField32 = YES;
  1793. msg2.boolField32 = YES;
  1794. XCTAssertTrue(msg1 != msg2); // Different pointers.
  1795. XCTAssertEqual([msg1 hash], [msg2 hash]);
  1796. XCTAssertEqualObjects(msg1, msg2);
  1797. BoolOnlyMessage *msg1Prime = [[msg1 copy] autorelease];
  1798. XCTAssertTrue(msg1Prime != msg1); // Different pointers.
  1799. XCTAssertEqual([msg1 hash], [msg1Prime hash]);
  1800. XCTAssertEqualObjects(msg1, msg1Prime);
  1801. // Field set in one, but not the other means they don't match (even if
  1802. // set to default value).
  1803. msg1Prime.boolField2 = NO;
  1804. XCTAssertNotEqualObjects(msg1Prime, msg1);
  1805. // And when set to different values.
  1806. msg1.boolField2 = YES;
  1807. XCTAssertNotEqualObjects(msg1Prime, msg1);
  1808. // And then they match again.
  1809. msg1.boolField2 = NO;
  1810. XCTAssertEqualObjects(msg1Prime, msg1);
  1811. XCTAssertEqual([msg1 hash], [msg1Prime hash]);
  1812. }
  1813. - (void)testCopyingMapFileds {
  1814. TestMessageOfMaps *msg = [TestMessageOfMaps message];
  1815. msg.strToStr[@"foo"] = @"bar";
  1816. [msg.strToInt setInt32:1 forKey:@"mumble"];
  1817. [msg.intToStr setObject:@"wee" forKey:42];
  1818. [msg.intToInt setInt32:123 forKey:321];
  1819. [msg.strToBool setBool:YES forKey:@"one"];
  1820. [msg.boolToStr setObject:@"something" forKey:YES];
  1821. [msg.boolToBool setBool:YES forKey:NO];
  1822. [msg.intToBool setBool:YES forKey:13];
  1823. [msg.boolToInt setInt32:111 forKey:NO];
  1824. TestAllTypes *subMsg1 = [TestAllTypes message];
  1825. subMsg1.optionalInt32 = 1;
  1826. TestAllTypes *subMsg2 = [TestAllTypes message];
  1827. subMsg1.optionalInt32 = 2;
  1828. TestAllTypes *subMsg3 = [TestAllTypes message];
  1829. subMsg1.optionalInt32 = 3;
  1830. msg.strToMsg[@"baz"] = subMsg1;
  1831. [msg.intToMsg setObject:subMsg2 forKey:222];
  1832. [msg.boolToMsg setObject:subMsg3 forKey:YES];
  1833. TestMessageOfMaps *msg2 = [[msg copy] autorelease];
  1834. XCTAssertNotNil(msg2);
  1835. XCTAssertEqualObjects(msg2, msg);
  1836. XCTAssertTrue(msg2 != msg); // ptr compare
  1837. XCTAssertTrue(msg.strToStr != msg2.strToStr); // ptr compare
  1838. XCTAssertTrue(msg.intToStr != msg2.intToStr); // ptr compare
  1839. XCTAssertTrue(msg.intToInt != msg2.intToInt); // ptr compare
  1840. XCTAssertTrue(msg.strToBool != msg2.strToBool); // ptr compare
  1841. XCTAssertTrue(msg.boolToStr != msg2.boolToStr); // ptr compare
  1842. XCTAssertTrue(msg.boolToBool != msg2.boolToBool); // ptr compare
  1843. XCTAssertTrue(msg.intToBool != msg2.intToBool); // ptr compare
  1844. XCTAssertTrue(msg.boolToInt != msg2.boolToInt); // ptr compare
  1845. XCTAssertTrue(msg.strToMsg != msg2.strToMsg); // ptr compare
  1846. XCTAssertTrue(msg.intToMsg != msg2.intToMsg); // ptr compare
  1847. XCTAssertTrue(msg.boolToMsg != msg2.boolToMsg); // ptr compare
  1848. XCTAssertTrue(msg.strToMsg[@"baz"] != msg2.strToMsg[@"baz"]); // ptr compare
  1849. XCTAssertEqualObjects(msg.strToMsg[@"baz"], msg2.strToMsg[@"baz"]);
  1850. XCTAssertTrue([msg.intToMsg objectForKey:222] != [msg2.intToMsg objectForKey:222]); // ptr compare
  1851. XCTAssertEqualObjects([msg.intToMsg objectForKey:222], [msg2.intToMsg objectForKey:222]);
  1852. XCTAssertTrue([msg.boolToMsg objectForKey:YES] != [msg2.boolToMsg objectForKey:YES]); // ptr compare
  1853. XCTAssertEqualObjects([msg.boolToMsg objectForKey:YES], [msg2.boolToMsg objectForKey:YES]);
  1854. }
  1855. @end