GPBMessageTests.m 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310
  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. #import "google/protobuf/UnittestObjcOptions.pbobjc.h"
  41. #import "google/protobuf/UnittestImport.pbobjc.h"
  42. // Helper class to test KVO.
  43. @interface GPBKVOTestObserver : NSObject {
  44. id observee_;
  45. NSString *keyPath_;
  46. }
  47. @property (nonatomic) BOOL didObserve;
  48. - (id)initWithObservee:(id)observee keyPath:(NSString *)keyPath;
  49. @end
  50. @implementation GPBKVOTestObserver
  51. @synthesize didObserve;
  52. - (id)initWithObservee:(id)observee keyPath:(NSString *)keyPath {
  53. if (self = [super init]) {
  54. observee_ = [observee retain];
  55. keyPath_ = [keyPath copy];
  56. [observee_ addObserver:self forKeyPath:keyPath_ options:0 context:NULL];
  57. }
  58. return self;
  59. }
  60. - (void)dealloc {
  61. [observee_ removeObserver:self forKeyPath:keyPath_];
  62. [observee_ release];
  63. [keyPath_ release];
  64. [super dealloc];
  65. }
  66. - (void)observeValueForKeyPath:(NSString *)keyPath
  67. ofObject:(id)object
  68. change:(NSDictionary *)change
  69. context:(void *)context
  70. {
  71. #pragma unused(object)
  72. #pragma unused(change)
  73. #pragma unused(context)
  74. if ([keyPath isEqualToString:keyPath_]) {
  75. self.didObserve = YES;
  76. }
  77. }
  78. @end
  79. @interface MessageTests : GPBTestCase
  80. @end
  81. @implementation MessageTests
  82. // TODO(thomasvl): this should get split into a few files of logic junks, it is
  83. // a jumble of things at the moment (and the testutils have a bunch of the real
  84. // assertions).
  85. - (TestAllTypes *)mergeSource {
  86. TestAllTypes *message = [TestAllTypes message];
  87. [message setOptionalInt32:1];
  88. [message setOptionalString:@"foo"];
  89. [message setOptionalForeignMessage:[ForeignMessage message]];
  90. [message.repeatedStringArray addObject:@"bar"];
  91. return message;
  92. }
  93. - (TestAllTypes *)mergeDestination {
  94. TestAllTypes *message = [TestAllTypes message];
  95. [message setOptionalInt64:2];
  96. [message setOptionalString:@"baz"];
  97. ForeignMessage *foreignMessage = [ForeignMessage message];
  98. [foreignMessage setC:3];
  99. [message setOptionalForeignMessage:foreignMessage];
  100. [message.repeatedStringArray addObject:@"qux"];
  101. return message;
  102. }
  103. - (TestAllTypes *)mergeDestinationWithoutForeignMessageIvar {
  104. TestAllTypes *message = [TestAllTypes message];
  105. [message setOptionalInt64:2];
  106. [message setOptionalString:@"baz"];
  107. [message.repeatedStringArray addObject:@"qux"];
  108. return message;
  109. }
  110. - (TestAllTypes *)mergeResult {
  111. TestAllTypes *message = [TestAllTypes message];
  112. [message setOptionalInt32:1];
  113. [message setOptionalInt64:2];
  114. [message setOptionalString:@"foo"];
  115. ForeignMessage *foreignMessage = [ForeignMessage message];
  116. [foreignMessage setC:3];
  117. [message setOptionalForeignMessage:foreignMessage];
  118. [message.repeatedStringArray addObject:@"qux"];
  119. [message.repeatedStringArray addObject:@"bar"];
  120. return message;
  121. }
  122. - (TestAllTypes *)mergeResultForDestinationWithoutForeignMessageIvar {
  123. TestAllTypes *message = [TestAllTypes message];
  124. [message setOptionalInt32:1];
  125. [message setOptionalInt64:2];
  126. [message setOptionalString:@"foo"];
  127. ForeignMessage *foreignMessage = [ForeignMessage message];
  128. [message setOptionalForeignMessage:foreignMessage];
  129. [message.repeatedStringArray addObject:@"qux"];
  130. [message.repeatedStringArray addObject:@"bar"];
  131. return message;
  132. }
  133. - (TestAllExtensions *)mergeExtensionsDestination {
  134. TestAllExtensions *message = [TestAllExtensions message];
  135. [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
  136. [message setExtension:[UnittestRoot optionalStringExtension] value:@"foo"];
  137. ForeignMessage *foreignMessage = [ForeignMessage message];
  138. foreignMessage.c = 4;
  139. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  140. value:foreignMessage];
  141. TestAllTypes_NestedMessage *nestedMessage =
  142. [TestAllTypes_NestedMessage message];
  143. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  144. value:nestedMessage];
  145. return message;
  146. }
  147. - (TestAllExtensions *)mergeExtensionsSource {
  148. TestAllExtensions *message = [TestAllExtensions message];
  149. [message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
  150. [message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
  151. ForeignMessage *foreignMessage = [ForeignMessage message];
  152. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  153. value:foreignMessage];
  154. TestAllTypes_NestedMessage *nestedMessage =
  155. [TestAllTypes_NestedMessage message];
  156. nestedMessage.bb = 7;
  157. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  158. value:nestedMessage];
  159. return message;
  160. }
  161. - (TestAllExtensions *)mergeExtensionsResult {
  162. TestAllExtensions *message = [TestAllExtensions message];
  163. [message setExtension:[UnittestRoot optionalInt32Extension] value:@5];
  164. [message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
  165. [message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
  166. ForeignMessage *foreignMessage = [ForeignMessage message];
  167. foreignMessage.c = 4;
  168. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  169. value:foreignMessage];
  170. TestAllTypes_NestedMessage *nestedMessage =
  171. [TestAllTypes_NestedMessage message];
  172. nestedMessage.bb = 7;
  173. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  174. value:nestedMessage];
  175. return message;
  176. }
  177. - (void)testMergeFrom {
  178. TestAllTypes *result = [[self.mergeDestination copy] autorelease];
  179. [result mergeFrom:self.mergeSource];
  180. NSData *resultData = [result data];
  181. NSData *mergeResultData = [self.mergeResult data];
  182. XCTAssertEqualObjects(resultData, mergeResultData);
  183. XCTAssertEqualObjects(result, self.mergeResult);
  184. // Test when destination does not have an Ivar (type is an object) but source
  185. // has such Ivar.
  186. // The result must has the Ivar which is same as the one in source.
  187. result = [[self.mergeDestinationWithoutForeignMessageIvar copy] autorelease];
  188. [result mergeFrom:self.mergeSource];
  189. resultData = [result data];
  190. mergeResultData =
  191. [self.mergeResultForDestinationWithoutForeignMessageIvar data];
  192. XCTAssertEqualObjects(resultData, mergeResultData);
  193. XCTAssertEqualObjects(
  194. result, self.mergeResultForDestinationWithoutForeignMessageIvar);
  195. // Test when destination is empty.
  196. // The result must is same as the source.
  197. result = [TestAllTypes message];
  198. [result mergeFrom:self.mergeSource];
  199. resultData = [result data];
  200. mergeResultData = [self.mergeSource data];
  201. XCTAssertEqualObjects(resultData, mergeResultData);
  202. XCTAssertEqualObjects(result, self.mergeSource);
  203. }
  204. - (void)testMergeFromWithExtensions {
  205. TestAllExtensions *result = [self mergeExtensionsDestination];
  206. [result mergeFrom:[self mergeExtensionsSource]];
  207. NSData *resultData = [result data];
  208. NSData *mergeResultData = [[self mergeExtensionsResult] data];
  209. XCTAssertEqualObjects(resultData, mergeResultData);
  210. XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
  211. // Test merging from data.
  212. result = [self mergeExtensionsDestination];
  213. NSData *data = [[self mergeExtensionsSource] data];
  214. XCTAssertNotNil(data);
  215. [result mergeFromData:data
  216. extensionRegistry:[UnittestRoot extensionRegistry]];
  217. resultData = [result data];
  218. XCTAssertEqualObjects(resultData, mergeResultData);
  219. XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
  220. }
  221. - (void)testIsEquals {
  222. TestAllTypes *result = [[self.mergeDestination copy] autorelease];
  223. [result mergeFrom:self.mergeSource];
  224. XCTAssertEqualObjects(result.data, self.mergeResult.data);
  225. XCTAssertEqualObjects(result, self.mergeResult);
  226. TestAllTypes *result2 = [[self.mergeDestination copy] autorelease];
  227. XCTAssertNotEqualObjects(result2.data, self.mergeResult.data);
  228. XCTAssertNotEqualObjects(result2, self.mergeResult);
  229. }
  230. // =================================================================
  231. // Required-field-related tests.
  232. - (TestRequired *)testRequiredInitialized {
  233. TestRequired *message = [TestRequired message];
  234. [message setA:1];
  235. [message setB:2];
  236. [message setC:3];
  237. return message;
  238. }
  239. - (void)testRequired {
  240. TestRequired *message = [TestRequired message];
  241. XCTAssertFalse(message.initialized);
  242. [message setA:1];
  243. XCTAssertFalse(message.initialized);
  244. [message setB:1];
  245. XCTAssertFalse(message.initialized);
  246. [message setC:1];
  247. XCTAssertTrue(message.initialized);
  248. }
  249. - (void)testRequiredForeign {
  250. TestRequiredForeign *message = [TestRequiredForeign message];
  251. XCTAssertTrue(message.initialized);
  252. [message setOptionalMessage:[TestRequired message]];
  253. XCTAssertFalse(message.initialized);
  254. [message setOptionalMessage:self.testRequiredInitialized];
  255. XCTAssertTrue(message.initialized);
  256. [message.repeatedMessageArray addObject:[TestRequired message]];
  257. XCTAssertFalse(message.initialized);
  258. [message.repeatedMessageArray removeAllObjects];
  259. [message.repeatedMessageArray addObject:self.testRequiredInitialized];
  260. XCTAssertTrue(message.initialized);
  261. }
  262. - (void)testRequiredExtension {
  263. TestAllExtensions *message = [TestAllExtensions message];
  264. XCTAssertTrue(message.initialized);
  265. [message setExtension:[TestRequired single] value:[TestRequired message]];
  266. XCTAssertFalse(message.initialized);
  267. [message setExtension:[TestRequired single]
  268. value:self.testRequiredInitialized];
  269. XCTAssertTrue(message.initialized);
  270. [message addExtension:[TestRequired multi] value:[TestRequired message]];
  271. XCTAssertFalse(message.initialized);
  272. [message setExtension:[TestRequired multi]
  273. index:0
  274. value:self.testRequiredInitialized];
  275. XCTAssertTrue(message.initialized);
  276. }
  277. - (void)testDataFromUninitialized {
  278. TestRequired *message = [TestRequired message];
  279. NSData *data = [message data];
  280. // In DEBUG, the data generation will fail, but in non DEBUG, it passes
  281. // because the check isn't done (for speed).
  282. #ifdef DEBUG
  283. XCTAssertNil(data);
  284. #else
  285. XCTAssertNotNil(data);
  286. XCTAssertFalse(message.initialized);
  287. #endif // DEBUG
  288. }
  289. - (void)testInitialized {
  290. // We're mostly testing that no exception is thrown.
  291. TestRequired *message = [TestRequired message];
  292. XCTAssertFalse(message.initialized);
  293. }
  294. - (void)testDataFromNestedUninitialized {
  295. TestRequiredForeign *message = [TestRequiredForeign message];
  296. [message setOptionalMessage:[TestRequired message]];
  297. [message.repeatedMessageArray addObject:[TestRequired message]];
  298. [message.repeatedMessageArray addObject:[TestRequired message]];
  299. NSData *data = [message data];
  300. // In DEBUG, the data generation will fail, but in non DEBUG, it passes
  301. // because the check isn't done (for speed).
  302. #ifdef DEBUG
  303. XCTAssertNil(data);
  304. #else
  305. XCTAssertNotNil(data);
  306. XCTAssertFalse(message.initialized);
  307. #endif // DEBUG
  308. }
  309. - (void)testNestedInitialized {
  310. // We're mostly testing that no exception is thrown.
  311. TestRequiredForeign *message = [TestRequiredForeign message];
  312. [message setOptionalMessage:[TestRequired message]];
  313. [message.repeatedMessageArray addObject:[TestRequired message]];
  314. [message.repeatedMessageArray addObject:[TestRequired message]];
  315. XCTAssertFalse(message.initialized);
  316. }
  317. - (void)testParseUninitialized {
  318. NSError *error = nil;
  319. TestRequired *msg =
  320. [TestRequired parseFromData:GPBEmptyNSData() error:&error];
  321. // In DEBUG, the parse will fail, but in non DEBUG, it passes because
  322. // the check isn't done (for speed).
  323. #ifdef DEBUG
  324. XCTAssertNil(msg);
  325. XCTAssertNotNil(error);
  326. XCTAssertEqualObjects(error.domain, GPBMessageErrorDomain);
  327. XCTAssertEqual(error.code, GPBMessageErrorCodeMissingRequiredField);
  328. #else
  329. XCTAssertNotNil(msg);
  330. XCTAssertNil(error);
  331. XCTAssertFalse(msg.initialized);
  332. #endif // DEBUG
  333. }
  334. #pragma clang diagnostic push
  335. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  336. - (void)testCoding {
  337. GPBMessage *original = [self mergeResult];
  338. NSData *data =
  339. [NSKeyedArchiver archivedDataWithRootObject:original];
  340. id unarchivedObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  341. XCTAssertEqualObjects(unarchivedObject, original);
  342. // Intentionally doing a pointer comparison.
  343. XCTAssertNotEqual(unarchivedObject, original);
  344. }
  345. - (void)testSecureCoding {
  346. GPBMessage *original = [self mergeResult];
  347. NSString *key = @"testing123";
  348. NSMutableData *data = [NSMutableData data];
  349. NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
  350. [archiver setRequiresSecureCoding:YES];
  351. [archiver encodeObject:original forKey:key];
  352. [archiver finishEncoding];
  353. NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
  354. [unarchiver setRequiresSecureCoding:YES];
  355. id unarchivedObject = [unarchiver decodeObjectOfClass:[GPBMessage class]
  356. forKey:key];
  357. [unarchiver finishDecoding];
  358. XCTAssertEqualObjects(unarchivedObject, original);
  359. // Intentionally doing a pointer comparison.
  360. XCTAssertNotEqual(unarchivedObject, original);
  361. }
  362. #pragma clang diagnostic pop
  363. - (void)testObjectReset {
  364. // Tests a failure where clearing out defaults values caused an over release.
  365. TestAllTypes *message = [TestAllTypes message];
  366. message.hasOptionalNestedMessage = NO;
  367. [message setOptionalNestedMessage:[TestAllTypes_NestedMessage message]];
  368. message.hasOptionalNestedMessage = NO;
  369. [message setOptionalNestedMessage:[TestAllTypes_NestedMessage message]];
  370. [message setOptionalNestedMessage:nil];
  371. message.hasOptionalNestedMessage = NO;
  372. }
  373. - (void)testSettingHasToYes {
  374. TestAllTypes *message = [TestAllTypes message];
  375. XCTAssertThrows([message setHasOptionalNestedMessage:YES]);
  376. }
  377. - (void)testRoot {
  378. XCTAssertNotNil([UnittestRoot extensionRegistry]);
  379. }
  380. - (void)testGPBMessageSize {
  381. // See the note in GPBMessage_PackagePrivate.h about why we want to keep the
  382. // base instance size pointer size aligned.
  383. size_t messageSize = class_getInstanceSize([GPBMessage class]);
  384. XCTAssertEqual((messageSize % sizeof(void *)), (size_t)0,
  385. @"Base size isn't pointer size aligned");
  386. // Since we add storage ourselves (see +allocWithZone: in GPBMessage), confirm
  387. // that the size of some generated classes is still the same as the base for
  388. // that logic to work as desired.
  389. size_t testMessageSize = class_getInstanceSize([TestAllTypes class]);
  390. XCTAssertEqual(testMessageSize, messageSize);
  391. }
  392. - (void)testInit {
  393. TestAllTypes *message = [TestAllTypes message];
  394. [self assertClear:message];
  395. }
  396. - (void)testAccessors {
  397. TestAllTypes *message = [TestAllTypes message];
  398. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  399. [self assertAllFieldsSet:message repeatedCount:kGPBDefaultRepeatCount];
  400. }
  401. - (void)testKVC_ValueForKey {
  402. TestAllTypes *message = [TestAllTypes message];
  403. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  404. [self assertAllFieldsKVCMatch:message];
  405. }
  406. - (void)testKVC_SetValue_ForKey {
  407. TestAllTypes *message = [TestAllTypes message];
  408. [self setAllFieldsViaKVC:message repeatedCount:kGPBDefaultRepeatCount];
  409. [self assertAllFieldsKVCMatch:message];
  410. [self assertAllFieldsSet:message repeatedCount:kGPBDefaultRepeatCount];
  411. [self assertAllFieldsKVCMatch:message];
  412. }
  413. - (void)testKVOBasic {
  414. TestAllTypes *message = [TestAllTypes message];
  415. GPBKVOTestObserver *observer =
  416. [[[GPBKVOTestObserver alloc] initWithObservee:message
  417. keyPath:@"optionalString"]
  418. autorelease];
  419. XCTAssertFalse(observer.didObserve);
  420. message.defaultString = @"Hello";
  421. XCTAssertFalse(observer.didObserve);
  422. message.optionalString = @"Hello";
  423. XCTAssertTrue(observer.didObserve);
  424. }
  425. - (void)testKVOAutocreate {
  426. TestAllTypes *message = [TestAllTypes message];
  427. GPBKVOTestObserver *autocreateObserver =
  428. [[[GPBKVOTestObserver alloc] initWithObservee:message
  429. keyPath:@"optionalImportMessage"]
  430. autorelease];
  431. GPBKVOTestObserver *innerFieldObserver =
  432. [[[GPBKVOTestObserver alloc] initWithObservee:message
  433. keyPath:@"optionalImportMessage.d"]
  434. autorelease];
  435. XCTAssertFalse(autocreateObserver.didObserve);
  436. XCTAssertFalse(innerFieldObserver.didObserve);
  437. int a = message.optionalImportMessage.d;
  438. XCTAssertEqual(a, 0);
  439. // Autocreation of fields is not observed by KVO when getting values.
  440. XCTAssertFalse(autocreateObserver.didObserve);
  441. XCTAssertFalse(innerFieldObserver.didObserve);
  442. message.optionalImportMessage.d = 2;
  443. // Autocreation of fields is not observed by KVO.
  444. // This is undefined behavior. The library makes no guarantees with regards
  445. // to KVO firing if an autocreation occurs as part of a setter.
  446. // This test exists just to be aware if the behavior changes.
  447. XCTAssertFalse(autocreateObserver.didObserve);
  448. // Values set inside of an autocreated field are observed.
  449. XCTAssertTrue(innerFieldObserver.didObserve);
  450. // Explicit setting of a message field is observed.
  451. message.optionalImportMessage = [ImportMessage message];
  452. XCTAssertTrue(autocreateObserver.didObserve);
  453. }
  454. - (void)testDescription {
  455. // No real test, just exercise code
  456. TestAllTypes *message = [TestAllTypes message];
  457. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  458. GPBUnknownFieldSet *unknownFields =
  459. [[[GPBUnknownFieldSet alloc] init] autorelease];
  460. GPBUnknownField *field =
  461. [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
  462. [field addVarint:2];
  463. [unknownFields addField:field];
  464. field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
  465. [field addVarint:4];
  466. [unknownFields addField:field];
  467. [message setUnknownFields:unknownFields];
  468. NSString *description = [message description];
  469. XCTAssertGreaterThan([description length], 0U);
  470. GPBMessage *message2 = [TestAllExtensions message];
  471. [message2 setExtension:[UnittestRoot optionalInt32Extension] value:@1];
  472. [message2 addExtension:[UnittestRoot repeatedInt32Extension] value:@2];
  473. description = [message2 description];
  474. XCTAssertGreaterThan([description length], 0U);
  475. }
  476. - (void)testSetter {
  477. // Test to make sure that if we set a value that has a default value
  478. // with the default, that the has is set, and the value gets put into the
  479. // message correctly.
  480. TestAllTypes *message = [TestAllTypes message];
  481. GPBDescriptor *descriptor = [[message class] descriptor];
  482. XCTAssertNotNil(descriptor);
  483. GPBFieldDescriptor *fieldDescriptor =
  484. [descriptor fieldWithName:@"defaultInt32"];
  485. XCTAssertNotNil(fieldDescriptor);
  486. GPBGenericValue defaultValue = [fieldDescriptor defaultValue];
  487. [message setDefaultInt32:defaultValue.valueInt32];
  488. XCTAssertTrue(message.hasDefaultInt32);
  489. XCTAssertEqual(message.defaultInt32, defaultValue.valueInt32);
  490. // Do the same thing with an object type.
  491. message = [TestAllTypes message];
  492. fieldDescriptor = [descriptor fieldWithName:@"defaultString"];
  493. XCTAssertNotNil(fieldDescriptor);
  494. defaultValue = [fieldDescriptor defaultValue];
  495. [message setDefaultString:defaultValue.valueString];
  496. XCTAssertTrue(message.hasDefaultString);
  497. XCTAssertEqualObjects(message.defaultString, defaultValue.valueString);
  498. // Test default string type.
  499. message = [TestAllTypes message];
  500. XCTAssertEqualObjects(message.defaultString, @"hello");
  501. XCTAssertFalse(message.hasDefaultString);
  502. fieldDescriptor = [descriptor fieldWithName:@"defaultString"];
  503. XCTAssertNotNil(fieldDescriptor);
  504. defaultValue = [fieldDescriptor defaultValue];
  505. [message setDefaultString:defaultValue.valueString];
  506. XCTAssertEqualObjects(message.defaultString, @"hello");
  507. XCTAssertTrue(message.hasDefaultString);
  508. [message setDefaultString:nil];
  509. XCTAssertEqualObjects(message.defaultString, @"hello");
  510. XCTAssertFalse(message.hasDefaultString);
  511. message.hasDefaultString = NO;
  512. XCTAssertFalse(message.hasDefaultString);
  513. XCTAssertEqualObjects(message.defaultString, @"hello");
  514. // Test default bytes type.
  515. NSData *defaultBytes = [@"world" dataUsingEncoding:NSUTF8StringEncoding];
  516. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  517. XCTAssertFalse(message.hasDefaultString);
  518. fieldDescriptor = [descriptor fieldWithName:@"defaultBytes"];
  519. XCTAssertNotNil(fieldDescriptor);
  520. defaultValue = [fieldDescriptor defaultValue];
  521. [message setDefaultBytes:defaultValue.valueData];
  522. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  523. XCTAssertTrue(message.hasDefaultBytes);
  524. [message setDefaultBytes:nil];
  525. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  526. XCTAssertFalse(message.hasDefaultBytes);
  527. message.hasDefaultBytes = NO;
  528. XCTAssertFalse(message.hasDefaultBytes);
  529. XCTAssertEqualObjects(message.defaultBytes, defaultBytes);
  530. // Test optional string.
  531. XCTAssertFalse(message.hasOptionalString);
  532. XCTAssertEqualObjects(message.optionalString, @"");
  533. XCTAssertFalse(message.hasOptionalString);
  534. message.optionalString = nil;
  535. XCTAssertFalse(message.hasOptionalString);
  536. XCTAssertEqualObjects(message.optionalString, @"");
  537. NSString *string = @"string";
  538. message.optionalString = string;
  539. XCTAssertEqualObjects(message.optionalString, string);
  540. XCTAssertTrue(message.hasOptionalString);
  541. message.optionalString = nil;
  542. XCTAssertFalse(message.hasOptionalString);
  543. XCTAssertEqualObjects(message.optionalString, @"");
  544. // Test optional data.
  545. XCTAssertFalse(message.hasOptionalBytes);
  546. XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
  547. XCTAssertFalse(message.hasOptionalBytes);
  548. message.optionalBytes = nil;
  549. XCTAssertFalse(message.hasOptionalBytes);
  550. XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
  551. NSData *data = [@"bytes" dataUsingEncoding:NSUTF8StringEncoding];
  552. message.optionalBytes = data;
  553. XCTAssertEqualObjects(message.optionalBytes, data);
  554. XCTAssertTrue(message.hasOptionalBytes);
  555. message.optionalBytes = nil;
  556. XCTAssertFalse(message.hasOptionalBytes);
  557. XCTAssertEqualObjects(message.optionalBytes, GPBEmptyNSData());
  558. // Test lazy message setting
  559. XCTAssertFalse(message.hasOptionalLazyMessage);
  560. XCTAssertNotNil(message.optionalLazyMessage);
  561. XCTAssertFalse(message.hasOptionalLazyMessage);
  562. message.hasOptionalLazyMessage = NO;
  563. XCTAssertFalse(message.hasOptionalLazyMessage);
  564. XCTAssertNotNil(message.optionalLazyMessage);
  565. XCTAssertFalse(message.hasOptionalLazyMessage);
  566. message.optionalLazyMessage = nil;
  567. XCTAssertFalse(message.hasOptionalLazyMessage);
  568. // Test nested messages
  569. XCTAssertFalse(message.hasOptionalLazyMessage);
  570. message.optionalLazyMessage.bb = 1;
  571. XCTAssertTrue(message.hasOptionalLazyMessage);
  572. XCTAssertEqual(message.optionalLazyMessage.bb, 1);
  573. XCTAssertNotNil(message.optionalLazyMessage);
  574. message.optionalLazyMessage = nil;
  575. XCTAssertFalse(message.hasOptionalLazyMessage);
  576. XCTAssertEqual(message.optionalLazyMessage.bb, 0);
  577. XCTAssertFalse(message.hasOptionalLazyMessage);
  578. XCTAssertNotNil(message.optionalLazyMessage);
  579. // -testDefaultSubMessages tests the "defaulting" handling of fields
  580. // containing messages.
  581. }
  582. - (void)testRepeatedSetters {
  583. TestAllTypes *message = [TestAllTypes message];
  584. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  585. [self modifyRepeatedFields:message];
  586. [self assertRepeatedFieldsModified:message
  587. repeatedCount:kGPBDefaultRepeatCount];
  588. }
  589. - (void)testClear {
  590. TestAllTypes *message = [TestAllTypes message];
  591. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  592. [self clearAllFields:message];
  593. [self assertClear:message];
  594. TestAllTypes *message2 = [TestAllTypes message];
  595. XCTAssertEqualObjects(message, message2);
  596. }
  597. - (void)testClearKVC {
  598. TestAllTypes *message = [TestAllTypes message];
  599. [self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
  600. [self clearAllFields:message];
  601. [self assertClear:message];
  602. [self assertClearKVC:message];
  603. }
  604. - (void)testClearExtension {
  605. // clearExtension() is not actually used in TestUtil, so try it manually.
  606. GPBMessage *message1 = [TestAllExtensions message];
  607. [message1 setExtension:[UnittestRoot optionalInt32Extension] value:@1];
  608. XCTAssertTrue([message1 hasExtension:[UnittestRoot optionalInt32Extension]]);
  609. [message1 clearExtension:[UnittestRoot optionalInt32Extension]];
  610. XCTAssertFalse([message1 hasExtension:[UnittestRoot optionalInt32Extension]]);
  611. GPBMessage *message2 = [TestAllExtensions message];
  612. [message2 addExtension:[UnittestRoot repeatedInt32Extension] value:@1];
  613. XCTAssertEqual(
  614. [[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
  615. (NSUInteger)1);
  616. [message2 clearExtension:[UnittestRoot repeatedInt32Extension]];
  617. XCTAssertEqual(
  618. [[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
  619. (NSUInteger)0);
  620. // Clearing an unset extension field shouldn't make the target message
  621. // visible.
  622. GPBMessage *message3 = [TestAllExtensions message];
  623. GPBMessage *extension_msg =
  624. [message3 getExtension:[UnittestObjcRoot recursiveExtension]];
  625. XCTAssertFalse([message3 hasExtension:[UnittestObjcRoot recursiveExtension]]);
  626. [extension_msg clearExtension:[UnittestRoot optionalInt32Extension]];
  627. XCTAssertFalse([message3 hasExtension:[UnittestObjcRoot recursiveExtension]]);
  628. }
  629. - (void)testDefaultingSubMessages {
  630. TestAllTypes *message = [TestAllTypes message];
  631. // Initially they should all not have values.
  632. XCTAssertFalse(message.hasOptionalGroup);
  633. XCTAssertFalse(message.hasOptionalNestedMessage);
  634. XCTAssertFalse(message.hasOptionalForeignMessage);
  635. XCTAssertFalse(message.hasOptionalImportMessage);
  636. XCTAssertFalse(message.hasOptionalPublicImportMessage);
  637. XCTAssertFalse(message.hasOptionalLazyMessage);
  638. // They should auto create something when fetched.
  639. TestAllTypes_OptionalGroup *optionalGroup = [message.optionalGroup retain];
  640. TestAllTypes_NestedMessage *optionalNestedMessage =
  641. [message.optionalNestedMessage retain];
  642. ForeignMessage *optionalForeignMessage =
  643. [message.optionalForeignMessage retain];
  644. ImportMessage *optionalImportMessage = [message.optionalImportMessage retain];
  645. PublicImportMessage *optionalPublicImportMessage =
  646. [message.optionalPublicImportMessage retain];
  647. TestAllTypes_NestedMessage *optionalLazyMessage =
  648. [message.optionalLazyMessage retain];
  649. XCTAssertNotNil(optionalGroup);
  650. XCTAssertNotNil(optionalNestedMessage);
  651. XCTAssertNotNil(optionalForeignMessage);
  652. XCTAssertNotNil(optionalImportMessage);
  653. XCTAssertNotNil(optionalPublicImportMessage);
  654. XCTAssertNotNil(optionalLazyMessage);
  655. // Although they were created, they should not respond to hasValue until that
  656. // submessage is mutated.
  657. XCTAssertFalse(message.hasOptionalGroup);
  658. XCTAssertFalse(message.hasOptionalNestedMessage);
  659. XCTAssertFalse(message.hasOptionalForeignMessage);
  660. XCTAssertFalse(message.hasOptionalImportMessage);
  661. XCTAssertFalse(message.hasOptionalPublicImportMessage);
  662. XCTAssertFalse(message.hasOptionalLazyMessage);
  663. // And they set that value back in to the message since the value created was
  664. // mutable (so a second fetch should give the same object).
  665. XCTAssertEqual(message.optionalGroup, optionalGroup);
  666. XCTAssertEqual(message.optionalNestedMessage, optionalNestedMessage);
  667. XCTAssertEqual(message.optionalForeignMessage, optionalForeignMessage);
  668. XCTAssertEqual(message.optionalImportMessage, optionalImportMessage);
  669. XCTAssertEqual(message.optionalPublicImportMessage,
  670. optionalPublicImportMessage);
  671. XCTAssertEqual(message.optionalLazyMessage, optionalLazyMessage);
  672. // And the default objects for a second message should be distinct (again,
  673. // since they are mutable, each needs their own copy).
  674. TestAllTypes *message2 = [TestAllTypes message];
  675. // Intentionally doing a pointer comparison.
  676. XCTAssertNotEqual(message2.optionalGroup, optionalGroup);
  677. XCTAssertNotEqual(message2.optionalNestedMessage, optionalNestedMessage);
  678. XCTAssertNotEqual(message2.optionalForeignMessage, optionalForeignMessage);
  679. XCTAssertNotEqual(message2.optionalImportMessage, optionalImportMessage);
  680. XCTAssertNotEqual(message2.optionalPublicImportMessage,
  681. optionalPublicImportMessage);
  682. XCTAssertNotEqual(message2.optionalLazyMessage, optionalLazyMessage);
  683. // Setting the values to nil will clear the has flag, and on next access you
  684. // get back new submessages.
  685. message.optionalGroup = nil;
  686. message.optionalNestedMessage = nil;
  687. message.optionalForeignMessage = nil;
  688. message.optionalImportMessage = nil;
  689. message.optionalPublicImportMessage = nil;
  690. message.optionalLazyMessage = nil;
  691. XCTAssertFalse(message.hasOptionalGroup);
  692. XCTAssertFalse(message.hasOptionalNestedMessage);
  693. XCTAssertFalse(message.hasOptionalForeignMessage);
  694. XCTAssertFalse(message.hasOptionalImportMessage);
  695. XCTAssertFalse(message.hasOptionalPublicImportMessage);
  696. XCTAssertFalse(message.hasOptionalLazyMessage);
  697. // Intentionally doing a pointer comparison.
  698. XCTAssertNotEqual(message.optionalGroup, optionalGroup);
  699. XCTAssertNotEqual(message.optionalNestedMessage, optionalNestedMessage);
  700. XCTAssertNotEqual(message.optionalForeignMessage, optionalForeignMessage);
  701. XCTAssertNotEqual(message.optionalImportMessage, optionalImportMessage);
  702. XCTAssertNotEqual(message.optionalPublicImportMessage,
  703. optionalPublicImportMessage);
  704. XCTAssertNotEqual(message.optionalLazyMessage, optionalLazyMessage);
  705. [optionalGroup release];
  706. [optionalNestedMessage release];
  707. [optionalForeignMessage release];
  708. [optionalImportMessage release];
  709. [optionalPublicImportMessage release];
  710. [optionalLazyMessage release];
  711. }
  712. - (void)testMultiplePointersToAutocreatedMessage {
  713. // Multiple objects pointing to the same autocreated message.
  714. TestAllTypes *message = [TestAllTypes message];
  715. TestAllTypes *message2 = [TestAllTypes message];
  716. message2.optionalGroup = message.optionalGroup;
  717. XCTAssertTrue([message2 hasOptionalGroup]);
  718. XCTAssertFalse([message hasOptionalGroup]);
  719. message2.optionalGroup.a = 42;
  720. XCTAssertTrue([message hasOptionalGroup]);
  721. XCTAssertTrue([message2 hasOptionalGroup]);
  722. }
  723. - (void)testCopyWithAutocreatedMessage {
  724. // Mutable copy should not copy autocreated messages.
  725. TestAllTypes *message = [TestAllTypes message];
  726. message.optionalGroup.a = 42;
  727. XCTAssertNotNil(message.optionalNestedMessage);
  728. TestAllTypes *message2 = [[message copy] autorelease];
  729. XCTAssertTrue([message2 hasOptionalGroup]);
  730. XCTAssertFalse([message2 hasOptionalNestedMessage]);
  731. // Intentionally doing a pointer comparison.
  732. XCTAssertNotEqual(message.optionalNestedMessage,
  733. message2.optionalNestedMessage);
  734. }
  735. - (void)testClearAutocreatedSubmessage {
  736. // Call clear on an intermediate submessage should cause it to get recreated
  737. // on the next call.
  738. TestRecursiveMessage *message = [TestRecursiveMessage message];
  739. TestRecursiveMessage *message_inner = [message.a.a.a retain];
  740. XCTAssertNotNil(message_inner);
  741. XCTAssertTrue(GPBWasMessageAutocreatedBy(message_inner, message.a.a));
  742. [message.a.a clear];
  743. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_inner, message.a.a));
  744. // Intentionally doing a pointer comparison.
  745. XCTAssertNotEqual(message.a.a.a, message_inner);
  746. [message_inner release];
  747. }
  748. - (void)testRetainAutocreatedSubmessage {
  749. // Should be able to retain autocreated submessage while the creator is
  750. // dealloced.
  751. TestAllTypes *message = [TestAllTypes message];
  752. ForeignMessage *subMessage;
  753. @autoreleasepool {
  754. TestAllTypes *message2 = [TestAllTypes message];
  755. subMessage = message2.optionalForeignMessage; // Autocreated
  756. message.optionalForeignMessage = subMessage;
  757. XCTAssertTrue(GPBWasMessageAutocreatedBy(message.optionalForeignMessage,
  758. message2));
  759. }
  760. // Should be the same object, and should still be live.
  761. XCTAssertEqual(message.optionalForeignMessage, subMessage);
  762. XCTAssertNotNil([subMessage description]);
  763. }
  764. - (void)testSetNilAutocreatedSubmessage {
  765. TestRecursiveMessage *message = [TestRecursiveMessage message];
  766. TestRecursiveMessage *message_inner = [message.a.a retain];
  767. XCTAssertFalse([message hasA]);
  768. XCTAssertFalse([message.a hasA]);
  769. message.a.a = nil;
  770. // |message.a| has to be made visible, but |message.a.a| was set to nil so
  771. // shouldn't be.
  772. XCTAssertTrue([message hasA]);
  773. XCTAssertFalse([message.a hasA]);
  774. // Setting submessage to nil should cause it to lose its creator.
  775. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_inner, message.a));
  776. // After setting to nil, getting it again should create a new autocreated
  777. // message.
  778. // Intentionally doing a pointer comparison.
  779. XCTAssertNotEqual(message.a.a, message_inner);
  780. [message_inner release];
  781. }
  782. - (void)testSetDoesntHaveAutocreatedSubmessage {
  783. // Clearing submessage (set has == NO) should NOT cause it to lose its
  784. // creator.
  785. TestAllTypes *message = [TestAllTypes message];
  786. TestAllTypes_NestedMessage *nestedMessage = message.optionalNestedMessage;
  787. XCTAssertFalse([message hasOptionalNestedMessage]);
  788. [message setHasOptionalNestedMessage:NO];
  789. XCTAssertFalse([message hasOptionalNestedMessage]);
  790. XCTAssertEqual(message.optionalNestedMessage, nestedMessage);
  791. }
  792. - (void)testSetAutocreatedMessageBecomesVisible {
  793. // Setting a value should cause the submessage to appear to its creator.
  794. // Test this several levels deep.
  795. TestRecursiveMessage *message = [TestRecursiveMessage message];
  796. message.a.a.a.a.i = 42;
  797. XCTAssertTrue([message hasA]);
  798. XCTAssertTrue([message.a hasA]);
  799. XCTAssertTrue([message.a.a hasA]);
  800. XCTAssertTrue([message.a.a.a hasA]);
  801. XCTAssertFalse([message.a.a.a.a hasA]);
  802. XCTAssertEqual(message.a.a.a.a.i, 42);
  803. }
  804. - (void)testClearUnsetFieldOfAutocreatedMessage {
  805. // Clearing an unset field should not cause the submessage to appear to its
  806. // creator.
  807. TestRecursiveMessage *message = [TestRecursiveMessage message];
  808. message.a.a.a.a.hasI = NO;
  809. XCTAssertFalse([message hasA]);
  810. XCTAssertFalse([message.a hasA]);
  811. XCTAssertFalse([message.a.a hasA]);
  812. XCTAssertFalse([message.a.a.a hasA]);
  813. }
  814. - (void)testAutocreatedSubmessageAssignSkip {
  815. TestRecursiveMessage *message = [TestRecursiveMessage message];
  816. TestRecursiveMessage *messageLevel1 = [message.a retain];
  817. TestRecursiveMessage *messageLevel2 = [message.a.a retain];
  818. TestRecursiveMessage *messageLevel3 = [message.a.a.a retain];
  819. TestRecursiveMessage *messageLevel4 = [message.a.a.a.a retain];
  820. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel1, message));
  821. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel2, messageLevel1));
  822. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel3, messageLevel2));
  823. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel4, messageLevel3));
  824. // Test skipping over an autocreated submessage and ensure it gets unset.
  825. message.a = message.a.a;
  826. XCTAssertEqual(message.a, messageLevel2);
  827. XCTAssertTrue([message hasA]);
  828. XCTAssertEqual(message.a.a, messageLevel3);
  829. XCTAssertFalse([message.a hasA]);
  830. XCTAssertEqual(message.a.a.a, messageLevel4);
  831. XCTAssertFalse(GPBWasMessageAutocreatedBy(messageLevel1,
  832. message)); // Because it was orphaned.
  833. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel2, messageLevel1));
  834. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel3, messageLevel2));
  835. [messageLevel1 release];
  836. [messageLevel2 release];
  837. [messageLevel3 release];
  838. [messageLevel4 release];
  839. }
  840. - (void)testAutocreatedSubmessageAssignLoop {
  841. TestRecursiveMessage *message = [TestRecursiveMessage message];
  842. TestRecursiveMessage *messageLevel1 = [message.a retain];
  843. TestRecursiveMessage *messageLevel2 = [message.a.a retain];
  844. TestRecursiveMessage *messageLevel3 = [message.a.a.a retain];
  845. TestRecursiveMessage *messageLevel4 = [message.a.a.a.a retain];
  846. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel1, message));
  847. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel2, messageLevel1));
  848. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel3, messageLevel2));
  849. XCTAssertTrue(GPBWasMessageAutocreatedBy(messageLevel4, messageLevel3));
  850. // Test a property with a loop. You'd never do this but at least ensure the
  851. // autocreated submessages behave sanely.
  852. message.a.a = message.a;
  853. XCTAssertTrue([message hasA]);
  854. XCTAssertEqual(message.a, messageLevel1);
  855. XCTAssertTrue([message.a hasA]);
  856. XCTAssertEqual(message.a.a, messageLevel1);
  857. XCTAssertTrue([message.a.a hasA]);
  858. XCTAssertEqual(message.a.a.a, messageLevel1);
  859. XCTAssertFalse(GPBWasMessageAutocreatedBy(messageLevel1,
  860. message)); // Because it was assigned.
  861. XCTAssertFalse(GPBWasMessageAutocreatedBy(messageLevel2,
  862. messageLevel1)); // Because it was orphaned.
  863. XCTAssertFalse([messageLevel2 hasA]);
  864. // Break the retain loop.
  865. message.a.a = nil;
  866. XCTAssertTrue([message hasA]);
  867. XCTAssertFalse([message.a hasA]);
  868. [messageLevel1 release];
  869. [messageLevel2 release];
  870. [messageLevel3 release];
  871. [messageLevel4 release];
  872. }
  873. - (void)testSetAutocreatedSubmessage {
  874. // Setting autocreated submessage to another value should cause the old one to
  875. // lose its creator.
  876. TestAllTypes *message = [TestAllTypes message];
  877. TestAllTypes_NestedMessage *nestedMessage =
  878. [message.optionalNestedMessage retain];
  879. message.optionalNestedMessage = [TestAllTypes_NestedMessage message];
  880. XCTAssertTrue([message hasOptionalNestedMessage]);
  881. XCTAssertTrue(message.optionalNestedMessage != nestedMessage);
  882. XCTAssertFalse(GPBWasMessageAutocreatedBy(nestedMessage, message));
  883. [nestedMessage release];
  884. }
  885. - (void)testAutocreatedUnknownFields {
  886. // Doing anything with (except reading) unknown fields should cause the
  887. // submessage to become visible.
  888. TestAllTypes *message = [TestAllTypes message];
  889. XCTAssertNotNil(message.optionalNestedMessage);
  890. XCTAssertFalse([message hasOptionalNestedMessage]);
  891. XCTAssertNil(message.optionalNestedMessage.unknownFields);
  892. XCTAssertFalse([message hasOptionalNestedMessage]);
  893. GPBUnknownFieldSet *unknownFields =
  894. [[[GPBUnknownFieldSet alloc] init] autorelease];
  895. message.optionalNestedMessage.unknownFields = unknownFields;
  896. XCTAssertTrue([message hasOptionalNestedMessage]);
  897. message.optionalNestedMessage = nil;
  898. XCTAssertFalse([message hasOptionalNestedMessage]);
  899. [message.optionalNestedMessage setUnknownFields:unknownFields];
  900. XCTAssertTrue([message hasOptionalNestedMessage]);
  901. }
  902. - (void)testSetAutocreatedSubmessageToSelf {
  903. // Setting submessage to itself should cause it to become visible.
  904. TestAllTypes *message = [TestAllTypes message];
  905. XCTAssertNotNil(message.optionalNestedMessage);
  906. XCTAssertFalse([message hasOptionalNestedMessage]);
  907. message.optionalNestedMessage = message.optionalNestedMessage;
  908. XCTAssertTrue([message hasOptionalNestedMessage]);
  909. }
  910. - (void)testAutocreatedSubmessageMemoryLeaks {
  911. // Test for memory leaks with autocreated submessages.
  912. TestRecursiveMessage *message;
  913. TestRecursiveMessage *messageLevel1;
  914. TestRecursiveMessage *messageLevel2;
  915. TestRecursiveMessage *messageLevel3;
  916. TestRecursiveMessage *messageLevel4;
  917. @autoreleasepool {
  918. message = [[TestRecursiveMessage alloc] init];
  919. messageLevel1 = [message.a retain];
  920. messageLevel2 = [message.a.a retain];
  921. messageLevel3 = [message.a.a.a retain];
  922. messageLevel4 = [message.a.a.a.a retain];
  923. message.a.i = 1;
  924. }
  925. XCTAssertEqual(message.retainCount, (NSUInteger)1);
  926. [message release];
  927. XCTAssertEqual(messageLevel1.retainCount, (NSUInteger)1);
  928. [messageLevel1 release];
  929. XCTAssertEqual(messageLevel2.retainCount, (NSUInteger)1);
  930. [messageLevel2 release];
  931. XCTAssertEqual(messageLevel3.retainCount, (NSUInteger)1);
  932. [messageLevel3 release];
  933. XCTAssertEqual(messageLevel4.retainCount, (NSUInteger)1);
  934. [messageLevel4 release];
  935. }
  936. - (void)testDefaultingArrays {
  937. // Basic tests for default creation of arrays in a message.
  938. TestRecursiveMessageWithRepeatedField *message =
  939. [TestRecursiveMessageWithRepeatedField message];
  940. TestRecursiveMessageWithRepeatedField *message2 =
  941. [TestRecursiveMessageWithRepeatedField message];
  942. // Simply accessing the array should not make any fields visible.
  943. XCTAssertNotNil(message.a.a.iArray);
  944. XCTAssertFalse([message hasA]);
  945. XCTAssertFalse([message.a hasA]);
  946. XCTAssertNotNil(message2.a.a.strArray);
  947. XCTAssertFalse([message2 hasA]);
  948. XCTAssertFalse([message2.a hasA]);
  949. // But adding an element to the array should.
  950. [message.a.a.iArray addValue:42];
  951. XCTAssertTrue([message hasA]);
  952. XCTAssertTrue([message.a hasA]);
  953. XCTAssertEqual([message.a.a.iArray count], (NSUInteger)1);
  954. [message2.a.a.strArray addObject:@"foo"];
  955. XCTAssertTrue([message2 hasA]);
  956. XCTAssertTrue([message2.a hasA]);
  957. XCTAssertEqual([message2.a.a.strArray count], (NSUInteger)1);
  958. }
  959. - (void)testAutocreatedArrayShared {
  960. // Multiple objects pointing to the same array.
  961. TestRecursiveMessageWithRepeatedField *message1a =
  962. [TestRecursiveMessageWithRepeatedField message];
  963. TestRecursiveMessageWithRepeatedField *message1b =
  964. [TestRecursiveMessageWithRepeatedField message];
  965. message1a.a.iArray = message1b.a.iArray;
  966. XCTAssertTrue([message1a hasA]);
  967. XCTAssertFalse([message1b hasA]);
  968. [message1a.a.iArray addValue:1];
  969. XCTAssertTrue([message1a hasA]);
  970. XCTAssertTrue([message1b hasA]);
  971. XCTAssertEqual(message1a.a.iArray, message1b.a.iArray);
  972. TestRecursiveMessageWithRepeatedField *message2a =
  973. [TestRecursiveMessageWithRepeatedField message];
  974. TestRecursiveMessageWithRepeatedField *message2b =
  975. [TestRecursiveMessageWithRepeatedField message];
  976. message2a.a.strArray = message2b.a.strArray;
  977. XCTAssertTrue([message2a hasA]);
  978. XCTAssertFalse([message2b hasA]);
  979. [message2a.a.strArray addObject:@"bar"];
  980. XCTAssertTrue([message2a hasA]);
  981. XCTAssertTrue([message2b hasA]);
  982. XCTAssertEqual(message2a.a.strArray, message2b.a.strArray);
  983. }
  984. - (void)testAutocreatedArrayCopy {
  985. // Copy should not copy autocreated arrays.
  986. TestAllTypes *message = [TestAllTypes message];
  987. XCTAssertNotNil(message.repeatedStringArray);
  988. XCTAssertNotNil(message.repeatedInt32Array);
  989. TestAllTypes *message2 = [[message copy] autorelease];
  990. // Pointer conparisions.
  991. XCTAssertNotEqual(message.repeatedStringArray, message2.repeatedStringArray);
  992. XCTAssertNotEqual(message.repeatedInt32Array, message2.repeatedInt32Array);
  993. // Mutable copy should copy empty arrays that were explicitly set (end up
  994. // with different objects that are equal).
  995. TestAllTypes *message3 = [TestAllTypes message];
  996. message3.repeatedInt32Array = [GPBInt32Array arrayWithValue:42];
  997. message3.repeatedStringArray = [NSMutableArray arrayWithObject:@"wee"];
  998. XCTAssertNotNil(message.repeatedInt32Array);
  999. XCTAssertNotNil(message.repeatedStringArray);
  1000. TestAllTypes *message4 = [[message3 copy] autorelease];
  1001. XCTAssertNotEqual(message3.repeatedInt32Array, message4.repeatedInt32Array);
  1002. XCTAssertEqualObjects(message3.repeatedInt32Array,
  1003. message4.repeatedInt32Array);
  1004. XCTAssertNotEqual(message3.repeatedStringArray, message4.repeatedStringArray);
  1005. XCTAssertEqualObjects(message3.repeatedStringArray,
  1006. message4.repeatedStringArray);
  1007. }
  1008. - (void)testAutocreatedArrayRetain {
  1009. // Should be able to retain autocreated array while the creator is dealloced.
  1010. TestAllTypes *message = [TestAllTypes message];
  1011. @autoreleasepool {
  1012. TestAllTypes *message2 = [TestAllTypes message];
  1013. message.repeatedInt32Array = message2.repeatedInt32Array;
  1014. message.repeatedStringArray = message2.repeatedStringArray;
  1015. // Pointer conparision
  1016. XCTAssertEqual(message.repeatedInt32Array->_autocreator, message2);
  1017. XCTAssertTrue([message.repeatedStringArray
  1018. isKindOfClass:[GPBAutocreatedArray class]]);
  1019. XCTAssertEqual(
  1020. ((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator,
  1021. message2);
  1022. }
  1023. XCTAssertNil(message.repeatedInt32Array->_autocreator);
  1024. XCTAssertTrue(
  1025. [message.repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
  1026. XCTAssertNil(
  1027. ((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator);
  1028. }
  1029. - (void)testSetNilAutocreatedArray {
  1030. // Setting array to nil should cause it to lose its delegate.
  1031. TestAllTypes *message = [TestAllTypes message];
  1032. GPBInt32Array *repeatedInt32Array = [message.repeatedInt32Array retain];
  1033. GPBAutocreatedArray *repeatedStringArray =
  1034. (GPBAutocreatedArray *)[message.repeatedStringArray retain];
  1035. XCTAssertTrue([repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
  1036. XCTAssertEqual(repeatedInt32Array->_autocreator, message);
  1037. XCTAssertEqual(repeatedStringArray->_autocreator, message);
  1038. message.repeatedInt32Array = nil;
  1039. message.repeatedStringArray = nil;
  1040. XCTAssertNil(repeatedInt32Array->_autocreator);
  1041. XCTAssertNil(repeatedStringArray->_autocreator);
  1042. [repeatedInt32Array release];
  1043. [repeatedStringArray release];
  1044. }
  1045. - (void)testSetOverAutocreatedArrayAndSetAgain {
  1046. // Ensure when dealing with replacing an array it is handled being either
  1047. // an autocreated one or a straight NSArray.
  1048. // The real test here is that nothing crashes while doing the work.
  1049. TestAllTypes *message = [TestAllTypes message];
  1050. [message.repeatedStringArray addObject:@"foo"];
  1051. XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)1);
  1052. message.repeatedStringArray = [NSMutableArray arrayWithObjects:@"bar", @"bar2", nil];
  1053. XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)2);
  1054. message.repeatedStringArray = [NSMutableArray arrayWithObject:@"baz"];
  1055. XCTAssertEqual(message.repeatedStringArray_Count, (NSUInteger)1);
  1056. }
  1057. - (void)testReplaceAutocreatedArray {
  1058. // Replacing array should orphan the old one and cause its creator to become
  1059. // visible.
  1060. {
  1061. TestRecursiveMessageWithRepeatedField *message =
  1062. [TestRecursiveMessageWithRepeatedField message];
  1063. XCTAssertNotNil(message.a);
  1064. XCTAssertNotNil(message.a.iArray);
  1065. XCTAssertFalse([message hasA]);
  1066. GPBInt32Array *iArray = [message.a.iArray retain];
  1067. XCTAssertEqual(iArray->_autocreator, message.a); // Pointer comparison
  1068. message.a.iArray = [GPBInt32Array arrayWithValue:1];
  1069. XCTAssertTrue([message hasA]);
  1070. XCTAssertNotEqual(message.a.iArray, iArray); // Pointer comparison
  1071. XCTAssertNil(iArray->_autocreator);
  1072. [iArray release];
  1073. }
  1074. {
  1075. TestRecursiveMessageWithRepeatedField *message =
  1076. [TestRecursiveMessageWithRepeatedField message];
  1077. XCTAssertNotNil(message.a);
  1078. XCTAssertNotNil(message.a.strArray);
  1079. XCTAssertFalse([message hasA]);
  1080. GPBAutocreatedArray *strArray =
  1081. (GPBAutocreatedArray *)[message.a.strArray retain];
  1082. XCTAssertTrue([strArray isKindOfClass:[GPBAutocreatedArray class]]);
  1083. XCTAssertEqual(strArray->_autocreator, message.a); // Pointer comparison
  1084. message.a.strArray = [NSMutableArray arrayWithObject:@"foo"];
  1085. XCTAssertTrue([message hasA]);
  1086. XCTAssertNotEqual(message.a.strArray, strArray); // Pointer comparison
  1087. XCTAssertNil(strArray->_autocreator);
  1088. [strArray release];
  1089. }
  1090. }
  1091. - (void)testSetAutocreatedArrayToSelf {
  1092. // Setting array to itself should cause it to become visible.
  1093. {
  1094. TestRecursiveMessageWithRepeatedField *message =
  1095. [TestRecursiveMessageWithRepeatedField message];
  1096. XCTAssertNotNil(message.a);
  1097. XCTAssertNotNil(message.a.iArray);
  1098. XCTAssertFalse([message hasA]);
  1099. message.a.iArray = message.a.iArray;
  1100. XCTAssertTrue([message hasA]);
  1101. XCTAssertNil(message.a.iArray->_autocreator);
  1102. }
  1103. {
  1104. TestRecursiveMessageWithRepeatedField *message =
  1105. [TestRecursiveMessageWithRepeatedField message];
  1106. XCTAssertNotNil(message.a);
  1107. XCTAssertNotNil(message.a.strArray);
  1108. XCTAssertFalse([message hasA]);
  1109. message.a.strArray = message.a.strArray;
  1110. XCTAssertTrue([message hasA]);
  1111. XCTAssertTrue([message.a.strArray isKindOfClass:[GPBAutocreatedArray class]]);
  1112. XCTAssertNil(((GPBAutocreatedArray *)message.a.strArray)->_autocreator);
  1113. }
  1114. }
  1115. - (void)testAutocreatedArrayRemoveAllValues {
  1116. // Calling removeAllValues on autocreated array should not cause it to be
  1117. // visible.
  1118. TestRecursiveMessageWithRepeatedField *message =
  1119. [TestRecursiveMessageWithRepeatedField message];
  1120. [message.a.iArray removeAll];
  1121. XCTAssertFalse([message hasA]);
  1122. [message.a.strArray removeAllObjects];
  1123. XCTAssertFalse([message hasA]);
  1124. }
  1125. - (void)testDefaultingMaps {
  1126. // Basic tests for default creation of maps in a message.
  1127. TestRecursiveMessageWithRepeatedField *message =
  1128. [TestRecursiveMessageWithRepeatedField message];
  1129. TestRecursiveMessageWithRepeatedField *message2 =
  1130. [TestRecursiveMessageWithRepeatedField message];
  1131. // Simply accessing the map should not make any fields visible.
  1132. XCTAssertNotNil(message.a.a.iToI);
  1133. XCTAssertFalse([message hasA]);
  1134. XCTAssertFalse([message.a hasA]);
  1135. XCTAssertNotNil(message2.a.a.strToStr);
  1136. XCTAssertFalse([message2 hasA]);
  1137. XCTAssertFalse([message2.a hasA]);
  1138. // But adding an element to the map should.
  1139. [message.a.a.iToI setInt32:100 forKey:200];
  1140. XCTAssertTrue([message hasA]);
  1141. XCTAssertTrue([message.a hasA]);
  1142. XCTAssertEqual([message.a.a.iToI count], (NSUInteger)1);
  1143. [message2.a.a.strToStr setObject:@"foo" forKey:@"bar"];
  1144. XCTAssertTrue([message2 hasA]);
  1145. XCTAssertTrue([message2.a hasA]);
  1146. XCTAssertEqual([message2.a.a.strToStr count], (NSUInteger)1);
  1147. }
  1148. - (void)testAutocreatedMapShared {
  1149. // Multiple objects pointing to the same map.
  1150. TestRecursiveMessageWithRepeatedField *message1a =
  1151. [TestRecursiveMessageWithRepeatedField message];
  1152. TestRecursiveMessageWithRepeatedField *message1b =
  1153. [TestRecursiveMessageWithRepeatedField message];
  1154. message1a.a.iToI = message1b.a.iToI;
  1155. XCTAssertTrue([message1a hasA]);
  1156. XCTAssertFalse([message1b hasA]);
  1157. [message1a.a.iToI setInt32:1 forKey:2];
  1158. XCTAssertTrue([message1a hasA]);
  1159. XCTAssertTrue([message1b hasA]);
  1160. XCTAssertEqual(message1a.a.iToI, message1b.a.iToI);
  1161. TestRecursiveMessageWithRepeatedField *message2a =
  1162. [TestRecursiveMessageWithRepeatedField message];
  1163. TestRecursiveMessageWithRepeatedField *message2b =
  1164. [TestRecursiveMessageWithRepeatedField message];
  1165. message2a.a.strToStr = message2b.a.strToStr;
  1166. XCTAssertTrue([message2a hasA]);
  1167. XCTAssertFalse([message2b hasA]);
  1168. [message2a.a.strToStr setObject:@"bar" forKey:@"foo"];
  1169. XCTAssertTrue([message2a hasA]);
  1170. XCTAssertTrue([message2b hasA]);
  1171. XCTAssertEqual(message2a.a.strToStr, message2b.a.strToStr);
  1172. }
  1173. - (void)testAutocreatedMapCopy {
  1174. // Copy should not copy autocreated maps.
  1175. TestRecursiveMessageWithRepeatedField *message =
  1176. [TestRecursiveMessageWithRepeatedField message];
  1177. XCTAssertNotNil(message.strToStr);
  1178. XCTAssertNotNil(message.iToI);
  1179. TestRecursiveMessageWithRepeatedField *message2 =
  1180. [[message copy] autorelease];
  1181. // Pointer conparisions.
  1182. XCTAssertNotEqual(message.strToStr, message2.strToStr);
  1183. XCTAssertNotEqual(message.iToI, message2.iToI);
  1184. // Mutable copy should copy empty arrays that were explicitly set (end up
  1185. // with different objects that are equal).
  1186. TestRecursiveMessageWithRepeatedField *message3 =
  1187. [TestRecursiveMessageWithRepeatedField message];
  1188. message3.iToI = [[[GPBInt32Int32Dictionary alloc] init] autorelease];
  1189. [message3.iToI setInt32:10 forKey:20];
  1190. message3.strToStr =
  1191. [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"123"];
  1192. XCTAssertNotNil(message.iToI);
  1193. XCTAssertNotNil(message.iToI);
  1194. TestRecursiveMessageWithRepeatedField *message4 =
  1195. [[message3 copy] autorelease];
  1196. XCTAssertNotEqual(message3.iToI, message4.iToI);
  1197. XCTAssertEqualObjects(message3.iToI, message4.iToI);
  1198. XCTAssertNotEqual(message3.strToStr, message4.strToStr);
  1199. XCTAssertEqualObjects(message3.strToStr, message4.strToStr);
  1200. }
  1201. - (void)testAutocreatedMapRetain {
  1202. // Should be able to retain autocreated map while the creator is dealloced.
  1203. TestRecursiveMessageWithRepeatedField *message =
  1204. [TestRecursiveMessageWithRepeatedField message];
  1205. @autoreleasepool {
  1206. TestRecursiveMessageWithRepeatedField *message2 =
  1207. [TestRecursiveMessageWithRepeatedField message];
  1208. message.iToI = message2.iToI;
  1209. message.strToStr = message2.strToStr;
  1210. // Pointer conparision
  1211. XCTAssertEqual(message.iToI->_autocreator, message2);
  1212. XCTAssertTrue([message.strToStr
  1213. isKindOfClass:[GPBAutocreatedDictionary class]]);
  1214. XCTAssertEqual(
  1215. ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator,
  1216. message2);
  1217. }
  1218. XCTAssertNil(message.iToI->_autocreator);
  1219. XCTAssertTrue(
  1220. [message.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1221. XCTAssertNil(
  1222. ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator);
  1223. }
  1224. - (void)testSetNilAutocreatedMap {
  1225. // Setting map to nil should cause it to lose its delegate.
  1226. TestRecursiveMessageWithRepeatedField *message =
  1227. [TestRecursiveMessageWithRepeatedField message];
  1228. GPBInt32Int32Dictionary *iToI = [message.iToI retain];
  1229. GPBAutocreatedDictionary *strToStr =
  1230. (GPBAutocreatedDictionary *)[message.strToStr retain];
  1231. XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1232. XCTAssertEqual(iToI->_autocreator, message);
  1233. XCTAssertEqual(strToStr->_autocreator, message);
  1234. message.iToI = nil;
  1235. message.strToStr = nil;
  1236. XCTAssertNil(iToI->_autocreator);
  1237. XCTAssertNil(strToStr->_autocreator);
  1238. [iToI release];
  1239. [strToStr release];
  1240. }
  1241. - (void)testSetOverAutocreatedMapAndSetAgain {
  1242. // Ensure when dealing with replacing a map it is handled being either
  1243. // an autocreated one or a straight NSDictionary.
  1244. // The real test here is that nothing crashes while doing the work.
  1245. TestRecursiveMessageWithRepeatedField *message =
  1246. [TestRecursiveMessageWithRepeatedField message];
  1247. message.strToStr[@"foo"] = @"bar";
  1248. XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
  1249. message.strToStr =
  1250. [NSMutableDictionary dictionaryWithObjectsAndKeys:@"bar", @"key1", @"baz", @"key2", nil];
  1251. XCTAssertEqual(message.strToStr_Count, (NSUInteger)2);
  1252. message.strToStr =
  1253. [NSMutableDictionary dictionaryWithObject:@"baz" forKey:@"mumble"];
  1254. XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
  1255. }
  1256. - (void)testReplaceAutocreatedMap {
  1257. // Replacing map should orphan the old one and cause its creator to become
  1258. // visible.
  1259. {
  1260. TestRecursiveMessageWithRepeatedField *message =
  1261. [TestRecursiveMessageWithRepeatedField message];
  1262. XCTAssertNotNil(message.a);
  1263. XCTAssertNotNil(message.a.iToI);
  1264. XCTAssertFalse([message hasA]);
  1265. GPBInt32Int32Dictionary *iToI = [message.a.iToI retain];
  1266. XCTAssertEqual(iToI->_autocreator, message.a); // Pointer comparison
  1267. message.a.iToI = [[[GPBInt32Int32Dictionary alloc] init] autorelease];
  1268. [message.a.iToI setInt32:6 forKey:7];
  1269. XCTAssertTrue([message hasA]);
  1270. XCTAssertNotEqual(message.a.iToI, iToI); // Pointer comparison
  1271. XCTAssertNil(iToI->_autocreator);
  1272. [iToI release];
  1273. }
  1274. {
  1275. TestRecursiveMessageWithRepeatedField *message =
  1276. [TestRecursiveMessageWithRepeatedField message];
  1277. XCTAssertNotNil(message.a);
  1278. XCTAssertNotNil(message.a.strToStr);
  1279. XCTAssertFalse([message hasA]);
  1280. GPBAutocreatedDictionary *strToStr =
  1281. (GPBAutocreatedDictionary *)[message.a.strToStr retain];
  1282. XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1283. XCTAssertEqual(strToStr->_autocreator, message.a); // Pointer comparison
  1284. message.a.strToStr =
  1285. [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"def"];
  1286. XCTAssertTrue([message hasA]);
  1287. XCTAssertNotEqual(message.a.strToStr, strToStr); // Pointer comparison
  1288. XCTAssertNil(strToStr->_autocreator);
  1289. [strToStr release];
  1290. }
  1291. }
  1292. - (void)testSetAutocreatedMapToSelf {
  1293. // Setting map to itself should cause it to become visible.
  1294. {
  1295. TestRecursiveMessageWithRepeatedField *message =
  1296. [TestRecursiveMessageWithRepeatedField message];
  1297. XCTAssertNotNil(message.a);
  1298. XCTAssertNotNil(message.a.iToI);
  1299. XCTAssertFalse([message hasA]);
  1300. message.a.iToI = message.a.iToI;
  1301. XCTAssertTrue([message hasA]);
  1302. XCTAssertNil(message.a.iToI->_autocreator);
  1303. }
  1304. {
  1305. TestRecursiveMessageWithRepeatedField *message =
  1306. [TestRecursiveMessageWithRepeatedField message];
  1307. XCTAssertNotNil(message.a);
  1308. XCTAssertNotNil(message.a.strToStr);
  1309. XCTAssertFalse([message hasA]);
  1310. message.a.strToStr = message.a.strToStr;
  1311. XCTAssertTrue([message hasA]);
  1312. XCTAssertTrue([message.a.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
  1313. XCTAssertNil(((GPBAutocreatedDictionary *)message.a.strToStr)->_autocreator);
  1314. }
  1315. }
  1316. - (void)testAutocreatedMapRemoveAllValues {
  1317. // Calling removeAll on autocreated map should not cause it to be visible.
  1318. TestRecursiveMessageWithRepeatedField *message =
  1319. [TestRecursiveMessageWithRepeatedField message];
  1320. [message.a.iToI removeAll];
  1321. XCTAssertFalse([message hasA]);
  1322. [message.a.strToStr removeAllObjects];
  1323. XCTAssertFalse([message hasA]);
  1324. }
  1325. - (void)testExtensionAccessors {
  1326. TestAllExtensions *message = [TestAllExtensions message];
  1327. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1328. [self assertAllExtensionsSet:message repeatedCount:kGPBDefaultRepeatCount];
  1329. }
  1330. - (void)testExtensionRepeatedSetters {
  1331. TestAllExtensions *message = [TestAllExtensions message];
  1332. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1333. [self modifyRepeatedExtensions:message];
  1334. [self assertRepeatedExtensionsModified:message
  1335. repeatedCount:kGPBDefaultRepeatCount];
  1336. }
  1337. - (void)testExtensionDefaults {
  1338. [self assertExtensionsClear:[TestAllExtensions message]];
  1339. }
  1340. - (void)testExtensionIsEquals {
  1341. TestAllExtensions *message = [TestAllExtensions message];
  1342. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1343. [self modifyRepeatedExtensions:message];
  1344. TestAllExtensions *message2 = [TestAllExtensions message];
  1345. [self setAllExtensions:message2 repeatedCount:kGPBDefaultRepeatCount];
  1346. XCTAssertFalse([message isEqual:message2]);
  1347. message2 = [TestAllExtensions message];
  1348. [self setAllExtensions:message2 repeatedCount:kGPBDefaultRepeatCount];
  1349. [self modifyRepeatedExtensions:message2];
  1350. XCTAssertEqualObjects(message, message2);
  1351. }
  1352. - (void)testExtensionsMergeFrom {
  1353. TestAllExtensions *message = [TestAllExtensions message];
  1354. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1355. [self modifyRepeatedExtensions:message];
  1356. message = [TestAllExtensions message];
  1357. [self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
  1358. TestAllExtensions *message2 = [TestAllExtensions message];
  1359. [self modifyRepeatedExtensions:message2];
  1360. [message2 mergeFrom:message];
  1361. XCTAssertEqualObjects(message, message2);
  1362. }
  1363. - (void)testDefaultingExtensionMessages {
  1364. TestAllExtensions *message = [TestAllExtensions message];
  1365. // Initially they should all not have values.
  1366. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1367. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1368. XCTAssertFalse(
  1369. [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1370. XCTAssertFalse(
  1371. [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1372. XCTAssertFalse(
  1373. [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1374. XCTAssertFalse([message
  1375. hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1376. XCTAssertFalse(
  1377. [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1378. // They should auto create something when fetched.
  1379. TestAllTypes_OptionalGroup *optionalGroup =
  1380. [message getExtension:[UnittestRoot optionalGroupExtension]];
  1381. TestAllTypes_NestedMessage *optionalNestedMessage =
  1382. [message getExtension:[UnittestRoot optionalNestedMessageExtension]];
  1383. ForeignMessage *optionalForeignMessage =
  1384. [message getExtension:[UnittestRoot optionalForeignMessageExtension]];
  1385. ImportMessage *optionalImportMessage =
  1386. [message getExtension:[UnittestRoot optionalImportMessageExtension]];
  1387. PublicImportMessage *optionalPublicImportMessage = [message
  1388. getExtension:[UnittestRoot optionalPublicImportMessageExtension]];
  1389. TestAllTypes_NestedMessage *optionalLazyMessage =
  1390. [message getExtension:[UnittestRoot optionalLazyMessageExtension]];
  1391. XCTAssertNotNil(optionalGroup);
  1392. XCTAssertNotNil(optionalNestedMessage);
  1393. XCTAssertNotNil(optionalForeignMessage);
  1394. XCTAssertNotNil(optionalImportMessage);
  1395. XCTAssertNotNil(optionalPublicImportMessage);
  1396. XCTAssertNotNil(optionalLazyMessage);
  1397. // Although it auto-created empty messages, it should not show that it has
  1398. // them.
  1399. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1400. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1401. XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1402. XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1403. XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1404. XCTAssertFalse([message hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1405. XCTAssertFalse([message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1406. // And they set that value back in to the message since the value created was
  1407. // mutable (so a second fetch should give the same object).
  1408. XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
  1409. optionalGroup);
  1410. XCTAssertEqual(
  1411. [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1412. optionalNestedMessage);
  1413. XCTAssertEqual(
  1414. [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1415. optionalForeignMessage);
  1416. XCTAssertEqual(
  1417. [message getExtension:[UnittestRoot optionalImportMessageExtension]],
  1418. optionalImportMessage);
  1419. XCTAssertEqual(
  1420. [message getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1421. optionalPublicImportMessage);
  1422. XCTAssertEqual(
  1423. [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1424. optionalLazyMessage);
  1425. // And the default objects for a second message should be distinct (again,
  1426. // since they are mutable, each needs their own copy).
  1427. TestAllExtensions *message2 = [TestAllExtensions message];
  1428. // Intentionally doing a pointer comparison.
  1429. XCTAssertNotEqual(
  1430. [message2 getExtension:[UnittestRoot optionalGroupExtension]],
  1431. optionalGroup);
  1432. XCTAssertNotEqual(
  1433. [message2 getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1434. optionalNestedMessage);
  1435. XCTAssertNotEqual(
  1436. [message2 getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1437. optionalForeignMessage);
  1438. XCTAssertNotEqual(
  1439. [message2 getExtension:[UnittestRoot optionalImportMessageExtension]],
  1440. optionalImportMessage);
  1441. XCTAssertNotEqual(
  1442. [message2 getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1443. optionalPublicImportMessage);
  1444. XCTAssertNotEqual(
  1445. [message2 getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1446. optionalLazyMessage);
  1447. // Clear values, and on next access you get back new submessages.
  1448. [message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
  1449. [message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
  1450. [message setExtension:[UnittestRoot optionalNestedMessageExtension]
  1451. value:nil];
  1452. [message setExtension:[UnittestRoot optionalForeignMessageExtension]
  1453. value:nil];
  1454. [message setExtension:[UnittestRoot optionalImportMessageExtension]
  1455. value:nil];
  1456. [message setExtension:[UnittestRoot optionalPublicImportMessageExtension]
  1457. value:nil];
  1458. [message setExtension:[UnittestRoot optionalLazyMessageExtension] value:nil];
  1459. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1460. XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
  1461. XCTAssertFalse(
  1462. [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
  1463. XCTAssertFalse(
  1464. [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
  1465. XCTAssertFalse(
  1466. [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
  1467. XCTAssertFalse([message
  1468. hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
  1469. XCTAssertFalse(
  1470. [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
  1471. XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
  1472. optionalGroup);
  1473. XCTAssertEqual(
  1474. [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
  1475. optionalNestedMessage);
  1476. XCTAssertEqual(
  1477. [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
  1478. optionalForeignMessage);
  1479. XCTAssertEqual(
  1480. [message getExtension:[UnittestRoot optionalImportMessageExtension]],
  1481. optionalImportMessage);
  1482. XCTAssertEqual(
  1483. [message
  1484. getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
  1485. optionalPublicImportMessage);
  1486. XCTAssertEqual(
  1487. [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
  1488. optionalLazyMessage);
  1489. }
  1490. - (void)testMultiplePointersToAutocreatedExtension {
  1491. // 2 objects point to the same auto-created extension. One should "has" it.
  1492. // The other should not.
  1493. TestAllExtensions *message = [TestAllExtensions message];
  1494. TestAllExtensions *message2 = [TestAllExtensions message];
  1495. GPBExtensionDescriptor *extension = [UnittestRoot optionalGroupExtension];
  1496. [message setExtension:extension value:[message2 getExtension:extension]];
  1497. XCTAssertEqual([message getExtension:extension],
  1498. [message2 getExtension:extension]);
  1499. XCTAssertFalse([message2 hasExtension:extension]);
  1500. XCTAssertTrue([message hasExtension:extension]);
  1501. TestAllTypes_OptionalGroup *extensionValue =
  1502. [message2 getExtension:extension];
  1503. extensionValue.a = 1;
  1504. XCTAssertTrue([message2 hasExtension:extension]);
  1505. XCTAssertTrue([message hasExtension:extension]);
  1506. }
  1507. - (void)testCopyWithAutocreatedExtension {
  1508. // Mutable copy shouldn't copy autocreated extensions.
  1509. TestAllExtensions *message = [TestAllExtensions message];
  1510. GPBExtensionDescriptor *optionalGroupExtension =
  1511. [UnittestRoot optionalGroupExtension];
  1512. GPBExtensionDescriptor *optionalNestedMessageExtesion =
  1513. [UnittestRoot optionalNestedMessageExtension];
  1514. TestAllTypes_OptionalGroup *optionalGroup =
  1515. [message getExtension:optionalGroupExtension];
  1516. optionalGroup.a = 42;
  1517. XCTAssertNotNil(optionalGroup);
  1518. XCTAssertNotNil([message getExtension:optionalNestedMessageExtesion]);
  1519. XCTAssertTrue([message hasExtension:optionalGroupExtension]);
  1520. XCTAssertFalse([message hasExtension:optionalNestedMessageExtesion]);
  1521. TestAllExtensions *message2 = [[message copy] autorelease];
  1522. // message2 should end up with its own copy of the optional group.
  1523. XCTAssertTrue([message2 hasExtension:optionalGroupExtension]);
  1524. XCTAssertEqualObjects([message getExtension:optionalGroupExtension],
  1525. [message2 getExtension:optionalGroupExtension]);
  1526. // Intentionally doing a pointer comparison.
  1527. XCTAssertNotEqual([message getExtension:optionalGroupExtension],
  1528. [message2 getExtension:optionalGroupExtension]);
  1529. XCTAssertFalse([message2 hasExtension:optionalNestedMessageExtesion]);
  1530. // Intentionally doing a pointer comparison (auto creation should be
  1531. // different)
  1532. XCTAssertNotEqual([message getExtension:optionalNestedMessageExtesion],
  1533. [message2 getExtension:optionalNestedMessageExtesion]);
  1534. }
  1535. - (void)testClearMessageAutocreatedExtension {
  1536. // Call clear should cause it to recreate its autocreated extensions.
  1537. TestAllExtensions *message = [TestAllExtensions message];
  1538. GPBExtensionDescriptor *optionalGroupExtension =
  1539. [UnittestRoot optionalGroupExtension];
  1540. TestAllTypes_OptionalGroup *optionalGroup =
  1541. [[message getExtension:optionalGroupExtension] retain];
  1542. [message clear];
  1543. TestAllTypes_OptionalGroup *optionalGroupNew =
  1544. [message getExtension:optionalGroupExtension];
  1545. // Intentionally doing a pointer comparison.
  1546. XCTAssertNotEqual(optionalGroup, optionalGroupNew);
  1547. [optionalGroup release];
  1548. }
  1549. - (void)testRetainAutocreatedExtension {
  1550. // Should be able to retain autocreated extension while the creator is
  1551. // dealloced.
  1552. TestAllExtensions *message = [TestAllExtensions message];
  1553. GPBExtensionDescriptor *optionalGroupExtension =
  1554. [UnittestRoot optionalGroupExtension];
  1555. @autoreleasepool {
  1556. TestAllExtensions *message2 = [TestAllExtensions message];
  1557. [message setExtension:optionalGroupExtension
  1558. value:[message2 getExtension:optionalGroupExtension]];
  1559. XCTAssertTrue(GPBWasMessageAutocreatedBy(
  1560. [message getExtension:optionalGroupExtension], message2));
  1561. }
  1562. XCTAssertFalse(GPBWasMessageAutocreatedBy(
  1563. [message getExtension:optionalGroupExtension], message));
  1564. }
  1565. - (void)testClearAutocreatedExtension {
  1566. // Clearing autocreated extension should NOT cause it to lose its creator.
  1567. TestAllExtensions *message = [TestAllExtensions message];
  1568. GPBExtensionDescriptor *optionalGroupExtension =
  1569. [UnittestRoot optionalGroupExtension];
  1570. TestAllTypes_OptionalGroup *optionalGroup =
  1571. [[message getExtension:optionalGroupExtension] retain];
  1572. [message clearExtension:optionalGroupExtension];
  1573. TestAllTypes_OptionalGroup *optionalGroupNew =
  1574. [message getExtension:optionalGroupExtension];
  1575. XCTAssertEqual(optionalGroup, optionalGroupNew);
  1576. XCTAssertFalse([message hasExtension:optionalGroupExtension]);
  1577. [optionalGroup release];
  1578. // Clearing autocreated extension should not cause its creator to become
  1579. // visible
  1580. GPBExtensionDescriptor *recursiveExtension =
  1581. [UnittestObjcRoot recursiveExtension];
  1582. TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
  1583. TestAllExtensions *message_lvl3 =
  1584. [message_lvl2 getExtension:recursiveExtension];
  1585. [message_lvl3 clearExtension:recursiveExtension];
  1586. XCTAssertFalse([message hasExtension:recursiveExtension]);
  1587. }
  1588. - (void)testSetAutocreatedExtensionBecomesVisible {
  1589. // Setting an extension should cause the extension to appear to its creator.
  1590. // Test this several levels deep.
  1591. TestAllExtensions *message = [TestAllExtensions message];
  1592. GPBExtensionDescriptor *recursiveExtension =
  1593. [UnittestObjcRoot recursiveExtension];
  1594. TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
  1595. TestAllExtensions *message_lvl3 =
  1596. [message_lvl2 getExtension:recursiveExtension];
  1597. TestAllExtensions *message_lvl4 =
  1598. [message_lvl3 getExtension:recursiveExtension];
  1599. XCTAssertFalse([message hasExtension:recursiveExtension]);
  1600. XCTAssertFalse([message_lvl2 hasExtension:recursiveExtension]);
  1601. XCTAssertFalse([message_lvl3 hasExtension:recursiveExtension]);
  1602. XCTAssertFalse([message_lvl4 hasExtension:recursiveExtension]);
  1603. [message_lvl4 setExtension:[UnittestRoot optionalInt32Extension] value:@(1)];
  1604. XCTAssertTrue([message hasExtension:recursiveExtension]);
  1605. XCTAssertTrue([message_lvl2 hasExtension:recursiveExtension]);
  1606. XCTAssertTrue([message_lvl3 hasExtension:recursiveExtension]);
  1607. XCTAssertFalse([message_lvl4 hasExtension:recursiveExtension]);
  1608. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl4, message_lvl3));
  1609. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl3, message_lvl2));
  1610. XCTAssertFalse(GPBWasMessageAutocreatedBy(message_lvl2, message));
  1611. }
  1612. - (void)testSetAutocreatedExtensionToSelf {
  1613. // Setting extension to itself should cause it to become visible.
  1614. TestAllExtensions *message = [TestAllExtensions message];
  1615. GPBExtensionDescriptor *optionalGroupExtension =
  1616. [UnittestRoot optionalGroupExtension];
  1617. XCTAssertNotNil([message getExtension:optionalGroupExtension]);
  1618. XCTAssertFalse([message hasExtension:optionalGroupExtension]);
  1619. [message setExtension:optionalGroupExtension
  1620. value:[message getExtension:optionalGroupExtension]];
  1621. XCTAssertTrue([message hasExtension:optionalGroupExtension]);
  1622. }
  1623. - (void)testAutocreatedExtensionMemoryLeaks {
  1624. GPBExtensionDescriptor *recursiveExtension =
  1625. [UnittestObjcRoot recursiveExtension];
  1626. // Test for memory leaks with autocreated extensions.
  1627. TestAllExtensions *message;
  1628. TestAllExtensions *message_lvl2;
  1629. TestAllExtensions *message_lvl3;
  1630. TestAllExtensions *message_lvl4;
  1631. @autoreleasepool {
  1632. message = [[TestAllExtensions alloc] init];
  1633. message_lvl2 = [[message getExtension:recursiveExtension] retain];
  1634. message_lvl3 = [[message_lvl2 getExtension:recursiveExtension] retain];
  1635. message_lvl4 = [[message_lvl3 getExtension:recursiveExtension] retain];
  1636. [message_lvl2 setExtension:[UnittestRoot optionalInt32Extension]
  1637. value:@(1)];
  1638. }
  1639. XCTAssertEqual(message.retainCount, (NSUInteger)1);
  1640. @autoreleasepool {
  1641. [message release];
  1642. }
  1643. XCTAssertEqual(message_lvl2.retainCount, (NSUInteger)1);
  1644. @autoreleasepool {
  1645. [message_lvl2 release];
  1646. }
  1647. XCTAssertEqual(message_lvl3.retainCount, (NSUInteger)1);
  1648. @autoreleasepool {
  1649. [message_lvl3 release];
  1650. }
  1651. XCTAssertEqual(message_lvl4.retainCount, (NSUInteger)1);
  1652. [message_lvl4 release];
  1653. }
  1654. - (void)testSetExtensionWithAutocreatedValue {
  1655. GPBExtensionDescriptor *recursiveExtension =
  1656. [UnittestObjcRoot recursiveExtension];
  1657. TestAllExtensions *message;
  1658. @autoreleasepool {
  1659. message = [[TestAllExtensions alloc] init];
  1660. [message getExtension:recursiveExtension];
  1661. }
  1662. // This statements checks that the extension value isn't accidentally
  1663. // dealloced when removing it from the autocreated map.
  1664. [message setExtension:recursiveExtension
  1665. value:[message getExtension:recursiveExtension]];
  1666. XCTAssertTrue([message hasExtension:recursiveExtension]);
  1667. [message release];
  1668. }
  1669. - (void)testRecursion {
  1670. TestRecursiveMessage *message = [TestRecursiveMessage message];
  1671. XCTAssertNotNil(message.a);
  1672. XCTAssertNotNil(message.a.a);
  1673. XCTAssertEqual(message.a.a.i, 0);
  1674. }
  1675. - (void)testGenerateAndParseUnknownMessage {
  1676. GPBUnknownFieldSet *unknowns =
  1677. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1678. [unknowns mergeVarintField:123 value:456];
  1679. GPBMessage *message = [GPBMessage message];
  1680. [message setUnknownFields:unknowns];
  1681. NSData *data = [message data];
  1682. GPBMessage *message2 =
  1683. [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
  1684. XCTAssertEqualObjects(message, message2);
  1685. }
  1686. - (void)testDelimitedWriteAndParseMultipleMessages {
  1687. GPBUnknownFieldSet *unknowns1 =
  1688. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1689. [unknowns1 mergeVarintField:123 value:456];
  1690. GPBMessage *message1 = [GPBMessage message];
  1691. [message1 setUnknownFields:unknowns1];
  1692. GPBUnknownFieldSet *unknowns2 =
  1693. [[[GPBUnknownFieldSet alloc] init] autorelease];
  1694. [unknowns2 mergeVarintField:789 value:987];
  1695. [unknowns2 mergeVarintField:654 value:321];
  1696. GPBMessage *message2 = [GPBMessage message];
  1697. [message2 setUnknownFields:unknowns2];
  1698. NSMutableData *delimitedData = [NSMutableData data];
  1699. [delimitedData appendData:[message1 delimitedData]];
  1700. [delimitedData appendData:[message2 delimitedData]];
  1701. GPBCodedInputStream *input =
  1702. [GPBCodedInputStream streamWithData:delimitedData];
  1703. GPBMessage *message3 = [GPBMessage parseDelimitedFromCodedInputStream:input
  1704. extensionRegistry:nil
  1705. error:NULL];
  1706. GPBMessage *message4 = [GPBMessage parseDelimitedFromCodedInputStream:input
  1707. extensionRegistry:nil
  1708. error:NULL];
  1709. XCTAssertEqualObjects(message1, message3);
  1710. XCTAssertEqualObjects(message2, message4);
  1711. }
  1712. - (void)testDuplicateEnums {
  1713. XCTAssertEqual(TestEnumWithDupValue_Foo1, TestEnumWithDupValue_Foo2);
  1714. }
  1715. - (void)testWeirdDefaults {
  1716. ObjcWeirdDefaults *message = [ObjcWeirdDefaults message];
  1717. GPBDescriptor *descriptor = [[message class] descriptor];
  1718. GPBFieldDescriptor *fieldDesc = [descriptor fieldWithName:@"foo"];
  1719. XCTAssertNotNil(fieldDesc);
  1720. XCTAssertTrue(fieldDesc.hasDefaultValue);
  1721. XCTAssertFalse(message.hasFoo);
  1722. XCTAssertEqualObjects(message.foo, @"");
  1723. fieldDesc = [descriptor fieldWithName:@"bar"];
  1724. XCTAssertNotNil(fieldDesc);
  1725. XCTAssertTrue(fieldDesc.hasDefaultValue);
  1726. XCTAssertFalse(message.hasBar);
  1727. XCTAssertEqualObjects(message.bar, GPBEmptyNSData());
  1728. }
  1729. - (void)testEnumDescriptorFromExtensionDescriptor {
  1730. GPBExtensionDescriptor *extDescriptor =
  1731. [UnittestRoot optionalForeignEnumExtension];
  1732. XCTAssertEqual(extDescriptor.dataType, GPBDataTypeEnum);
  1733. GPBEnumDescriptor *enumDescriptor = extDescriptor.enumDescriptor;
  1734. GPBEnumDescriptor *expectedDescriptor = ForeignEnum_EnumDescriptor();
  1735. XCTAssertEqualObjects(enumDescriptor, expectedDescriptor);
  1736. }
  1737. - (void)testPropertyNaming {
  1738. // objectivec_helpers.cc has some special handing to get proper all caps
  1739. // for a few cases to meet objc developer expectations.
  1740. //
  1741. // This "test" confirms that the expected names are generated, otherwise the
  1742. // test itself will fail to compile.
  1743. ObjCPropertyNaming *msg = [ObjCPropertyNaming message];
  1744. // On their own, at the end, in the middle.
  1745. msg.URL = @"good";
  1746. msg.thumbnailURL = @"good";
  1747. msg.URLFoo = @"good";
  1748. msg.someURLBlah = @"good";
  1749. msg.HTTP = @"good";
  1750. msg.HTTPS = @"good";
  1751. // No caps since it was "urls".
  1752. [msg.urlsArray addObject:@"good"];
  1753. }
  1754. - (void)testEnumNaming {
  1755. // objectivec_helpers.cc has some interesting cases to deal with in
  1756. // EnumValueName/EnumValueShortName. Confirm that things generated as
  1757. // expected.
  1758. // This block just has to compile to confirm we got the expected types/names.
  1759. // The *_IsValidValue() calls are just there to keep the projects warnings
  1760. // flags happy by providing use of the variables/values.
  1761. Foo aFoo = Foo_SerializedSize;
  1762. Foo_IsValidValue(aFoo);
  1763. aFoo = Foo_Size;
  1764. Foo_IsValidValue(aFoo);
  1765. Category_Enum aCat = Category_Enum_Red;
  1766. Category_Enum_IsValidValue(aCat);
  1767. Time aTime = Time_Base;
  1768. Time_IsValidValue(aTime);
  1769. aTime = Time_SomethingElse;
  1770. Time_IsValidValue(aTime);
  1771. // This block confirms the names in the descriptors is what we wanted.
  1772. GPBEnumDescriptor *descriptor;
  1773. NSString *valueName;
  1774. descriptor = Foo_EnumDescriptor();
  1775. XCTAssertNotNil(descriptor);
  1776. XCTAssertEqualObjects(@"Foo", descriptor.name);
  1777. valueName = [descriptor enumNameForValue:Foo_SerializedSize];
  1778. XCTAssertEqualObjects(@"Foo_SerializedSize", valueName);
  1779. valueName = [descriptor enumNameForValue:Foo_Size];
  1780. XCTAssertEqualObjects(@"Foo_Size", valueName);
  1781. descriptor = Category_Enum_EnumDescriptor();
  1782. XCTAssertNotNil(descriptor);
  1783. XCTAssertEqualObjects(@"Category_Enum", descriptor.name);
  1784. valueName = [descriptor enumNameForValue:Category_Enum_Red];
  1785. XCTAssertEqualObjects(@"Category_Enum_Red", valueName);
  1786. descriptor = Time_EnumDescriptor();
  1787. XCTAssertNotNil(descriptor);
  1788. XCTAssertEqualObjects(@"Time", descriptor.name);
  1789. valueName = [descriptor enumNameForValue:Time_Base];
  1790. XCTAssertEqualObjects(@"Time_Base", valueName);
  1791. valueName = [descriptor enumNameForValue:Time_SomethingElse];
  1792. XCTAssertEqualObjects(@"Time_SomethingElse", valueName);
  1793. }
  1794. - (void)testNegativeEnums {
  1795. EnumTestMsg *msg = [EnumTestMsg message];
  1796. // Defaults
  1797. XCTAssertEqual(msg.foo, EnumTestMsg_MyEnum_Zero);
  1798. XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_One);
  1799. XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegOne);
  1800. // Bounce to wire and back.
  1801. NSData *data = [msg data];
  1802. XCTAssertNotNil(data);
  1803. EnumTestMsg *msgPrime = [EnumTestMsg parseFromData:data error:NULL];
  1804. XCTAssertEqualObjects(msgPrime, msg);
  1805. XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero);
  1806. XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_One);
  1807. XCTAssertEqual(msgPrime.baz, EnumTestMsg_MyEnum_NegOne);
  1808. // Other values
  1809. msg.bar = EnumTestMsg_MyEnum_Two;
  1810. msg.baz = EnumTestMsg_MyEnum_NegTwo;
  1811. XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_Two);
  1812. XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegTwo);
  1813. // Bounce to wire and back.
  1814. data = [msg data];
  1815. XCTAssertNotNil(data);
  1816. msgPrime = [EnumTestMsg parseFromData:data error:NULL];
  1817. XCTAssertEqualObjects(msgPrime, msg);
  1818. XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero);
  1819. XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_Two);
  1820. XCTAssertEqual(msgPrime.baz, EnumTestMsg_MyEnum_NegTwo);
  1821. // Repeated field (shouldn't ever be an issue since developer has to use the
  1822. // right GPBArray methods themselves).
  1823. msg.mumbleArray = [GPBEnumArray
  1824. arrayWithValidationFunction:EnumTestMsg_MyEnum_IsValidValue];
  1825. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_Zero];
  1826. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_One];
  1827. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_Two];
  1828. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_NegOne];
  1829. [msg.mumbleArray addValue:EnumTestMsg_MyEnum_NegTwo];
  1830. XCTAssertEqual([msg.mumbleArray valueAtIndex:0], EnumTestMsg_MyEnum_Zero);
  1831. XCTAssertEqual([msg.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
  1832. XCTAssertEqual([msg.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
  1833. XCTAssertEqual([msg.mumbleArray valueAtIndex:3], EnumTestMsg_MyEnum_NegOne);
  1834. XCTAssertEqual([msg.mumbleArray valueAtIndex:4], EnumTestMsg_MyEnum_NegTwo);
  1835. // Bounce to wire and back.
  1836. data = [msg data];
  1837. XCTAssertNotNil(data);
  1838. msgPrime = [EnumTestMsg parseFromData:data error:NULL];
  1839. XCTAssertEqualObjects(msgPrime, msg);
  1840. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:0],
  1841. EnumTestMsg_MyEnum_Zero);
  1842. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
  1843. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
  1844. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:3],
  1845. EnumTestMsg_MyEnum_NegOne);
  1846. XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:4],
  1847. EnumTestMsg_MyEnum_NegTwo);
  1848. }
  1849. - (void)testReservedWordNaming {
  1850. // objectivec_helpers.cc has some special handing to make sure that
  1851. // some "reserved" objc names get renamed in a way so they
  1852. // don't conflict.
  1853. //
  1854. // This "test" confirms that the expected names are generated,
  1855. // otherwise the test itself will fail to compile.
  1856. self_Class *msg = [self_Class message];
  1857. // Some ObjC/C/C++ keywords.
  1858. msg.className_p = msg.hasClassName_p;
  1859. msg.cmd = msg.hasCmd;
  1860. msg.nullable_p = msg.hasNullable_p;
  1861. msg.typeof_p = msg.hasTypeof_p;
  1862. msg.instancetype_p = msg.hasInstancetype_p;
  1863. msg.nil_p = msg.hasNil_p;
  1864. msg.instancetype_p = msg.hasInstancetype_p;
  1865. msg.public_p = msg.hasPublic_p;
  1866. // Some that would override NSObject methods
  1867. msg.camltype = msg.hasCamltype;
  1868. msg.isNsdictionary = msg.hasIsNsdictionary;
  1869. msg.dealloc_p = msg.hasDealloc_p;
  1870. msg.zone_p = msg.hasZone_p;
  1871. msg.accessibilityLabel_p = msg.hasAccessibilityLabel_p;
  1872. // Some that we shouldn't need to handle.
  1873. msg.atomic = msg.hasAtomic;
  1874. msg.nonatomic = msg.hasNonatomic;
  1875. msg.strong = msg.hasStrong;
  1876. msg.nullResettable = msg.hasNullResettable;
  1877. // Some that would override GPBMessage methods
  1878. msg.clear_p = msg.hasClear_p;
  1879. msg.data_p = msg.hasData_p;
  1880. // Some MacTypes
  1881. msg.fixed = msg.hasFixed;
  1882. msg.style = msg.hasStyle;
  1883. // Some C Identifiers
  1884. msg.generic = msg.hasGeneric;
  1885. msg.block = msg.hasBlock;
  1886. }
  1887. - (void)testOneBasedEnumHolder {
  1888. // Test case for https://github.com/protocolbuffers/protobuf/issues/1453
  1889. // Message with no explicit defaults, but a non zero default for an enum.
  1890. MessageWithOneBasedEnum *enumMsg = [MessageWithOneBasedEnum message];
  1891. XCTAssertEqual(enumMsg.enumField, MessageWithOneBasedEnum_OneBasedEnum_One);
  1892. }
  1893. - (void)testBoolOffsetUsage {
  1894. // Bools use storage within has_bits; this test ensures that this is honored
  1895. // in all places where things should crash or fail based on reading out of
  1896. // field storage instead.
  1897. BoolOnlyMessage *msg1 = [BoolOnlyMessage message];
  1898. BoolOnlyMessage *msg2 = [BoolOnlyMessage message];
  1899. msg1.boolField1 = YES;
  1900. msg2.boolField1 = YES;
  1901. msg1.boolField3 = YES;
  1902. msg2.boolField3 = YES;
  1903. msg1.boolField5 = YES;
  1904. msg2.boolField5 = YES;
  1905. msg1.boolField7 = YES;
  1906. msg2.boolField7 = YES;
  1907. msg1.boolField9 = YES;
  1908. msg2.boolField9 = YES;
  1909. msg1.boolField11 = YES;
  1910. msg2.boolField11 = YES;
  1911. msg1.boolField13 = YES;
  1912. msg2.boolField13 = YES;
  1913. msg1.boolField15 = YES;
  1914. msg2.boolField15 = YES;
  1915. msg1.boolField17 = YES;
  1916. msg2.boolField17 = YES;
  1917. msg1.boolField19 = YES;
  1918. msg2.boolField19 = YES;
  1919. msg1.boolField21 = YES;
  1920. msg2.boolField21 = YES;
  1921. msg1.boolField23 = YES;
  1922. msg2.boolField23 = YES;
  1923. msg1.boolField25 = YES;
  1924. msg2.boolField25 = YES;
  1925. msg1.boolField27 = YES;
  1926. msg2.boolField27 = YES;
  1927. msg1.boolField29 = YES;
  1928. msg2.boolField29 = YES;
  1929. msg1.boolField31 = YES;
  1930. msg2.boolField31 = YES;
  1931. msg1.boolField32 = YES;
  1932. msg2.boolField32 = YES;
  1933. XCTAssertTrue(msg1 != msg2); // Different pointers.
  1934. XCTAssertEqual([msg1 hash], [msg2 hash]);
  1935. XCTAssertEqualObjects(msg1, msg2);
  1936. BoolOnlyMessage *msg1Prime = [[msg1 copy] autorelease];
  1937. XCTAssertTrue(msg1Prime != msg1); // Different pointers.
  1938. XCTAssertEqual([msg1 hash], [msg1Prime hash]);
  1939. XCTAssertEqualObjects(msg1, msg1Prime);
  1940. // Field set in one, but not the other means they don't match (even if
  1941. // set to default value).
  1942. msg1Prime.boolField2 = NO;
  1943. XCTAssertNotEqualObjects(msg1Prime, msg1);
  1944. // And when set to different values.
  1945. msg1.boolField2 = YES;
  1946. XCTAssertNotEqualObjects(msg1Prime, msg1);
  1947. // And then they match again.
  1948. msg1.boolField2 = NO;
  1949. XCTAssertEqualObjects(msg1Prime, msg1);
  1950. XCTAssertEqual([msg1 hash], [msg1Prime hash]);
  1951. }
  1952. - (void)testCopyingMapFields {
  1953. TestMessageOfMaps *msg = [TestMessageOfMaps message];
  1954. msg.strToStr[@"foo"] = @"bar";
  1955. [msg.strToInt setInt32:1 forKey:@"mumble"];
  1956. [msg.intToStr setObject:@"wee" forKey:42];
  1957. [msg.intToInt setInt32:123 forKey:321];
  1958. [msg.strToBool setBool:YES forKey:@"one"];
  1959. [msg.boolToStr setObject:@"something" forKey:YES];
  1960. [msg.boolToBool setBool:YES forKey:NO];
  1961. [msg.intToBool setBool:YES forKey:13];
  1962. [msg.boolToInt setInt32:111 forKey:NO];
  1963. TestAllTypes *subMsg1 = [TestAllTypes message];
  1964. subMsg1.optionalInt32 = 1;
  1965. TestAllTypes *subMsg2 = [TestAllTypes message];
  1966. subMsg1.optionalInt32 = 2;
  1967. TestAllTypes *subMsg3 = [TestAllTypes message];
  1968. subMsg1.optionalInt32 = 3;
  1969. msg.strToMsg[@"baz"] = subMsg1;
  1970. [msg.intToMsg setObject:subMsg2 forKey:222];
  1971. [msg.boolToMsg setObject:subMsg3 forKey:YES];
  1972. TestMessageOfMaps *msg2 = [[msg copy] autorelease];
  1973. XCTAssertNotNil(msg2);
  1974. XCTAssertEqualObjects(msg2, msg);
  1975. XCTAssertTrue(msg2 != msg); // ptr compare
  1976. XCTAssertTrue(msg.strToStr != msg2.strToStr); // ptr compare
  1977. XCTAssertTrue(msg.intToStr != msg2.intToStr); // ptr compare
  1978. XCTAssertTrue(msg.intToInt != msg2.intToInt); // ptr compare
  1979. XCTAssertTrue(msg.strToBool != msg2.strToBool); // ptr compare
  1980. XCTAssertTrue(msg.boolToStr != msg2.boolToStr); // ptr compare
  1981. XCTAssertTrue(msg.boolToBool != msg2.boolToBool); // ptr compare
  1982. XCTAssertTrue(msg.intToBool != msg2.intToBool); // ptr compare
  1983. XCTAssertTrue(msg.boolToInt != msg2.boolToInt); // ptr compare
  1984. XCTAssertTrue(msg.strToMsg != msg2.strToMsg); // ptr compare
  1985. XCTAssertTrue(msg.intToMsg != msg2.intToMsg); // ptr compare
  1986. XCTAssertTrue(msg.boolToMsg != msg2.boolToMsg); // ptr compare
  1987. XCTAssertTrue(msg.strToMsg[@"baz"] != msg2.strToMsg[@"baz"]); // ptr compare
  1988. XCTAssertEqualObjects(msg.strToMsg[@"baz"], msg2.strToMsg[@"baz"]);
  1989. XCTAssertTrue([msg.intToMsg objectForKey:222] != [msg2.intToMsg objectForKey:222]); // ptr compare
  1990. XCTAssertEqualObjects([msg.intToMsg objectForKey:222], [msg2.intToMsg objectForKey:222]);
  1991. XCTAssertTrue([msg.boolToMsg objectForKey:YES] != [msg2.boolToMsg objectForKey:YES]); // ptr compare
  1992. XCTAssertEqualObjects([msg.boolToMsg objectForKey:YES], [msg2.boolToMsg objectForKey:YES]);
  1993. }
  1994. - (void)testPrefixedNames {
  1995. // The fact that this compiles is sufficient as a test.
  1996. // The assertions are just there to avoid "not-used" warnings.
  1997. // Verify that enum types and values get the prefix.
  1998. GPBTESTTestObjcProtoPrefixEnum value = GPBTESTTestObjcProtoPrefixEnum_Value;
  1999. XCTAssertNotEqual(value, 0);
  2000. // Verify that roots get the prefix.
  2001. GPBTESTUnittestObjcOptionsRoot *root = nil;
  2002. XCTAssertNil(root);
  2003. // Verify that messages that don't already have the prefix get a prefix.
  2004. GPBTESTTestObjcProtoPrefixMessage *prefixedMessage = nil;
  2005. XCTAssertNil(prefixedMessage);
  2006. // Verify that messages that already have a prefix aren't prefixed twice.
  2007. GPBTESTTestHasAPrefixMessage *alreadyPrefixedMessage = nil;
  2008. XCTAssertNil(alreadyPrefixedMessage);
  2009. // Verify that enums that already have a prefix aren't prefixed twice.
  2010. GPBTESTTestHasAPrefixEnum prefixedValue = GPBTESTTestHasAPrefixEnum_ValueB;
  2011. XCTAssertNotEqual(prefixedValue, 0);
  2012. // Verify that classes named the same as prefixes are prefixed.
  2013. GPBTESTGPBTEST *prefixMessage = nil;
  2014. XCTAssertNil(prefixMessage);
  2015. // Verify that classes that have the prefix followed by a lowercase
  2016. // letter DO get the prefix.
  2017. GPBTESTGPBTESTshouldGetAPrefixMessage *shouldGetAPrefixMessage = nil;
  2018. XCTAssertNil(shouldGetAPrefixMessage);
  2019. }
  2020. @end