testjsondata.pas 86 KB

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