testjsondata.pp 77 KB

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