testjsondata.pp 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645
  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. { TTestJSONString }
  19. TTestJSONString = Class(TTestCase)
  20. Private
  21. Procedure TestTo(Const Src,Dest : String);
  22. Procedure TestFrom(Const Src,Dest : String);
  23. Published
  24. Procedure TestJSONStringToString;
  25. Procedure TestStringToJSONString;
  26. end;
  27. { TTestJSON }
  28. TTestJSON = Class(TTestCase)
  29. Protected
  30. Procedure TestItemCount(J : TJSONData;Expected : Integer);
  31. Procedure TestJSONType(J : TJSONData;Expected : TJSONType);
  32. Procedure TestJSON(J : TJSONData;Expected : String);
  33. Procedure TestIsNull(J : TJSONData;Expected : Boolean);
  34. Procedure TestAsBoolean(J : TJSONData;Expected : Boolean; ExpectError : boolean = False);
  35. Procedure TestAsInteger(J : TJSONData; Expected : Integer; ExpectError : boolean = False);
  36. Procedure TestAsInt64(J : TJSONData; Expected : Int64; ExpectError : boolean = False);
  37. Procedure TestAsString(J : TJSONData; Expected : String; ExpectError : boolean = False);
  38. Procedure TestAsFloat(J : TJSONData; Expected : TJSONFloat; ExpectError : boolean = False);
  39. end;
  40. { TTestNull }
  41. TTestNull = class(TTestJSON)
  42. published
  43. procedure TestNull;
  44. Procedure TestClone;
  45. Procedure TestFormat;
  46. end;
  47. { TTestBoolean }
  48. TTestBoolean = class(TTestJSON)
  49. published
  50. procedure TestTrue;
  51. procedure TestFalse;
  52. Procedure TestClone;
  53. Procedure TestFormat;
  54. end;
  55. { TTestInteger }
  56. TTestInteger = class(TTestJSON)
  57. Private
  58. Procedure DoTest(I : Integer);
  59. published
  60. procedure TestPositive;
  61. procedure TestNegative;
  62. procedure TestZero;
  63. Procedure TestClone;
  64. Procedure TestFormat;
  65. end;
  66. { TTestInt64 }
  67. TTestInt64 = class(TTestJSON)
  68. Private
  69. Procedure DoTest(I : Int64);
  70. published
  71. procedure TestPositive;
  72. procedure TestNegative;
  73. procedure TestZero;
  74. Procedure TestClone;
  75. Procedure TestFormat;
  76. end;
  77. { TTestFloat }
  78. TTestFloat = class(TTestJSON)
  79. Private
  80. Procedure DoTest(F : TJSONFloat);
  81. published
  82. procedure TestPositive;
  83. procedure TestNegative;
  84. procedure TestZero;
  85. Procedure TestClone;
  86. Procedure TestFormat;
  87. end;
  88. { TTestString }
  89. TTestString = class(TTestJSON)
  90. private
  91. procedure DoTestFloat(F: TJSOnFloat; S: String; OK: Boolean);
  92. published
  93. procedure TestString;
  94. procedure TestInteger;
  95. procedure TestNegativeInteger;
  96. procedure TestFloat;
  97. procedure TestNegativeFloat;
  98. Procedure TestBooleanTrue;
  99. Procedure TestBooleanFalse;
  100. Procedure TestClone;
  101. Procedure TestFormat;
  102. end;
  103. { TTestArray }
  104. TTestArray = class(TTestJSON)
  105. private
  106. procedure TestAddBoolean(B : Boolean);
  107. procedure TestInsertBoolean(B : Boolean);
  108. published
  109. Procedure TestCreate;
  110. Procedure TestCreateString;
  111. Procedure TestCreatePchar;
  112. procedure TestCreateStrings;
  113. procedure TestCreateInteger;
  114. procedure TestCreateInt64;
  115. procedure TestCreateFloat;
  116. procedure TestCreateBoolean;
  117. procedure TestCreateObject;
  118. procedure TestCreateJSONString;
  119. procedure TestCreateJSONObject;
  120. procedure TestCreateNilPointer;
  121. procedure TestCreatePointer;
  122. procedure TestAddInteger;
  123. procedure TestAddInt64;
  124. procedure TestAddFloat;
  125. procedure TestAddBooleanTrue;
  126. procedure TestAddBooleanFalse;
  127. procedure TestAddString;
  128. procedure TestAddNull;
  129. procedure TestAddObject;
  130. procedure TestAddArray;
  131. procedure TestInsertInteger;
  132. procedure TestInsertInt64;
  133. procedure TestInsertFloat;
  134. procedure TestInsertBooleanTrue;
  135. procedure TestInsertBooleanFalse;
  136. procedure TestInsertString;
  137. procedure TestInsertNull;
  138. procedure TestInsertObject;
  139. procedure TestInsertArray;
  140. procedure TestMove;
  141. procedure TestExchange;
  142. procedure TestDelete;
  143. procedure TestRemove;
  144. Procedure TestClone;
  145. Procedure TestFormat;
  146. end;
  147. { TTestObject }
  148. TTestObject = class(TTestJSON)
  149. private
  150. procedure TestAddBoolean(B : Boolean);
  151. Procedure TestAccessError;
  152. published
  153. Procedure TestCreate;
  154. Procedure TestCreateString;
  155. Procedure TestCreatePchar;
  156. procedure TestCreateStrings;
  157. procedure TestCreateInteger;
  158. procedure TestCreateInt64;
  159. procedure TestCreateFloat;
  160. procedure TestCreateBoolean;
  161. procedure TestCreateObject;
  162. procedure TestCreateJSONString;
  163. procedure TestCreateJSONObject;
  164. procedure TestCreateNilPointer;
  165. procedure TestCreatePointer;
  166. procedure TestAddInteger;
  167. procedure TestAddInt64;
  168. procedure TestAddFloat;
  169. procedure TestAddBooleanTrue;
  170. procedure TestAddBooleanFalse;
  171. procedure TestAddString;
  172. procedure TestAddNull;
  173. procedure TestAddObject;
  174. procedure TestAddArray;
  175. procedure TestDelete;
  176. procedure TestRemove;
  177. procedure TestClone;
  178. procedure TestExtract;
  179. Procedure TestNonExistingAccessError;
  180. Procedure TestFormat;
  181. Procedure TestFind;
  182. end;
  183. implementation
  184. { TTestJSON }
  185. procedure TTestJSON.TestItemCount(J: TJSONData; Expected: Integer);
  186. begin
  187. AssertEquals(J.ClassName+'.ItemCount',Expected,J.Count);
  188. end;
  189. procedure TTestJSON.TestJSONType(J: TJSONData; Expected: TJSONType);
  190. begin
  191. AssertEquals(J.ClassName+'.JSONType',Ord(Expected),Ord(J.JSONType));
  192. end;
  193. procedure TTestJSON.TestJSON(J: TJSONData; Expected: String);
  194. begin
  195. AssertEquals(J.ClassName+'.AsJSON',Expected,J.AsJSON);
  196. end;
  197. procedure TTestJSON.TestIsNull(J: TJSONData; Expected: Boolean);
  198. begin
  199. AssertEquals(J.ClassName+'.IsNull',Expected,J.IsNull);
  200. end;
  201. procedure TTestJSON.TestAsBoolean(J: TJSONData; Expected: Boolean; ExpectError: boolean = False);
  202. Var
  203. B : Boolean;
  204. AssignOK : Boolean;
  205. Msg : String;
  206. begin
  207. AssignOK:=False;
  208. Try
  209. B:=J.AsBoolean;
  210. AssignOK:=True;
  211. If Not ExpectError then
  212. AssertEquals(J.Classname+'.AsBoolean',Expected,B);
  213. except
  214. On E : Exception do
  215. begin
  216. AssignOK:=False;
  217. Msg:=E.Message;
  218. end;
  219. end;
  220. If ExpectError then
  221. begin
  222. If AssignOK then
  223. Fail(J.ClassName+'.AsBoolean must raise error');
  224. end
  225. else
  226. begin
  227. If not AssignOK then
  228. Fail(J.ClassName+'.AsBoolean raised unexpected exception: '+Msg)
  229. end;
  230. end;
  231. procedure TTestJSON.TestAsInteger(J: TJSONData; Expected: Integer;
  232. ExpectError: boolean);
  233. Var
  234. I : Integer;
  235. AssignOK : Boolean;
  236. Msg : String;
  237. begin
  238. AssignOK:=False;
  239. Try
  240. I:=J.AsInteger;
  241. AssignOK:=True;
  242. If Not ExpectError then
  243. AssertEquals(J.Classname+'.AsInteger',Expected,I);
  244. except
  245. On E : Exception do
  246. begin
  247. AssignOK:=False;
  248. Msg:=E.Message;
  249. end;
  250. end;
  251. If ExpectError then
  252. begin
  253. If AssignOK then
  254. Fail(J.ClassName+'.AsInteger must raise error');
  255. end
  256. else
  257. begin
  258. If not AssignOK then
  259. Fail(J.ClassName+'.AsInteger raised unexpected exception: '+Msg)
  260. end;
  261. end;
  262. procedure TTestJSON.TestAsInt64(J: TJSONData; Expected: Int64;
  263. ExpectError: boolean);
  264. Var
  265. I : Int64;
  266. AssignOK : Boolean;
  267. Msg : String;
  268. begin
  269. AssignOK:=False;
  270. Try
  271. I:=J.AsInt64;
  272. AssignOK:=True;
  273. If Not ExpectError then
  274. AssertEquals(J.Classname+'.AsInt64',Expected,I);
  275. except
  276. On E : Exception do
  277. begin
  278. AssignOK:=False;
  279. Msg:=E.Message;
  280. end;
  281. end;
  282. If ExpectError then
  283. begin
  284. If AssignOK then
  285. Fail(J.ClassName+'.AsInt64 must raise error');
  286. end
  287. else
  288. begin
  289. If not AssignOK then
  290. Fail(J.ClassName+'.AsInt64 raised unexpected exception: '+Msg)
  291. end;
  292. end;
  293. procedure TTestJSON.TestAsString(J: TJSONData; Expected: String;
  294. ExpectError: boolean);
  295. Var
  296. S : String;
  297. AssignOK : Boolean;
  298. Msg : String;
  299. begin
  300. AssignOK:=False;
  301. Try
  302. S:=J.AsString;
  303. AssignOK:=True;
  304. If Not ExpectError then
  305. AssertEquals(J.Classname+'.AsString',Expected,S);
  306. except
  307. On E : Exception do
  308. begin
  309. AssignOK:=False;
  310. Msg:=E.Message;
  311. end;
  312. end;
  313. If ExpectError then
  314. begin
  315. If AssignOK then
  316. Fail(J.ClassName+'.AsString must raise error');
  317. end
  318. else
  319. begin
  320. If not AssignOK then
  321. Fail(J.ClassName+'.AsString raised unexpected exception: '+Msg)
  322. end;
  323. end;
  324. procedure TTestJSON.TestAsFloat(J: TJSONData; Expected: TJSONFloat;
  325. ExpectError: boolean);
  326. Var
  327. F : TJSONFloat;
  328. AssignOK : Boolean;
  329. Msg : String;
  330. begin
  331. AssignOK:=False;
  332. Try
  333. F:=J.AsFloat;
  334. AssignOK:=True;
  335. If Not ExpectError then
  336. AssertEquals(J.Classname+'.AsFloat',Expected,F);
  337. except
  338. On E : Exception do
  339. begin
  340. AssignOK:=False;
  341. Msg:=E.Message;
  342. end;
  343. end;
  344. If ExpectError then
  345. begin
  346. If AssignOK then
  347. Fail(J.ClassName+'.AsFloat must raise error');
  348. end
  349. else
  350. begin
  351. If not AssignOK then
  352. Fail(J.ClassName+'.AsFloat raised unexpected exception: '+Msg)
  353. end;
  354. end;
  355. { TTestBoolean }
  356. procedure TTestBoolean.TestTrue;
  357. Var
  358. J : TJSONBoolean;
  359. begin
  360. J:=TJSONBoolean.Create(True);
  361. try
  362. TestJSONType(J,jtBoolean);
  363. TestItemCount(J,0);
  364. TestJSON(J,'true');
  365. TestIsNull(J,False);
  366. TestAsBoolean(J,True);
  367. TestAsInteger(J,1);
  368. TestAsInt64(J,1);
  369. TestAsString(J,BoolToStr(True,True));
  370. TestAsFloat(J,1.0);
  371. finally
  372. FreeAndNil(J);
  373. end;
  374. end;
  375. procedure TTestBoolean.TestFalse;
  376. Var
  377. J : TJSONBoolean;
  378. begin
  379. J:=TJSONBoolean.Create(False);
  380. try
  381. TestJSONType(J,jtBoolean);
  382. TestItemCount(J,0);
  383. TestJSON(J,'false');
  384. TestIsNull(J,False);
  385. TestAsBoolean(J,False);
  386. TestAsInteger(J,0);
  387. TestAsInt64(J,0);
  388. TestAsString(J,BoolToStr(False,True));
  389. TestAsFloat(J,0.0);
  390. finally
  391. FreeAndNil(J);
  392. end;
  393. end;
  394. procedure TTestBoolean.TestClone;
  395. Var
  396. B : TJSONBoolean;
  397. D : TJSONData;
  398. begin
  399. B:=TJSONBoolean.Create(true);
  400. try
  401. D:=B.Clone;
  402. try
  403. TestJSONType(D,jtBoolean);
  404. TestAsBoolean(D,true);
  405. finally
  406. D.Free;
  407. end;
  408. finally
  409. FreeAndNil(B);
  410. end;
  411. end;
  412. procedure TTestBoolean.TestFormat;
  413. Var
  414. B : TJSONBoolean;
  415. begin
  416. B:=TJSONBoolean.Create(true);
  417. try
  418. AssertEquals('FormatJSON same as asJSON',B.asJSON,B.FormatJSON);
  419. finally
  420. B.Free;
  421. end;
  422. end;
  423. { TTestNull }
  424. procedure TTestNull.TestNull;
  425. Var
  426. J : TJSONNull;
  427. begin
  428. J:=TJSONNull.Create;
  429. try
  430. TestJSONType(J,jtNull);
  431. TestItemCount(J,0);
  432. TestJSON(J,'null');
  433. TestIsNull(J,True);
  434. TestAsBoolean(J,False,True);
  435. TestAsInteger(J,0,true);
  436. TestAsInt64(J,0,true);
  437. TestAsString(J,BoolToStr(False),true);
  438. TestAsFloat(J,0.0,true);
  439. finally
  440. FreeAndNil(J);
  441. end;
  442. end;
  443. procedure TTestNull.TestClone;
  444. Var
  445. J : TJSONNull;
  446. D : TJSONData;
  447. begin
  448. J:=TJSONNull.Create;
  449. try
  450. D:=J.Clone;
  451. try
  452. TestIsNull(D,True);
  453. finally
  454. D.Free;
  455. end;
  456. finally
  457. FreeAndNil(J);
  458. end;
  459. end;
  460. procedure TTestNull.TestFormat;
  461. Var
  462. J : TJSONNull;
  463. begin
  464. J:=TJSONNull.Create;
  465. try
  466. AssertEquals('FormatJSON same as asJSON',J.asJSON,J.FormatJSON);
  467. finally
  468. J.Free;
  469. end;
  470. end;
  471. { TTestString }
  472. procedure TTestString.TestString;
  473. Const
  474. S = 'A string';
  475. Var
  476. J : TJSONString;
  477. begin
  478. J:=TJSONString.Create(S);
  479. try
  480. TestJSONType(J,jtString);
  481. TestItemCount(J,0);
  482. TestJSON(J,'"'+S+'"');
  483. TestIsNull(J,False);
  484. TestAsBoolean(J,False,True);
  485. TestAsInteger(J,0,true);
  486. TestAsInt64(J,0,true);
  487. TestAsString(J,S);
  488. TestAsFloat(J,0.0,true);
  489. finally
  490. FreeAndNil(J);
  491. end;
  492. end;
  493. procedure TTestString.TestInteger;
  494. Const
  495. S = '1';
  496. Var
  497. J : TJSONString;
  498. begin
  499. J:=TJSONString.Create(S);
  500. try
  501. TestJSONType(J,jtString);
  502. TestItemCount(J,0);
  503. TestJSON(J,'"'+S+'"');
  504. TestIsNull(J,False);
  505. TestAsBoolean(J,True,False);
  506. TestAsInteger(J,1,False);
  507. TestAsInt64(J,1,False);
  508. TestAsString(J,S);
  509. TestAsFloat(J,1.0,False);
  510. finally
  511. FreeAndNil(J);
  512. end;
  513. end;
  514. procedure TTestString.TestNegativeInteger;
  515. Const
  516. S = '-1';
  517. Var
  518. J : TJSONString;
  519. begin
  520. J:=TJSONString.Create(S);
  521. try
  522. TestJSONType(J,jtString);
  523. TestItemCount(J,0);
  524. TestJSON(J,'"'+S+'"');
  525. TestIsNull(J,False);
  526. TestAsBoolean(J,True,False);
  527. TestAsInteger(J,-1,False);
  528. TestAsInt64(J,-1,False);
  529. TestAsString(J,S);
  530. TestAsFloat(J,-1.0,False);
  531. finally
  532. FreeAndNil(J);
  533. end;
  534. end;
  535. procedure TTestString.TestFloat;
  536. begin
  537. DoTestFloat(1.0,'1.0',True);
  538. DoTestFloat(1.0,'1',True);
  539. DoTestFloat(1.0,'1e0',True);
  540. DoTestFloat(1.2,'1.2',True);
  541. DoTestFloat(12.0,'1.2e1',True);
  542. end;
  543. procedure TTestString.TestNegativeFloat;
  544. begin
  545. DoTestFloat(-1.0,'-1.0',True);
  546. DoTestFloat(-1.0,'-1',True);
  547. DoTestFloat(-1.0,'-1e0',True);
  548. DoTestFloat(-1.2,'-1.2',True);
  549. DoTestFloat(-12.0,'-1.2e1',True);
  550. end;
  551. procedure TTestString.TestBooleanTrue;
  552. Const
  553. S = 'true';
  554. Var
  555. J : TJSONString;
  556. begin
  557. J:=TJSONString.Create(S);
  558. try
  559. TestJSONType(J,jtString);
  560. TestItemCount(J,0);
  561. TestJSON(J,'"'+S+'"');
  562. TestIsNull(J,False);
  563. TestAsBoolean(J,True,False);
  564. TestAsInteger(J,-1,True);
  565. TestAsInt64(J,-1,True);
  566. TestAsString(J,S);
  567. TestAsFloat(J,-1.0,True);
  568. finally
  569. FreeAndNil(J);
  570. end;
  571. end;
  572. procedure TTestString.TestBooleanFalse;
  573. Const
  574. S = 'false';
  575. Var
  576. J : TJSONString;
  577. begin
  578. J:=TJSONString.Create(S);
  579. try
  580. TestJSONType(J,jtString);
  581. TestItemCount(J,0);
  582. TestJSON(J,'"'+S+'"');
  583. TestIsNull(J,False);
  584. TestAsBoolean(J,False,False);
  585. TestAsInteger(J,0,True);
  586. TestAsInt64(J,0,True);
  587. TestAsString(J,S);
  588. TestAsFloat(J,0,True);
  589. finally
  590. FreeAndNil(J);
  591. end;
  592. end;
  593. procedure TTestString.TestClone;
  594. Var
  595. S : TJSONString;
  596. D : TJSONData;
  597. begin
  598. S:=TJSONString.Create('aloha');
  599. try
  600. D:=S.Clone;
  601. try
  602. TestJSONType(D,jtString);
  603. TestAsString(D,'aloha');
  604. finally
  605. D.Free;
  606. end;
  607. finally
  608. FreeAndNil(S);
  609. end;
  610. end;
  611. procedure TTestString.TestFormat;
  612. Var
  613. S : TJSONString;
  614. begin
  615. S:=TJSONString.Create('aloha');
  616. try
  617. AssertEquals('FormatJSON equals JSON',S.AsJSON,S.FormatJSOn);
  618. finally
  619. FreeAndNil(S);
  620. end;
  621. end;
  622. procedure TTestString.DoTestFloat(F : TJSOnFloat;S : String; OK : Boolean);
  623. Var
  624. J : TJSONString;
  625. begin
  626. J:=TJSONString.Create(S);
  627. try
  628. TestJSONType(J,jtString);
  629. TestItemCount(J,0);
  630. TestJSON(J,'"'+S+'"');
  631. TestIsNull(J,False);
  632. TestAsBoolean(J,(F<>0),Not OK);
  633. TestAsInteger(J,Round(F),(Pos('.',S)<>0) or (Pos('E',UpperCase(S))<>0));
  634. TestAsInt64(J,Round(F),(Pos('.',S)<>0) or (Pos('E',UpperCase(S))<>0));
  635. TestAsString(J,S);
  636. TestAsFloat(J,F,Not OK);
  637. finally
  638. FreeAndNil(J);
  639. end;
  640. end;
  641. { TTestInteger }
  642. procedure TTestInteger.DoTest(I: Integer);
  643. Var
  644. J : TJSONIntegerNumber;
  645. begin
  646. J:=TJSONIntegerNumber.Create(I);
  647. try
  648. TestJSONType(J,jtNumber);
  649. TestItemCount(J,0);
  650. AssertEquals('Numbertype is ntInteger',ord(ntInteger),Ord(J.NumberType));
  651. TestJSON(J,IntToStr(i));
  652. TestIsNull(J,False);
  653. TestAsBoolean(J,(I<>0));
  654. TestAsInteger(J,I);
  655. TestAsInt64(J,I);
  656. TestAsString(J,IntToStr(I));
  657. TestAsFloat(J,I);
  658. finally
  659. FreeAndNil(J);
  660. end;
  661. end;
  662. procedure TTestInteger.TestPositive;
  663. begin
  664. DoTest(1);
  665. end;
  666. procedure TTestInteger.TestNegative;
  667. begin
  668. DoTest(-1);
  669. end;
  670. procedure TTestInteger.TestZero;
  671. begin
  672. DoTest(0);
  673. end;
  674. procedure TTestInteger.TestClone;
  675. Var
  676. I : TJSONIntegerNumber;
  677. D : TJSONData;
  678. begin
  679. I:=TJSONIntegerNumber.Create(99);
  680. try
  681. D:=I.Clone;
  682. try
  683. TestJSONType(D,jtNumber);
  684. TestAsInteger(D,99);
  685. finally
  686. D.Free;
  687. end;
  688. finally
  689. FreeAndNil(I);
  690. end;
  691. end;
  692. procedure TTestInteger.TestFormat;
  693. Var
  694. I : TJSONIntegerNumber;
  695. begin
  696. I:=TJSONIntegerNumber.Create(99);
  697. try
  698. AssertEquals('FormatJSON equal to JSON',I.AsJSON,I.FormatJSON);
  699. finally
  700. FreeAndNil(I);
  701. end;
  702. end;
  703. { TTestInt64 }
  704. procedure TTestInt64.DoTest(I: Int64);
  705. Var
  706. J : TJSONInt64Number;
  707. begin
  708. J:=TJSONInt64Number.Create(I);
  709. try
  710. TestJSONType(J,jtNumber);
  711. TestItemCount(J,0);
  712. AssertEquals('Numbertype is ntInt64',ord(ntInt64),Ord(J.NumberType));
  713. TestJSON(J,IntToStr(i));
  714. TestIsNull(J,False);
  715. TestAsBoolean(J,(I<>0));
  716. TestAsInteger(J,I);
  717. TestAsInt64(J,I);
  718. TestAsString(J,IntToStr(I));
  719. TestAsFloat(J,I);
  720. finally
  721. FreeAndNil(J);
  722. end;
  723. end;
  724. procedure TTestInt64.TestPositive;
  725. begin
  726. DoTest(1);
  727. end;
  728. procedure TTestInt64.TestNegative;
  729. begin
  730. DoTest(-1);
  731. end;
  732. procedure TTestInt64.TestZero;
  733. begin
  734. DoTest(0);
  735. end;
  736. procedure TTestInt64.TestClone;
  737. Var
  738. I : TJSONInt64Number;
  739. D : TJSONData;
  740. begin
  741. I:=TJSONInt64Number.Create(99);
  742. try
  743. D:=I.Clone;
  744. try
  745. TestJSONType(D,jtNumber);
  746. AssertEquals('Numbertype is ntInt64',ord(ntInt64),Ord(TJSONInt64Number(D).NumberType));
  747. TestAsInteger(D,99);
  748. finally
  749. D.Free;
  750. end;
  751. finally
  752. FreeAndNil(I);
  753. end;
  754. end;
  755. procedure TTestInt64.TestFormat;
  756. Var
  757. I : TJSONInt64Number;
  758. begin
  759. I:=TJSONInt64Number.Create(99);
  760. try
  761. AssertEquals('FormatJSON equal to JSON',I.AsJSON,I.FormatJSON);
  762. finally
  763. FreeAndNil(I);
  764. end;
  765. end;
  766. { TTestFloat }
  767. procedure TTestFloat.DoTest(F: TJSONFloat);
  768. Var
  769. J : TJSONFloatNumber;
  770. S : String;
  771. begin
  772. Str(F,S);
  773. J:=TJSONFloatNumber.Create(F);
  774. try
  775. TestJSONType(J,jtNumber);
  776. TestItemCount(J,0);
  777. AssertEquals('Numbertype is ntFloat',ord(ntFloat),Ord(J.NumberType));
  778. TestJSON(J,S);
  779. TestIsNull(J,False);
  780. TestAsBoolean(J,(F<>0));
  781. TestAsInteger(J,Round(F));
  782. TestAsInt64(J,Round(F));
  783. TestAsString(J,S);
  784. TestAsFloat(J,F);
  785. finally
  786. FreeAndNil(J);
  787. end;
  788. end;
  789. procedure TTestFloat.TestPositive;
  790. begin
  791. DoTest(1.0);
  792. DoTest(1.2);
  793. DoTest(1.2e1);
  794. DoTest(1.2e-1);
  795. DoTest(1.2e10);
  796. DoTest(1.2e-10);
  797. end;
  798. procedure TTestFloat.TestNegative;
  799. begin
  800. DoTest(-1.0);
  801. DoTest(-1.2);
  802. DoTest(-1.2e1);
  803. DoTest(-1.2e-1);
  804. DoTest(-1.2e10);
  805. DoTest(-1.2e-10);
  806. end;
  807. procedure TTestFloat.TestZero;
  808. begin
  809. DoTest(0.0);
  810. end;
  811. procedure TTestFloat.TestClone;
  812. Var
  813. F : TJSONFloatNumber;
  814. D : TJSONData;
  815. begin
  816. F:=TJSONFloatNumber.Create(1.23);
  817. try
  818. D:=F.Clone;
  819. try
  820. TestJSONType(D,jtNumber);
  821. AssertEquals('Numbertype is ntFloat',ord(ntFloat),Ord(TJSONFloatNumber(D).NumberType));
  822. TestAsFloat(D,1.23);
  823. finally
  824. D.Free;
  825. end;
  826. finally
  827. FreeAndNil(F);
  828. end;
  829. end;
  830. procedure TTestFloat.TestFormat;
  831. Var
  832. F : TJSONFloatNumber;
  833. begin
  834. F:=TJSONFloatNumber.Create(1.23);
  835. try
  836. AssertEquals('FormatJSON equals asJSON',F.AsJSON,F.FormatJSON);
  837. finally
  838. FreeAndNil(F);
  839. end;
  840. end;
  841. { TTestArray }
  842. procedure TTestArray.TestCreate;
  843. Var
  844. J : TJSONArray;
  845. begin
  846. J:=TJSonArray.Create;
  847. try
  848. TestJSONType(J,jtArray);
  849. TestItemCount(J,0);
  850. TestJSON(J,'[]');
  851. TestIsNull(J,False);
  852. TestAsBoolean(J,False,True);
  853. TestAsInteger(J,1,True);
  854. TestAsInt64(J,1,True);
  855. TestAsString(J,'',True);
  856. TestAsFloat(J,0.0,True);
  857. finally
  858. FreeAndNil(J);
  859. end;
  860. end;
  861. procedure TTestArray.TestCreateString;
  862. Const
  863. S = 'A string';
  864. Var
  865. J : TJSONArray;
  866. begin
  867. J:=TJSonArray.Create([S]);
  868. try
  869. TestJSONType(J,jtArray);
  870. TestItemCount(J,1);
  871. TestJSONType(J[0],jtString);
  872. TestJSON(J,'["'+S+'"]');
  873. TestIsNull(J,False);
  874. finally
  875. FreeAndNil(J);
  876. end;
  877. end;
  878. procedure TTestArray.TestCreatePChar;
  879. Const
  880. S = 'A string';
  881. Var
  882. J : TJSONArray;
  883. begin
  884. J:=TJSonArray.Create([Pchar(S)]);
  885. try
  886. TestJSONType(J,jtArray);
  887. TestItemCount(J,1);
  888. TestJSONType(J[0],jtString);
  889. TestJSON(J,'["'+S+'"]');
  890. TestIsNull(J,False);
  891. finally
  892. FreeAndNil(J);
  893. end;
  894. end;
  895. procedure TTestArray.TestCreateStrings;
  896. Const
  897. S = 'A string';
  898. T = 'B string';
  899. Var
  900. J : TJSONArray;
  901. begin
  902. J:=TJSONArray.Create([S,T]);
  903. try
  904. TestJSONType(J,jtArray);
  905. TestItemCount(J,2);
  906. TestJSONType(J[0],jtString);
  907. TestJSONType(J[1],jtString);
  908. TestJSON(J,'["'+S+'", "'+T+'"]');
  909. TestIsNull(J,False);
  910. finally
  911. FreeAndNil(J);
  912. end;
  913. end;
  914. procedure TTestArray.TestCreateInteger;
  915. Const
  916. S = 3;
  917. Var
  918. J : TJSONArray;
  919. begin
  920. J:=TJSonArray.Create([S]);
  921. try
  922. TestJSONType(J,jtArray);
  923. TestItemCount(J,1);
  924. TestJSONType(J[0],jtNumber);
  925. TestJSON(J,'[3]');
  926. finally
  927. FreeAndNil(J);
  928. end;
  929. end;
  930. procedure TTestArray.TestCreateFloat;
  931. Const
  932. S : double = 1.2;
  933. Var
  934. J : TJSONArray;
  935. r : String;
  936. begin
  937. J:=TJSonArray.Create([S]);
  938. try
  939. TestJSONType(J,jtArray);
  940. TestItemCount(J,1);
  941. TestJSONType(J[0],jtNumber);
  942. Str(S,R);
  943. TestJSON(J,'['+R+']');
  944. finally
  945. FreeAndNil(J);
  946. end;
  947. end;
  948. procedure TTestArray.TestCreateInt64;
  949. Const
  950. S : Int64 = $FFFFFFFFFFFFF;
  951. Var
  952. J : TJSONArray;
  953. begin
  954. J:=TJSonArray.Create([S]);
  955. try
  956. TestJSONType(J,jtArray);
  957. TestItemCount(J,1);
  958. TestJSONType(J[0],jtNumber);
  959. TestJSON(J,'['+IntToStr(S)+']');
  960. finally
  961. FreeAndNil(J);
  962. end;
  963. end;
  964. procedure TTestArray.TestCreateBoolean;
  965. Const
  966. S = True;
  967. Var
  968. J : TJSONArray;
  969. begin
  970. J:=TJSonArray.Create([S]);
  971. try
  972. TestJSONType(J,jtArray);
  973. TestItemCount(J,1);
  974. TestJSONType(J[0],jtBoolean);
  975. TestJSON(J,'[true]');
  976. finally
  977. FreeAndNil(J);
  978. end;
  979. end;
  980. procedure TTestArray.TestCreateJSONObject;
  981. Var
  982. J : TJSONArray;
  983. begin
  984. J:=TJSonArray.Create([TJSONObject.Create]);
  985. try
  986. TestItemCount(J,1);
  987. TestJSONType(J[0],jtObject);
  988. TestJSON(J,'[{}]');
  989. finally
  990. FreeAndNil(J);
  991. end;
  992. end;
  993. procedure TTestArray.TestCreateJSONString;
  994. Const
  995. S = 'A string';
  996. Var
  997. J : TJSONArray;
  998. begin
  999. J:=TJSonArray.Create([TJSONString.Create(S)]);
  1000. try
  1001. TestItemCount(J,1);
  1002. TestJSONType(J[0],jtString);
  1003. TestJSON(J,'["'+S+'"]');
  1004. finally
  1005. FreeAndNil(J);
  1006. end;
  1007. end;
  1008. procedure TTestArray.TestCreateObject;
  1009. Var
  1010. J : TJSONArray;
  1011. begin
  1012. J:=Nil;
  1013. try
  1014. Try
  1015. J:=TJSONArray.Create([TObject.Create]);
  1016. Fail('Array constructor accepts only TJSONData');
  1017. finally
  1018. FreeAndNil(J);
  1019. end;
  1020. except
  1021. // Should be OK.
  1022. end;
  1023. end;
  1024. procedure TTestArray.TestCreateNilPointer;
  1025. Var
  1026. J : TJSONArray;
  1027. P : Pointer;
  1028. begin
  1029. J:=Nil;
  1030. P:=Nil;
  1031. Try
  1032. J:=TJSONArray.Create([P]);
  1033. TestJSONType(J[0],jtNull);
  1034. finally
  1035. FreeAndNil(J);
  1036. end;
  1037. end;
  1038. procedure TTestArray.TestCreatePointer;
  1039. Var
  1040. J : TJSONArray;
  1041. P : Pointer;
  1042. begin
  1043. J:=Nil;
  1044. P:=@Self;
  1045. try
  1046. Try
  1047. J:=TJSONArray.Create([P]);
  1048. Fail('Array constructor accepts only NIL pointers');
  1049. finally
  1050. FreeAndNil(J);
  1051. end;
  1052. except
  1053. // Should be OK.
  1054. end;
  1055. end;
  1056. procedure TTestArray.TestAddInteger;
  1057. Var
  1058. J : TJSONArray;
  1059. begin
  1060. J:=TJSonArray.Create;
  1061. try
  1062. J.Add(Integer(0));
  1063. TestItemCount(J,1);
  1064. TestJSONType(J[0],jtNumber);
  1065. AssertEquals('J[0] is TJSONIntegerNumber',J[0].ClassType,TJSONIntegerNumber);
  1066. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  1067. AssertEquals('J.Integers[0]=0',0,J.integers[0]);
  1068. TestAsInteger(J[0],0);
  1069. TestAsInt64(J[0],0);
  1070. TestJSON(J,'[0]');
  1071. finally
  1072. FreeAndNil(J);
  1073. end;
  1074. end;
  1075. procedure TTestArray.TestAddInt64;
  1076. Var
  1077. J : TJSONArray;
  1078. begin
  1079. J:=TJSonArray.Create;
  1080. try
  1081. J.Add(Int64(0));
  1082. TestItemCount(J,1);
  1083. TestJSONType(J[0],jtNumber);
  1084. AssertEquals('J[0] is TJSONInt64Number',J[0].ClassType,TJSONInt64Number);
  1085. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  1086. AssertEquals('J.Int64s[0]=0',0,J.Int64s[0]);
  1087. TestAsInteger(J[0],0);
  1088. TestAsInt64(J[0],0);
  1089. TestJSON(J,'[0]');
  1090. finally
  1091. FreeAndNil(J);
  1092. end;
  1093. end;
  1094. procedure TTestArray.TestAddFloat;
  1095. Var
  1096. J : TJSONArray;
  1097. S : String;
  1098. F : TJSONFloat;
  1099. begin
  1100. F:=1.2;
  1101. J:=TJSonArray.Create;
  1102. try
  1103. J.Add(F);
  1104. TestItemCount(J,1);
  1105. TestJSONType(J[0],jtNumber);
  1106. AssertEquals('J[0] is TJSONFloatNumber',TJSONfloatNumber,J[0].ClassType);
  1107. AssertEquals('j.Types[0]=jtNumber',Ord(jtNumber),ord(J.Types[0]));
  1108. AssertEquals('J.Floats[0]='+FloatToStr(F),F,J.Floats[0]);
  1109. TestAsFloat(J[0],F);
  1110. Str(F,S);
  1111. TestJSON(J,'['+S+']');
  1112. finally
  1113. FreeAndNil(J);
  1114. end;
  1115. end;
  1116. procedure TTestArray.TestAddBoolean(B : Boolean);
  1117. Var
  1118. J : TJSONArray;
  1119. begin
  1120. B:=True;
  1121. J:=TJSonArray.Create;
  1122. try
  1123. J.Add(B);
  1124. TestItemCount(J,1);
  1125. TestJSONType(J[0],jtBoolean);
  1126. AssertEquals('J[0] is TJSONBoolean',TJSONBoolean,J[0].ClassType);
  1127. TestAsBoolean(J[0],B);
  1128. AssertEquals('J.Booleans[0]='+BoolToStr(B)+'"',B,J.Booleans[0]);
  1129. If B then
  1130. TestJSON(J,'[true]')
  1131. else
  1132. TestJSON(J,'[false]');
  1133. finally
  1134. FreeAndNil(J);
  1135. end;
  1136. end;
  1137. procedure TTestArray.TestInsertBoolean(B: Boolean);
  1138. Var
  1139. J : TJSONArray;
  1140. begin
  1141. B:=True;
  1142. J:=TJSonArray.Create;
  1143. try
  1144. J.Add(Not B);
  1145. J.Insert(0,B);
  1146. TestItemCount(J,2);
  1147. TestJSONType(J[0],jtBoolean);
  1148. AssertEquals('J[0] is TJSONBoolean',TJSONBoolean,J[0].ClassType);
  1149. TestAsBoolean(J[0],B);
  1150. AssertEquals('J.Booleans[0]='+BoolToStr(B)+'"',B,J.Booleans[0]);
  1151. If B then
  1152. TestJSON(J,'[true, false]')
  1153. else
  1154. TestJSON(J,'[false, true]');
  1155. finally
  1156. FreeAndNil(J);
  1157. end;
  1158. end;
  1159. procedure TTestArray.TestAddBooleanTrue;
  1160. begin
  1161. TestAddBoolean(True);
  1162. end;
  1163. procedure TTestArray.TestAddBooleanFalse;
  1164. begin
  1165. TestAddBoolean(False);
  1166. end;
  1167. procedure TTestArray.TestAddString;
  1168. Var
  1169. J : TJSONArray;
  1170. S : String;
  1171. F : TJSONFloat;
  1172. begin
  1173. S:='A string';
  1174. J:=TJSonArray.Create;
  1175. try
  1176. J.Add(S);
  1177. TestItemCount(J,1);
  1178. TestJSONType(J[0],jtString);
  1179. AssertEquals('J[0] is TJSONString',TJSONString,J[0].ClassType);
  1180. TestAsString(J[0],S);
  1181. AssertEquals('J.Strings[0]="'+S+'"',S,J.Strings[0]);
  1182. TestJSON(J,'["'+StringToJSONString(S)+'"]');
  1183. finally
  1184. FreeAndNil(J);
  1185. end;
  1186. end;
  1187. procedure TTestArray.TestAddNull;
  1188. Var
  1189. J : TJSONArray;
  1190. S : String;
  1191. F : TJSONFloat;
  1192. begin
  1193. J:=TJSonArray.Create;
  1194. try
  1195. J.Add;
  1196. TestItemCount(J,1);
  1197. TestJSONType(J[0],jtNull);
  1198. AssertEquals('J[0] is TJSONNull',TJSONNull,J[0].ClassType);
  1199. AssertEquals('J.Nulls[0]=True',True,J.Nulls[0]);
  1200. TestIsNull(J[0],true);
  1201. TestJSON(J,'[null]');
  1202. finally
  1203. FreeAndNil(J);
  1204. end;
  1205. end;
  1206. procedure TTestArray.TestAddArray;
  1207. Var
  1208. J,J2 : TJSONArray;
  1209. begin
  1210. J:=TJSonArray.Create;
  1211. try
  1212. J2:=TJSonArray.Create;
  1213. J2.Add(0);
  1214. J2.Add(1);
  1215. J.Add(J2);
  1216. TestItemCount(J,1);
  1217. TestJSONType(J[0],jtArray);
  1218. AssertEquals('J[0] is TJSONArray',TJSONArray,J[0].ClassType);
  1219. AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[0].ClassType);
  1220. TestAsInteger(J.Arrays[0][0],0);
  1221. TestAsInteger(J.Arrays[0][1],1);
  1222. TestAsInt64(J.Arrays[0][0],0);
  1223. TestAsInt64(J.Arrays[0][1],1);
  1224. TestJSON(J,'[[0, 1]]');
  1225. finally
  1226. FreeAndNil(J);
  1227. end;
  1228. end;
  1229. procedure TTestArray.TestInsertInteger;
  1230. Var
  1231. J : TJSONArray;
  1232. begin
  1233. J:=TJSonArray.Create;
  1234. try
  1235. J.Add(Integer(1));
  1236. J.Insert(0,Integer(0));
  1237. TestItemCount(J,2);
  1238. TestJSONType(J[0],jtNumber);
  1239. AssertEquals('J[0] is TJSONIntegerNumber',J[0].ClassType,TJSONIntegerNumber);
  1240. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  1241. AssertEquals('J.Integers[0]=0',0,J.integers[0]);
  1242. TestAsInteger(J[0],0);
  1243. TestAsInt64(J[0],0);
  1244. TestJSON(J,'[0, 1]');
  1245. finally
  1246. FreeAndNil(J);
  1247. end;
  1248. end;
  1249. procedure TTestArray.TestInsertInt64;
  1250. Var
  1251. J : TJSONArray;
  1252. begin
  1253. J:=TJSonArray.Create;
  1254. try
  1255. J.Add(Int64(1));
  1256. J.Insert(0,Int64(0));
  1257. TestItemCount(J,2);
  1258. TestJSONType(J[0],jtNumber);
  1259. AssertEquals('J[0] is TJSONInt64Number',J[0].ClassType,TJSONInt64Number);
  1260. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  1261. AssertEquals('J.Int64s[0]=0',0,J.Int64s[0]);
  1262. TestAsInteger(J[0],0);
  1263. TestAsInt64(J[0],0);
  1264. TestJSON(J,'[0, 1]');
  1265. finally
  1266. FreeAndNil(J);
  1267. end;
  1268. end;
  1269. procedure TTestArray.TestInsertFloat;
  1270. Var
  1271. J : TJSONArray;
  1272. S,S2 : String;
  1273. F : TJSONFloat;
  1274. begin
  1275. F:=1.2;
  1276. J:=TJSonArray.Create;
  1277. try
  1278. J.Add(2.3);
  1279. J.Insert(0,F);
  1280. TestItemCount(J,2);
  1281. TestJSONType(J[0],jtNumber);
  1282. AssertEquals('J[0] is TJSONFloatNumber',TJSONfloatNumber,J[0].ClassType);
  1283. AssertEquals('j.Types[0]=jtNumber',Ord(jtNumber),ord(J.Types[0]));
  1284. AssertEquals('J.Floats[0]='+FloatToStr(F),F,J.Floats[0]);
  1285. TestAsFloat(J[0],F);
  1286. Str(F,S);
  1287. F:=2.3;
  1288. Str(F,S2);
  1289. TestJSON(J,'['+S+', '+S2+']');
  1290. finally
  1291. FreeAndNil(J);
  1292. end;
  1293. end;
  1294. procedure TTestArray.TestInsertBooleanTrue;
  1295. begin
  1296. TestInsertBoolean(True);
  1297. end;
  1298. procedure TTestArray.TestInsertBooleanFalse;
  1299. begin
  1300. TestInsertBoolean(False);
  1301. end;
  1302. procedure TTestArray.TestInsertString;
  1303. Var
  1304. J : TJSONArray;
  1305. S : String;
  1306. F : TJSONFloat;
  1307. begin
  1308. S:='A string';
  1309. J:=TJSonArray.Create;
  1310. try
  1311. J.Add('Another string');
  1312. J.Insert(0,S);
  1313. TestItemCount(J,2);
  1314. TestJSONType(J[0],jtString);
  1315. AssertEquals('J[0] is TJSONString',TJSONString,J[0].ClassType);
  1316. TestAsString(J[0],S);
  1317. AssertEquals('J.Strings[0]="'+S+'"',S,J.Strings[0]);
  1318. TestJSON(J,'["'+StringToJSONString(S)+'", "Another string"]');
  1319. finally
  1320. FreeAndNil(J);
  1321. end;
  1322. end;
  1323. procedure TTestArray.TestInsertNull;
  1324. Var
  1325. J : TJSONArray;
  1326. S : String;
  1327. F : TJSONFloat;
  1328. begin
  1329. J:=TJSonArray.Create;
  1330. try
  1331. J.Add(123);
  1332. J.Insert(0);
  1333. TestItemCount(J,2);
  1334. TestJSONType(J[0],jtNull);
  1335. AssertEquals('J[0] is TJSONNull',TJSONNull,J[0].ClassType);
  1336. AssertEquals('J.Nulls[0]=True',True,J.Nulls[0]);
  1337. TestIsNull(J[0],true);
  1338. TestJSON(J,'[null, 123]');
  1339. finally
  1340. FreeAndNil(J);
  1341. end;
  1342. end;
  1343. procedure TTestArray.TestInsertObject;
  1344. Const
  1345. A = 'a';
  1346. B = 'b';
  1347. Var
  1348. J : TJSONArray;
  1349. J2 : TJSONObject;
  1350. begin
  1351. J:=TJSonArray.Create;
  1352. try
  1353. J.Add('A string');
  1354. J2:=TJSonObject.Create;
  1355. J2.Add(A,0);
  1356. J2.Add(B,1);
  1357. J.Insert(0,J2);
  1358. TestItemCount(J,2);
  1359. TestJSONType(J[0],jtObject);
  1360. AssertEquals('J[0] is TJSONObject',TJSONObject,J[0].ClassType);
  1361. AssertEquals('J.Objects[0] is TJSONObject',TJSONObject,J.Objects[0].ClassType);
  1362. TestAsInteger(J.Objects[0][A],0);
  1363. TestAsInteger(J.Objects[0][B],1);
  1364. TestAsInt64(J.Objects[0][A],0);
  1365. TestAsInt64(J.Objects[0][B],1);
  1366. TestJSON(J,'[{ "a" : 0, "b" : 1 }, "A string"]');
  1367. finally
  1368. FreeAndNil(J);
  1369. end;
  1370. end;
  1371. procedure TTestArray.TestInsertArray;
  1372. Var
  1373. J,J2 : TJSONArray;
  1374. begin
  1375. J:=TJSonArray.Create;
  1376. try
  1377. J.Add('Something nice');
  1378. J2:=TJSonArray.Create;
  1379. J2.Add(0);
  1380. J2.Add(1);
  1381. J.Insert(0,J2);
  1382. TestItemCount(J,2);
  1383. TestJSONType(J[0],jtArray);
  1384. AssertEquals('J[0] is TJSONArray',TJSONArray,J[0].ClassType);
  1385. AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[0].ClassType);
  1386. TestAsInteger(J.Arrays[0][0],0);
  1387. TestAsInteger(J.Arrays[0][1],1);
  1388. TestAsInt64(J.Arrays[0][0],0);
  1389. TestAsInt64(J.Arrays[0][1],1);
  1390. TestJSON(J,'[[0, 1], "Something nice"]');
  1391. finally
  1392. FreeAndNil(J);
  1393. end;
  1394. end;
  1395. procedure TTestArray.TestMove;
  1396. Var
  1397. J : TJSONArray;
  1398. S : String;
  1399. F : TJSONFloat;
  1400. begin
  1401. S:='A string';
  1402. J:=TJSonArray.Create;
  1403. try
  1404. J.Add('First string');
  1405. J.Add('Second string');
  1406. J.Add('Third string');
  1407. J.Move(2,1);
  1408. TestItemCount(J,3);
  1409. AssertEquals('J[2] is TJSONString',TJSONString,J[1].ClassType);
  1410. AssertEquals('J[1] is TJSONString',TJSONString,J[2].ClassType);
  1411. TestAsString(J[1],'Third string');
  1412. TestAsString(J[2],'Second string');
  1413. finally
  1414. FreeAndNil(J);
  1415. end;
  1416. end;
  1417. procedure TTestArray.TestExchange;
  1418. Var
  1419. J : TJSONArray;
  1420. S : String;
  1421. F : TJSONFloat;
  1422. begin
  1423. S:='A string';
  1424. J:=TJSonArray.Create;
  1425. try
  1426. J.Add('First string');
  1427. J.Add('Second string');
  1428. J.Add('Third string');
  1429. J.Exchange(2,0);
  1430. TestItemCount(J,3);
  1431. AssertEquals('J[2] is TJSONString',TJSONString,J[0].ClassType);
  1432. AssertEquals('J[1] is TJSONString',TJSONString,J[2].ClassType);
  1433. TestAsString(J[0],'Third string');
  1434. TestAsString(J[2],'First string');
  1435. finally
  1436. FreeAndNil(J);
  1437. end;
  1438. end;
  1439. procedure TTestArray.TestAddObject;
  1440. Const
  1441. A = 'a';
  1442. B = 'b';
  1443. Var
  1444. J : TJSONArray;
  1445. J2 : TJSONObject;
  1446. begin
  1447. J:=TJSonArray.Create;
  1448. try
  1449. J2:=TJSonObject.Create;
  1450. J2.Add(A,0);
  1451. J2.Add(B,1);
  1452. J.Add(J2);
  1453. TestItemCount(J,1);
  1454. TestJSONType(J[0],jtObject);
  1455. AssertEquals('J[0] is TJSONObject',TJSONObject,J[0].ClassType);
  1456. AssertEquals('J.Objects[0] is TJSONObject',TJSONObject,J.Objects[0].ClassType);
  1457. TestAsInteger(J.Objects[0][A],0);
  1458. TestAsInteger(J.Objects[0][B],1);
  1459. TestAsInt64(J.Objects[0][A],0);
  1460. TestAsInt64(J.Objects[0][B],1);
  1461. TestJSON(J,'[{ "a" : 0, "b" : 1 }]');
  1462. finally
  1463. FreeAndNil(J);
  1464. end;
  1465. end;
  1466. procedure TTestArray.TestDelete;
  1467. Var
  1468. J : TJSONArray;
  1469. begin
  1470. J:=TJSonArray.Create;
  1471. try
  1472. J.Add(0);
  1473. J.Add(1);
  1474. TestItemCount(J,2);
  1475. TestJSONType(J[0],jtNumber);
  1476. TestJSONType(J[1],jtNumber);
  1477. TestJSON(J,'[0, 1]');
  1478. J.Delete(1);
  1479. TestItemCount(J,1);
  1480. J.Delete(0);
  1481. TestItemCount(J,0);
  1482. finally
  1483. FreeAndNil(J);
  1484. end;
  1485. end;
  1486. procedure TTestArray.TestRemove;
  1487. Var
  1488. J : TJSONArray;
  1489. I : TJSONData;
  1490. begin
  1491. J:=TJSonArray.Create;
  1492. try
  1493. J.Add(0);
  1494. J.Add(1);
  1495. J.Add(2);
  1496. TestItemCount(J,3);
  1497. TestJSONType(J[0],jtNumber);
  1498. TestJSONType(J[1],jtNumber);
  1499. TestJSONType(J[2],jtNumber);
  1500. TestJSON(J,'[0, 1, 2]');
  1501. I:=J[1];
  1502. J.Remove(I);
  1503. TestItemCount(J,2);
  1504. TestAsInteger(J[0],0);
  1505. TestAsInteger(J[1],2);
  1506. TestAsInt64(J[0],0);
  1507. TestAsInt64(J[1],2);
  1508. finally
  1509. FreeAndNil(J);
  1510. end;
  1511. end;
  1512. procedure TTestArray.TestClone;
  1513. Var
  1514. J,J2 : TJSONArray;
  1515. D : TJSONData;
  1516. begin
  1517. J:=TJSonArray.Create;
  1518. try
  1519. J.Add(1);
  1520. J.Add('aloha');
  1521. D:=J.Clone;
  1522. try
  1523. TestJSONType(D,jtArray);
  1524. J2:=TJSonArray(D);
  1525. TestItemCount(J2,2);
  1526. TestJSONType(J2[0],jtNumber);
  1527. TestJSONType(J2[1],jtString);
  1528. TestAsInteger(J2[0],1);
  1529. TestAsString(J2[1],'aloha');
  1530. finally
  1531. D.Free;
  1532. end;
  1533. finally
  1534. FreeAndNil(J);
  1535. end;
  1536. end;
  1537. procedure TTestArray.TestFormat;
  1538. Var
  1539. J : TJSONArray;
  1540. I : TJSONData;
  1541. begin
  1542. J:=TJSonArray.Create;
  1543. try
  1544. J.Add(0);
  1545. J.Add(1);
  1546. J.Add(2);
  1547. TestItemCount(J,3);
  1548. TestJSONType(J[0],jtNumber);
  1549. TestJSONType(J[1],jtNumber);
  1550. TestJSONType(J[2],jtNumber);
  1551. TestJSON(J,'[0, 1, 2]');
  1552. AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineArray],1));
  1553. AssertEquals('FormatJSON, single line','['+sLinebreak+' 0,'+sLinebreak+' 1,'+sLinebreak+' 2'+sLinebreak+']',J.FormatJSON());
  1554. AssertEquals('FormatJSON, single line','['+sLinebreak+#9'0,'+sLinebreak+#9'1,'+sLinebreak+#9'2'+sLinebreak+']',J.FormatJSON([foUseTabChar],1));
  1555. J.Add(TJSONObject.Create(['x',1,'y',2]));
  1556. 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));
  1557. finally
  1558. J.Free
  1559. end;
  1560. end;
  1561. { TTestObject }
  1562. procedure TTestObject.TestCreate;
  1563. Var
  1564. J : TJSONObject;
  1565. begin
  1566. J:=TJSONObject.Create;
  1567. try
  1568. TestJSONType(J,jtObject);
  1569. TestItemCount(J,0);
  1570. TestJSON(J,'{}');
  1571. TestIsNull(J,False);
  1572. TestAsBoolean(J,False,True);
  1573. TestAsInteger(J,1,True);
  1574. TestAsInt64(J,1,True);
  1575. TestAsString(J,'',True);
  1576. TestAsFloat(J,0.0,True);
  1577. finally
  1578. FreeAndNil(J);
  1579. end;
  1580. end;
  1581. procedure TTestObject.TestAddInteger;
  1582. Const
  1583. A = 'a';
  1584. Var
  1585. J : TJSONObject;
  1586. begin
  1587. J:=TJSonObject.Create;
  1588. try
  1589. J.Add(A,Integer(0));
  1590. TestItemCount(J,1);
  1591. TestJSONType(J[A],jtNumber);
  1592. AssertEquals('J[''a''] is TJSONIntegerNumber',J[A].ClassType,TJSONIntegerNumber);
  1593. AssertEquals('j.Types[''a'']=jtNumber',ord(J.Types[A]),Ord(jtNumber));
  1594. AssertEquals('J.Integers[''a'']=0',0,J.integers[A]);
  1595. TestAsInteger(J[A],0);
  1596. TestAsInt64(J[A],0);
  1597. TestJSON(J,'{ "'+A+'" : 0 }');
  1598. finally
  1599. FreeAndNil(J);
  1600. end;
  1601. end;
  1602. procedure TTestObject.TestAddInt64;
  1603. Const
  1604. A = 'a';
  1605. Var
  1606. J : TJSONObject;
  1607. begin
  1608. J:=TJSonObject.Create;
  1609. try
  1610. J.Add(A,Int64(0));
  1611. TestItemCount(J,1);
  1612. TestJSONType(J[A],jtNumber);
  1613. AssertEquals('J[''a''] is TJSONInt64Number',J[A].ClassType,TJSONInt64Number);
  1614. AssertEquals('j.Types[''a'']=jtNumber',ord(J.Types[A]),Ord(jtNumber));
  1615. AssertEquals('J.Int64s[''a'']=0',0,J.Int64s[A]);
  1616. TestAsInteger(J[A],0);
  1617. TestAsInt64(J[A],0);
  1618. TestJSON(J,'{ "'+A+'" : 0 }');
  1619. finally
  1620. FreeAndNil(J);
  1621. end;
  1622. end;
  1623. procedure TTestObject.TestAddFloat;
  1624. Const
  1625. A = 'a';
  1626. Var
  1627. J : TJSONObject;
  1628. S : String;
  1629. F : TJSONFloat;
  1630. begin
  1631. F:=1.2;
  1632. J:=TJSonObject.Create;
  1633. try
  1634. J.Add(A,F);
  1635. TestItemCount(J,1);
  1636. TestJSONType(J[A],jtNumber);
  1637. AssertEquals('J[''a''] is TJSONFloatNumber',TJSONfloatNumber,J[a].ClassType);
  1638. AssertEquals('j.Types[''a'']=jtNumber',Ord(jtNumber),ord(J.Types[a]));
  1639. AssertEquals('J.Floats[''a'']='+FloatToStr(F),F,J.Floats[a]);
  1640. TestAsFloat(J[A],F);
  1641. Str(F,S);
  1642. TestJSON(J,'{ "'+a+'" : '+S+' }');
  1643. finally
  1644. FreeAndNil(J);
  1645. end;
  1646. end;
  1647. procedure TTestObject.TestAddBoolean(B : Boolean);
  1648. Const
  1649. A = 'a';
  1650. Var
  1651. J : TJSONObject;
  1652. begin
  1653. B:=True;
  1654. J:=TJSonObject.Create;
  1655. try
  1656. J.Add(A,B);
  1657. TestItemCount(J,1);
  1658. TestJSONType(J[A],jtBoolean);
  1659. AssertEquals('J[''a''] is TJSONBoolean',TJSONBoolean,J[a].ClassType);
  1660. TestAsBoolean(J[a],B);
  1661. AssertEquals('J.Booleans[''a'']='+BoolToStr(B)+'"',B,J.Booleans[a]);
  1662. If B then
  1663. TestJSON(J,'{ "'+a+'" : true }')
  1664. else
  1665. TestJSON(J,'{ "'+a+'" : false }');
  1666. finally
  1667. FreeAndNil(J);
  1668. end;
  1669. end;
  1670. procedure TTestObject.TestAccessError;
  1671. Var
  1672. J : TJSONObject;
  1673. begin
  1674. J:=TJSonObject.Create;
  1675. try
  1676. J.Strings['NonExist'];
  1677. finally
  1678. FreeAndNil(J);
  1679. end;
  1680. end;
  1681. procedure TTestObject.TestAddBooleanTrue;
  1682. begin
  1683. TestAddBoolean(True);
  1684. end;
  1685. procedure TTestObject.TestAddBooleanFalse;
  1686. begin
  1687. TestAddBoolean(False);
  1688. end;
  1689. procedure TTestObject.TestAddString;
  1690. Const
  1691. A = 'a';
  1692. Var
  1693. J : TJSONObject;
  1694. S : String;
  1695. F : TJSONFloat;
  1696. begin
  1697. S:='A string';
  1698. J:=TJSonObject.Create;
  1699. try
  1700. J.Add(A,S);
  1701. TestItemCount(J,1);
  1702. TestJSONType(J[a],jtString);
  1703. AssertEquals('J[''a''] is TJSONString',TJSONString,J[A].ClassType);
  1704. TestAsString(J[a],S);
  1705. AssertEquals('J.Strings[''a'']="'+S+'"',S,J.Strings[A]);
  1706. TestJSON(J,'{ "'+a+'" : "'+StringToJSONString(S)+'" }');
  1707. finally
  1708. FreeAndNil(J);
  1709. end;
  1710. end;
  1711. procedure TTestObject.TestAddNull;
  1712. Const
  1713. A = 'a';
  1714. Var
  1715. J : TJSONObject;
  1716. S : String;
  1717. F : TJSONFloat;
  1718. begin
  1719. J:=TJSonObject.Create;
  1720. try
  1721. J.Add(a);
  1722. TestItemCount(J,1);
  1723. TestJSONType(J[a],jtNull);
  1724. AssertEquals('J[''a''] is TJSONNull',TJSONNull,J[A].ClassType);
  1725. AssertEquals('J.Nulls[''a'']=True',True,J.Nulls[A]);
  1726. TestIsNull(J[a],true);
  1727. TestJSON(J,'{ "'+a+'" : null }');
  1728. finally
  1729. FreeAndNil(J);
  1730. end;
  1731. end;
  1732. procedure TTestObject.TestAddObject;
  1733. Const
  1734. A = 'a';
  1735. B = 'b';
  1736. C = 'c';
  1737. Var
  1738. J,J2 : TJSONObject;
  1739. begin
  1740. J:=TJSonObject.Create;
  1741. try
  1742. J2:=TJSonObject.Create;
  1743. J2.Add(B,0);
  1744. J2.Add(C,1);
  1745. J.Add(A,J2);
  1746. TestItemCount(J,1);
  1747. TestJSONType(J[A],jtObject);
  1748. AssertEquals('J[''a''] is TJSONObject',TJSONObject,J[A].ClassType);
  1749. AssertEquals('J.Objects[''a''] is TJSONObject',TJSONObject,J.Objects[A].ClassType);
  1750. TestAsInteger(J.Objects[A][B],0);
  1751. TestAsInteger(J.Objects[A][C],1);
  1752. TestAsInt64(J.Objects[A][B],0);
  1753. TestAsInt64(J.Objects[A][C],1);
  1754. TestJSON(J,'{ "a" : { "b" : 0, "c" : 1 } }');
  1755. finally
  1756. FreeAndNil(J);
  1757. end;
  1758. end;
  1759. procedure TTestObject.TestAddArray;
  1760. Const
  1761. A = 'a';
  1762. Var
  1763. J : TJSONObject;
  1764. J2 : TJSONArray;
  1765. begin
  1766. J:=TJSONObject.Create;
  1767. try
  1768. J2:=TJSonArray.Create;
  1769. J2.Add(0);
  1770. J2.Add(1);
  1771. J.Add(A,J2);
  1772. TestItemCount(J,1);
  1773. TestJSONType(J[A],jtArray);
  1774. AssertEquals('J[''a''] is TJSONArray',TJSONArray,J[A].ClassType);
  1775. AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[A].ClassType);
  1776. TestAsInteger(J.Arrays[A][0],0);
  1777. TestAsInteger(J.Arrays[A][1],1);
  1778. TestAsInt64(J.Arrays[A][0],0);
  1779. TestAsInt64(J.Arrays[A][1],1);
  1780. TestJSON(J,'{ "a" : [0, 1] }');
  1781. finally
  1782. FreeAndNil(J);
  1783. end;
  1784. end;
  1785. procedure TTestObject.TestDelete;
  1786. Const
  1787. A = 'a';
  1788. B = 'b';
  1789. Var
  1790. J : TJSONObject;
  1791. begin
  1792. J:=TJSonObject.Create;
  1793. try
  1794. J.Add(A,0);
  1795. J.Add(B,1);
  1796. TestItemCount(J,2);
  1797. TestJSONType(J[A],jtNumber);
  1798. TestJSONType(J[A],jtNumber);
  1799. TestJSON(J,'{ "a" : 0, "b" : 1 }');
  1800. J.Delete(1);
  1801. TestItemCount(J,1);
  1802. J.Delete(0);
  1803. TestItemCount(J,0);
  1804. finally
  1805. FreeAndNil(J);
  1806. end;
  1807. end;
  1808. procedure TTestObject.TestRemove;
  1809. Const
  1810. A = 'a';
  1811. B = 'b';
  1812. C = 'c';
  1813. Var
  1814. J : TJSONObject;
  1815. I : TJSONData;
  1816. begin
  1817. J:=TJSonObject.Create;
  1818. try
  1819. J.Add(A,1);
  1820. J.Add(B,2);
  1821. J.Add(C,3);
  1822. TestItemCount(J,3);
  1823. TestJSONType(J[A],jtNumber);
  1824. TestJSONType(J[B],jtNumber);
  1825. TestJSONType(J[C],jtNumber);
  1826. TestJSON(J,'{ "a" : 1, "b" : 2, "c" : 3 }');
  1827. I:=J[b];
  1828. J.Remove(I);
  1829. TestItemCount(J,2);
  1830. TestAsInteger(J[a],1);
  1831. TestAsInteger(J[c],3);
  1832. TestAsInt64(J[a],1);
  1833. TestAsInt64(J[c],3);
  1834. finally
  1835. FreeAndNil(J);
  1836. end;
  1837. end;
  1838. procedure TTestObject.TestClone;
  1839. Var
  1840. J,J2 : TJSONObject;
  1841. D : TJSONData;
  1842. begin
  1843. J:=TJSonObject.Create;
  1844. try
  1845. J.Add('p1',1);
  1846. J.Add('p2','aloha');
  1847. D:=J.Clone;
  1848. try
  1849. TestJSONType(D,jtObject);
  1850. J2:=TJSonObject(D);
  1851. TestItemCount(J2,2);
  1852. TestJSONType(J2['p1'],jtNumber);
  1853. TestJSONType(J2['p2'],jtString);
  1854. TestAsInteger(J2['p1'],1);
  1855. TestAsString(J2['p2'],'aloha');
  1856. finally
  1857. D.Free;
  1858. end;
  1859. finally
  1860. FreeAndNil(J);
  1861. end;
  1862. end;
  1863. procedure TTestObject.TestExtract;
  1864. Const
  1865. A = 'a';
  1866. B = 'b';
  1867. Var
  1868. J : TJSONObject;
  1869. JA,JB : TJSONData;
  1870. E : TJSONData;
  1871. begin
  1872. J:=TJSonObject.Create;
  1873. try
  1874. J.Add(A,0);
  1875. J.Add(B,1);
  1876. TestItemCount(J,2);
  1877. JA:=J[A];
  1878. JB:=J[B];
  1879. TestJSONType(JA,jtNumber);
  1880. TestJSONType(JB,jtNumber);
  1881. TestJSON(J,'{ "a" : 0, "b" : 1 }');
  1882. E:=J.Extract(1);
  1883. AssertSame('Extracted JA',JB,E);
  1884. E.Free;
  1885. TestItemCount(J,1);
  1886. E:=J.Extract(0);
  1887. AssertSame('Extracted JB',JA,E);
  1888. E.Free;
  1889. TestItemCount(J,0);
  1890. finally
  1891. FreeAndNil(J);
  1892. end;
  1893. end;
  1894. procedure TTestObject.TestNonExistingAccessError;
  1895. begin
  1896. AssertException(EJSON,@TestAccessError);
  1897. end;
  1898. procedure TTestObject.TestFormat;
  1899. Var
  1900. O : TJSONObject;
  1901. begin
  1902. O:=TJSONObject.Create(['x',1,'y',2]);
  1903. try
  1904. TestJSON(O,'{ "x" : 1, "y" : 2 }');
  1905. AssertEquals('Format equals JSON',O.AsJSON,O.FormatJSON([foSingleLineObject]));
  1906. AssertEquals('Format 1','{'+sLineBreak+' "x" : 1,'+sLineBreak+' "y" : 2'+sLineBreak+'}',O.FormatJSON([]));
  1907. AssertEquals('Format 1','{'+sLineBreak+' x : 1,'+sLineBreak+' y : 2'+sLineBreak+'}',O.FormatJSON([foDoNotQuoteMembers]));
  1908. AssertEquals('Format 1','{'+sLineBreak+#9'x : 1,'+sLineBreak+#9'y : 2'+sLineBreak+'}',O.FormatJSON([foUseTabChar,foDoNotQuoteMembers],1));
  1909. O.Add('s',TJSONObject.Create(['w',10,'h',20]));
  1910. 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));
  1911. finally
  1912. O.Free;
  1913. end;
  1914. end;
  1915. procedure TTestObject.TestFind;
  1916. Const
  1917. A = 'A';
  1918. S = 'A string';
  1919. B = 'a';
  1920. S2 = 'Another string';
  1921. C = 'c';
  1922. S3 = 'Yet Another string';
  1923. Var
  1924. J : TJSONObject;
  1925. begin
  1926. J:=TJSONObject.Create([A,S,B,S2,C,S3]);
  1927. try
  1928. TestJSONType(J,jtObject);
  1929. TestIsNull(J,False);
  1930. TestItemCount(J,3);
  1931. TestJSONType(J[A],jtString);
  1932. TestJSONType(J[B],jtString);
  1933. TestJSON(J,'{ "A" : "'+S+'", "a" : "'+S2+'", "c" : "'+S3+'" }');
  1934. AssertEquals('Nonexisting, case sensitive',-1,J.IndexOfName('D'));
  1935. AssertEquals('Nonexisting, case insensitive',-1,J.IndexOfName('D',True));
  1936. AssertEquals('1 Existing , case sensitive',0,J.IndexOfName(A));
  1937. AssertEquals('2 Existing exact match, case insensitive',0,J.IndexOfName(A,true));
  1938. AssertEquals('3 Existing , case sensitive',1,J.IndexOfName(B));
  1939. AssertEquals('4 Existing exact match, case insensitive',1,J.IndexOfName(B,true));
  1940. AssertEquals('5 Existing , case sensitive again',2,J.IndexOfName(C));
  1941. AssertEquals('6 Existing case-insensitive match, case insensitive',2,J.IndexOfName(Uppercase(C),true));
  1942. finally
  1943. FreeAndNil(J);
  1944. end;
  1945. end;
  1946. procedure TTestObject.TestCreateString;
  1947. Const
  1948. A = 'A';
  1949. S = 'A string';
  1950. Var
  1951. J : TJSONObject;
  1952. begin
  1953. J:=TJSONObject.Create([A,S]);
  1954. try
  1955. TestJSONType(J,jtObject);
  1956. TestItemCount(J,1);
  1957. TestJSONType(J[A],jtString);
  1958. TestJSON(J,'{ "A" : "'+S+'" }');
  1959. TestIsNull(J,False);
  1960. finally
  1961. FreeAndNil(J);
  1962. end;
  1963. end;
  1964. procedure TTestObject.TestCreatePChar;
  1965. Const
  1966. A = 'A';
  1967. S = 'A string';
  1968. Var
  1969. J : TJSONObject;
  1970. begin
  1971. J:=TJSONObject.Create([A,Pchar(S)]);
  1972. try
  1973. TestJSONType(J,jtObject);
  1974. TestItemCount(J,1);
  1975. TestJSONType(J[A],jtString);
  1976. TestJSON(J,'{ "A" : "'+S+'" }');
  1977. TestIsNull(J,False);
  1978. finally
  1979. FreeAndNil(J);
  1980. end;
  1981. end;
  1982. procedure TTestObject.TestCreateStrings;
  1983. Const
  1984. A = 'A';
  1985. B = 'B';
  1986. S = 'A string';
  1987. T = 'B string';
  1988. Var
  1989. J : TJSONObject;
  1990. begin
  1991. J:=TJSONObject.Create([A,S,B,T]);
  1992. try
  1993. TestJSONType(J,jtObject);
  1994. TestItemCount(J,2);
  1995. TestJSONType(J[A],jtString);
  1996. TestJSONType(J[B],jtString);
  1997. TestJSON(J,'{ "A" : "'+S+'", "B" : "'+T+'" }');
  1998. TestIsNull(J,False);
  1999. finally
  2000. FreeAndNil(J);
  2001. end;
  2002. end;
  2003. procedure TTestObject.TestCreateInteger;
  2004. Const
  2005. A = 'A';
  2006. S = 3;
  2007. Var
  2008. J : TJSONObject;
  2009. begin
  2010. J:=TJSONObject.Create([A,S]);
  2011. try
  2012. TestJSONType(J,jtObject);
  2013. TestItemCount(J,1);
  2014. TestJSONType(J[A],jtNumber);
  2015. TestJSON(J,'{ "A" : 3 }');
  2016. finally
  2017. FreeAndNil(J);
  2018. end;
  2019. end;
  2020. procedure TTestObject.TestCreateFloat;
  2021. Const
  2022. A = 'A';
  2023. S : double = 1.2;
  2024. Var
  2025. J : TJSONObject;
  2026. r : String;
  2027. begin
  2028. J:=TJSONObject.Create([A,S]);
  2029. try
  2030. TestJSONType(J,jtObject);
  2031. TestItemCount(J,1);
  2032. TestJSONType(J[A],jtNumber);
  2033. Str(S,R);
  2034. TestJSON(J,'{ "A" : '+R+' }');
  2035. finally
  2036. FreeAndNil(J);
  2037. end;
  2038. end;
  2039. procedure TTestObject.TestCreateInt64;
  2040. Const
  2041. A = 'A';
  2042. S : Int64 = $FFFFFFFFFFFFF;
  2043. Var
  2044. J : TJSONObject;
  2045. begin
  2046. J:=TJSONObject.Create([A,S]);
  2047. try
  2048. TestJSONType(J,jtObject);
  2049. TestItemCount(J,1);
  2050. TestJSONType(J[A],jtNumber);
  2051. TestJSON(J,'{ "A" : '+IntToStr(S)+' }');
  2052. finally
  2053. FreeAndNil(J);
  2054. end;
  2055. end;
  2056. procedure TTestObject.TestCreateBoolean;
  2057. Const
  2058. A = 'A';
  2059. S = True;
  2060. Var
  2061. J : TJSONObject;
  2062. begin
  2063. J:=TJSONObject.Create([A,S]);
  2064. try
  2065. TestJSONType(J,jtObject);
  2066. TestItemCount(J,1);
  2067. TestJSONType(J[A],jtBoolean);
  2068. TestJSON(J,'{ "A" : true }');
  2069. finally
  2070. FreeAndNil(J);
  2071. end;
  2072. end;
  2073. procedure TTestObject.TestCreateJSONObject;
  2074. Const
  2075. A = 'A';
  2076. Var
  2077. J : TJSONObject;
  2078. begin
  2079. J:=TJSONObject.Create([A,TJSONObject.Create]);
  2080. try
  2081. TestItemCount(J,1);
  2082. TestJSONType(J[A],jtObject);
  2083. TestJSON(J,'{ "A" : {} }');
  2084. finally
  2085. FreeAndNil(J);
  2086. end;
  2087. end;
  2088. procedure TTestObject.TestCreateJSONString;
  2089. Const
  2090. A = 'A';
  2091. S = 'A string';
  2092. Var
  2093. J : TJSONObject;
  2094. begin
  2095. J:=TJSONObject.Create([A,TJSONString.Create(S)]);
  2096. try
  2097. TestItemCount(J,1);
  2098. TestJSONType(J[A],jtString);
  2099. TestJSON(J,'{ "A" : "'+S+'" }');
  2100. finally
  2101. FreeAndNil(J);
  2102. end;
  2103. end;
  2104. procedure TTestObject.TestCreateObject;
  2105. Const
  2106. A = 'A';
  2107. Var
  2108. J : TJSONObject;
  2109. begin
  2110. J:=Nil;
  2111. try
  2112. Try
  2113. J:=TJSONObject.Create([A,TObject.Create]);
  2114. Fail('Array constructor accepts only TJSONData');
  2115. finally
  2116. FreeAndNil(J);
  2117. end;
  2118. except
  2119. // Should be OK.
  2120. end;
  2121. end;
  2122. procedure TTestObject.TestCreateNilPointer;
  2123. Const
  2124. A = 'A';
  2125. Var
  2126. J : TJSONObject;
  2127. P : Pointer;
  2128. begin
  2129. J:=Nil;
  2130. P:=Nil;
  2131. Try
  2132. J:=TJSONObject.Create([A,P]);
  2133. TestJSONType(J[A],jtNull);
  2134. finally
  2135. FreeAndNil(J);
  2136. end;
  2137. end;
  2138. procedure TTestObject.TestCreatePointer;
  2139. Const
  2140. A = 'A';
  2141. Var
  2142. J : TJSONObject;
  2143. P : Pointer;
  2144. begin
  2145. J:=Nil;
  2146. P:=@Self;
  2147. try
  2148. Try
  2149. J:=TJSONObject.Create([A,P]);
  2150. Fail('Array constructor accepts only NIL pointers');
  2151. finally
  2152. FreeAndNil(J);
  2153. end;
  2154. except
  2155. // Should be OK.
  2156. end;
  2157. end;
  2158. { TTestJSONString }
  2159. procedure TTestJSONString.TestTo(const Src, Dest: String);
  2160. Var
  2161. S : String;
  2162. begin
  2163. S:='StringToJSONString('''+Src+''')='''+Dest+'''';
  2164. AssertEquals(S,Dest,StringToJSONString(Src));
  2165. end;
  2166. procedure TTestJSONString.TestFrom(const Src, Dest: String);
  2167. Var
  2168. S : String;
  2169. begin
  2170. S:='JSONStringToString('''+Src+''')='''+Dest+'''';
  2171. AssertEquals(S,Dest,JSONStringToString(Src));
  2172. end;
  2173. procedure TTestJSONString.TestJSONStringToString;
  2174. begin
  2175. TestFrom('','');
  2176. TestFrom('A','A');
  2177. TestFrom('AB','AB');
  2178. TestFrom('ABC','ABC');
  2179. TestFrom('\\','\');
  2180. TestFrom('\/','/');
  2181. TestFrom('\"','"');
  2182. TestFrom('\b',#8);
  2183. TestFrom('\t',#9);
  2184. TestFrom('\n',#10);
  2185. TestFrom('\f',#12);
  2186. TestFrom('\r',#13);
  2187. TestFrom('\bBC',#8'BC');
  2188. TestFrom('\tBC',#9'BC');
  2189. TestFrom('\nBC',#10'BC');
  2190. TestFrom('\fBC',#12'BC');
  2191. TestFrom('\rBC',#13'BC');
  2192. TestFrom('A\b','A'#8);
  2193. TestFrom('A\t','A'#9);
  2194. TestFrom('A\n','A'#10);
  2195. TestFrom('A\f','A'#12);
  2196. TestFrom('A\r','A'#13);
  2197. TestFrom('A\bBC','A'#8'BC');
  2198. TestFrom('A\tBC','A'#9'BC');
  2199. TestFrom('A\nBC','A'#10'BC');
  2200. TestFrom('A\fBC','A'#12'BC');
  2201. TestFrom('A\rBC','A'#13'BC');
  2202. TestFrom('\\\\','\\');
  2203. TestFrom('\/\/','//');
  2204. TestFrom('\"\"','""');
  2205. TestFrom('\b\b',#8#8);
  2206. TestFrom('\t\t',#9#9);
  2207. TestFrom('\n\n',#10#10);
  2208. TestFrom('\f\f',#12#12);
  2209. TestFrom('\r\r',#13#13);
  2210. end;
  2211. procedure TTestJSONString.TestStringToJSONString;
  2212. begin
  2213. TestTo('','');
  2214. TestTo('A','A');
  2215. TestTo('AB','AB');
  2216. TestTo('ABC','ABC');
  2217. TestTo('\','\\');
  2218. TestTo('/','\/');
  2219. TestTo('"','\"');
  2220. TestTo(#8,'\b');
  2221. TestTo(#9,'\t');
  2222. TestTo(#10,'\n');
  2223. TestTo(#12,'\f');
  2224. TestTo(#13,'\r');
  2225. TestTo(#8'BC','\bBC');
  2226. TestTo(#9'BC','\tBC');
  2227. TestTo(#10'BC','\nBC');
  2228. TestTo(#12'BC','\fBC');
  2229. TestTo(#13'BC','\rBC');
  2230. TestTo('A'#8,'A\b');
  2231. TestTo('A'#9,'A\t');
  2232. TestTo('A'#10,'A\n');
  2233. TestTo('A'#12,'A\f');
  2234. TestTo('A'#13,'A\r');
  2235. TestTo('A'#8'BC','A\bBC');
  2236. TestTo('A'#9'BC','A\tBC');
  2237. TestTo('A'#10'BC','A\nBC');
  2238. TestTo('A'#12'BC','A\fBC');
  2239. TestTo('A'#13'BC','A\rBC');
  2240. TestTo('\\','\\\\');
  2241. TestTo('//','\/\/');
  2242. TestTo('""','\"\"');
  2243. TestTo(#8#8,'\b\b');
  2244. TestTo(#9#9,'\t\t');
  2245. TestTo(#10#10,'\n\n');
  2246. TestTo(#12#12,'\f\f');
  2247. TestTo(#13#13,'\r\r');
  2248. end;
  2249. initialization
  2250. RegisterTest(TTestJSONString);
  2251. RegisterTest(TTestNull);
  2252. RegisterTest(TTestBoolean);
  2253. RegisterTest(TTestInteger);
  2254. RegisterTest(TTestInt64);
  2255. RegisterTest(TTestFloat);
  2256. RegisterTest(TTestString);
  2257. RegisterTest(TTestArray);
  2258. RegisterTest(TTestObject);
  2259. end.