testjsondata.pp 74 KB

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