GPBMessageTests.m 81 KB

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