2
0

testjsondata.pas 86 KB

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