testjsondata.pp 44 KB

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