GPBMessageTests.m 77 KB

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