GPBArrayTests.m 124 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2015 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 <Foundation/Foundation.h>
  31. #import <XCTest/XCTest.h>
  32. #import "GPBArray.h"
  33. #import "GPBArray_PackagePrivate.h"
  34. #import "GPBTestUtilities.h"
  35. // To let the testing macros work, add some extra methods to simplify things.
  36. @interface GPBEnumArray (TestingTweak)
  37. + (instancetype)arrayWithValue:(int32_t)value;
  38. + (instancetype)arrayWithCapacity:(NSUInteger)count;
  39. - (instancetype)initWithValues:(const int32_t [])values
  40. count:(NSUInteger)count;
  41. @end
  42. static BOOL TestingEnum_IsValidValue(int32_t value) {
  43. switch (value) {
  44. case 71:
  45. case 72:
  46. case 73:
  47. case 74:
  48. return YES;
  49. default:
  50. return NO;
  51. }
  52. }
  53. static BOOL TestingEnum_IsValidValue2(int32_t value) {
  54. switch (value) {
  55. case 71:
  56. case 72:
  57. case 73:
  58. return YES;
  59. default:
  60. return NO;
  61. }
  62. }
  63. @implementation GPBEnumArray (TestingTweak)
  64. + (instancetype)arrayWithValue:(int32_t)value {
  65. return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
  66. rawValues:&value
  67. count:1] autorelease];
  68. }
  69. + (instancetype)arrayWithCapacity:(NSUInteger)count {
  70. return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
  71. capacity:count] autorelease];
  72. }
  73. - (instancetype)initWithValues:(const int32_t [])values
  74. count:(NSUInteger)count {
  75. return [self initWithValidationFunction:TestingEnum_IsValidValue
  76. rawValues:values
  77. count:count];
  78. }
  79. @end
  80. #pragma mark - PDDM Macros
  81. //%PDDM-DEFINE ARRAY_TESTS(NAME, TYPE, VAL1, VAL2, VAL3, VAL4)
  82. //%ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, )
  83. //%PDDM-DEFINE ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, HELPER)
  84. //%#pragma mark - NAME
  85. //%
  86. //%@interface GPB##NAME##ArrayTests : XCTestCase
  87. //%@end
  88. //%
  89. //%@implementation GPB##NAME##ArrayTests
  90. //%
  91. //%- (void)testEmpty {
  92. //% GPB##NAME##Array *array = [[GPB##NAME##Array alloc] init];
  93. //% XCTAssertNotNil(array);
  94. //% XCTAssertEqual(array.count, 0U);
  95. //% XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  96. //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  97. //% #pragma unused(value, idx, stop)
  98. //% XCTFail(@"Shouldn't get here!");
  99. //% }];
  100. //% [array enumerateValuesWithOptions:NSEnumerationReverse
  101. //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  102. //% #pragma unused(value, idx, stop)
  103. //% XCTFail(@"Shouldn't get here!");
  104. //% }];
  105. //% [array release];
  106. //%}
  107. //%
  108. //%- (void)testOne {
  109. //% GPB##NAME##Array *array = [GPB##NAME##Array arrayWithValue:VAL1];
  110. //% XCTAssertNotNil(array);
  111. //% XCTAssertEqual(array.count, 1U);
  112. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  113. //% XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  114. //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  115. //% XCTAssertEqual(idx, 0U);
  116. //% XCTAssertEqual(value, VAL1);
  117. //% XCTAssertNotEqual(stop, NULL);
  118. //% }];
  119. //% [array enumerateValuesWithOptions:NSEnumerationReverse
  120. //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  121. //% XCTAssertEqual(idx, 0U);
  122. //% XCTAssertEqual(value, VAL1);
  123. //% XCTAssertNotEqual(stop, NULL);
  124. //% }];
  125. //%}
  126. //%
  127. //%- (void)testBasics {
  128. //% static const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 };
  129. //% GPB##NAME##Array *array =
  130. //% [[GPB##NAME##Array alloc] initWithValues:kValues
  131. //% NAME$S count:GPBARRAYSIZE(kValues)];
  132. //% XCTAssertNotNil(array);
  133. //% XCTAssertEqual(array.count, 4U);
  134. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  135. //% XCTAssertEqual([array valueAtIndex:1], VAL2);
  136. //% XCTAssertEqual([array valueAtIndex:2], VAL3);
  137. //% XCTAssertEqual([array valueAtIndex:3], VAL4);
  138. //% XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  139. //% __block NSUInteger idx2 = 0;
  140. //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  141. //% XCTAssertEqual(idx, idx2);
  142. //% XCTAssertEqual(value, kValues[idx]);
  143. //% XCTAssertNotEqual(stop, NULL);
  144. //% ++idx2;
  145. //% }];
  146. //% idx2 = 0;
  147. //% [array enumerateValuesWithOptions:NSEnumerationReverse
  148. //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  149. //% XCTAssertEqual(idx, (3 - idx2));
  150. //% XCTAssertEqual(value, kValues[idx]);
  151. //% XCTAssertNotEqual(stop, NULL);
  152. //% ++idx2;
  153. //% }];
  154. //% // Stopping the enumeration.
  155. //% idx2 = 0;
  156. //% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  157. //% XCTAssertEqual(idx, idx2);
  158. //% XCTAssertEqual(value, kValues[idx]);
  159. //% XCTAssertNotEqual(stop, NULL);
  160. //% if (idx2 == 1) *stop = YES;
  161. //% XCTAssertNotEqual(idx, 2U);
  162. //% XCTAssertNotEqual(idx, 3U);
  163. //% ++idx2;
  164. //% }];
  165. //% idx2 = 0;
  166. //% [array enumerateValuesWithOptions:NSEnumerationReverse
  167. //% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
  168. //% XCTAssertEqual(idx, (3 - idx2));
  169. //% XCTAssertEqual(value, kValues[idx]);
  170. //% XCTAssertNotEqual(stop, NULL);
  171. //% if (idx2 == 1) *stop = YES;
  172. //% XCTAssertNotEqual(idx, 1U);
  173. //% XCTAssertNotEqual(idx, 0U);
  174. //% ++idx2;
  175. //% }];
  176. //% // Ensure description doesn't choke.
  177. //% XCTAssertTrue(array.description.length > 10);
  178. //% [array release];
  179. //%}
  180. //%
  181. //%- (void)testEquality {
  182. //% const TYPE kValues1[] = { VAL1, VAL2, VAL3 };
  183. //% const TYPE kValues2[] = { VAL1, VAL4, VAL3 };
  184. //% const TYPE kValues3[] = { VAL1, VAL2, VAL3, VAL4 };
  185. //% GPB##NAME##Array *array1 =
  186. //% [[GPB##NAME##Array alloc] initWithValues:kValues1
  187. //% NAME$S count:GPBARRAYSIZE(kValues1)];
  188. //% XCTAssertNotNil(array1);
  189. //% GPB##NAME##Array *array1prime =
  190. //% [[GPB##NAME##Array alloc] initWithValues:kValues1
  191. //% NAME$S count:GPBARRAYSIZE(kValues1)];
  192. //% XCTAssertNotNil(array1prime);
  193. //% GPB##NAME##Array *array2 =
  194. //% [[GPB##NAME##Array alloc] initWithValues:kValues2
  195. //% NAME$S count:GPBARRAYSIZE(kValues2)];
  196. //% XCTAssertNotNil(array2);
  197. //% GPB##NAME##Array *array3 =
  198. //% [[GPB##NAME##Array alloc] initWithValues:kValues3
  199. //% NAME$S count:GPBARRAYSIZE(kValues3)];
  200. //% XCTAssertNotNil(array3);
  201. //%
  202. //% // Identity
  203. //% XCTAssertTrue([array1 isEqual:array1]);
  204. //% // Wrong type doesn't blow up.
  205. //% XCTAssertFalse([array1 isEqual:@"bogus"]);
  206. //% // 1/1Prime should be different objects, but equal.
  207. //% XCTAssertNotEqual(array1, array1prime);
  208. //% XCTAssertEqualObjects(array1, array1prime);
  209. //% // Equal, so they must have same hash.
  210. //% XCTAssertEqual([array1 hash], [array1prime hash]);
  211. //%
  212. //% // 1/2/3 shouldn't be equal.
  213. //% XCTAssertNotEqualObjects(array1, array2);
  214. //% XCTAssertNotEqualObjects(array1, array3);
  215. //% XCTAssertNotEqualObjects(array2, array3);
  216. //%
  217. //% [array1 release];
  218. //% [array1prime release];
  219. //% [array2 release];
  220. //% [array3 release];
  221. //%}
  222. //%
  223. //%- (void)testCopy {
  224. //% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 };
  225. //% GPB##NAME##Array *array =
  226. //% [[GPB##NAME##Array alloc] initWithValues:kValues
  227. //% NAME$S count:GPBARRAYSIZE(kValues)];
  228. //% XCTAssertNotNil(array);
  229. //%
  230. //% GPB##NAME##Array *array2 = [array copy];
  231. //% XCTAssertNotNil(array2);
  232. //%
  233. //% // Should be new object but equal.
  234. //% XCTAssertNotEqual(array, array2);
  235. //% XCTAssertEqualObjects(array, array2);
  236. //% [array2 release];
  237. //% [array release];
  238. //%}
  239. //%
  240. //%- (void)testArrayFromArray {
  241. //% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 };
  242. //% GPB##NAME##Array *array =
  243. //% [[GPB##NAME##Array alloc] initWithValues:kValues
  244. //% NAME$S count:GPBARRAYSIZE(kValues)];
  245. //% XCTAssertNotNil(array);
  246. //%
  247. //% GPB##NAME##Array *array2 = [GPB##NAME##Array arrayWithValueArray:array];
  248. //% XCTAssertNotNil(array2);
  249. //%
  250. //% // Should be new pointer, but equal objects.
  251. //% XCTAssertNotEqual(array, array2);
  252. //% XCTAssertEqualObjects(array, array2);
  253. //% [array release];
  254. //%}
  255. //%
  256. //%- (void)testAdds {
  257. //% GPB##NAME##Array *array = [GPB##NAME##Array array];
  258. //% XCTAssertNotNil(array);
  259. //%
  260. //% XCTAssertEqual(array.count, 0U);
  261. //% [array addValue:VAL1];
  262. //% XCTAssertEqual(array.count, 1U);
  263. //%
  264. //% const TYPE kValues1[] = { VAL2, VAL3 };
  265. //% [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  266. //% XCTAssertEqual(array.count, 3U);
  267. //%
  268. //% const TYPE kValues2[] = { VAL4, VAL1 };
  269. //% GPB##NAME##Array *array2 =
  270. //% [[GPB##NAME##Array alloc] initWithValues:kValues2
  271. //% NAME$S count:GPBARRAYSIZE(kValues2)];
  272. //% XCTAssertNotNil(array2);
  273. //% [array add##HELPER##ValuesFromArray:array2];
  274. //% XCTAssertEqual(array.count, 5U);
  275. //%
  276. //% // Zero/nil inputs do nothing.
  277. //% [array addValues:kValues1 count:0];
  278. //% XCTAssertEqual(array.count, 5U);
  279. //% [array addValues:NULL count:5];
  280. //% XCTAssertEqual(array.count, 5U);
  281. //%
  282. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  283. //% XCTAssertEqual([array valueAtIndex:1], VAL2);
  284. //% XCTAssertEqual([array valueAtIndex:2], VAL3);
  285. //% XCTAssertEqual([array valueAtIndex:3], VAL4);
  286. //% XCTAssertEqual([array valueAtIndex:4], VAL1);
  287. //% [array2 release];
  288. //%}
  289. //%
  290. //%- (void)testInsert {
  291. //% const TYPE kValues[] = { VAL1, VAL2, VAL3 };
  292. //% GPB##NAME##Array *array =
  293. //% [[GPB##NAME##Array alloc] initWithValues:kValues
  294. //% NAME$S count:GPBARRAYSIZE(kValues)];
  295. //% XCTAssertNotNil(array);
  296. //% XCTAssertEqual(array.count, 3U);
  297. //%
  298. //% // First
  299. //% [array insertValue:VAL4 atIndex:0];
  300. //% XCTAssertEqual(array.count, 4U);
  301. //%
  302. //% // Middle
  303. //% [array insertValue:VAL4 atIndex:2];
  304. //% XCTAssertEqual(array.count, 5U);
  305. //%
  306. //% // End
  307. //% [array insertValue:VAL4 atIndex:5];
  308. //% XCTAssertEqual(array.count, 6U);
  309. //%
  310. //% // Too far.
  311. //% XCTAssertThrowsSpecificNamed([array insertValue:VAL4 atIndex:7],
  312. //% NSException, NSRangeException);
  313. //%
  314. //% XCTAssertEqual([array valueAtIndex:0], VAL4);
  315. //% XCTAssertEqual([array valueAtIndex:1], VAL1);
  316. //% XCTAssertEqual([array valueAtIndex:2], VAL4);
  317. //% XCTAssertEqual([array valueAtIndex:3], VAL2);
  318. //% XCTAssertEqual([array valueAtIndex:4], VAL3);
  319. //% XCTAssertEqual([array valueAtIndex:5], VAL4);
  320. //% [array release];
  321. //%}
  322. //%
  323. //%- (void)testRemove {
  324. //% const TYPE kValues[] = { VAL4, VAL1, VAL2, VAL4, VAL3, VAL4 };
  325. //% GPB##NAME##Array *array =
  326. //% [[GPB##NAME##Array alloc] initWithValues:kValues
  327. //% NAME$S count:GPBARRAYSIZE(kValues)];
  328. //% XCTAssertNotNil(array);
  329. //% XCTAssertEqual(array.count, 6U);
  330. //%
  331. //% // First
  332. //% [array removeValueAtIndex:0];
  333. //% XCTAssertEqual(array.count, 5U);
  334. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  335. //%
  336. //% // Middle
  337. //% [array removeValueAtIndex:2];
  338. //% XCTAssertEqual(array.count, 4U);
  339. //% XCTAssertEqual([array valueAtIndex:2], VAL3);
  340. //%
  341. //% // End
  342. //% [array removeValueAtIndex:3];
  343. //% XCTAssertEqual(array.count, 3U);
  344. //%
  345. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  346. //% XCTAssertEqual([array valueAtIndex:1], VAL2);
  347. //% XCTAssertEqual([array valueAtIndex:2], VAL3);
  348. //%
  349. //% // Too far.
  350. //% XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  351. //% NSException, NSRangeException);
  352. //%
  353. //% [array removeAll];
  354. //% XCTAssertEqual(array.count, 0U);
  355. //% XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  356. //% NSException, NSRangeException);
  357. //% [array release];
  358. //%}
  359. //%
  360. //%- (void)testInplaceMutation {
  361. //% const TYPE kValues[] = { VAL1, VAL1, VAL3, VAL3 };
  362. //% GPB##NAME##Array *array =
  363. //% [[GPB##NAME##Array alloc] initWithValues:kValues
  364. //% NAME$S count:GPBARRAYSIZE(kValues)];
  365. //% XCTAssertNotNil(array);
  366. //%
  367. //% [array replaceValueAtIndex:1 withValue:VAL2];
  368. //% [array replaceValueAtIndex:3 withValue:VAL4];
  369. //% XCTAssertEqual(array.count, 4U);
  370. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  371. //% XCTAssertEqual([array valueAtIndex:1], VAL2);
  372. //% XCTAssertEqual([array valueAtIndex:2], VAL3);
  373. //% XCTAssertEqual([array valueAtIndex:3], VAL4);
  374. //%
  375. //% XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:VAL4],
  376. //% NSException, NSRangeException);
  377. //%
  378. //% [array exchangeValueAtIndex:1 withValueAtIndex:3];
  379. //% XCTAssertEqual(array.count, 4U);
  380. //% XCTAssertEqual([array valueAtIndex:0], VAL1);
  381. //% XCTAssertEqual([array valueAtIndex:1], VAL4);
  382. //% XCTAssertEqual([array valueAtIndex:2], VAL3);
  383. //% XCTAssertEqual([array valueAtIndex:3], VAL2);
  384. //%
  385. //% [array exchangeValueAtIndex:2 withValueAtIndex:0];
  386. //% XCTAssertEqual(array.count, 4U);
  387. //% XCTAssertEqual([array valueAtIndex:0], VAL3);
  388. //% XCTAssertEqual([array valueAtIndex:1], VAL4);
  389. //% XCTAssertEqual([array valueAtIndex:2], VAL1);
  390. //% XCTAssertEqual([array valueAtIndex:3], VAL2);
  391. //%
  392. //% XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  393. //% NSException, NSRangeException);
  394. //% XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  395. //% NSException, NSRangeException);
  396. //% [array release];
  397. //%}
  398. //%
  399. //%- (void)testInternalResizing {
  400. //% const TYPE kValues[] = { VAL1, VAL2, VAL3, VAL4 };
  401. //% GPB##NAME##Array *array =
  402. //% [GPB##NAME##Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
  403. //% XCTAssertNotNil(array);
  404. //% [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  405. //%
  406. //% // Add/remove to trigger the intneral buffer to grow/shrink.
  407. //% for (int i = 0; i < 100; ++i) {
  408. //% [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  409. //% }
  410. //% XCTAssertEqual(array.count, 404U);
  411. //% for (int i = 0; i < 100; ++i) {
  412. //% [array removeValueAtIndex:(i * 2)];
  413. //% }
  414. //% XCTAssertEqual(array.count, 304U);
  415. //% for (int i = 0; i < 100; ++i) {
  416. //% [array insertValue:VAL4 atIndex:(i * 3)];
  417. //% }
  418. //% XCTAssertEqual(array.count, 404U);
  419. //% [array removeAll];
  420. //% XCTAssertEqual(array.count, 0U);
  421. //%}
  422. //%
  423. //%@end
  424. //%
  425. //%PDDM-EXPAND ARRAY_TESTS(Int32, int32_t, 1, 2, 3, 4)
  426. // This block of code is generated, do not edit it directly.
  427. #pragma mark - Int32
  428. @interface GPBInt32ArrayTests : XCTestCase
  429. @end
  430. @implementation GPBInt32ArrayTests
  431. - (void)testEmpty {
  432. GPBInt32Array *array = [[GPBInt32Array alloc] init];
  433. XCTAssertNotNil(array);
  434. XCTAssertEqual(array.count, 0U);
  435. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  436. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  437. #pragma unused(value, idx, stop)
  438. XCTFail(@"Shouldn't get here!");
  439. }];
  440. [array enumerateValuesWithOptions:NSEnumerationReverse
  441. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  442. #pragma unused(value, idx, stop)
  443. XCTFail(@"Shouldn't get here!");
  444. }];
  445. [array release];
  446. }
  447. - (void)testOne {
  448. GPBInt32Array *array = [GPBInt32Array arrayWithValue:1];
  449. XCTAssertNotNil(array);
  450. XCTAssertEqual(array.count, 1U);
  451. XCTAssertEqual([array valueAtIndex:0], 1);
  452. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  453. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  454. XCTAssertEqual(idx, 0U);
  455. XCTAssertEqual(value, 1);
  456. XCTAssertNotEqual(stop, NULL);
  457. }];
  458. [array enumerateValuesWithOptions:NSEnumerationReverse
  459. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  460. XCTAssertEqual(idx, 0U);
  461. XCTAssertEqual(value, 1);
  462. XCTAssertNotEqual(stop, NULL);
  463. }];
  464. }
  465. - (void)testBasics {
  466. static const int32_t kValues[] = { 1, 2, 3, 4 };
  467. GPBInt32Array *array =
  468. [[GPBInt32Array alloc] initWithValues:kValues
  469. count:GPBARRAYSIZE(kValues)];
  470. XCTAssertNotNil(array);
  471. XCTAssertEqual(array.count, 4U);
  472. XCTAssertEqual([array valueAtIndex:0], 1);
  473. XCTAssertEqual([array valueAtIndex:1], 2);
  474. XCTAssertEqual([array valueAtIndex:2], 3);
  475. XCTAssertEqual([array valueAtIndex:3], 4);
  476. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  477. __block NSUInteger idx2 = 0;
  478. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  479. XCTAssertEqual(idx, idx2);
  480. XCTAssertEqual(value, kValues[idx]);
  481. XCTAssertNotEqual(stop, NULL);
  482. ++idx2;
  483. }];
  484. idx2 = 0;
  485. [array enumerateValuesWithOptions:NSEnumerationReverse
  486. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  487. XCTAssertEqual(idx, (3 - idx2));
  488. XCTAssertEqual(value, kValues[idx]);
  489. XCTAssertNotEqual(stop, NULL);
  490. ++idx2;
  491. }];
  492. // Stopping the enumeration.
  493. idx2 = 0;
  494. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  495. XCTAssertEqual(idx, idx2);
  496. XCTAssertEqual(value, kValues[idx]);
  497. XCTAssertNotEqual(stop, NULL);
  498. if (idx2 == 1) *stop = YES;
  499. XCTAssertNotEqual(idx, 2U);
  500. XCTAssertNotEqual(idx, 3U);
  501. ++idx2;
  502. }];
  503. idx2 = 0;
  504. [array enumerateValuesWithOptions:NSEnumerationReverse
  505. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  506. XCTAssertEqual(idx, (3 - idx2));
  507. XCTAssertEqual(value, kValues[idx]);
  508. XCTAssertNotEqual(stop, NULL);
  509. if (idx2 == 1) *stop = YES;
  510. XCTAssertNotEqual(idx, 1U);
  511. XCTAssertNotEqual(idx, 0U);
  512. ++idx2;
  513. }];
  514. // Ensure description doesn't choke.
  515. XCTAssertTrue(array.description.length > 10);
  516. [array release];
  517. }
  518. - (void)testEquality {
  519. const int32_t kValues1[] = { 1, 2, 3 };
  520. const int32_t kValues2[] = { 1, 4, 3 };
  521. const int32_t kValues3[] = { 1, 2, 3, 4 };
  522. GPBInt32Array *array1 =
  523. [[GPBInt32Array alloc] initWithValues:kValues1
  524. count:GPBARRAYSIZE(kValues1)];
  525. XCTAssertNotNil(array1);
  526. GPBInt32Array *array1prime =
  527. [[GPBInt32Array alloc] initWithValues:kValues1
  528. count:GPBARRAYSIZE(kValues1)];
  529. XCTAssertNotNil(array1prime);
  530. GPBInt32Array *array2 =
  531. [[GPBInt32Array alloc] initWithValues:kValues2
  532. count:GPBARRAYSIZE(kValues2)];
  533. XCTAssertNotNil(array2);
  534. GPBInt32Array *array3 =
  535. [[GPBInt32Array alloc] initWithValues:kValues3
  536. count:GPBARRAYSIZE(kValues3)];
  537. XCTAssertNotNil(array3);
  538. // Identity
  539. XCTAssertTrue([array1 isEqual:array1]);
  540. // Wrong type doesn't blow up.
  541. XCTAssertFalse([array1 isEqual:@"bogus"]);
  542. // 1/1Prime should be different objects, but equal.
  543. XCTAssertNotEqual(array1, array1prime);
  544. XCTAssertEqualObjects(array1, array1prime);
  545. // Equal, so they must have same hash.
  546. XCTAssertEqual([array1 hash], [array1prime hash]);
  547. // 1/2/3 shouldn't be equal.
  548. XCTAssertNotEqualObjects(array1, array2);
  549. XCTAssertNotEqualObjects(array1, array3);
  550. XCTAssertNotEqualObjects(array2, array3);
  551. [array1 release];
  552. [array1prime release];
  553. [array2 release];
  554. [array3 release];
  555. }
  556. - (void)testCopy {
  557. const int32_t kValues[] = { 1, 2, 3, 4 };
  558. GPBInt32Array *array =
  559. [[GPBInt32Array alloc] initWithValues:kValues
  560. count:GPBARRAYSIZE(kValues)];
  561. XCTAssertNotNil(array);
  562. GPBInt32Array *array2 = [array copy];
  563. XCTAssertNotNil(array2);
  564. // Should be new object but equal.
  565. XCTAssertNotEqual(array, array2);
  566. XCTAssertEqualObjects(array, array2);
  567. [array2 release];
  568. [array release];
  569. }
  570. - (void)testArrayFromArray {
  571. const int32_t kValues[] = { 1, 2, 3, 4 };
  572. GPBInt32Array *array =
  573. [[GPBInt32Array alloc] initWithValues:kValues
  574. count:GPBARRAYSIZE(kValues)];
  575. XCTAssertNotNil(array);
  576. GPBInt32Array *array2 = [GPBInt32Array arrayWithValueArray:array];
  577. XCTAssertNotNil(array2);
  578. // Should be new pointer, but equal objects.
  579. XCTAssertNotEqual(array, array2);
  580. XCTAssertEqualObjects(array, array2);
  581. [array release];
  582. }
  583. - (void)testAdds {
  584. GPBInt32Array *array = [GPBInt32Array array];
  585. XCTAssertNotNil(array);
  586. XCTAssertEqual(array.count, 0U);
  587. [array addValue:1];
  588. XCTAssertEqual(array.count, 1U);
  589. const int32_t kValues1[] = { 2, 3 };
  590. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  591. XCTAssertEqual(array.count, 3U);
  592. const int32_t kValues2[] = { 4, 1 };
  593. GPBInt32Array *array2 =
  594. [[GPBInt32Array alloc] initWithValues:kValues2
  595. count:GPBARRAYSIZE(kValues2)];
  596. XCTAssertNotNil(array2);
  597. [array addValuesFromArray:array2];
  598. XCTAssertEqual(array.count, 5U);
  599. // Zero/nil inputs do nothing.
  600. [array addValues:kValues1 count:0];
  601. XCTAssertEqual(array.count, 5U);
  602. [array addValues:NULL count:5];
  603. XCTAssertEqual(array.count, 5U);
  604. XCTAssertEqual([array valueAtIndex:0], 1);
  605. XCTAssertEqual([array valueAtIndex:1], 2);
  606. XCTAssertEqual([array valueAtIndex:2], 3);
  607. XCTAssertEqual([array valueAtIndex:3], 4);
  608. XCTAssertEqual([array valueAtIndex:4], 1);
  609. [array2 release];
  610. }
  611. - (void)testInsert {
  612. const int32_t kValues[] = { 1, 2, 3 };
  613. GPBInt32Array *array =
  614. [[GPBInt32Array alloc] initWithValues:kValues
  615. count:GPBARRAYSIZE(kValues)];
  616. XCTAssertNotNil(array);
  617. XCTAssertEqual(array.count, 3U);
  618. // First
  619. [array insertValue:4 atIndex:0];
  620. XCTAssertEqual(array.count, 4U);
  621. // Middle
  622. [array insertValue:4 atIndex:2];
  623. XCTAssertEqual(array.count, 5U);
  624. // End
  625. [array insertValue:4 atIndex:5];
  626. XCTAssertEqual(array.count, 6U);
  627. // Too far.
  628. XCTAssertThrowsSpecificNamed([array insertValue:4 atIndex:7],
  629. NSException, NSRangeException);
  630. XCTAssertEqual([array valueAtIndex:0], 4);
  631. XCTAssertEqual([array valueAtIndex:1], 1);
  632. XCTAssertEqual([array valueAtIndex:2], 4);
  633. XCTAssertEqual([array valueAtIndex:3], 2);
  634. XCTAssertEqual([array valueAtIndex:4], 3);
  635. XCTAssertEqual([array valueAtIndex:5], 4);
  636. [array release];
  637. }
  638. - (void)testRemove {
  639. const int32_t kValues[] = { 4, 1, 2, 4, 3, 4 };
  640. GPBInt32Array *array =
  641. [[GPBInt32Array alloc] initWithValues:kValues
  642. count:GPBARRAYSIZE(kValues)];
  643. XCTAssertNotNil(array);
  644. XCTAssertEqual(array.count, 6U);
  645. // First
  646. [array removeValueAtIndex:0];
  647. XCTAssertEqual(array.count, 5U);
  648. XCTAssertEqual([array valueAtIndex:0], 1);
  649. // Middle
  650. [array removeValueAtIndex:2];
  651. XCTAssertEqual(array.count, 4U);
  652. XCTAssertEqual([array valueAtIndex:2], 3);
  653. // End
  654. [array removeValueAtIndex:3];
  655. XCTAssertEqual(array.count, 3U);
  656. XCTAssertEqual([array valueAtIndex:0], 1);
  657. XCTAssertEqual([array valueAtIndex:1], 2);
  658. XCTAssertEqual([array valueAtIndex:2], 3);
  659. // Too far.
  660. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  661. NSException, NSRangeException);
  662. [array removeAll];
  663. XCTAssertEqual(array.count, 0U);
  664. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  665. NSException, NSRangeException);
  666. [array release];
  667. }
  668. - (void)testInplaceMutation {
  669. const int32_t kValues[] = { 1, 1, 3, 3 };
  670. GPBInt32Array *array =
  671. [[GPBInt32Array alloc] initWithValues:kValues
  672. count:GPBARRAYSIZE(kValues)];
  673. XCTAssertNotNil(array);
  674. [array replaceValueAtIndex:1 withValue:2];
  675. [array replaceValueAtIndex:3 withValue:4];
  676. XCTAssertEqual(array.count, 4U);
  677. XCTAssertEqual([array valueAtIndex:0], 1);
  678. XCTAssertEqual([array valueAtIndex:1], 2);
  679. XCTAssertEqual([array valueAtIndex:2], 3);
  680. XCTAssertEqual([array valueAtIndex:3], 4);
  681. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:4],
  682. NSException, NSRangeException);
  683. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  684. XCTAssertEqual(array.count, 4U);
  685. XCTAssertEqual([array valueAtIndex:0], 1);
  686. XCTAssertEqual([array valueAtIndex:1], 4);
  687. XCTAssertEqual([array valueAtIndex:2], 3);
  688. XCTAssertEqual([array valueAtIndex:3], 2);
  689. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  690. XCTAssertEqual(array.count, 4U);
  691. XCTAssertEqual([array valueAtIndex:0], 3);
  692. XCTAssertEqual([array valueAtIndex:1], 4);
  693. XCTAssertEqual([array valueAtIndex:2], 1);
  694. XCTAssertEqual([array valueAtIndex:3], 2);
  695. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  696. NSException, NSRangeException);
  697. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  698. NSException, NSRangeException);
  699. [array release];
  700. }
  701. - (void)testInternalResizing {
  702. const int32_t kValues[] = { 1, 2, 3, 4 };
  703. GPBInt32Array *array =
  704. [GPBInt32Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
  705. XCTAssertNotNil(array);
  706. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  707. // Add/remove to trigger the intneral buffer to grow/shrink.
  708. for (int i = 0; i < 100; ++i) {
  709. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  710. }
  711. XCTAssertEqual(array.count, 404U);
  712. for (int i = 0; i < 100; ++i) {
  713. [array removeValueAtIndex:(i * 2)];
  714. }
  715. XCTAssertEqual(array.count, 304U);
  716. for (int i = 0; i < 100; ++i) {
  717. [array insertValue:4 atIndex:(i * 3)];
  718. }
  719. XCTAssertEqual(array.count, 404U);
  720. [array removeAll];
  721. XCTAssertEqual(array.count, 0U);
  722. }
  723. @end
  724. //%PDDM-EXPAND ARRAY_TESTS(UInt32, uint32_t, 11U, 12U, 13U, 14U)
  725. // This block of code is generated, do not edit it directly.
  726. #pragma mark - UInt32
  727. @interface GPBUInt32ArrayTests : XCTestCase
  728. @end
  729. @implementation GPBUInt32ArrayTests
  730. - (void)testEmpty {
  731. GPBUInt32Array *array = [[GPBUInt32Array alloc] init];
  732. XCTAssertNotNil(array);
  733. XCTAssertEqual(array.count, 0U);
  734. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  735. [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  736. #pragma unused(value, idx, stop)
  737. XCTFail(@"Shouldn't get here!");
  738. }];
  739. [array enumerateValuesWithOptions:NSEnumerationReverse
  740. usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  741. #pragma unused(value, idx, stop)
  742. XCTFail(@"Shouldn't get here!");
  743. }];
  744. [array release];
  745. }
  746. - (void)testOne {
  747. GPBUInt32Array *array = [GPBUInt32Array arrayWithValue:11U];
  748. XCTAssertNotNil(array);
  749. XCTAssertEqual(array.count, 1U);
  750. XCTAssertEqual([array valueAtIndex:0], 11U);
  751. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  752. [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  753. XCTAssertEqual(idx, 0U);
  754. XCTAssertEqual(value, 11U);
  755. XCTAssertNotEqual(stop, NULL);
  756. }];
  757. [array enumerateValuesWithOptions:NSEnumerationReverse
  758. usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  759. XCTAssertEqual(idx, 0U);
  760. XCTAssertEqual(value, 11U);
  761. XCTAssertNotEqual(stop, NULL);
  762. }];
  763. }
  764. - (void)testBasics {
  765. static const uint32_t kValues[] = { 11U, 12U, 13U, 14U };
  766. GPBUInt32Array *array =
  767. [[GPBUInt32Array alloc] initWithValues:kValues
  768. count:GPBARRAYSIZE(kValues)];
  769. XCTAssertNotNil(array);
  770. XCTAssertEqual(array.count, 4U);
  771. XCTAssertEqual([array valueAtIndex:0], 11U);
  772. XCTAssertEqual([array valueAtIndex:1], 12U);
  773. XCTAssertEqual([array valueAtIndex:2], 13U);
  774. XCTAssertEqual([array valueAtIndex:3], 14U);
  775. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  776. __block NSUInteger idx2 = 0;
  777. [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  778. XCTAssertEqual(idx, idx2);
  779. XCTAssertEqual(value, kValues[idx]);
  780. XCTAssertNotEqual(stop, NULL);
  781. ++idx2;
  782. }];
  783. idx2 = 0;
  784. [array enumerateValuesWithOptions:NSEnumerationReverse
  785. usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  786. XCTAssertEqual(idx, (3 - idx2));
  787. XCTAssertEqual(value, kValues[idx]);
  788. XCTAssertNotEqual(stop, NULL);
  789. ++idx2;
  790. }];
  791. // Stopping the enumeration.
  792. idx2 = 0;
  793. [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  794. XCTAssertEqual(idx, idx2);
  795. XCTAssertEqual(value, kValues[idx]);
  796. XCTAssertNotEqual(stop, NULL);
  797. if (idx2 == 1) *stop = YES;
  798. XCTAssertNotEqual(idx, 2U);
  799. XCTAssertNotEqual(idx, 3U);
  800. ++idx2;
  801. }];
  802. idx2 = 0;
  803. [array enumerateValuesWithOptions:NSEnumerationReverse
  804. usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
  805. XCTAssertEqual(idx, (3 - idx2));
  806. XCTAssertEqual(value, kValues[idx]);
  807. XCTAssertNotEqual(stop, NULL);
  808. if (idx2 == 1) *stop = YES;
  809. XCTAssertNotEqual(idx, 1U);
  810. XCTAssertNotEqual(idx, 0U);
  811. ++idx2;
  812. }];
  813. // Ensure description doesn't choke.
  814. XCTAssertTrue(array.description.length > 10);
  815. [array release];
  816. }
  817. - (void)testEquality {
  818. const uint32_t kValues1[] = { 11U, 12U, 13U };
  819. const uint32_t kValues2[] = { 11U, 14U, 13U };
  820. const uint32_t kValues3[] = { 11U, 12U, 13U, 14U };
  821. GPBUInt32Array *array1 =
  822. [[GPBUInt32Array alloc] initWithValues:kValues1
  823. count:GPBARRAYSIZE(kValues1)];
  824. XCTAssertNotNil(array1);
  825. GPBUInt32Array *array1prime =
  826. [[GPBUInt32Array alloc] initWithValues:kValues1
  827. count:GPBARRAYSIZE(kValues1)];
  828. XCTAssertNotNil(array1prime);
  829. GPBUInt32Array *array2 =
  830. [[GPBUInt32Array alloc] initWithValues:kValues2
  831. count:GPBARRAYSIZE(kValues2)];
  832. XCTAssertNotNil(array2);
  833. GPBUInt32Array *array3 =
  834. [[GPBUInt32Array alloc] initWithValues:kValues3
  835. count:GPBARRAYSIZE(kValues3)];
  836. XCTAssertNotNil(array3);
  837. // Identity
  838. XCTAssertTrue([array1 isEqual:array1]);
  839. // Wrong type doesn't blow up.
  840. XCTAssertFalse([array1 isEqual:@"bogus"]);
  841. // 1/1Prime should be different objects, but equal.
  842. XCTAssertNotEqual(array1, array1prime);
  843. XCTAssertEqualObjects(array1, array1prime);
  844. // Equal, so they must have same hash.
  845. XCTAssertEqual([array1 hash], [array1prime hash]);
  846. // 1/2/3 shouldn't be equal.
  847. XCTAssertNotEqualObjects(array1, array2);
  848. XCTAssertNotEqualObjects(array1, array3);
  849. XCTAssertNotEqualObjects(array2, array3);
  850. [array1 release];
  851. [array1prime release];
  852. [array2 release];
  853. [array3 release];
  854. }
  855. - (void)testCopy {
  856. const uint32_t kValues[] = { 11U, 12U, 13U, 14U };
  857. GPBUInt32Array *array =
  858. [[GPBUInt32Array alloc] initWithValues:kValues
  859. count:GPBARRAYSIZE(kValues)];
  860. XCTAssertNotNil(array);
  861. GPBUInt32Array *array2 = [array copy];
  862. XCTAssertNotNil(array2);
  863. // Should be new object but equal.
  864. XCTAssertNotEqual(array, array2);
  865. XCTAssertEqualObjects(array, array2);
  866. [array2 release];
  867. [array release];
  868. }
  869. - (void)testArrayFromArray {
  870. const uint32_t kValues[] = { 11U, 12U, 13U, 14U };
  871. GPBUInt32Array *array =
  872. [[GPBUInt32Array alloc] initWithValues:kValues
  873. count:GPBARRAYSIZE(kValues)];
  874. XCTAssertNotNil(array);
  875. GPBUInt32Array *array2 = [GPBUInt32Array arrayWithValueArray:array];
  876. XCTAssertNotNil(array2);
  877. // Should be new pointer, but equal objects.
  878. XCTAssertNotEqual(array, array2);
  879. XCTAssertEqualObjects(array, array2);
  880. [array release];
  881. }
  882. - (void)testAdds {
  883. GPBUInt32Array *array = [GPBUInt32Array array];
  884. XCTAssertNotNil(array);
  885. XCTAssertEqual(array.count, 0U);
  886. [array addValue:11U];
  887. XCTAssertEqual(array.count, 1U);
  888. const uint32_t kValues1[] = { 12U, 13U };
  889. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  890. XCTAssertEqual(array.count, 3U);
  891. const uint32_t kValues2[] = { 14U, 11U };
  892. GPBUInt32Array *array2 =
  893. [[GPBUInt32Array alloc] initWithValues:kValues2
  894. count:GPBARRAYSIZE(kValues2)];
  895. XCTAssertNotNil(array2);
  896. [array addValuesFromArray:array2];
  897. XCTAssertEqual(array.count, 5U);
  898. // Zero/nil inputs do nothing.
  899. [array addValues:kValues1 count:0];
  900. XCTAssertEqual(array.count, 5U);
  901. [array addValues:NULL count:5];
  902. XCTAssertEqual(array.count, 5U);
  903. XCTAssertEqual([array valueAtIndex:0], 11U);
  904. XCTAssertEqual([array valueAtIndex:1], 12U);
  905. XCTAssertEqual([array valueAtIndex:2], 13U);
  906. XCTAssertEqual([array valueAtIndex:3], 14U);
  907. XCTAssertEqual([array valueAtIndex:4], 11U);
  908. [array2 release];
  909. }
  910. - (void)testInsert {
  911. const uint32_t kValues[] = { 11U, 12U, 13U };
  912. GPBUInt32Array *array =
  913. [[GPBUInt32Array alloc] initWithValues:kValues
  914. count:GPBARRAYSIZE(kValues)];
  915. XCTAssertNotNil(array);
  916. XCTAssertEqual(array.count, 3U);
  917. // First
  918. [array insertValue:14U atIndex:0];
  919. XCTAssertEqual(array.count, 4U);
  920. // Middle
  921. [array insertValue:14U atIndex:2];
  922. XCTAssertEqual(array.count, 5U);
  923. // End
  924. [array insertValue:14U atIndex:5];
  925. XCTAssertEqual(array.count, 6U);
  926. // Too far.
  927. XCTAssertThrowsSpecificNamed([array insertValue:14U atIndex:7],
  928. NSException, NSRangeException);
  929. XCTAssertEqual([array valueAtIndex:0], 14U);
  930. XCTAssertEqual([array valueAtIndex:1], 11U);
  931. XCTAssertEqual([array valueAtIndex:2], 14U);
  932. XCTAssertEqual([array valueAtIndex:3], 12U);
  933. XCTAssertEqual([array valueAtIndex:4], 13U);
  934. XCTAssertEqual([array valueAtIndex:5], 14U);
  935. [array release];
  936. }
  937. - (void)testRemove {
  938. const uint32_t kValues[] = { 14U, 11U, 12U, 14U, 13U, 14U };
  939. GPBUInt32Array *array =
  940. [[GPBUInt32Array alloc] initWithValues:kValues
  941. count:GPBARRAYSIZE(kValues)];
  942. XCTAssertNotNil(array);
  943. XCTAssertEqual(array.count, 6U);
  944. // First
  945. [array removeValueAtIndex:0];
  946. XCTAssertEqual(array.count, 5U);
  947. XCTAssertEqual([array valueAtIndex:0], 11U);
  948. // Middle
  949. [array removeValueAtIndex:2];
  950. XCTAssertEqual(array.count, 4U);
  951. XCTAssertEqual([array valueAtIndex:2], 13U);
  952. // End
  953. [array removeValueAtIndex:3];
  954. XCTAssertEqual(array.count, 3U);
  955. XCTAssertEqual([array valueAtIndex:0], 11U);
  956. XCTAssertEqual([array valueAtIndex:1], 12U);
  957. XCTAssertEqual([array valueAtIndex:2], 13U);
  958. // Too far.
  959. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  960. NSException, NSRangeException);
  961. [array removeAll];
  962. XCTAssertEqual(array.count, 0U);
  963. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  964. NSException, NSRangeException);
  965. [array release];
  966. }
  967. - (void)testInplaceMutation {
  968. const uint32_t kValues[] = { 11U, 11U, 13U, 13U };
  969. GPBUInt32Array *array =
  970. [[GPBUInt32Array alloc] initWithValues:kValues
  971. count:GPBARRAYSIZE(kValues)];
  972. XCTAssertNotNil(array);
  973. [array replaceValueAtIndex:1 withValue:12U];
  974. [array replaceValueAtIndex:3 withValue:14U];
  975. XCTAssertEqual(array.count, 4U);
  976. XCTAssertEqual([array valueAtIndex:0], 11U);
  977. XCTAssertEqual([array valueAtIndex:1], 12U);
  978. XCTAssertEqual([array valueAtIndex:2], 13U);
  979. XCTAssertEqual([array valueAtIndex:3], 14U);
  980. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:14U],
  981. NSException, NSRangeException);
  982. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  983. XCTAssertEqual(array.count, 4U);
  984. XCTAssertEqual([array valueAtIndex:0], 11U);
  985. XCTAssertEqual([array valueAtIndex:1], 14U);
  986. XCTAssertEqual([array valueAtIndex:2], 13U);
  987. XCTAssertEqual([array valueAtIndex:3], 12U);
  988. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  989. XCTAssertEqual(array.count, 4U);
  990. XCTAssertEqual([array valueAtIndex:0], 13U);
  991. XCTAssertEqual([array valueAtIndex:1], 14U);
  992. XCTAssertEqual([array valueAtIndex:2], 11U);
  993. XCTAssertEqual([array valueAtIndex:3], 12U);
  994. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  995. NSException, NSRangeException);
  996. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  997. NSException, NSRangeException);
  998. [array release];
  999. }
  1000. - (void)testInternalResizing {
  1001. const uint32_t kValues[] = { 11U, 12U, 13U, 14U };
  1002. GPBUInt32Array *array =
  1003. [GPBUInt32Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
  1004. XCTAssertNotNil(array);
  1005. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1006. // Add/remove to trigger the intneral buffer to grow/shrink.
  1007. for (int i = 0; i < 100; ++i) {
  1008. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1009. }
  1010. XCTAssertEqual(array.count, 404U);
  1011. for (int i = 0; i < 100; ++i) {
  1012. [array removeValueAtIndex:(i * 2)];
  1013. }
  1014. XCTAssertEqual(array.count, 304U);
  1015. for (int i = 0; i < 100; ++i) {
  1016. [array insertValue:14U atIndex:(i * 3)];
  1017. }
  1018. XCTAssertEqual(array.count, 404U);
  1019. [array removeAll];
  1020. XCTAssertEqual(array.count, 0U);
  1021. }
  1022. @end
  1023. //%PDDM-EXPAND ARRAY_TESTS(Int64, int64_t, 31LL, 32LL, 33LL, 34LL)
  1024. // This block of code is generated, do not edit it directly.
  1025. #pragma mark - Int64
  1026. @interface GPBInt64ArrayTests : XCTestCase
  1027. @end
  1028. @implementation GPBInt64ArrayTests
  1029. - (void)testEmpty {
  1030. GPBInt64Array *array = [[GPBInt64Array alloc] init];
  1031. XCTAssertNotNil(array);
  1032. XCTAssertEqual(array.count, 0U);
  1033. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  1034. [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1035. #pragma unused(value, idx, stop)
  1036. XCTFail(@"Shouldn't get here!");
  1037. }];
  1038. [array enumerateValuesWithOptions:NSEnumerationReverse
  1039. usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1040. #pragma unused(value, idx, stop)
  1041. XCTFail(@"Shouldn't get here!");
  1042. }];
  1043. [array release];
  1044. }
  1045. - (void)testOne {
  1046. GPBInt64Array *array = [GPBInt64Array arrayWithValue:31LL];
  1047. XCTAssertNotNil(array);
  1048. XCTAssertEqual(array.count, 1U);
  1049. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1050. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  1051. [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1052. XCTAssertEqual(idx, 0U);
  1053. XCTAssertEqual(value, 31LL);
  1054. XCTAssertNotEqual(stop, NULL);
  1055. }];
  1056. [array enumerateValuesWithOptions:NSEnumerationReverse
  1057. usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1058. XCTAssertEqual(idx, 0U);
  1059. XCTAssertEqual(value, 31LL);
  1060. XCTAssertNotEqual(stop, NULL);
  1061. }];
  1062. }
  1063. - (void)testBasics {
  1064. static const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL };
  1065. GPBInt64Array *array =
  1066. [[GPBInt64Array alloc] initWithValues:kValues
  1067. count:GPBARRAYSIZE(kValues)];
  1068. XCTAssertNotNil(array);
  1069. XCTAssertEqual(array.count, 4U);
  1070. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1071. XCTAssertEqual([array valueAtIndex:1], 32LL);
  1072. XCTAssertEqual([array valueAtIndex:2], 33LL);
  1073. XCTAssertEqual([array valueAtIndex:3], 34LL);
  1074. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  1075. __block NSUInteger idx2 = 0;
  1076. [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1077. XCTAssertEqual(idx, idx2);
  1078. XCTAssertEqual(value, kValues[idx]);
  1079. XCTAssertNotEqual(stop, NULL);
  1080. ++idx2;
  1081. }];
  1082. idx2 = 0;
  1083. [array enumerateValuesWithOptions:NSEnumerationReverse
  1084. usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1085. XCTAssertEqual(idx, (3 - idx2));
  1086. XCTAssertEqual(value, kValues[idx]);
  1087. XCTAssertNotEqual(stop, NULL);
  1088. ++idx2;
  1089. }];
  1090. // Stopping the enumeration.
  1091. idx2 = 0;
  1092. [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1093. XCTAssertEqual(idx, idx2);
  1094. XCTAssertEqual(value, kValues[idx]);
  1095. XCTAssertNotEqual(stop, NULL);
  1096. if (idx2 == 1) *stop = YES;
  1097. XCTAssertNotEqual(idx, 2U);
  1098. XCTAssertNotEqual(idx, 3U);
  1099. ++idx2;
  1100. }];
  1101. idx2 = 0;
  1102. [array enumerateValuesWithOptions:NSEnumerationReverse
  1103. usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
  1104. XCTAssertEqual(idx, (3 - idx2));
  1105. XCTAssertEqual(value, kValues[idx]);
  1106. XCTAssertNotEqual(stop, NULL);
  1107. if (idx2 == 1) *stop = YES;
  1108. XCTAssertNotEqual(idx, 1U);
  1109. XCTAssertNotEqual(idx, 0U);
  1110. ++idx2;
  1111. }];
  1112. // Ensure description doesn't choke.
  1113. XCTAssertTrue(array.description.length > 10);
  1114. [array release];
  1115. }
  1116. - (void)testEquality {
  1117. const int64_t kValues1[] = { 31LL, 32LL, 33LL };
  1118. const int64_t kValues2[] = { 31LL, 34LL, 33LL };
  1119. const int64_t kValues3[] = { 31LL, 32LL, 33LL, 34LL };
  1120. GPBInt64Array *array1 =
  1121. [[GPBInt64Array alloc] initWithValues:kValues1
  1122. count:GPBARRAYSIZE(kValues1)];
  1123. XCTAssertNotNil(array1);
  1124. GPBInt64Array *array1prime =
  1125. [[GPBInt64Array alloc] initWithValues:kValues1
  1126. count:GPBARRAYSIZE(kValues1)];
  1127. XCTAssertNotNil(array1prime);
  1128. GPBInt64Array *array2 =
  1129. [[GPBInt64Array alloc] initWithValues:kValues2
  1130. count:GPBARRAYSIZE(kValues2)];
  1131. XCTAssertNotNil(array2);
  1132. GPBInt64Array *array3 =
  1133. [[GPBInt64Array alloc] initWithValues:kValues3
  1134. count:GPBARRAYSIZE(kValues3)];
  1135. XCTAssertNotNil(array3);
  1136. // Identity
  1137. XCTAssertTrue([array1 isEqual:array1]);
  1138. // Wrong type doesn't blow up.
  1139. XCTAssertFalse([array1 isEqual:@"bogus"]);
  1140. // 1/1Prime should be different objects, but equal.
  1141. XCTAssertNotEqual(array1, array1prime);
  1142. XCTAssertEqualObjects(array1, array1prime);
  1143. // Equal, so they must have same hash.
  1144. XCTAssertEqual([array1 hash], [array1prime hash]);
  1145. // 1/2/3 shouldn't be equal.
  1146. XCTAssertNotEqualObjects(array1, array2);
  1147. XCTAssertNotEqualObjects(array1, array3);
  1148. XCTAssertNotEqualObjects(array2, array3);
  1149. [array1 release];
  1150. [array1prime release];
  1151. [array2 release];
  1152. [array3 release];
  1153. }
  1154. - (void)testCopy {
  1155. const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL };
  1156. GPBInt64Array *array =
  1157. [[GPBInt64Array alloc] initWithValues:kValues
  1158. count:GPBARRAYSIZE(kValues)];
  1159. XCTAssertNotNil(array);
  1160. GPBInt64Array *array2 = [array copy];
  1161. XCTAssertNotNil(array2);
  1162. // Should be new object but equal.
  1163. XCTAssertNotEqual(array, array2);
  1164. XCTAssertEqualObjects(array, array2);
  1165. [array2 release];
  1166. [array release];
  1167. }
  1168. - (void)testArrayFromArray {
  1169. const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL };
  1170. GPBInt64Array *array =
  1171. [[GPBInt64Array alloc] initWithValues:kValues
  1172. count:GPBARRAYSIZE(kValues)];
  1173. XCTAssertNotNil(array);
  1174. GPBInt64Array *array2 = [GPBInt64Array arrayWithValueArray:array];
  1175. XCTAssertNotNil(array2);
  1176. // Should be new pointer, but equal objects.
  1177. XCTAssertNotEqual(array, array2);
  1178. XCTAssertEqualObjects(array, array2);
  1179. [array release];
  1180. }
  1181. - (void)testAdds {
  1182. GPBInt64Array *array = [GPBInt64Array array];
  1183. XCTAssertNotNil(array);
  1184. XCTAssertEqual(array.count, 0U);
  1185. [array addValue:31LL];
  1186. XCTAssertEqual(array.count, 1U);
  1187. const int64_t kValues1[] = { 32LL, 33LL };
  1188. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  1189. XCTAssertEqual(array.count, 3U);
  1190. const int64_t kValues2[] = { 34LL, 31LL };
  1191. GPBInt64Array *array2 =
  1192. [[GPBInt64Array alloc] initWithValues:kValues2
  1193. count:GPBARRAYSIZE(kValues2)];
  1194. XCTAssertNotNil(array2);
  1195. [array addValuesFromArray:array2];
  1196. XCTAssertEqual(array.count, 5U);
  1197. // Zero/nil inputs do nothing.
  1198. [array addValues:kValues1 count:0];
  1199. XCTAssertEqual(array.count, 5U);
  1200. [array addValues:NULL count:5];
  1201. XCTAssertEqual(array.count, 5U);
  1202. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1203. XCTAssertEqual([array valueAtIndex:1], 32LL);
  1204. XCTAssertEqual([array valueAtIndex:2], 33LL);
  1205. XCTAssertEqual([array valueAtIndex:3], 34LL);
  1206. XCTAssertEqual([array valueAtIndex:4], 31LL);
  1207. [array2 release];
  1208. }
  1209. - (void)testInsert {
  1210. const int64_t kValues[] = { 31LL, 32LL, 33LL };
  1211. GPBInt64Array *array =
  1212. [[GPBInt64Array alloc] initWithValues:kValues
  1213. count:GPBARRAYSIZE(kValues)];
  1214. XCTAssertNotNil(array);
  1215. XCTAssertEqual(array.count, 3U);
  1216. // First
  1217. [array insertValue:34LL atIndex:0];
  1218. XCTAssertEqual(array.count, 4U);
  1219. // Middle
  1220. [array insertValue:34LL atIndex:2];
  1221. XCTAssertEqual(array.count, 5U);
  1222. // End
  1223. [array insertValue:34LL atIndex:5];
  1224. XCTAssertEqual(array.count, 6U);
  1225. // Too far.
  1226. XCTAssertThrowsSpecificNamed([array insertValue:34LL atIndex:7],
  1227. NSException, NSRangeException);
  1228. XCTAssertEqual([array valueAtIndex:0], 34LL);
  1229. XCTAssertEqual([array valueAtIndex:1], 31LL);
  1230. XCTAssertEqual([array valueAtIndex:2], 34LL);
  1231. XCTAssertEqual([array valueAtIndex:3], 32LL);
  1232. XCTAssertEqual([array valueAtIndex:4], 33LL);
  1233. XCTAssertEqual([array valueAtIndex:5], 34LL);
  1234. [array release];
  1235. }
  1236. - (void)testRemove {
  1237. const int64_t kValues[] = { 34LL, 31LL, 32LL, 34LL, 33LL, 34LL };
  1238. GPBInt64Array *array =
  1239. [[GPBInt64Array alloc] initWithValues:kValues
  1240. count:GPBARRAYSIZE(kValues)];
  1241. XCTAssertNotNil(array);
  1242. XCTAssertEqual(array.count, 6U);
  1243. // First
  1244. [array removeValueAtIndex:0];
  1245. XCTAssertEqual(array.count, 5U);
  1246. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1247. // Middle
  1248. [array removeValueAtIndex:2];
  1249. XCTAssertEqual(array.count, 4U);
  1250. XCTAssertEqual([array valueAtIndex:2], 33LL);
  1251. // End
  1252. [array removeValueAtIndex:3];
  1253. XCTAssertEqual(array.count, 3U);
  1254. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1255. XCTAssertEqual([array valueAtIndex:1], 32LL);
  1256. XCTAssertEqual([array valueAtIndex:2], 33LL);
  1257. // Too far.
  1258. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  1259. NSException, NSRangeException);
  1260. [array removeAll];
  1261. XCTAssertEqual(array.count, 0U);
  1262. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  1263. NSException, NSRangeException);
  1264. [array release];
  1265. }
  1266. - (void)testInplaceMutation {
  1267. const int64_t kValues[] = { 31LL, 31LL, 33LL, 33LL };
  1268. GPBInt64Array *array =
  1269. [[GPBInt64Array alloc] initWithValues:kValues
  1270. count:GPBARRAYSIZE(kValues)];
  1271. XCTAssertNotNil(array);
  1272. [array replaceValueAtIndex:1 withValue:32LL];
  1273. [array replaceValueAtIndex:3 withValue:34LL];
  1274. XCTAssertEqual(array.count, 4U);
  1275. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1276. XCTAssertEqual([array valueAtIndex:1], 32LL);
  1277. XCTAssertEqual([array valueAtIndex:2], 33LL);
  1278. XCTAssertEqual([array valueAtIndex:3], 34LL);
  1279. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:34LL],
  1280. NSException, NSRangeException);
  1281. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  1282. XCTAssertEqual(array.count, 4U);
  1283. XCTAssertEqual([array valueAtIndex:0], 31LL);
  1284. XCTAssertEqual([array valueAtIndex:1], 34LL);
  1285. XCTAssertEqual([array valueAtIndex:2], 33LL);
  1286. XCTAssertEqual([array valueAtIndex:3], 32LL);
  1287. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  1288. XCTAssertEqual(array.count, 4U);
  1289. XCTAssertEqual([array valueAtIndex:0], 33LL);
  1290. XCTAssertEqual([array valueAtIndex:1], 34LL);
  1291. XCTAssertEqual([array valueAtIndex:2], 31LL);
  1292. XCTAssertEqual([array valueAtIndex:3], 32LL);
  1293. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  1294. NSException, NSRangeException);
  1295. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  1296. NSException, NSRangeException);
  1297. [array release];
  1298. }
  1299. - (void)testInternalResizing {
  1300. const int64_t kValues[] = { 31LL, 32LL, 33LL, 34LL };
  1301. GPBInt64Array *array =
  1302. [GPBInt64Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
  1303. XCTAssertNotNil(array);
  1304. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1305. // Add/remove to trigger the intneral buffer to grow/shrink.
  1306. for (int i = 0; i < 100; ++i) {
  1307. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1308. }
  1309. XCTAssertEqual(array.count, 404U);
  1310. for (int i = 0; i < 100; ++i) {
  1311. [array removeValueAtIndex:(i * 2)];
  1312. }
  1313. XCTAssertEqual(array.count, 304U);
  1314. for (int i = 0; i < 100; ++i) {
  1315. [array insertValue:34LL atIndex:(i * 3)];
  1316. }
  1317. XCTAssertEqual(array.count, 404U);
  1318. [array removeAll];
  1319. XCTAssertEqual(array.count, 0U);
  1320. }
  1321. @end
  1322. //%PDDM-EXPAND ARRAY_TESTS(UInt64, uint64_t, 41ULL, 42ULL, 43ULL, 44ULL)
  1323. // This block of code is generated, do not edit it directly.
  1324. #pragma mark - UInt64
  1325. @interface GPBUInt64ArrayTests : XCTestCase
  1326. @end
  1327. @implementation GPBUInt64ArrayTests
  1328. - (void)testEmpty {
  1329. GPBUInt64Array *array = [[GPBUInt64Array alloc] init];
  1330. XCTAssertNotNil(array);
  1331. XCTAssertEqual(array.count, 0U);
  1332. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  1333. [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1334. #pragma unused(value, idx, stop)
  1335. XCTFail(@"Shouldn't get here!");
  1336. }];
  1337. [array enumerateValuesWithOptions:NSEnumerationReverse
  1338. usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1339. #pragma unused(value, idx, stop)
  1340. XCTFail(@"Shouldn't get here!");
  1341. }];
  1342. [array release];
  1343. }
  1344. - (void)testOne {
  1345. GPBUInt64Array *array = [GPBUInt64Array arrayWithValue:41ULL];
  1346. XCTAssertNotNil(array);
  1347. XCTAssertEqual(array.count, 1U);
  1348. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1349. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  1350. [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1351. XCTAssertEqual(idx, 0U);
  1352. XCTAssertEqual(value, 41ULL);
  1353. XCTAssertNotEqual(stop, NULL);
  1354. }];
  1355. [array enumerateValuesWithOptions:NSEnumerationReverse
  1356. usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1357. XCTAssertEqual(idx, 0U);
  1358. XCTAssertEqual(value, 41ULL);
  1359. XCTAssertNotEqual(stop, NULL);
  1360. }];
  1361. }
  1362. - (void)testBasics {
  1363. static const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL };
  1364. GPBUInt64Array *array =
  1365. [[GPBUInt64Array alloc] initWithValues:kValues
  1366. count:GPBARRAYSIZE(kValues)];
  1367. XCTAssertNotNil(array);
  1368. XCTAssertEqual(array.count, 4U);
  1369. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1370. XCTAssertEqual([array valueAtIndex:1], 42ULL);
  1371. XCTAssertEqual([array valueAtIndex:2], 43ULL);
  1372. XCTAssertEqual([array valueAtIndex:3], 44ULL);
  1373. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  1374. __block NSUInteger idx2 = 0;
  1375. [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1376. XCTAssertEqual(idx, idx2);
  1377. XCTAssertEqual(value, kValues[idx]);
  1378. XCTAssertNotEqual(stop, NULL);
  1379. ++idx2;
  1380. }];
  1381. idx2 = 0;
  1382. [array enumerateValuesWithOptions:NSEnumerationReverse
  1383. usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1384. XCTAssertEqual(idx, (3 - idx2));
  1385. XCTAssertEqual(value, kValues[idx]);
  1386. XCTAssertNotEqual(stop, NULL);
  1387. ++idx2;
  1388. }];
  1389. // Stopping the enumeration.
  1390. idx2 = 0;
  1391. [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1392. XCTAssertEqual(idx, idx2);
  1393. XCTAssertEqual(value, kValues[idx]);
  1394. XCTAssertNotEqual(stop, NULL);
  1395. if (idx2 == 1) *stop = YES;
  1396. XCTAssertNotEqual(idx, 2U);
  1397. XCTAssertNotEqual(idx, 3U);
  1398. ++idx2;
  1399. }];
  1400. idx2 = 0;
  1401. [array enumerateValuesWithOptions:NSEnumerationReverse
  1402. usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
  1403. XCTAssertEqual(idx, (3 - idx2));
  1404. XCTAssertEqual(value, kValues[idx]);
  1405. XCTAssertNotEqual(stop, NULL);
  1406. if (idx2 == 1) *stop = YES;
  1407. XCTAssertNotEqual(idx, 1U);
  1408. XCTAssertNotEqual(idx, 0U);
  1409. ++idx2;
  1410. }];
  1411. // Ensure description doesn't choke.
  1412. XCTAssertTrue(array.description.length > 10);
  1413. [array release];
  1414. }
  1415. - (void)testEquality {
  1416. const uint64_t kValues1[] = { 41ULL, 42ULL, 43ULL };
  1417. const uint64_t kValues2[] = { 41ULL, 44ULL, 43ULL };
  1418. const uint64_t kValues3[] = { 41ULL, 42ULL, 43ULL, 44ULL };
  1419. GPBUInt64Array *array1 =
  1420. [[GPBUInt64Array alloc] initWithValues:kValues1
  1421. count:GPBARRAYSIZE(kValues1)];
  1422. XCTAssertNotNil(array1);
  1423. GPBUInt64Array *array1prime =
  1424. [[GPBUInt64Array alloc] initWithValues:kValues1
  1425. count:GPBARRAYSIZE(kValues1)];
  1426. XCTAssertNotNil(array1prime);
  1427. GPBUInt64Array *array2 =
  1428. [[GPBUInt64Array alloc] initWithValues:kValues2
  1429. count:GPBARRAYSIZE(kValues2)];
  1430. XCTAssertNotNil(array2);
  1431. GPBUInt64Array *array3 =
  1432. [[GPBUInt64Array alloc] initWithValues:kValues3
  1433. count:GPBARRAYSIZE(kValues3)];
  1434. XCTAssertNotNil(array3);
  1435. // Identity
  1436. XCTAssertTrue([array1 isEqual:array1]);
  1437. // Wrong type doesn't blow up.
  1438. XCTAssertFalse([array1 isEqual:@"bogus"]);
  1439. // 1/1Prime should be different objects, but equal.
  1440. XCTAssertNotEqual(array1, array1prime);
  1441. XCTAssertEqualObjects(array1, array1prime);
  1442. // Equal, so they must have same hash.
  1443. XCTAssertEqual([array1 hash], [array1prime hash]);
  1444. // 1/2/3 shouldn't be equal.
  1445. XCTAssertNotEqualObjects(array1, array2);
  1446. XCTAssertNotEqualObjects(array1, array3);
  1447. XCTAssertNotEqualObjects(array2, array3);
  1448. [array1 release];
  1449. [array1prime release];
  1450. [array2 release];
  1451. [array3 release];
  1452. }
  1453. - (void)testCopy {
  1454. const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL };
  1455. GPBUInt64Array *array =
  1456. [[GPBUInt64Array alloc] initWithValues:kValues
  1457. count:GPBARRAYSIZE(kValues)];
  1458. XCTAssertNotNil(array);
  1459. GPBUInt64Array *array2 = [array copy];
  1460. XCTAssertNotNil(array2);
  1461. // Should be new object but equal.
  1462. XCTAssertNotEqual(array, array2);
  1463. XCTAssertEqualObjects(array, array2);
  1464. [array2 release];
  1465. [array release];
  1466. }
  1467. - (void)testArrayFromArray {
  1468. const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL };
  1469. GPBUInt64Array *array =
  1470. [[GPBUInt64Array alloc] initWithValues:kValues
  1471. count:GPBARRAYSIZE(kValues)];
  1472. XCTAssertNotNil(array);
  1473. GPBUInt64Array *array2 = [GPBUInt64Array arrayWithValueArray:array];
  1474. XCTAssertNotNil(array2);
  1475. // Should be new pointer, but equal objects.
  1476. XCTAssertNotEqual(array, array2);
  1477. XCTAssertEqualObjects(array, array2);
  1478. [array release];
  1479. }
  1480. - (void)testAdds {
  1481. GPBUInt64Array *array = [GPBUInt64Array array];
  1482. XCTAssertNotNil(array);
  1483. XCTAssertEqual(array.count, 0U);
  1484. [array addValue:41ULL];
  1485. XCTAssertEqual(array.count, 1U);
  1486. const uint64_t kValues1[] = { 42ULL, 43ULL };
  1487. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  1488. XCTAssertEqual(array.count, 3U);
  1489. const uint64_t kValues2[] = { 44ULL, 41ULL };
  1490. GPBUInt64Array *array2 =
  1491. [[GPBUInt64Array alloc] initWithValues:kValues2
  1492. count:GPBARRAYSIZE(kValues2)];
  1493. XCTAssertNotNil(array2);
  1494. [array addValuesFromArray:array2];
  1495. XCTAssertEqual(array.count, 5U);
  1496. // Zero/nil inputs do nothing.
  1497. [array addValues:kValues1 count:0];
  1498. XCTAssertEqual(array.count, 5U);
  1499. [array addValues:NULL count:5];
  1500. XCTAssertEqual(array.count, 5U);
  1501. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1502. XCTAssertEqual([array valueAtIndex:1], 42ULL);
  1503. XCTAssertEqual([array valueAtIndex:2], 43ULL);
  1504. XCTAssertEqual([array valueAtIndex:3], 44ULL);
  1505. XCTAssertEqual([array valueAtIndex:4], 41ULL);
  1506. [array2 release];
  1507. }
  1508. - (void)testInsert {
  1509. const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL };
  1510. GPBUInt64Array *array =
  1511. [[GPBUInt64Array alloc] initWithValues:kValues
  1512. count:GPBARRAYSIZE(kValues)];
  1513. XCTAssertNotNil(array);
  1514. XCTAssertEqual(array.count, 3U);
  1515. // First
  1516. [array insertValue:44ULL atIndex:0];
  1517. XCTAssertEqual(array.count, 4U);
  1518. // Middle
  1519. [array insertValue:44ULL atIndex:2];
  1520. XCTAssertEqual(array.count, 5U);
  1521. // End
  1522. [array insertValue:44ULL atIndex:5];
  1523. XCTAssertEqual(array.count, 6U);
  1524. // Too far.
  1525. XCTAssertThrowsSpecificNamed([array insertValue:44ULL atIndex:7],
  1526. NSException, NSRangeException);
  1527. XCTAssertEqual([array valueAtIndex:0], 44ULL);
  1528. XCTAssertEqual([array valueAtIndex:1], 41ULL);
  1529. XCTAssertEqual([array valueAtIndex:2], 44ULL);
  1530. XCTAssertEqual([array valueAtIndex:3], 42ULL);
  1531. XCTAssertEqual([array valueAtIndex:4], 43ULL);
  1532. XCTAssertEqual([array valueAtIndex:5], 44ULL);
  1533. [array release];
  1534. }
  1535. - (void)testRemove {
  1536. const uint64_t kValues[] = { 44ULL, 41ULL, 42ULL, 44ULL, 43ULL, 44ULL };
  1537. GPBUInt64Array *array =
  1538. [[GPBUInt64Array alloc] initWithValues:kValues
  1539. count:GPBARRAYSIZE(kValues)];
  1540. XCTAssertNotNil(array);
  1541. XCTAssertEqual(array.count, 6U);
  1542. // First
  1543. [array removeValueAtIndex:0];
  1544. XCTAssertEqual(array.count, 5U);
  1545. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1546. // Middle
  1547. [array removeValueAtIndex:2];
  1548. XCTAssertEqual(array.count, 4U);
  1549. XCTAssertEqual([array valueAtIndex:2], 43ULL);
  1550. // End
  1551. [array removeValueAtIndex:3];
  1552. XCTAssertEqual(array.count, 3U);
  1553. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1554. XCTAssertEqual([array valueAtIndex:1], 42ULL);
  1555. XCTAssertEqual([array valueAtIndex:2], 43ULL);
  1556. // Too far.
  1557. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  1558. NSException, NSRangeException);
  1559. [array removeAll];
  1560. XCTAssertEqual(array.count, 0U);
  1561. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  1562. NSException, NSRangeException);
  1563. [array release];
  1564. }
  1565. - (void)testInplaceMutation {
  1566. const uint64_t kValues[] = { 41ULL, 41ULL, 43ULL, 43ULL };
  1567. GPBUInt64Array *array =
  1568. [[GPBUInt64Array alloc] initWithValues:kValues
  1569. count:GPBARRAYSIZE(kValues)];
  1570. XCTAssertNotNil(array);
  1571. [array replaceValueAtIndex:1 withValue:42ULL];
  1572. [array replaceValueAtIndex:3 withValue:44ULL];
  1573. XCTAssertEqual(array.count, 4U);
  1574. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1575. XCTAssertEqual([array valueAtIndex:1], 42ULL);
  1576. XCTAssertEqual([array valueAtIndex:2], 43ULL);
  1577. XCTAssertEqual([array valueAtIndex:3], 44ULL);
  1578. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:44ULL],
  1579. NSException, NSRangeException);
  1580. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  1581. XCTAssertEqual(array.count, 4U);
  1582. XCTAssertEqual([array valueAtIndex:0], 41ULL);
  1583. XCTAssertEqual([array valueAtIndex:1], 44ULL);
  1584. XCTAssertEqual([array valueAtIndex:2], 43ULL);
  1585. XCTAssertEqual([array valueAtIndex:3], 42ULL);
  1586. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  1587. XCTAssertEqual(array.count, 4U);
  1588. XCTAssertEqual([array valueAtIndex:0], 43ULL);
  1589. XCTAssertEqual([array valueAtIndex:1], 44ULL);
  1590. XCTAssertEqual([array valueAtIndex:2], 41ULL);
  1591. XCTAssertEqual([array valueAtIndex:3], 42ULL);
  1592. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  1593. NSException, NSRangeException);
  1594. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  1595. NSException, NSRangeException);
  1596. [array release];
  1597. }
  1598. - (void)testInternalResizing {
  1599. const uint64_t kValues[] = { 41ULL, 42ULL, 43ULL, 44ULL };
  1600. GPBUInt64Array *array =
  1601. [GPBUInt64Array arrayWithCapacity:GPBARRAYSIZE(kValues)];
  1602. XCTAssertNotNil(array);
  1603. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1604. // Add/remove to trigger the intneral buffer to grow/shrink.
  1605. for (int i = 0; i < 100; ++i) {
  1606. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1607. }
  1608. XCTAssertEqual(array.count, 404U);
  1609. for (int i = 0; i < 100; ++i) {
  1610. [array removeValueAtIndex:(i * 2)];
  1611. }
  1612. XCTAssertEqual(array.count, 304U);
  1613. for (int i = 0; i < 100; ++i) {
  1614. [array insertValue:44ULL atIndex:(i * 3)];
  1615. }
  1616. XCTAssertEqual(array.count, 404U);
  1617. [array removeAll];
  1618. XCTAssertEqual(array.count, 0U);
  1619. }
  1620. @end
  1621. //%PDDM-EXPAND ARRAY_TESTS(Float, float, 51.f, 52.f, 53.f, 54.f)
  1622. // This block of code is generated, do not edit it directly.
  1623. #pragma mark - Float
  1624. @interface GPBFloatArrayTests : XCTestCase
  1625. @end
  1626. @implementation GPBFloatArrayTests
  1627. - (void)testEmpty {
  1628. GPBFloatArray *array = [[GPBFloatArray alloc] init];
  1629. XCTAssertNotNil(array);
  1630. XCTAssertEqual(array.count, 0U);
  1631. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  1632. [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1633. #pragma unused(value, idx, stop)
  1634. XCTFail(@"Shouldn't get here!");
  1635. }];
  1636. [array enumerateValuesWithOptions:NSEnumerationReverse
  1637. usingBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1638. #pragma unused(value, idx, stop)
  1639. XCTFail(@"Shouldn't get here!");
  1640. }];
  1641. [array release];
  1642. }
  1643. - (void)testOne {
  1644. GPBFloatArray *array = [GPBFloatArray arrayWithValue:51.f];
  1645. XCTAssertNotNil(array);
  1646. XCTAssertEqual(array.count, 1U);
  1647. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1648. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  1649. [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1650. XCTAssertEqual(idx, 0U);
  1651. XCTAssertEqual(value, 51.f);
  1652. XCTAssertNotEqual(stop, NULL);
  1653. }];
  1654. [array enumerateValuesWithOptions:NSEnumerationReverse
  1655. usingBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1656. XCTAssertEqual(idx, 0U);
  1657. XCTAssertEqual(value, 51.f);
  1658. XCTAssertNotEqual(stop, NULL);
  1659. }];
  1660. }
  1661. - (void)testBasics {
  1662. static const float kValues[] = { 51.f, 52.f, 53.f, 54.f };
  1663. GPBFloatArray *array =
  1664. [[GPBFloatArray alloc] initWithValues:kValues
  1665. count:GPBARRAYSIZE(kValues)];
  1666. XCTAssertNotNil(array);
  1667. XCTAssertEqual(array.count, 4U);
  1668. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1669. XCTAssertEqual([array valueAtIndex:1], 52.f);
  1670. XCTAssertEqual([array valueAtIndex:2], 53.f);
  1671. XCTAssertEqual([array valueAtIndex:3], 54.f);
  1672. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  1673. __block NSUInteger idx2 = 0;
  1674. [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1675. XCTAssertEqual(idx, idx2);
  1676. XCTAssertEqual(value, kValues[idx]);
  1677. XCTAssertNotEqual(stop, NULL);
  1678. ++idx2;
  1679. }];
  1680. idx2 = 0;
  1681. [array enumerateValuesWithOptions:NSEnumerationReverse
  1682. usingBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1683. XCTAssertEqual(idx, (3 - idx2));
  1684. XCTAssertEqual(value, kValues[idx]);
  1685. XCTAssertNotEqual(stop, NULL);
  1686. ++idx2;
  1687. }];
  1688. // Stopping the enumeration.
  1689. idx2 = 0;
  1690. [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1691. XCTAssertEqual(idx, idx2);
  1692. XCTAssertEqual(value, kValues[idx]);
  1693. XCTAssertNotEqual(stop, NULL);
  1694. if (idx2 == 1) *stop = YES;
  1695. XCTAssertNotEqual(idx, 2U);
  1696. XCTAssertNotEqual(idx, 3U);
  1697. ++idx2;
  1698. }];
  1699. idx2 = 0;
  1700. [array enumerateValuesWithOptions:NSEnumerationReverse
  1701. usingBlock:^(float value, NSUInteger idx, BOOL *stop) {
  1702. XCTAssertEqual(idx, (3 - idx2));
  1703. XCTAssertEqual(value, kValues[idx]);
  1704. XCTAssertNotEqual(stop, NULL);
  1705. if (idx2 == 1) *stop = YES;
  1706. XCTAssertNotEqual(idx, 1U);
  1707. XCTAssertNotEqual(idx, 0U);
  1708. ++idx2;
  1709. }];
  1710. // Ensure description doesn't choke.
  1711. XCTAssertTrue(array.description.length > 10);
  1712. [array release];
  1713. }
  1714. - (void)testEquality {
  1715. const float kValues1[] = { 51.f, 52.f, 53.f };
  1716. const float kValues2[] = { 51.f, 54.f, 53.f };
  1717. const float kValues3[] = { 51.f, 52.f, 53.f, 54.f };
  1718. GPBFloatArray *array1 =
  1719. [[GPBFloatArray alloc] initWithValues:kValues1
  1720. count:GPBARRAYSIZE(kValues1)];
  1721. XCTAssertNotNil(array1);
  1722. GPBFloatArray *array1prime =
  1723. [[GPBFloatArray alloc] initWithValues:kValues1
  1724. count:GPBARRAYSIZE(kValues1)];
  1725. XCTAssertNotNil(array1prime);
  1726. GPBFloatArray *array2 =
  1727. [[GPBFloatArray alloc] initWithValues:kValues2
  1728. count:GPBARRAYSIZE(kValues2)];
  1729. XCTAssertNotNil(array2);
  1730. GPBFloatArray *array3 =
  1731. [[GPBFloatArray alloc] initWithValues:kValues3
  1732. count:GPBARRAYSIZE(kValues3)];
  1733. XCTAssertNotNil(array3);
  1734. // Identity
  1735. XCTAssertTrue([array1 isEqual:array1]);
  1736. // Wrong type doesn't blow up.
  1737. XCTAssertFalse([array1 isEqual:@"bogus"]);
  1738. // 1/1Prime should be different objects, but equal.
  1739. XCTAssertNotEqual(array1, array1prime);
  1740. XCTAssertEqualObjects(array1, array1prime);
  1741. // Equal, so they must have same hash.
  1742. XCTAssertEqual([array1 hash], [array1prime hash]);
  1743. // 1/2/3 shouldn't be equal.
  1744. XCTAssertNotEqualObjects(array1, array2);
  1745. XCTAssertNotEqualObjects(array1, array3);
  1746. XCTAssertNotEqualObjects(array2, array3);
  1747. [array1 release];
  1748. [array1prime release];
  1749. [array2 release];
  1750. [array3 release];
  1751. }
  1752. - (void)testCopy {
  1753. const float kValues[] = { 51.f, 52.f, 53.f, 54.f };
  1754. GPBFloatArray *array =
  1755. [[GPBFloatArray alloc] initWithValues:kValues
  1756. count:GPBARRAYSIZE(kValues)];
  1757. XCTAssertNotNil(array);
  1758. GPBFloatArray *array2 = [array copy];
  1759. XCTAssertNotNil(array2);
  1760. // Should be new object but equal.
  1761. XCTAssertNotEqual(array, array2);
  1762. XCTAssertEqualObjects(array, array2);
  1763. [array2 release];
  1764. [array release];
  1765. }
  1766. - (void)testArrayFromArray {
  1767. const float kValues[] = { 51.f, 52.f, 53.f, 54.f };
  1768. GPBFloatArray *array =
  1769. [[GPBFloatArray alloc] initWithValues:kValues
  1770. count:GPBARRAYSIZE(kValues)];
  1771. XCTAssertNotNil(array);
  1772. GPBFloatArray *array2 = [GPBFloatArray arrayWithValueArray:array];
  1773. XCTAssertNotNil(array2);
  1774. // Should be new pointer, but equal objects.
  1775. XCTAssertNotEqual(array, array2);
  1776. XCTAssertEqualObjects(array, array2);
  1777. [array release];
  1778. }
  1779. - (void)testAdds {
  1780. GPBFloatArray *array = [GPBFloatArray array];
  1781. XCTAssertNotNil(array);
  1782. XCTAssertEqual(array.count, 0U);
  1783. [array addValue:51.f];
  1784. XCTAssertEqual(array.count, 1U);
  1785. const float kValues1[] = { 52.f, 53.f };
  1786. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  1787. XCTAssertEqual(array.count, 3U);
  1788. const float kValues2[] = { 54.f, 51.f };
  1789. GPBFloatArray *array2 =
  1790. [[GPBFloatArray alloc] initWithValues:kValues2
  1791. count:GPBARRAYSIZE(kValues2)];
  1792. XCTAssertNotNil(array2);
  1793. [array addValuesFromArray:array2];
  1794. XCTAssertEqual(array.count, 5U);
  1795. // Zero/nil inputs do nothing.
  1796. [array addValues:kValues1 count:0];
  1797. XCTAssertEqual(array.count, 5U);
  1798. [array addValues:NULL count:5];
  1799. XCTAssertEqual(array.count, 5U);
  1800. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1801. XCTAssertEqual([array valueAtIndex:1], 52.f);
  1802. XCTAssertEqual([array valueAtIndex:2], 53.f);
  1803. XCTAssertEqual([array valueAtIndex:3], 54.f);
  1804. XCTAssertEqual([array valueAtIndex:4], 51.f);
  1805. [array2 release];
  1806. }
  1807. - (void)testInsert {
  1808. const float kValues[] = { 51.f, 52.f, 53.f };
  1809. GPBFloatArray *array =
  1810. [[GPBFloatArray alloc] initWithValues:kValues
  1811. count:GPBARRAYSIZE(kValues)];
  1812. XCTAssertNotNil(array);
  1813. XCTAssertEqual(array.count, 3U);
  1814. // First
  1815. [array insertValue:54.f atIndex:0];
  1816. XCTAssertEqual(array.count, 4U);
  1817. // Middle
  1818. [array insertValue:54.f atIndex:2];
  1819. XCTAssertEqual(array.count, 5U);
  1820. // End
  1821. [array insertValue:54.f atIndex:5];
  1822. XCTAssertEqual(array.count, 6U);
  1823. // Too far.
  1824. XCTAssertThrowsSpecificNamed([array insertValue:54.f atIndex:7],
  1825. NSException, NSRangeException);
  1826. XCTAssertEqual([array valueAtIndex:0], 54.f);
  1827. XCTAssertEqual([array valueAtIndex:1], 51.f);
  1828. XCTAssertEqual([array valueAtIndex:2], 54.f);
  1829. XCTAssertEqual([array valueAtIndex:3], 52.f);
  1830. XCTAssertEqual([array valueAtIndex:4], 53.f);
  1831. XCTAssertEqual([array valueAtIndex:5], 54.f);
  1832. [array release];
  1833. }
  1834. - (void)testRemove {
  1835. const float kValues[] = { 54.f, 51.f, 52.f, 54.f, 53.f, 54.f };
  1836. GPBFloatArray *array =
  1837. [[GPBFloatArray alloc] initWithValues:kValues
  1838. count:GPBARRAYSIZE(kValues)];
  1839. XCTAssertNotNil(array);
  1840. XCTAssertEqual(array.count, 6U);
  1841. // First
  1842. [array removeValueAtIndex:0];
  1843. XCTAssertEqual(array.count, 5U);
  1844. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1845. // Middle
  1846. [array removeValueAtIndex:2];
  1847. XCTAssertEqual(array.count, 4U);
  1848. XCTAssertEqual([array valueAtIndex:2], 53.f);
  1849. // End
  1850. [array removeValueAtIndex:3];
  1851. XCTAssertEqual(array.count, 3U);
  1852. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1853. XCTAssertEqual([array valueAtIndex:1], 52.f);
  1854. XCTAssertEqual([array valueAtIndex:2], 53.f);
  1855. // Too far.
  1856. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  1857. NSException, NSRangeException);
  1858. [array removeAll];
  1859. XCTAssertEqual(array.count, 0U);
  1860. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  1861. NSException, NSRangeException);
  1862. [array release];
  1863. }
  1864. - (void)testInplaceMutation {
  1865. const float kValues[] = { 51.f, 51.f, 53.f, 53.f };
  1866. GPBFloatArray *array =
  1867. [[GPBFloatArray alloc] initWithValues:kValues
  1868. count:GPBARRAYSIZE(kValues)];
  1869. XCTAssertNotNil(array);
  1870. [array replaceValueAtIndex:1 withValue:52.f];
  1871. [array replaceValueAtIndex:3 withValue:54.f];
  1872. XCTAssertEqual(array.count, 4U);
  1873. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1874. XCTAssertEqual([array valueAtIndex:1], 52.f);
  1875. XCTAssertEqual([array valueAtIndex:2], 53.f);
  1876. XCTAssertEqual([array valueAtIndex:3], 54.f);
  1877. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:54.f],
  1878. NSException, NSRangeException);
  1879. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  1880. XCTAssertEqual(array.count, 4U);
  1881. XCTAssertEqual([array valueAtIndex:0], 51.f);
  1882. XCTAssertEqual([array valueAtIndex:1], 54.f);
  1883. XCTAssertEqual([array valueAtIndex:2], 53.f);
  1884. XCTAssertEqual([array valueAtIndex:3], 52.f);
  1885. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  1886. XCTAssertEqual(array.count, 4U);
  1887. XCTAssertEqual([array valueAtIndex:0], 53.f);
  1888. XCTAssertEqual([array valueAtIndex:1], 54.f);
  1889. XCTAssertEqual([array valueAtIndex:2], 51.f);
  1890. XCTAssertEqual([array valueAtIndex:3], 52.f);
  1891. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  1892. NSException, NSRangeException);
  1893. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  1894. NSException, NSRangeException);
  1895. [array release];
  1896. }
  1897. - (void)testInternalResizing {
  1898. const float kValues[] = { 51.f, 52.f, 53.f, 54.f };
  1899. GPBFloatArray *array =
  1900. [GPBFloatArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
  1901. XCTAssertNotNil(array);
  1902. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1903. // Add/remove to trigger the intneral buffer to grow/shrink.
  1904. for (int i = 0; i < 100; ++i) {
  1905. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  1906. }
  1907. XCTAssertEqual(array.count, 404U);
  1908. for (int i = 0; i < 100; ++i) {
  1909. [array removeValueAtIndex:(i * 2)];
  1910. }
  1911. XCTAssertEqual(array.count, 304U);
  1912. for (int i = 0; i < 100; ++i) {
  1913. [array insertValue:54.f atIndex:(i * 3)];
  1914. }
  1915. XCTAssertEqual(array.count, 404U);
  1916. [array removeAll];
  1917. XCTAssertEqual(array.count, 0U);
  1918. }
  1919. @end
  1920. //%PDDM-EXPAND ARRAY_TESTS(Double, double, 61., 62., 63., 64.)
  1921. // This block of code is generated, do not edit it directly.
  1922. #pragma mark - Double
  1923. @interface GPBDoubleArrayTests : XCTestCase
  1924. @end
  1925. @implementation GPBDoubleArrayTests
  1926. - (void)testEmpty {
  1927. GPBDoubleArray *array = [[GPBDoubleArray alloc] init];
  1928. XCTAssertNotNil(array);
  1929. XCTAssertEqual(array.count, 0U);
  1930. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  1931. [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1932. #pragma unused(value, idx, stop)
  1933. XCTFail(@"Shouldn't get here!");
  1934. }];
  1935. [array enumerateValuesWithOptions:NSEnumerationReverse
  1936. usingBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1937. #pragma unused(value, idx, stop)
  1938. XCTFail(@"Shouldn't get here!");
  1939. }];
  1940. [array release];
  1941. }
  1942. - (void)testOne {
  1943. GPBDoubleArray *array = [GPBDoubleArray arrayWithValue:61.];
  1944. XCTAssertNotNil(array);
  1945. XCTAssertEqual(array.count, 1U);
  1946. XCTAssertEqual([array valueAtIndex:0], 61.);
  1947. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  1948. [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1949. XCTAssertEqual(idx, 0U);
  1950. XCTAssertEqual(value, 61.);
  1951. XCTAssertNotEqual(stop, NULL);
  1952. }];
  1953. [array enumerateValuesWithOptions:NSEnumerationReverse
  1954. usingBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1955. XCTAssertEqual(idx, 0U);
  1956. XCTAssertEqual(value, 61.);
  1957. XCTAssertNotEqual(stop, NULL);
  1958. }];
  1959. }
  1960. - (void)testBasics {
  1961. static const double kValues[] = { 61., 62., 63., 64. };
  1962. GPBDoubleArray *array =
  1963. [[GPBDoubleArray alloc] initWithValues:kValues
  1964. count:GPBARRAYSIZE(kValues)];
  1965. XCTAssertNotNil(array);
  1966. XCTAssertEqual(array.count, 4U);
  1967. XCTAssertEqual([array valueAtIndex:0], 61.);
  1968. XCTAssertEqual([array valueAtIndex:1], 62.);
  1969. XCTAssertEqual([array valueAtIndex:2], 63.);
  1970. XCTAssertEqual([array valueAtIndex:3], 64.);
  1971. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  1972. __block NSUInteger idx2 = 0;
  1973. [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1974. XCTAssertEqual(idx, idx2);
  1975. XCTAssertEqual(value, kValues[idx]);
  1976. XCTAssertNotEqual(stop, NULL);
  1977. ++idx2;
  1978. }];
  1979. idx2 = 0;
  1980. [array enumerateValuesWithOptions:NSEnumerationReverse
  1981. usingBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1982. XCTAssertEqual(idx, (3 - idx2));
  1983. XCTAssertEqual(value, kValues[idx]);
  1984. XCTAssertNotEqual(stop, NULL);
  1985. ++idx2;
  1986. }];
  1987. // Stopping the enumeration.
  1988. idx2 = 0;
  1989. [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
  1990. XCTAssertEqual(idx, idx2);
  1991. XCTAssertEqual(value, kValues[idx]);
  1992. XCTAssertNotEqual(stop, NULL);
  1993. if (idx2 == 1) *stop = YES;
  1994. XCTAssertNotEqual(idx, 2U);
  1995. XCTAssertNotEqual(idx, 3U);
  1996. ++idx2;
  1997. }];
  1998. idx2 = 0;
  1999. [array enumerateValuesWithOptions:NSEnumerationReverse
  2000. usingBlock:^(double value, NSUInteger idx, BOOL *stop) {
  2001. XCTAssertEqual(idx, (3 - idx2));
  2002. XCTAssertEqual(value, kValues[idx]);
  2003. XCTAssertNotEqual(stop, NULL);
  2004. if (idx2 == 1) *stop = YES;
  2005. XCTAssertNotEqual(idx, 1U);
  2006. XCTAssertNotEqual(idx, 0U);
  2007. ++idx2;
  2008. }];
  2009. // Ensure description doesn't choke.
  2010. XCTAssertTrue(array.description.length > 10);
  2011. [array release];
  2012. }
  2013. - (void)testEquality {
  2014. const double kValues1[] = { 61., 62., 63. };
  2015. const double kValues2[] = { 61., 64., 63. };
  2016. const double kValues3[] = { 61., 62., 63., 64. };
  2017. GPBDoubleArray *array1 =
  2018. [[GPBDoubleArray alloc] initWithValues:kValues1
  2019. count:GPBARRAYSIZE(kValues1)];
  2020. XCTAssertNotNil(array1);
  2021. GPBDoubleArray *array1prime =
  2022. [[GPBDoubleArray alloc] initWithValues:kValues1
  2023. count:GPBARRAYSIZE(kValues1)];
  2024. XCTAssertNotNil(array1prime);
  2025. GPBDoubleArray *array2 =
  2026. [[GPBDoubleArray alloc] initWithValues:kValues2
  2027. count:GPBARRAYSIZE(kValues2)];
  2028. XCTAssertNotNil(array2);
  2029. GPBDoubleArray *array3 =
  2030. [[GPBDoubleArray alloc] initWithValues:kValues3
  2031. count:GPBARRAYSIZE(kValues3)];
  2032. XCTAssertNotNil(array3);
  2033. // Identity
  2034. XCTAssertTrue([array1 isEqual:array1]);
  2035. // Wrong type doesn't blow up.
  2036. XCTAssertFalse([array1 isEqual:@"bogus"]);
  2037. // 1/1Prime should be different objects, but equal.
  2038. XCTAssertNotEqual(array1, array1prime);
  2039. XCTAssertEqualObjects(array1, array1prime);
  2040. // Equal, so they must have same hash.
  2041. XCTAssertEqual([array1 hash], [array1prime hash]);
  2042. // 1/2/3 shouldn't be equal.
  2043. XCTAssertNotEqualObjects(array1, array2);
  2044. XCTAssertNotEqualObjects(array1, array3);
  2045. XCTAssertNotEqualObjects(array2, array3);
  2046. [array1 release];
  2047. [array1prime release];
  2048. [array2 release];
  2049. [array3 release];
  2050. }
  2051. - (void)testCopy {
  2052. const double kValues[] = { 61., 62., 63., 64. };
  2053. GPBDoubleArray *array =
  2054. [[GPBDoubleArray alloc] initWithValues:kValues
  2055. count:GPBARRAYSIZE(kValues)];
  2056. XCTAssertNotNil(array);
  2057. GPBDoubleArray *array2 = [array copy];
  2058. XCTAssertNotNil(array2);
  2059. // Should be new object but equal.
  2060. XCTAssertNotEqual(array, array2);
  2061. XCTAssertEqualObjects(array, array2);
  2062. [array2 release];
  2063. [array release];
  2064. }
  2065. - (void)testArrayFromArray {
  2066. const double kValues[] = { 61., 62., 63., 64. };
  2067. GPBDoubleArray *array =
  2068. [[GPBDoubleArray alloc] initWithValues:kValues
  2069. count:GPBARRAYSIZE(kValues)];
  2070. XCTAssertNotNil(array);
  2071. GPBDoubleArray *array2 = [GPBDoubleArray arrayWithValueArray:array];
  2072. XCTAssertNotNil(array2);
  2073. // Should be new pointer, but equal objects.
  2074. XCTAssertNotEqual(array, array2);
  2075. XCTAssertEqualObjects(array, array2);
  2076. [array release];
  2077. }
  2078. - (void)testAdds {
  2079. GPBDoubleArray *array = [GPBDoubleArray array];
  2080. XCTAssertNotNil(array);
  2081. XCTAssertEqual(array.count, 0U);
  2082. [array addValue:61.];
  2083. XCTAssertEqual(array.count, 1U);
  2084. const double kValues1[] = { 62., 63. };
  2085. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  2086. XCTAssertEqual(array.count, 3U);
  2087. const double kValues2[] = { 64., 61. };
  2088. GPBDoubleArray *array2 =
  2089. [[GPBDoubleArray alloc] initWithValues:kValues2
  2090. count:GPBARRAYSIZE(kValues2)];
  2091. XCTAssertNotNil(array2);
  2092. [array addValuesFromArray:array2];
  2093. XCTAssertEqual(array.count, 5U);
  2094. // Zero/nil inputs do nothing.
  2095. [array addValues:kValues1 count:0];
  2096. XCTAssertEqual(array.count, 5U);
  2097. [array addValues:NULL count:5];
  2098. XCTAssertEqual(array.count, 5U);
  2099. XCTAssertEqual([array valueAtIndex:0], 61.);
  2100. XCTAssertEqual([array valueAtIndex:1], 62.);
  2101. XCTAssertEqual([array valueAtIndex:2], 63.);
  2102. XCTAssertEqual([array valueAtIndex:3], 64.);
  2103. XCTAssertEqual([array valueAtIndex:4], 61.);
  2104. [array2 release];
  2105. }
  2106. - (void)testInsert {
  2107. const double kValues[] = { 61., 62., 63. };
  2108. GPBDoubleArray *array =
  2109. [[GPBDoubleArray alloc] initWithValues:kValues
  2110. count:GPBARRAYSIZE(kValues)];
  2111. XCTAssertNotNil(array);
  2112. XCTAssertEqual(array.count, 3U);
  2113. // First
  2114. [array insertValue:64. atIndex:0];
  2115. XCTAssertEqual(array.count, 4U);
  2116. // Middle
  2117. [array insertValue:64. atIndex:2];
  2118. XCTAssertEqual(array.count, 5U);
  2119. // End
  2120. [array insertValue:64. atIndex:5];
  2121. XCTAssertEqual(array.count, 6U);
  2122. // Too far.
  2123. XCTAssertThrowsSpecificNamed([array insertValue:64. atIndex:7],
  2124. NSException, NSRangeException);
  2125. XCTAssertEqual([array valueAtIndex:0], 64.);
  2126. XCTAssertEqual([array valueAtIndex:1], 61.);
  2127. XCTAssertEqual([array valueAtIndex:2], 64.);
  2128. XCTAssertEqual([array valueAtIndex:3], 62.);
  2129. XCTAssertEqual([array valueAtIndex:4], 63.);
  2130. XCTAssertEqual([array valueAtIndex:5], 64.);
  2131. [array release];
  2132. }
  2133. - (void)testRemove {
  2134. const double kValues[] = { 64., 61., 62., 64., 63., 64. };
  2135. GPBDoubleArray *array =
  2136. [[GPBDoubleArray alloc] initWithValues:kValues
  2137. count:GPBARRAYSIZE(kValues)];
  2138. XCTAssertNotNil(array);
  2139. XCTAssertEqual(array.count, 6U);
  2140. // First
  2141. [array removeValueAtIndex:0];
  2142. XCTAssertEqual(array.count, 5U);
  2143. XCTAssertEqual([array valueAtIndex:0], 61.);
  2144. // Middle
  2145. [array removeValueAtIndex:2];
  2146. XCTAssertEqual(array.count, 4U);
  2147. XCTAssertEqual([array valueAtIndex:2], 63.);
  2148. // End
  2149. [array removeValueAtIndex:3];
  2150. XCTAssertEqual(array.count, 3U);
  2151. XCTAssertEqual([array valueAtIndex:0], 61.);
  2152. XCTAssertEqual([array valueAtIndex:1], 62.);
  2153. XCTAssertEqual([array valueAtIndex:2], 63.);
  2154. // Too far.
  2155. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  2156. NSException, NSRangeException);
  2157. [array removeAll];
  2158. XCTAssertEqual(array.count, 0U);
  2159. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  2160. NSException, NSRangeException);
  2161. [array release];
  2162. }
  2163. - (void)testInplaceMutation {
  2164. const double kValues[] = { 61., 61., 63., 63. };
  2165. GPBDoubleArray *array =
  2166. [[GPBDoubleArray alloc] initWithValues:kValues
  2167. count:GPBARRAYSIZE(kValues)];
  2168. XCTAssertNotNil(array);
  2169. [array replaceValueAtIndex:1 withValue:62.];
  2170. [array replaceValueAtIndex:3 withValue:64.];
  2171. XCTAssertEqual(array.count, 4U);
  2172. XCTAssertEqual([array valueAtIndex:0], 61.);
  2173. XCTAssertEqual([array valueAtIndex:1], 62.);
  2174. XCTAssertEqual([array valueAtIndex:2], 63.);
  2175. XCTAssertEqual([array valueAtIndex:3], 64.);
  2176. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:64.],
  2177. NSException, NSRangeException);
  2178. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  2179. XCTAssertEqual(array.count, 4U);
  2180. XCTAssertEqual([array valueAtIndex:0], 61.);
  2181. XCTAssertEqual([array valueAtIndex:1], 64.);
  2182. XCTAssertEqual([array valueAtIndex:2], 63.);
  2183. XCTAssertEqual([array valueAtIndex:3], 62.);
  2184. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  2185. XCTAssertEqual(array.count, 4U);
  2186. XCTAssertEqual([array valueAtIndex:0], 63.);
  2187. XCTAssertEqual([array valueAtIndex:1], 64.);
  2188. XCTAssertEqual([array valueAtIndex:2], 61.);
  2189. XCTAssertEqual([array valueAtIndex:3], 62.);
  2190. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  2191. NSException, NSRangeException);
  2192. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  2193. NSException, NSRangeException);
  2194. [array release];
  2195. }
  2196. - (void)testInternalResizing {
  2197. const double kValues[] = { 61., 62., 63., 64. };
  2198. GPBDoubleArray *array =
  2199. [GPBDoubleArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
  2200. XCTAssertNotNil(array);
  2201. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  2202. // Add/remove to trigger the intneral buffer to grow/shrink.
  2203. for (int i = 0; i < 100; ++i) {
  2204. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  2205. }
  2206. XCTAssertEqual(array.count, 404U);
  2207. for (int i = 0; i < 100; ++i) {
  2208. [array removeValueAtIndex:(i * 2)];
  2209. }
  2210. XCTAssertEqual(array.count, 304U);
  2211. for (int i = 0; i < 100; ++i) {
  2212. [array insertValue:64. atIndex:(i * 3)];
  2213. }
  2214. XCTAssertEqual(array.count, 404U);
  2215. [array removeAll];
  2216. XCTAssertEqual(array.count, 0U);
  2217. }
  2218. @end
  2219. //%PDDM-EXPAND ARRAY_TESTS(Bool, BOOL, TRUE, TRUE, FALSE, FALSE)
  2220. // This block of code is generated, do not edit it directly.
  2221. #pragma mark - Bool
  2222. @interface GPBBoolArrayTests : XCTestCase
  2223. @end
  2224. @implementation GPBBoolArrayTests
  2225. - (void)testEmpty {
  2226. GPBBoolArray *array = [[GPBBoolArray alloc] init];
  2227. XCTAssertNotNil(array);
  2228. XCTAssertEqual(array.count, 0U);
  2229. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  2230. [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2231. #pragma unused(value, idx, stop)
  2232. XCTFail(@"Shouldn't get here!");
  2233. }];
  2234. [array enumerateValuesWithOptions:NSEnumerationReverse
  2235. usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2236. #pragma unused(value, idx, stop)
  2237. XCTFail(@"Shouldn't get here!");
  2238. }];
  2239. [array release];
  2240. }
  2241. - (void)testOne {
  2242. GPBBoolArray *array = [GPBBoolArray arrayWithValue:TRUE];
  2243. XCTAssertNotNil(array);
  2244. XCTAssertEqual(array.count, 1U);
  2245. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2246. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  2247. [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2248. XCTAssertEqual(idx, 0U);
  2249. XCTAssertEqual(value, TRUE);
  2250. XCTAssertNotEqual(stop, NULL);
  2251. }];
  2252. [array enumerateValuesWithOptions:NSEnumerationReverse
  2253. usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2254. XCTAssertEqual(idx, 0U);
  2255. XCTAssertEqual(value, TRUE);
  2256. XCTAssertNotEqual(stop, NULL);
  2257. }];
  2258. }
  2259. - (void)testBasics {
  2260. static const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
  2261. GPBBoolArray *array =
  2262. [[GPBBoolArray alloc] initWithValues:kValues
  2263. count:GPBARRAYSIZE(kValues)];
  2264. XCTAssertNotNil(array);
  2265. XCTAssertEqual(array.count, 4U);
  2266. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2267. XCTAssertEqual([array valueAtIndex:1], TRUE);
  2268. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2269. XCTAssertEqual([array valueAtIndex:3], FALSE);
  2270. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  2271. __block NSUInteger idx2 = 0;
  2272. [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2273. XCTAssertEqual(idx, idx2);
  2274. XCTAssertEqual(value, kValues[idx]);
  2275. XCTAssertNotEqual(stop, NULL);
  2276. ++idx2;
  2277. }];
  2278. idx2 = 0;
  2279. [array enumerateValuesWithOptions:NSEnumerationReverse
  2280. usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2281. XCTAssertEqual(idx, (3 - idx2));
  2282. XCTAssertEqual(value, kValues[idx]);
  2283. XCTAssertNotEqual(stop, NULL);
  2284. ++idx2;
  2285. }];
  2286. // Stopping the enumeration.
  2287. idx2 = 0;
  2288. [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2289. XCTAssertEqual(idx, idx2);
  2290. XCTAssertEqual(value, kValues[idx]);
  2291. XCTAssertNotEqual(stop, NULL);
  2292. if (idx2 == 1) *stop = YES;
  2293. XCTAssertNotEqual(idx, 2U);
  2294. XCTAssertNotEqual(idx, 3U);
  2295. ++idx2;
  2296. }];
  2297. idx2 = 0;
  2298. [array enumerateValuesWithOptions:NSEnumerationReverse
  2299. usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
  2300. XCTAssertEqual(idx, (3 - idx2));
  2301. XCTAssertEqual(value, kValues[idx]);
  2302. XCTAssertNotEqual(stop, NULL);
  2303. if (idx2 == 1) *stop = YES;
  2304. XCTAssertNotEqual(idx, 1U);
  2305. XCTAssertNotEqual(idx, 0U);
  2306. ++idx2;
  2307. }];
  2308. // Ensure description doesn't choke.
  2309. XCTAssertTrue(array.description.length > 10);
  2310. [array release];
  2311. }
  2312. - (void)testEquality {
  2313. const BOOL kValues1[] = { TRUE, TRUE, FALSE };
  2314. const BOOL kValues2[] = { TRUE, FALSE, FALSE };
  2315. const BOOL kValues3[] = { TRUE, TRUE, FALSE, FALSE };
  2316. GPBBoolArray *array1 =
  2317. [[GPBBoolArray alloc] initWithValues:kValues1
  2318. count:GPBARRAYSIZE(kValues1)];
  2319. XCTAssertNotNil(array1);
  2320. GPBBoolArray *array1prime =
  2321. [[GPBBoolArray alloc] initWithValues:kValues1
  2322. count:GPBARRAYSIZE(kValues1)];
  2323. XCTAssertNotNil(array1prime);
  2324. GPBBoolArray *array2 =
  2325. [[GPBBoolArray alloc] initWithValues:kValues2
  2326. count:GPBARRAYSIZE(kValues2)];
  2327. XCTAssertNotNil(array2);
  2328. GPBBoolArray *array3 =
  2329. [[GPBBoolArray alloc] initWithValues:kValues3
  2330. count:GPBARRAYSIZE(kValues3)];
  2331. XCTAssertNotNil(array3);
  2332. // Identity
  2333. XCTAssertTrue([array1 isEqual:array1]);
  2334. // Wrong type doesn't blow up.
  2335. XCTAssertFalse([array1 isEqual:@"bogus"]);
  2336. // 1/1Prime should be different objects, but equal.
  2337. XCTAssertNotEqual(array1, array1prime);
  2338. XCTAssertEqualObjects(array1, array1prime);
  2339. // Equal, so they must have same hash.
  2340. XCTAssertEqual([array1 hash], [array1prime hash]);
  2341. // 1/2/3 shouldn't be equal.
  2342. XCTAssertNotEqualObjects(array1, array2);
  2343. XCTAssertNotEqualObjects(array1, array3);
  2344. XCTAssertNotEqualObjects(array2, array3);
  2345. [array1 release];
  2346. [array1prime release];
  2347. [array2 release];
  2348. [array3 release];
  2349. }
  2350. - (void)testCopy {
  2351. const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
  2352. GPBBoolArray *array =
  2353. [[GPBBoolArray alloc] initWithValues:kValues
  2354. count:GPBARRAYSIZE(kValues)];
  2355. XCTAssertNotNil(array);
  2356. GPBBoolArray *array2 = [array copy];
  2357. XCTAssertNotNil(array2);
  2358. // Should be new object but equal.
  2359. XCTAssertNotEqual(array, array2);
  2360. XCTAssertEqualObjects(array, array2);
  2361. [array2 release];
  2362. [array release];
  2363. }
  2364. - (void)testArrayFromArray {
  2365. const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
  2366. GPBBoolArray *array =
  2367. [[GPBBoolArray alloc] initWithValues:kValues
  2368. count:GPBARRAYSIZE(kValues)];
  2369. XCTAssertNotNil(array);
  2370. GPBBoolArray *array2 = [GPBBoolArray arrayWithValueArray:array];
  2371. XCTAssertNotNil(array2);
  2372. // Should be new pointer, but equal objects.
  2373. XCTAssertNotEqual(array, array2);
  2374. XCTAssertEqualObjects(array, array2);
  2375. [array release];
  2376. }
  2377. - (void)testAdds {
  2378. GPBBoolArray *array = [GPBBoolArray array];
  2379. XCTAssertNotNil(array);
  2380. XCTAssertEqual(array.count, 0U);
  2381. [array addValue:TRUE];
  2382. XCTAssertEqual(array.count, 1U);
  2383. const BOOL kValues1[] = { TRUE, FALSE };
  2384. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  2385. XCTAssertEqual(array.count, 3U);
  2386. const BOOL kValues2[] = { FALSE, TRUE };
  2387. GPBBoolArray *array2 =
  2388. [[GPBBoolArray alloc] initWithValues:kValues2
  2389. count:GPBARRAYSIZE(kValues2)];
  2390. XCTAssertNotNil(array2);
  2391. [array addValuesFromArray:array2];
  2392. XCTAssertEqual(array.count, 5U);
  2393. // Zero/nil inputs do nothing.
  2394. [array addValues:kValues1 count:0];
  2395. XCTAssertEqual(array.count, 5U);
  2396. [array addValues:NULL count:5];
  2397. XCTAssertEqual(array.count, 5U);
  2398. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2399. XCTAssertEqual([array valueAtIndex:1], TRUE);
  2400. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2401. XCTAssertEqual([array valueAtIndex:3], FALSE);
  2402. XCTAssertEqual([array valueAtIndex:4], TRUE);
  2403. [array2 release];
  2404. }
  2405. - (void)testInsert {
  2406. const BOOL kValues[] = { TRUE, TRUE, FALSE };
  2407. GPBBoolArray *array =
  2408. [[GPBBoolArray alloc] initWithValues:kValues
  2409. count:GPBARRAYSIZE(kValues)];
  2410. XCTAssertNotNil(array);
  2411. XCTAssertEqual(array.count, 3U);
  2412. // First
  2413. [array insertValue:FALSE atIndex:0];
  2414. XCTAssertEqual(array.count, 4U);
  2415. // Middle
  2416. [array insertValue:FALSE atIndex:2];
  2417. XCTAssertEqual(array.count, 5U);
  2418. // End
  2419. [array insertValue:FALSE atIndex:5];
  2420. XCTAssertEqual(array.count, 6U);
  2421. // Too far.
  2422. XCTAssertThrowsSpecificNamed([array insertValue:FALSE atIndex:7],
  2423. NSException, NSRangeException);
  2424. XCTAssertEqual([array valueAtIndex:0], FALSE);
  2425. XCTAssertEqual([array valueAtIndex:1], TRUE);
  2426. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2427. XCTAssertEqual([array valueAtIndex:3], TRUE);
  2428. XCTAssertEqual([array valueAtIndex:4], FALSE);
  2429. XCTAssertEqual([array valueAtIndex:5], FALSE);
  2430. [array release];
  2431. }
  2432. - (void)testRemove {
  2433. const BOOL kValues[] = { FALSE, TRUE, TRUE, FALSE, FALSE, FALSE };
  2434. GPBBoolArray *array =
  2435. [[GPBBoolArray alloc] initWithValues:kValues
  2436. count:GPBARRAYSIZE(kValues)];
  2437. XCTAssertNotNil(array);
  2438. XCTAssertEqual(array.count, 6U);
  2439. // First
  2440. [array removeValueAtIndex:0];
  2441. XCTAssertEqual(array.count, 5U);
  2442. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2443. // Middle
  2444. [array removeValueAtIndex:2];
  2445. XCTAssertEqual(array.count, 4U);
  2446. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2447. // End
  2448. [array removeValueAtIndex:3];
  2449. XCTAssertEqual(array.count, 3U);
  2450. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2451. XCTAssertEqual([array valueAtIndex:1], TRUE);
  2452. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2453. // Too far.
  2454. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  2455. NSException, NSRangeException);
  2456. [array removeAll];
  2457. XCTAssertEqual(array.count, 0U);
  2458. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  2459. NSException, NSRangeException);
  2460. [array release];
  2461. }
  2462. - (void)testInplaceMutation {
  2463. const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
  2464. GPBBoolArray *array =
  2465. [[GPBBoolArray alloc] initWithValues:kValues
  2466. count:GPBARRAYSIZE(kValues)];
  2467. XCTAssertNotNil(array);
  2468. [array replaceValueAtIndex:1 withValue:TRUE];
  2469. [array replaceValueAtIndex:3 withValue:FALSE];
  2470. XCTAssertEqual(array.count, 4U);
  2471. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2472. XCTAssertEqual([array valueAtIndex:1], TRUE);
  2473. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2474. XCTAssertEqual([array valueAtIndex:3], FALSE);
  2475. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:FALSE],
  2476. NSException, NSRangeException);
  2477. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  2478. XCTAssertEqual(array.count, 4U);
  2479. XCTAssertEqual([array valueAtIndex:0], TRUE);
  2480. XCTAssertEqual([array valueAtIndex:1], FALSE);
  2481. XCTAssertEqual([array valueAtIndex:2], FALSE);
  2482. XCTAssertEqual([array valueAtIndex:3], TRUE);
  2483. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  2484. XCTAssertEqual(array.count, 4U);
  2485. XCTAssertEqual([array valueAtIndex:0], FALSE);
  2486. XCTAssertEqual([array valueAtIndex:1], FALSE);
  2487. XCTAssertEqual([array valueAtIndex:2], TRUE);
  2488. XCTAssertEqual([array valueAtIndex:3], TRUE);
  2489. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  2490. NSException, NSRangeException);
  2491. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  2492. NSException, NSRangeException);
  2493. [array release];
  2494. }
  2495. - (void)testInternalResizing {
  2496. const BOOL kValues[] = { TRUE, TRUE, FALSE, FALSE };
  2497. GPBBoolArray *array =
  2498. [GPBBoolArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
  2499. XCTAssertNotNil(array);
  2500. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  2501. // Add/remove to trigger the intneral buffer to grow/shrink.
  2502. for (int i = 0; i < 100; ++i) {
  2503. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  2504. }
  2505. XCTAssertEqual(array.count, 404U);
  2506. for (int i = 0; i < 100; ++i) {
  2507. [array removeValueAtIndex:(i * 2)];
  2508. }
  2509. XCTAssertEqual(array.count, 304U);
  2510. for (int i = 0; i < 100; ++i) {
  2511. [array insertValue:FALSE atIndex:(i * 3)];
  2512. }
  2513. XCTAssertEqual(array.count, 404U);
  2514. [array removeAll];
  2515. XCTAssertEqual(array.count, 0U);
  2516. }
  2517. @end
  2518. //%PDDM-EXPAND ARRAY_TESTS2(Enum, int32_t, 71, 72, 73, 74, Raw)
  2519. // This block of code is generated, do not edit it directly.
  2520. #pragma mark - Enum
  2521. @interface GPBEnumArrayTests : XCTestCase
  2522. @end
  2523. @implementation GPBEnumArrayTests
  2524. - (void)testEmpty {
  2525. GPBEnumArray *array = [[GPBEnumArray alloc] init];
  2526. XCTAssertNotNil(array);
  2527. XCTAssertEqual(array.count, 0U);
  2528. XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
  2529. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2530. #pragma unused(value, idx, stop)
  2531. XCTFail(@"Shouldn't get here!");
  2532. }];
  2533. [array enumerateValuesWithOptions:NSEnumerationReverse
  2534. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2535. #pragma unused(value, idx, stop)
  2536. XCTFail(@"Shouldn't get here!");
  2537. }];
  2538. [array release];
  2539. }
  2540. - (void)testOne {
  2541. GPBEnumArray *array = [GPBEnumArray arrayWithValue:71];
  2542. XCTAssertNotNil(array);
  2543. XCTAssertEqual(array.count, 1U);
  2544. XCTAssertEqual([array valueAtIndex:0], 71);
  2545. XCTAssertThrowsSpecificNamed([array valueAtIndex:1], NSException, NSRangeException);
  2546. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2547. XCTAssertEqual(idx, 0U);
  2548. XCTAssertEqual(value, 71);
  2549. XCTAssertNotEqual(stop, NULL);
  2550. }];
  2551. [array enumerateValuesWithOptions:NSEnumerationReverse
  2552. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2553. XCTAssertEqual(idx, 0U);
  2554. XCTAssertEqual(value, 71);
  2555. XCTAssertNotEqual(stop, NULL);
  2556. }];
  2557. }
  2558. - (void)testBasics {
  2559. static const int32_t kValues[] = { 71, 72, 73, 74 };
  2560. GPBEnumArray *array =
  2561. [[GPBEnumArray alloc] initWithValues:kValues
  2562. count:GPBARRAYSIZE(kValues)];
  2563. XCTAssertNotNil(array);
  2564. XCTAssertEqual(array.count, 4U);
  2565. XCTAssertEqual([array valueAtIndex:0], 71);
  2566. XCTAssertEqual([array valueAtIndex:1], 72);
  2567. XCTAssertEqual([array valueAtIndex:2], 73);
  2568. XCTAssertEqual([array valueAtIndex:3], 74);
  2569. XCTAssertThrowsSpecificNamed([array valueAtIndex:4], NSException, NSRangeException);
  2570. __block NSUInteger idx2 = 0;
  2571. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2572. XCTAssertEqual(idx, idx2);
  2573. XCTAssertEqual(value, kValues[idx]);
  2574. XCTAssertNotEqual(stop, NULL);
  2575. ++idx2;
  2576. }];
  2577. idx2 = 0;
  2578. [array enumerateValuesWithOptions:NSEnumerationReverse
  2579. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2580. XCTAssertEqual(idx, (3 - idx2));
  2581. XCTAssertEqual(value, kValues[idx]);
  2582. XCTAssertNotEqual(stop, NULL);
  2583. ++idx2;
  2584. }];
  2585. // Stopping the enumeration.
  2586. idx2 = 0;
  2587. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2588. XCTAssertEqual(idx, idx2);
  2589. XCTAssertEqual(value, kValues[idx]);
  2590. XCTAssertNotEqual(stop, NULL);
  2591. if (idx2 == 1) *stop = YES;
  2592. XCTAssertNotEqual(idx, 2U);
  2593. XCTAssertNotEqual(idx, 3U);
  2594. ++idx2;
  2595. }];
  2596. idx2 = 0;
  2597. [array enumerateValuesWithOptions:NSEnumerationReverse
  2598. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2599. XCTAssertEqual(idx, (3 - idx2));
  2600. XCTAssertEqual(value, kValues[idx]);
  2601. XCTAssertNotEqual(stop, NULL);
  2602. if (idx2 == 1) *stop = YES;
  2603. XCTAssertNotEqual(idx, 1U);
  2604. XCTAssertNotEqual(idx, 0U);
  2605. ++idx2;
  2606. }];
  2607. // Ensure description doesn't choke.
  2608. XCTAssertTrue(array.description.length > 10);
  2609. [array release];
  2610. }
  2611. - (void)testEquality {
  2612. const int32_t kValues1[] = { 71, 72, 73 };
  2613. const int32_t kValues2[] = { 71, 74, 73 };
  2614. const int32_t kValues3[] = { 71, 72, 73, 74 };
  2615. GPBEnumArray *array1 =
  2616. [[GPBEnumArray alloc] initWithValues:kValues1
  2617. count:GPBARRAYSIZE(kValues1)];
  2618. XCTAssertNotNil(array1);
  2619. GPBEnumArray *array1prime =
  2620. [[GPBEnumArray alloc] initWithValues:kValues1
  2621. count:GPBARRAYSIZE(kValues1)];
  2622. XCTAssertNotNil(array1prime);
  2623. GPBEnumArray *array2 =
  2624. [[GPBEnumArray alloc] initWithValues:kValues2
  2625. count:GPBARRAYSIZE(kValues2)];
  2626. XCTAssertNotNil(array2);
  2627. GPBEnumArray *array3 =
  2628. [[GPBEnumArray alloc] initWithValues:kValues3
  2629. count:GPBARRAYSIZE(kValues3)];
  2630. XCTAssertNotNil(array3);
  2631. // Identity
  2632. XCTAssertTrue([array1 isEqual:array1]);
  2633. // Wrong type doesn't blow up.
  2634. XCTAssertFalse([array1 isEqual:@"bogus"]);
  2635. // 1/1Prime should be different objects, but equal.
  2636. XCTAssertNotEqual(array1, array1prime);
  2637. XCTAssertEqualObjects(array1, array1prime);
  2638. // Equal, so they must have same hash.
  2639. XCTAssertEqual([array1 hash], [array1prime hash]);
  2640. // 1/2/3 shouldn't be equal.
  2641. XCTAssertNotEqualObjects(array1, array2);
  2642. XCTAssertNotEqualObjects(array1, array3);
  2643. XCTAssertNotEqualObjects(array2, array3);
  2644. [array1 release];
  2645. [array1prime release];
  2646. [array2 release];
  2647. [array3 release];
  2648. }
  2649. - (void)testCopy {
  2650. const int32_t kValues[] = { 71, 72, 73, 74 };
  2651. GPBEnumArray *array =
  2652. [[GPBEnumArray alloc] initWithValues:kValues
  2653. count:GPBARRAYSIZE(kValues)];
  2654. XCTAssertNotNil(array);
  2655. GPBEnumArray *array2 = [array copy];
  2656. XCTAssertNotNil(array2);
  2657. // Should be new object but equal.
  2658. XCTAssertNotEqual(array, array2);
  2659. XCTAssertEqualObjects(array, array2);
  2660. [array2 release];
  2661. [array release];
  2662. }
  2663. - (void)testArrayFromArray {
  2664. const int32_t kValues[] = { 71, 72, 73, 74 };
  2665. GPBEnumArray *array =
  2666. [[GPBEnumArray alloc] initWithValues:kValues
  2667. count:GPBARRAYSIZE(kValues)];
  2668. XCTAssertNotNil(array);
  2669. GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array];
  2670. XCTAssertNotNil(array2);
  2671. // Should be new pointer, but equal objects.
  2672. XCTAssertNotEqual(array, array2);
  2673. XCTAssertEqualObjects(array, array2);
  2674. [array release];
  2675. }
  2676. - (void)testAdds {
  2677. GPBEnumArray *array = [GPBEnumArray array];
  2678. XCTAssertNotNil(array);
  2679. XCTAssertEqual(array.count, 0U);
  2680. [array addValue:71];
  2681. XCTAssertEqual(array.count, 1U);
  2682. const int32_t kValues1[] = { 72, 73 };
  2683. [array addValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  2684. XCTAssertEqual(array.count, 3U);
  2685. const int32_t kValues2[] = { 74, 71 };
  2686. GPBEnumArray *array2 =
  2687. [[GPBEnumArray alloc] initWithValues:kValues2
  2688. count:GPBARRAYSIZE(kValues2)];
  2689. XCTAssertNotNil(array2);
  2690. [array addRawValuesFromArray:array2];
  2691. XCTAssertEqual(array.count, 5U);
  2692. // Zero/nil inputs do nothing.
  2693. [array addValues:kValues1 count:0];
  2694. XCTAssertEqual(array.count, 5U);
  2695. [array addValues:NULL count:5];
  2696. XCTAssertEqual(array.count, 5U);
  2697. XCTAssertEqual([array valueAtIndex:0], 71);
  2698. XCTAssertEqual([array valueAtIndex:1], 72);
  2699. XCTAssertEqual([array valueAtIndex:2], 73);
  2700. XCTAssertEqual([array valueAtIndex:3], 74);
  2701. XCTAssertEqual([array valueAtIndex:4], 71);
  2702. [array2 release];
  2703. }
  2704. - (void)testInsert {
  2705. const int32_t kValues[] = { 71, 72, 73 };
  2706. GPBEnumArray *array =
  2707. [[GPBEnumArray alloc] initWithValues:kValues
  2708. count:GPBARRAYSIZE(kValues)];
  2709. XCTAssertNotNil(array);
  2710. XCTAssertEqual(array.count, 3U);
  2711. // First
  2712. [array insertValue:74 atIndex:0];
  2713. XCTAssertEqual(array.count, 4U);
  2714. // Middle
  2715. [array insertValue:74 atIndex:2];
  2716. XCTAssertEqual(array.count, 5U);
  2717. // End
  2718. [array insertValue:74 atIndex:5];
  2719. XCTAssertEqual(array.count, 6U);
  2720. // Too far.
  2721. XCTAssertThrowsSpecificNamed([array insertValue:74 atIndex:7],
  2722. NSException, NSRangeException);
  2723. XCTAssertEqual([array valueAtIndex:0], 74);
  2724. XCTAssertEqual([array valueAtIndex:1], 71);
  2725. XCTAssertEqual([array valueAtIndex:2], 74);
  2726. XCTAssertEqual([array valueAtIndex:3], 72);
  2727. XCTAssertEqual([array valueAtIndex:4], 73);
  2728. XCTAssertEqual([array valueAtIndex:5], 74);
  2729. [array release];
  2730. }
  2731. - (void)testRemove {
  2732. const int32_t kValues[] = { 74, 71, 72, 74, 73, 74 };
  2733. GPBEnumArray *array =
  2734. [[GPBEnumArray alloc] initWithValues:kValues
  2735. count:GPBARRAYSIZE(kValues)];
  2736. XCTAssertNotNil(array);
  2737. XCTAssertEqual(array.count, 6U);
  2738. // First
  2739. [array removeValueAtIndex:0];
  2740. XCTAssertEqual(array.count, 5U);
  2741. XCTAssertEqual([array valueAtIndex:0], 71);
  2742. // Middle
  2743. [array removeValueAtIndex:2];
  2744. XCTAssertEqual(array.count, 4U);
  2745. XCTAssertEqual([array valueAtIndex:2], 73);
  2746. // End
  2747. [array removeValueAtIndex:3];
  2748. XCTAssertEqual(array.count, 3U);
  2749. XCTAssertEqual([array valueAtIndex:0], 71);
  2750. XCTAssertEqual([array valueAtIndex:1], 72);
  2751. XCTAssertEqual([array valueAtIndex:2], 73);
  2752. // Too far.
  2753. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:3],
  2754. NSException, NSRangeException);
  2755. [array removeAll];
  2756. XCTAssertEqual(array.count, 0U);
  2757. XCTAssertThrowsSpecificNamed([array removeValueAtIndex:0],
  2758. NSException, NSRangeException);
  2759. [array release];
  2760. }
  2761. - (void)testInplaceMutation {
  2762. const int32_t kValues[] = { 71, 71, 73, 73 };
  2763. GPBEnumArray *array =
  2764. [[GPBEnumArray alloc] initWithValues:kValues
  2765. count:GPBARRAYSIZE(kValues)];
  2766. XCTAssertNotNil(array);
  2767. [array replaceValueAtIndex:1 withValue:72];
  2768. [array replaceValueAtIndex:3 withValue:74];
  2769. XCTAssertEqual(array.count, 4U);
  2770. XCTAssertEqual([array valueAtIndex:0], 71);
  2771. XCTAssertEqual([array valueAtIndex:1], 72);
  2772. XCTAssertEqual([array valueAtIndex:2], 73);
  2773. XCTAssertEqual([array valueAtIndex:3], 74);
  2774. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withValue:74],
  2775. NSException, NSRangeException);
  2776. [array exchangeValueAtIndex:1 withValueAtIndex:3];
  2777. XCTAssertEqual(array.count, 4U);
  2778. XCTAssertEqual([array valueAtIndex:0], 71);
  2779. XCTAssertEqual([array valueAtIndex:1], 74);
  2780. XCTAssertEqual([array valueAtIndex:2], 73);
  2781. XCTAssertEqual([array valueAtIndex:3], 72);
  2782. [array exchangeValueAtIndex:2 withValueAtIndex:0];
  2783. XCTAssertEqual(array.count, 4U);
  2784. XCTAssertEqual([array valueAtIndex:0], 73);
  2785. XCTAssertEqual([array valueAtIndex:1], 74);
  2786. XCTAssertEqual([array valueAtIndex:2], 71);
  2787. XCTAssertEqual([array valueAtIndex:3], 72);
  2788. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:4 withValueAtIndex:1],
  2789. NSException, NSRangeException);
  2790. XCTAssertThrowsSpecificNamed([array exchangeValueAtIndex:1 withValueAtIndex:4],
  2791. NSException, NSRangeException);
  2792. [array release];
  2793. }
  2794. - (void)testInternalResizing {
  2795. const int32_t kValues[] = { 71, 72, 73, 74 };
  2796. GPBEnumArray *array =
  2797. [GPBEnumArray arrayWithCapacity:GPBARRAYSIZE(kValues)];
  2798. XCTAssertNotNil(array);
  2799. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  2800. // Add/remove to trigger the intneral buffer to grow/shrink.
  2801. for (int i = 0; i < 100; ++i) {
  2802. [array addValues:kValues count:GPBARRAYSIZE(kValues)];
  2803. }
  2804. XCTAssertEqual(array.count, 404U);
  2805. for (int i = 0; i < 100; ++i) {
  2806. [array removeValueAtIndex:(i * 2)];
  2807. }
  2808. XCTAssertEqual(array.count, 304U);
  2809. for (int i = 0; i < 100; ++i) {
  2810. [array insertValue:74 atIndex:(i * 3)];
  2811. }
  2812. XCTAssertEqual(array.count, 404U);
  2813. [array removeAll];
  2814. XCTAssertEqual(array.count, 0U);
  2815. }
  2816. @end
  2817. //%PDDM-EXPAND-END (8 expansions)
  2818. #pragma mark - Non macro-based Enum tests
  2819. // These are hand written tests to cover the verification and raw methods.
  2820. @interface GPBEnumArrayCustomTests : XCTestCase
  2821. @end
  2822. @implementation GPBEnumArrayCustomTests
  2823. - (void)testRawBasics {
  2824. static const int32_t kValues[] = { 71, 272, 73, 374 };
  2825. static const int32_t kValuesFiltered[] = {
  2826. 71, kGPBUnrecognizedEnumeratorValue, 73, kGPBUnrecognizedEnumeratorValue
  2827. };
  2828. XCTAssertEqual(GPBARRAYSIZE(kValues), GPBARRAYSIZE(kValuesFiltered));
  2829. GPBEnumArray *array =
  2830. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  2831. rawValues:kValues
  2832. count:GPBARRAYSIZE(kValues)];
  2833. XCTAssertNotNil(array);
  2834. XCTAssertEqual(array.count, 4U);
  2835. GPBEnumValidationFunc func = TestingEnum_IsValidValue;
  2836. XCTAssertEqual(array.validationFunc, func);
  2837. XCTAssertEqual([array rawValueAtIndex:0], 71);
  2838. XCTAssertEqual([array rawValueAtIndex:1], 272);
  2839. XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue);
  2840. XCTAssertEqual([array rawValueAtIndex:2], 73);
  2841. XCTAssertEqual([array rawValueAtIndex:3], 374);
  2842. XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue);
  2843. XCTAssertThrowsSpecificNamed([array rawValueAtIndex:4], NSException, NSRangeException);
  2844. __block NSUInteger idx2 = 0;
  2845. [array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2846. XCTAssertEqual(idx, idx2);
  2847. XCTAssertEqual(value, kValues[idx]);
  2848. XCTAssertNotEqual(stop, NULL);
  2849. ++idx2;
  2850. }];
  2851. idx2 = 0;
  2852. [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2853. XCTAssertEqual(idx, idx2);
  2854. XCTAssertEqual(value, kValuesFiltered[idx]);
  2855. XCTAssertNotEqual(stop, NULL);
  2856. ++idx2;
  2857. }];
  2858. idx2 = 0;
  2859. [array enumerateRawValuesWithOptions:NSEnumerationReverse
  2860. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2861. XCTAssertEqual(idx, (3 - idx2));
  2862. XCTAssertEqual(value, kValues[idx]);
  2863. XCTAssertNotEqual(stop, NULL);
  2864. ++idx2;
  2865. }];
  2866. idx2 = 0;
  2867. [array enumerateValuesWithOptions:NSEnumerationReverse
  2868. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2869. XCTAssertEqual(idx, (3 - idx2));
  2870. XCTAssertEqual(value, kValuesFiltered[idx]);
  2871. XCTAssertNotEqual(stop, NULL);
  2872. ++idx2;
  2873. }];
  2874. // Stopping the enumeration.
  2875. idx2 = 0;
  2876. [array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2877. XCTAssertEqual(idx, idx2);
  2878. XCTAssertEqual(value, kValues[idx]);
  2879. XCTAssertNotEqual(stop, NULL);
  2880. if (idx2 == 1) *stop = YES;
  2881. XCTAssertNotEqual(idx, 2U);
  2882. XCTAssertNotEqual(idx, 3U);
  2883. ++idx2;
  2884. }];
  2885. idx2 = 0;
  2886. [array enumerateRawValuesWithOptions:NSEnumerationReverse
  2887. usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
  2888. XCTAssertEqual(idx, (3 - idx2));
  2889. XCTAssertEqual(value, kValues[idx]);
  2890. XCTAssertNotEqual(stop, NULL);
  2891. if (idx2 == 1) *stop = YES;
  2892. XCTAssertNotEqual(idx, 1U);
  2893. XCTAssertNotEqual(idx, 0U);
  2894. ++idx2;
  2895. }];
  2896. [array release];
  2897. }
  2898. - (void)testEquality {
  2899. const int32_t kValues1[] = { 71, 72, 173 }; // With unknown value
  2900. const int32_t kValues2[] = { 71, 74, 173 }; // With unknown value
  2901. const int32_t kValues3[] = { 71, 72, 173, 74 }; // With unknown value
  2902. GPBEnumArray *array1 =
  2903. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  2904. rawValues:kValues1
  2905. count:GPBARRAYSIZE(kValues1)];
  2906. XCTAssertNotNil(array1);
  2907. GPBEnumArray *array1prime =
  2908. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue2
  2909. rawValues:kValues1
  2910. count:GPBARRAYSIZE(kValues1)];
  2911. XCTAssertNotNil(array1prime);
  2912. GPBEnumArray *array2 =
  2913. [[GPBEnumArray alloc] initWithValues:kValues2
  2914. count:GPBARRAYSIZE(kValues2)];
  2915. XCTAssertNotNil(array2);
  2916. GPBEnumArray *array3 =
  2917. [[GPBEnumArray alloc] initWithValues:kValues3
  2918. count:GPBARRAYSIZE(kValues3)];
  2919. XCTAssertNotNil(array3);
  2920. // 1/1Prime should be different objects, but equal.
  2921. XCTAssertNotEqual(array1, array1prime);
  2922. XCTAssertEqualObjects(array1, array1prime);
  2923. // Equal, so they must have same hash.
  2924. XCTAssertEqual([array1 hash], [array1prime hash]);
  2925. // But different validation functions.
  2926. XCTAssertNotEqual(array1.validationFunc, array1prime.validationFunc);
  2927. // 1/2/3 shouldn't be equal.
  2928. XCTAssertNotEqualObjects(array1, array2);
  2929. XCTAssertNotEqualObjects(array1, array3);
  2930. XCTAssertNotEqualObjects(array2, array3);
  2931. [array1 release];
  2932. [array1prime release];
  2933. [array2 release];
  2934. [array3 release];
  2935. }
  2936. - (void)testCopy {
  2937. const int32_t kValues[] = { 71, 72 };
  2938. GPBEnumArray *array =
  2939. [[GPBEnumArray alloc] initWithValues:kValues
  2940. count:GPBARRAYSIZE(kValues)];
  2941. XCTAssertNotNil(array);
  2942. [array addRawValue:1000]; // Unknown
  2943. XCTAssertEqual(array.count, 3U);
  2944. XCTAssertEqual([array rawValueAtIndex:0], 71);
  2945. XCTAssertEqual([array rawValueAtIndex:1], 72);
  2946. XCTAssertEqual([array rawValueAtIndex:2], 1000);
  2947. XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue);
  2948. GPBEnumArray *array2 = [array copy];
  2949. XCTAssertNotNil(array2);
  2950. // Should be new object but equal.
  2951. XCTAssertNotEqual(array, array2);
  2952. XCTAssertEqualObjects(array, array2);
  2953. XCTAssertEqual(array.validationFunc, array2.validationFunc);
  2954. XCTAssertTrue([array2 isKindOfClass:[GPBEnumArray class]]);
  2955. XCTAssertEqual(array2.count, 3U);
  2956. XCTAssertEqual([array2 rawValueAtIndex:0], 71);
  2957. XCTAssertEqual([array2 rawValueAtIndex:1], 72);
  2958. XCTAssertEqual([array2 rawValueAtIndex:2], 1000);
  2959. XCTAssertEqual([array2 valueAtIndex:2], kGPBUnrecognizedEnumeratorValue);
  2960. [array2 release];
  2961. [array release];
  2962. }
  2963. - (void)testArrayFromArray {
  2964. const int32_t kValues[] = { 71, 172, 173, 74 }; // Unknowns
  2965. GPBEnumArray *array =
  2966. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  2967. rawValues:kValues
  2968. count:GPBARRAYSIZE(kValues)];
  2969. XCTAssertNotNil(array);
  2970. GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array];
  2971. XCTAssertNotNil(array2);
  2972. // Should be new pointer, but equal objects.
  2973. XCTAssertNotEqual(array, array2);
  2974. XCTAssertEqualObjects(array, array2);
  2975. XCTAssertEqual(array.validationFunc, array2.validationFunc);
  2976. [array release];
  2977. }
  2978. - (void)testUnknownAdds {
  2979. GPBEnumArray *array =
  2980. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue];
  2981. XCTAssertNotNil(array);
  2982. XCTAssertThrowsSpecificNamed([array addValue:172],
  2983. NSException, NSInvalidArgumentException);
  2984. XCTAssertEqual(array.count, 0U);
  2985. const int32_t kValues1[] = { 172, 173 }; // Unknown
  2986. XCTAssertThrowsSpecificNamed([array addValues:kValues1 count:GPBARRAYSIZE(kValues1)],
  2987. NSException, NSInvalidArgumentException);
  2988. XCTAssertEqual(array.count, 0U);
  2989. [array release];
  2990. }
  2991. - (void)testRawAdds {
  2992. GPBEnumArray *array =
  2993. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue];
  2994. XCTAssertNotNil(array);
  2995. XCTAssertEqual(array.count, 0U);
  2996. [array addRawValue:71]; // Valid
  2997. XCTAssertEqual(array.count, 1U);
  2998. const int32_t kValues1[] = { 172, 173 }; // Unknown
  2999. [array addRawValues:kValues1 count:GPBARRAYSIZE(kValues1)];
  3000. XCTAssertEqual(array.count, 3U);
  3001. const int32_t kValues2[] = { 74, 71 };
  3002. GPBEnumArray *array2 =
  3003. [[GPBEnumArray alloc] initWithValues:kValues2
  3004. count:GPBARRAYSIZE(kValues2)];
  3005. XCTAssertNotNil(array2);
  3006. [array addRawValuesFromArray:array2];
  3007. XCTAssertEqual(array.count, 5U);
  3008. XCTAssertEqual([array rawValueAtIndex:0], 71);
  3009. XCTAssertEqual([array rawValueAtIndex:1], 172);
  3010. XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue);
  3011. XCTAssertEqual([array rawValueAtIndex:2], 173);
  3012. XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue);
  3013. XCTAssertEqual([array rawValueAtIndex:3], 74);
  3014. XCTAssertEqual([array rawValueAtIndex:4], 71);
  3015. [array release];
  3016. }
  3017. - (void)testUnknownInserts {
  3018. const int32_t kValues[] = { 71, 72, 73 };
  3019. GPBEnumArray *array =
  3020. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  3021. rawValues:kValues
  3022. count:GPBARRAYSIZE(kValues)];
  3023. XCTAssertNotNil(array);
  3024. XCTAssertEqual(array.count, 3U);
  3025. // First
  3026. XCTAssertThrowsSpecificNamed([array insertValue:174 atIndex:0],
  3027. NSException, NSInvalidArgumentException);
  3028. XCTAssertEqual(array.count, 3U);
  3029. // Middle
  3030. XCTAssertThrowsSpecificNamed([array insertValue:274 atIndex:1],
  3031. NSException, NSInvalidArgumentException);
  3032. XCTAssertEqual(array.count, 3U);
  3033. // End
  3034. XCTAssertThrowsSpecificNamed([array insertValue:374 atIndex:3],
  3035. NSException, NSInvalidArgumentException);
  3036. XCTAssertEqual(array.count, 3U);
  3037. [array release];
  3038. }
  3039. - (void)testRawInsert {
  3040. const int32_t kValues[] = { 71, 72, 73 };
  3041. GPBEnumArray *array =
  3042. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  3043. rawValues:kValues
  3044. count:GPBARRAYSIZE(kValues)];
  3045. XCTAssertNotNil(array);
  3046. XCTAssertEqual(array.count, 3U);
  3047. // First
  3048. [array insertRawValue:174 atIndex:0]; // Unknown
  3049. XCTAssertEqual(array.count, 4U);
  3050. // Middle
  3051. [array insertRawValue:274 atIndex:2]; // Unknown
  3052. XCTAssertEqual(array.count, 5U);
  3053. // End
  3054. [array insertRawValue:374 atIndex:5]; // Unknown
  3055. XCTAssertEqual(array.count, 6U);
  3056. // Too far.
  3057. XCTAssertThrowsSpecificNamed([array insertRawValue:74 atIndex:7],
  3058. NSException, NSRangeException);
  3059. XCTAssertEqual([array rawValueAtIndex:0], 174);
  3060. XCTAssertEqual([array valueAtIndex:0], kGPBUnrecognizedEnumeratorValue);
  3061. XCTAssertEqual([array rawValueAtIndex:1], 71);
  3062. XCTAssertEqual([array rawValueAtIndex:2], 274);
  3063. XCTAssertEqual([array valueAtIndex:2], kGPBUnrecognizedEnumeratorValue);
  3064. XCTAssertEqual([array rawValueAtIndex:3], 72);
  3065. XCTAssertEqual([array rawValueAtIndex:4], 73);
  3066. XCTAssertEqual([array rawValueAtIndex:5], 374);
  3067. XCTAssertEqual([array valueAtIndex:5], kGPBUnrecognizedEnumeratorValue);
  3068. [array release];
  3069. }
  3070. - (void)testUnknownInplaceMutation {
  3071. const int32_t kValues[] = { 71, 72, 73, 74 };
  3072. GPBEnumArray *array =
  3073. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  3074. rawValues:kValues
  3075. count:GPBARRAYSIZE(kValues)];
  3076. XCTAssertNotNil(array);
  3077. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:1 withValue:172],
  3078. NSException, NSInvalidArgumentException);
  3079. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:3 withValue:274],
  3080. NSException, NSInvalidArgumentException);
  3081. XCTAssertEqual(array.count, 4U);
  3082. XCTAssertEqual([array valueAtIndex:0], 71);
  3083. XCTAssertEqual([array valueAtIndex:1], 72);
  3084. XCTAssertEqual([array valueAtIndex:2], 73);
  3085. XCTAssertEqual([array valueAtIndex:3], 74);
  3086. [array release];
  3087. }
  3088. - (void)testRawInplaceMutation {
  3089. const int32_t kValues[] = { 71, 72, 73, 74 };
  3090. GPBEnumArray *array =
  3091. [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
  3092. rawValues:kValues
  3093. count:GPBARRAYSIZE(kValues)];
  3094. XCTAssertNotNil(array);
  3095. [array replaceValueAtIndex:1 withRawValue:172]; // Unknown
  3096. [array replaceValueAtIndex:3 withRawValue:274]; // Unknown
  3097. XCTAssertEqual(array.count, 4U);
  3098. XCTAssertEqual([array rawValueAtIndex:0], 71);
  3099. XCTAssertEqual([array rawValueAtIndex:1], 172);
  3100. XCTAssertEqual([array valueAtIndex:1], kGPBUnrecognizedEnumeratorValue);
  3101. XCTAssertEqual([array rawValueAtIndex:2], 73);
  3102. XCTAssertEqual([array rawValueAtIndex:3], 274);
  3103. XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue);
  3104. XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withRawValue:74],
  3105. NSException, NSRangeException);
  3106. [array release];
  3107. }
  3108. - (void)testRawInternalResizing {
  3109. const int32_t kValues[] = { 71, 172, 173, 74 }; // Unknown
  3110. GPBEnumArray *array =
  3111. [[GPBEnumArray alloc] initWithValues:kValues
  3112. count:GPBARRAYSIZE(kValues)];
  3113. XCTAssertNotNil(array);
  3114. // Add/remove to trigger the intneral buffer to grow/shrink.
  3115. for (int i = 0; i < 100; ++i) {
  3116. [array addRawValues:kValues count:GPBARRAYSIZE(kValues)];
  3117. }
  3118. XCTAssertEqual(array.count, 404U);
  3119. for (int i = 0; i < 100; ++i) {
  3120. [array removeValueAtIndex:(i * 2)];
  3121. }
  3122. XCTAssertEqual(array.count, 304U);
  3123. for (int i = 0; i < 100; ++i) {
  3124. [array insertRawValue:274 atIndex:(i * 3)]; // Unknown
  3125. }
  3126. XCTAssertEqual(array.count, 404U);
  3127. [array removeAll];
  3128. XCTAssertEqual(array.count, 0U);
  3129. [array release];
  3130. }
  3131. @end
  3132. #pragma mark - GPBAutocreatedArray Tests
  3133. // These are hand written tests to double check some behaviors of the
  3134. // GPBAutocreatedArray.
  3135. // NOTE: GPBAutocreatedArray is private to the library, users of the library
  3136. // should never have to directly deal with this class.
  3137. @interface GPBAutocreatedArrayTests : XCTestCase
  3138. @end
  3139. @implementation GPBAutocreatedArrayTests
  3140. - (void)testEquality {
  3141. GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
  3142. XCTAssertTrue([array isEqual:@[]]);
  3143. XCTAssertTrue([array isEqualToArray:@[]]);
  3144. XCTAssertFalse([array isEqual:@[ @"foo" ]]);
  3145. XCTAssertFalse([array isEqualToArray:@[ @"foo" ]]);
  3146. [array addObject:@"foo"];
  3147. XCTAssertFalse([array isEqual:@[]]);
  3148. XCTAssertFalse([array isEqualToArray:@[]]);
  3149. XCTAssertTrue([array isEqual:@[ @"foo" ]]);
  3150. XCTAssertTrue([array isEqualToArray:@[ @"foo" ]]);
  3151. XCTAssertFalse([array isEqual:@[ @"bar" ]]);
  3152. XCTAssertFalse([array isEqualToArray:@[ @"bar" ]]);
  3153. GPBAutocreatedArray *array2 = [[GPBAutocreatedArray alloc] init];
  3154. XCTAssertFalse([array isEqual:array2]);
  3155. XCTAssertFalse([array isEqualToArray:array2]);
  3156. [array2 addObject:@"bar"];
  3157. XCTAssertFalse([array isEqual:array2]);
  3158. XCTAssertFalse([array isEqualToArray:array2]);
  3159. [array2 replaceObjectAtIndex:0 withObject:@"foo"];
  3160. XCTAssertTrue([array isEqual:array2]);
  3161. XCTAssertTrue([array isEqualToArray:array2]);
  3162. [array2 release];
  3163. [array release];
  3164. }
  3165. - (void)testCopy {
  3166. {
  3167. GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
  3168. NSArray *cpy = [array copy];
  3169. XCTAssertTrue(cpy != array); // Ptr compare
  3170. XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
  3171. XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
  3172. XCTAssertEqual(cpy.count, (NSUInteger)0);
  3173. NSArray *cpy2 = [array copy];
  3174. XCTAssertTrue(cpy2 != array); // Ptr compare
  3175. // Can't compare cpy and cpy2 because NSArray has a singleton empty
  3176. // array it uses, so the ptrs are the same.
  3177. XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
  3178. XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
  3179. XCTAssertEqual(cpy2.count, (NSUInteger)0);
  3180. [cpy2 release];
  3181. [cpy release];
  3182. [array release];
  3183. }
  3184. {
  3185. GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
  3186. NSMutableArray *cpy = [array mutableCopy];
  3187. XCTAssertTrue(cpy != array); // Ptr compare
  3188. XCTAssertTrue([cpy isKindOfClass:[NSMutableArray class]]);
  3189. XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
  3190. XCTAssertEqual(cpy.count, (NSUInteger)0);
  3191. NSMutableArray *cpy2 = [array mutableCopy];
  3192. XCTAssertTrue(cpy2 != array); // Ptr compare
  3193. XCTAssertTrue(cpy2 != cpy); // Ptr compare
  3194. XCTAssertTrue([cpy2 isKindOfClass:[NSMutableArray class]]);
  3195. XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
  3196. XCTAssertEqual(cpy2.count, (NSUInteger)0);
  3197. [cpy2 release];
  3198. [cpy release];
  3199. [array release];
  3200. }
  3201. {
  3202. GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
  3203. [array addObject:@"foo"];
  3204. [array addObject:@"bar"];
  3205. NSArray *cpy = [array copy];
  3206. XCTAssertTrue(cpy != array); // Ptr compare
  3207. XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
  3208. XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
  3209. XCTAssertEqual(cpy.count, (NSUInteger)2);
  3210. XCTAssertEqualObjects(cpy[0], @"foo");
  3211. XCTAssertEqualObjects(cpy[1], @"bar");
  3212. NSArray *cpy2 = [array copy];
  3213. XCTAssertTrue(cpy2 != array); // Ptr compare
  3214. XCTAssertTrue(cpy2 != cpy); // Ptr compare
  3215. XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
  3216. XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
  3217. XCTAssertEqual(cpy2.count, (NSUInteger)2);
  3218. XCTAssertEqualObjects(cpy2[0], @"foo");
  3219. XCTAssertEqualObjects(cpy2[1], @"bar");
  3220. [cpy2 release];
  3221. [cpy release];
  3222. [array release];
  3223. }
  3224. {
  3225. GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
  3226. [array addObject:@"foo"];
  3227. [array addObject:@"bar"];
  3228. NSMutableArray *cpy = [array mutableCopy];
  3229. XCTAssertTrue(cpy != array); // Ptr compare
  3230. XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
  3231. XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
  3232. XCTAssertEqual(cpy.count, (NSUInteger)2);
  3233. XCTAssertEqualObjects(cpy[0], @"foo");
  3234. XCTAssertEqualObjects(cpy[1], @"bar");
  3235. NSMutableArray *cpy2 = [array mutableCopy];
  3236. XCTAssertTrue(cpy2 != array); // Ptr compare
  3237. XCTAssertTrue(cpy2 != cpy); // Ptr compare
  3238. XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
  3239. XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
  3240. XCTAssertEqual(cpy2.count, (NSUInteger)2);
  3241. XCTAssertEqualObjects(cpy2[0], @"foo");
  3242. XCTAssertEqualObjects(cpy2[1], @"bar");
  3243. [cpy2 release];
  3244. [cpy release];
  3245. [array release];
  3246. }
  3247. }
  3248. - (void)testIndexedSubscriptSupport {
  3249. // The base NSArray/NSMutableArray behaviors for *IndexedSubscript methods
  3250. // should still work via the methods that one has to override to make an
  3251. // NSMutableArray subclass. i.e. - this should "just work" and if these
  3252. // crash/fail, then something is wrong in how NSMutableArray is subclassed.
  3253. GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
  3254. [array addObject:@"foo"];
  3255. [array addObject:@"bar"];
  3256. XCTAssertEqual(array.count, (NSUInteger)2);
  3257. XCTAssertEqualObjects(array[0], @"foo");
  3258. XCTAssertEqualObjects(array[1], @"bar");
  3259. array[0] = @"foo2";
  3260. array[2] = @"baz";
  3261. XCTAssertEqual(array.count, (NSUInteger)3);
  3262. XCTAssertEqualObjects(array[0], @"foo2");
  3263. XCTAssertEqualObjects(array[1], @"bar");
  3264. XCTAssertEqualObjects(array[2], @"baz");
  3265. [array release];
  3266. }
  3267. @end