GPBDictionaryTests+UInt64.m 137 KB

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