testjsondata.pas 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242
  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. AssertEquals('Formatjson with float formatting','1.23',F.FormatJSON([foFormatFloat]));
  1867. finally
  1868. FreeAndNil(F);
  1869. end;
  1870. end;
  1871. { TTestArray }
  1872. procedure TTestArray.TestCreate;
  1873. Var
  1874. J : TJSONArray;
  1875. begin
  1876. J:=TJSonArray.Create;
  1877. try
  1878. TestJSONType(J,jtArray);
  1879. TestItemCount(J,0);
  1880. TestJSON(J,'[]');
  1881. TestIsNull(J,False);
  1882. TestAsBoolean(J,False,True);
  1883. TestAsInteger(J,1,True);
  1884. TestAsInt64(J,1,True);
  1885. TestAsQWord(J,1,True);
  1886. TestAsString(J,'',True);
  1887. TestAsFloat(J,0.0,True);
  1888. finally
  1889. FreeAndNil(J);
  1890. end;
  1891. end;
  1892. procedure TTestArray.TestCreateString;
  1893. Const
  1894. S = 'A string';
  1895. Var
  1896. J : TJSONArray;
  1897. begin
  1898. J:=TJSonArray.Create([S]);
  1899. try
  1900. TestJSONType(J,jtArray);
  1901. TestItemCount(J,1);
  1902. TestJSONType(J[0],jtString);
  1903. TestJSON(J,'["'+S+'"]');
  1904. TestIsNull(J,False);
  1905. finally
  1906. FreeAndNil(J);
  1907. end;
  1908. end;
  1909. procedure TTestArray.TestCreatePchar;
  1910. Const
  1911. S = 'A string';
  1912. Var
  1913. J : TJSONArray;
  1914. begin
  1915. J:=TJSonArray.Create([PAnsiChar(S)]);
  1916. try
  1917. TestJSONType(J,jtArray);
  1918. TestItemCount(J,1);
  1919. TestJSONType(J[0],jtString);
  1920. TestJSON(J,'["'+S+'"]');
  1921. TestIsNull(J,False);
  1922. finally
  1923. FreeAndNil(J);
  1924. end;
  1925. end;
  1926. procedure TTestArray.TestCreateStrings;
  1927. Const
  1928. S = 'A string';
  1929. T = 'B string';
  1930. Var
  1931. J : TJSONArray;
  1932. begin
  1933. J:=TJSONArray.Create([S,T]);
  1934. try
  1935. TestJSONType(J,jtArray);
  1936. TestItemCount(J,2);
  1937. TestJSONType(J[0],jtString);
  1938. TestJSONType(J[1],jtString);
  1939. TestJSON(J,'["'+S+'", "'+T+'"]');
  1940. TestIsNull(J,False);
  1941. finally
  1942. FreeAndNil(J);
  1943. end;
  1944. end;
  1945. procedure TTestArray.TestCreateStringsCompressed;
  1946. Const
  1947. S = 'A string';
  1948. T = 'B string';
  1949. Var
  1950. J : TJSONArray;
  1951. begin
  1952. TJSONData.CompressedJSON:=True;
  1953. J:=TJSONArray.Create([S,T]);
  1954. try
  1955. TestJSONType(J,jtArray);
  1956. TestItemCount(J,2);
  1957. TestJSONType(J[0],jtString);
  1958. TestJSONType(J[1],jtString);
  1959. TestJSON(J,'["'+S+'","'+T+'"]');
  1960. TestIsNull(J,False);
  1961. finally
  1962. FreeAndNil(J);
  1963. end;
  1964. end;
  1965. procedure TTestArray.TestCreateInteger;
  1966. Const
  1967. S = 3;
  1968. Var
  1969. J : TJSONArray;
  1970. begin
  1971. J:=TJSonArray.Create([S]);
  1972. try
  1973. TestJSONType(J,jtArray);
  1974. TestItemCount(J,1);
  1975. TestJSONType(J[0],jtNumber);
  1976. TestJSON(J,'[3]');
  1977. finally
  1978. FreeAndNil(J);
  1979. end;
  1980. end;
  1981. procedure TTestArray.TestCreateFloat;
  1982. Const
  1983. S : double = 1.2;
  1984. Var
  1985. J : TJSONArray;
  1986. r : String;
  1987. begin
  1988. J:=TJSonArray.Create([S]);
  1989. try
  1990. TestJSONType(J,jtArray);
  1991. TestItemCount(J,1);
  1992. TestJSONType(J[0],jtNumber);
  1993. Str(S,R);
  1994. Delete(R,1,1);
  1995. TestJSON(J,'['+R+']');
  1996. finally
  1997. FreeAndNil(J);
  1998. end;
  1999. end;
  2000. procedure TTestArray.TestCreateInt64;
  2001. Const
  2002. S : Int64 = $FFFFFFFFFFFFF;
  2003. Var
  2004. J : TJSONArray;
  2005. begin
  2006. J:=TJSonArray.Create([S]);
  2007. try
  2008. TestJSONType(J,jtArray);
  2009. TestItemCount(J,1);
  2010. TestJSONType(J[0],jtNumber);
  2011. TestJSON(J,'['+IntToStr(S)+']');
  2012. finally
  2013. FreeAndNil(J);
  2014. end;
  2015. end;
  2016. procedure TTestArray.TestCreateBoolean;
  2017. Const
  2018. S = True;
  2019. Var
  2020. J : TJSONArray;
  2021. begin
  2022. J:=TJSonArray.Create([S]);
  2023. try
  2024. TestJSONType(J,jtArray);
  2025. TestItemCount(J,1);
  2026. TestJSONType(J[0],jtBoolean);
  2027. TestJSON(J,'[true]');
  2028. finally
  2029. FreeAndNil(J);
  2030. end;
  2031. end;
  2032. procedure TTestArray.TestCreateJSONObject;
  2033. Var
  2034. J : TJSONArray;
  2035. begin
  2036. J:=TJSonArray.Create([TJSONObject.Create]);
  2037. try
  2038. TestItemCount(J,1);
  2039. TestJSONType(J[0],jtObject);
  2040. TestJSON(J,'[{}]');
  2041. finally
  2042. FreeAndNil(J);
  2043. end;
  2044. end;
  2045. procedure TTestArray.TestCreateJSONString;
  2046. Const
  2047. S = 'A string';
  2048. Var
  2049. J : TJSONArray;
  2050. begin
  2051. J:=TJSonArray.Create([TJSONString.Create(S)]);
  2052. try
  2053. TestItemCount(J,1);
  2054. TestJSONType(J[0],jtString);
  2055. TestJSON(J,'["'+S+'"]');
  2056. finally
  2057. FreeAndNil(J);
  2058. end;
  2059. end;
  2060. procedure TTestArray.TestCreateJSONStringSpecialChars;
  2061. const
  2062. S: array[0..7] of string = (
  2063. 'A'#1,
  2064. 'B'#9,
  2065. 'C'#10,
  2066. 'D'#12,
  2067. 'E'#13,
  2068. 'F'#10#13,
  2069. 'G"Foo"',
  2070. 'H\J');
  2071. Var
  2072. J : TJSONArray;
  2073. i: Integer;
  2074. begin
  2075. J:=TJSonArray.Create;
  2076. try
  2077. for i:=0 to high(S) do
  2078. J.Add(S[i]);
  2079. TestItemCount(J,length(S));
  2080. for i:=0 to high(S) do
  2081. begin
  2082. TestJSONType(J[i],jtString);
  2083. end;
  2084. TestJSON(J,'["A\u0001", "B\t", "C\n", "D\f", "E\r", "F\n\r", "G\"Foo\"", "H\\J"]');
  2085. finally
  2086. FreeAndNil(J);
  2087. end;
  2088. end;
  2089. procedure TTestArray.TestCreateObject;
  2090. Var
  2091. J : TJSONArray;
  2092. O : TObject;
  2093. begin
  2094. J:=Nil;
  2095. try
  2096. Try
  2097. O:=TObject.Create;
  2098. J:=TJSONArray.Create([O]);
  2099. Fail('Array constructor accepts only TJSONData');
  2100. finally
  2101. FreeAndNil(J);
  2102. FreeAndNil(O);
  2103. end;
  2104. except
  2105. // Should be OK.
  2106. end;
  2107. end;
  2108. procedure TTestArray.TestCreateNilPointer;
  2109. Var
  2110. J : TJSONArray;
  2111. P : Pointer;
  2112. begin
  2113. J:=Nil;
  2114. P:=Nil;
  2115. Try
  2116. J:=TJSONArray.Create([P]);
  2117. TestJSONType(J[0],jtNull);
  2118. finally
  2119. FreeAndNil(J);
  2120. end;
  2121. end;
  2122. procedure TTestArray.TestCreatePointer;
  2123. Var
  2124. J : TJSONArray;
  2125. P : Pointer;
  2126. begin
  2127. J:=Nil;
  2128. P:=@Self;
  2129. try
  2130. Try
  2131. J:=TJSONArray.Create([P]);
  2132. Fail('Array constructor accepts only NIL pointers');
  2133. finally
  2134. FreeAndNil(J);
  2135. end;
  2136. except
  2137. // Should be OK.
  2138. end;
  2139. end;
  2140. procedure TTestArray.TestAddInteger;
  2141. Var
  2142. J : TJSONArray;
  2143. begin
  2144. J:=TJSonArray.Create;
  2145. try
  2146. J.Add(Integer(0));
  2147. TestItemCount(J,1);
  2148. TestJSONType(J[0],jtNumber);
  2149. AssertEquals('J[0] is TJSONIntegerNumber',J[0].ClassType,TJSONIntegerNumber);
  2150. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  2151. AssertEquals('J.Integers[0]=0',0,J.integers[0]);
  2152. TestAsInteger(J[0],0);
  2153. TestAsInt64(J[0],0);
  2154. TestAsQword(J[0],0);
  2155. TestJSON(J,'[0]');
  2156. finally
  2157. FreeAndNil(J);
  2158. end;
  2159. end;
  2160. procedure TTestArray.TestAddInt64;
  2161. Var
  2162. J : TJSONArray;
  2163. begin
  2164. J:=TJSonArray.Create;
  2165. try
  2166. J.Add(Int64(0));
  2167. TestItemCount(J,1);
  2168. TestJSONType(J[0],jtNumber);
  2169. AssertEquals('J[0] is TJSONInt64Number',J[0].ClassType,TJSONInt64Number);
  2170. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  2171. AssertEquals('J.Int64s[0]=0',0,J.Int64s[0]);
  2172. TestAsInteger(J[0],0);
  2173. TestAsInt64(J[0],0);
  2174. TestAsQword(J[0],0);
  2175. TestJSON(J,'[0]');
  2176. finally
  2177. FreeAndNil(J);
  2178. end;
  2179. end;
  2180. procedure TTestArray.TestAddFloat;
  2181. Var
  2182. J : TJSONArray;
  2183. S : String;
  2184. F : TJSONFloat;
  2185. begin
  2186. F:=1.2;
  2187. J:=TJSonArray.Create;
  2188. try
  2189. J.Add(F);
  2190. TestItemCount(J,1);
  2191. TestJSONType(J[0],jtNumber);
  2192. AssertEquals('J[0] is TJSONFloatNumber',TJSONfloatNumber,J[0].ClassType);
  2193. AssertEquals('j.Types[0]=jtNumber',Ord(jtNumber),ord(J.Types[0]));
  2194. AssertEquals('J.Floats[0]='+FloatToStr(F),F,J.Floats[0]);
  2195. TestAsFloat(J[0],F);
  2196. Str(F,S);
  2197. Delete(S,1,1);
  2198. TestJSON(J,'['+S+']');
  2199. finally
  2200. FreeAndNil(J);
  2201. end;
  2202. end;
  2203. procedure TTestArray.TestAddBoolean(B : Boolean);
  2204. Var
  2205. J : TJSONArray;
  2206. begin
  2207. B:=True;
  2208. J:=TJSonArray.Create;
  2209. try
  2210. J.Add(B);
  2211. TestItemCount(J,1);
  2212. TestJSONType(J[0],jtBoolean);
  2213. AssertEquals('J[0] is TJSONBoolean',TJSONBoolean,J[0].ClassType);
  2214. TestAsBoolean(J[0],B);
  2215. AssertEquals('J.Booleans[0]='+BoolToStr(B)+'"',B,J.Booleans[0]);
  2216. If B then
  2217. TestJSON(J,'[true]')
  2218. else
  2219. TestJSON(J,'[false]');
  2220. finally
  2221. FreeAndNil(J);
  2222. end;
  2223. end;
  2224. procedure TTestArray.TestInsertBoolean(B: Boolean);
  2225. Var
  2226. J : TJSONArray;
  2227. begin
  2228. B:=True;
  2229. J:=TJSonArray.Create;
  2230. try
  2231. J.Add(Not B);
  2232. J.Insert(0,B);
  2233. TestItemCount(J,2);
  2234. TestJSONType(J[0],jtBoolean);
  2235. AssertEquals('J[0] is TJSONBoolean',TJSONBoolean,J[0].ClassType);
  2236. TestAsBoolean(J[0],B);
  2237. AssertEquals('J.Booleans[0]='+BoolToStr(B)+'"',B,J.Booleans[0]);
  2238. If B then
  2239. TestJSON(J,'[true, false]')
  2240. else
  2241. TestJSON(J,'[false, true]');
  2242. finally
  2243. FreeAndNil(J);
  2244. end;
  2245. end;
  2246. procedure TTestArray.TestAddBooleanTrue;
  2247. begin
  2248. TestAddBoolean(True);
  2249. end;
  2250. procedure TTestArray.TestAddBooleanFalse;
  2251. begin
  2252. TestAddBoolean(False);
  2253. end;
  2254. procedure TTestArray.TestAddString;
  2255. Var
  2256. J : TJSONArray;
  2257. S : String;
  2258. begin
  2259. S:='A string';
  2260. J:=TJSonArray.Create;
  2261. try
  2262. J.Add(S);
  2263. TestItemCount(J,1);
  2264. TestJSONType(J[0],jtString);
  2265. AssertEquals('J[0] is TJSONString',TJSONString,J[0].ClassType);
  2266. TestAsString(J[0],S);
  2267. AssertEquals('J.Strings[0]="'+S+'"',S,J.Strings[0]);
  2268. TestJSON(J,'["'+StringToJSONString(S)+'"]');
  2269. finally
  2270. FreeAndNil(J);
  2271. end;
  2272. end;
  2273. procedure TTestArray.TestAddNull;
  2274. Var
  2275. J : TJSONArray;
  2276. begin
  2277. J:=TJSonArray.Create;
  2278. try
  2279. J.Add;
  2280. TestItemCount(J,1);
  2281. TestJSONType(J[0],jtNull);
  2282. AssertEquals('J[0] is TJSONNull',TJSONNull,J[0].ClassType);
  2283. AssertEquals('J.Nulls[0]=True',True,J.Nulls[0]);
  2284. TestIsNull(J[0],true);
  2285. TestJSON(J,'[null]');
  2286. finally
  2287. FreeAndNil(J);
  2288. end;
  2289. end;
  2290. procedure TTestArray.TestAddArray;
  2291. Var
  2292. J,J2 : TJSONArray;
  2293. begin
  2294. J:=TJSonArray.Create;
  2295. try
  2296. J2:=TJSonArray.Create;
  2297. J2.Add(0);
  2298. J2.Add(1);
  2299. J.Add(J2);
  2300. TestItemCount(J,1);
  2301. TestJSONType(J[0],jtArray);
  2302. AssertEquals('J[0] is TJSONArray',TJSONArray,J[0].ClassType);
  2303. AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[0].ClassType);
  2304. TestAsInteger(J.Arrays[0][0],0);
  2305. TestAsInteger(J.Arrays[0][1],1);
  2306. TestAsInt64(J.Arrays[0][0],0);
  2307. TestAsInt64(J.Arrays[0][1],1);
  2308. TestAsQword(J.Arrays[0][0],0);
  2309. TestAsQword(J.Arrays[0][1],1);
  2310. TestJSON(J,'[[0, 1]]');
  2311. finally
  2312. FreeAndNil(J);
  2313. end;
  2314. end;
  2315. procedure TTestArray.TestInsertInteger;
  2316. Var
  2317. J : TJSONArray;
  2318. begin
  2319. J:=TJSonArray.Create;
  2320. try
  2321. J.Add(Integer(1));
  2322. J.Insert(0,Integer(0));
  2323. TestItemCount(J,2);
  2324. TestJSONType(J[0],jtNumber);
  2325. AssertEquals('J[0] is TJSONIntegerNumber',J[0].ClassType,TJSONIntegerNumber);
  2326. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  2327. AssertEquals('J.Integers[0]=0',0,J.integers[0]);
  2328. TestAsInteger(J[0],0);
  2329. TestAsInt64(J[0],0);
  2330. TestAsQword(J[0],0);
  2331. TestJSON(J,'[0, 1]');
  2332. finally
  2333. FreeAndNil(J);
  2334. end;
  2335. end;
  2336. procedure TTestArray.TestInsertInt64;
  2337. Var
  2338. J : TJSONArray;
  2339. begin
  2340. J:=TJSonArray.Create;
  2341. try
  2342. J.Add(Int64(1));
  2343. J.Insert(0,Int64(0));
  2344. TestItemCount(J,2);
  2345. TestJSONType(J[0],jtNumber);
  2346. AssertEquals('J[0] is TJSONInt64Number',J[0].ClassType,TJSONInt64Number);
  2347. AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
  2348. AssertEquals('J.Int64s[0]=0',0,J.Int64s[0]);
  2349. TestAsInteger(J[0],0);
  2350. TestAsInt64(J[0],0);
  2351. TestAsQword(J[0],0);
  2352. TestJSON(J,'[0, 1]');
  2353. finally
  2354. FreeAndNil(J);
  2355. end;
  2356. end;
  2357. procedure TTestArray.TestInsertFloat;
  2358. Var
  2359. J : TJSONArray;
  2360. S,S2 : String;
  2361. F : TJSONFloat;
  2362. begin
  2363. F:=1.2;
  2364. J:=TJSonArray.Create;
  2365. try
  2366. J.Add(2.3);
  2367. J.Insert(0,F);
  2368. TestItemCount(J,2);
  2369. TestJSONType(J[0],jtNumber);
  2370. AssertEquals('J[0] is TJSONFloatNumber',TJSONfloatNumber,J[0].ClassType);
  2371. AssertEquals('j.Types[0]=jtNumber',Ord(jtNumber),ord(J.Types[0]));
  2372. AssertEquals('J.Floats[0]='+FloatToStr(F),F,J.Floats[0]);
  2373. TestAsFloat(J[0],F);
  2374. Str(F,S);
  2375. Delete(S,1,1);
  2376. F:=2.3;
  2377. Str(F,S2);
  2378. Delete(S2,1,1);
  2379. TestJSON(J,'['+S+', '+S2+']');
  2380. finally
  2381. FreeAndNil(J);
  2382. end;
  2383. end;
  2384. procedure TTestArray.TestInsertBooleanTrue;
  2385. begin
  2386. TestInsertBoolean(True);
  2387. end;
  2388. procedure TTestArray.TestInsertBooleanFalse;
  2389. begin
  2390. TestInsertBoolean(False);
  2391. end;
  2392. procedure TTestArray.TestInsertString;
  2393. Var
  2394. J : TJSONArray;
  2395. S : String;
  2396. begin
  2397. S:='A string';
  2398. J:=TJSonArray.Create;
  2399. try
  2400. J.Add('Another string');
  2401. J.Insert(0,S);
  2402. TestItemCount(J,2);
  2403. TestJSONType(J[0],jtString);
  2404. AssertEquals('J[0] is TJSONString',TJSONString,J[0].ClassType);
  2405. TestAsString(J[0],S);
  2406. AssertEquals('J.Strings[0]="'+S+'"',S,J.Strings[0]);
  2407. TestJSON(J,'["'+StringToJSONString(S)+'", "Another string"]');
  2408. finally
  2409. FreeAndNil(J);
  2410. end;
  2411. end;
  2412. procedure TTestArray.TestInsertNull;
  2413. Var
  2414. J : TJSONArray;
  2415. begin
  2416. J:=TJSonArray.Create;
  2417. try
  2418. J.Add(123);
  2419. J.Insert(0);
  2420. TestItemCount(J,2);
  2421. TestJSONType(J[0],jtNull);
  2422. AssertEquals('J[0] is TJSONNull',TJSONNull,J[0].ClassType);
  2423. AssertEquals('J.Nulls[0]=True',True,J.Nulls[0]);
  2424. TestIsNull(J[0],true);
  2425. TestJSON(J,'[null, 123]');
  2426. finally
  2427. FreeAndNil(J);
  2428. end;
  2429. end;
  2430. procedure TTestArray.TestInsertObject;
  2431. Const
  2432. A = 'a';
  2433. B = 'b';
  2434. Var
  2435. J : TJSONArray;
  2436. J2 : TJSONObject;
  2437. begin
  2438. J:=TJSonArray.Create;
  2439. try
  2440. J.Add('A string');
  2441. J2:=TJSonObject.Create;
  2442. J2.Add(A,0);
  2443. J2.Add(B,1);
  2444. J.Insert(0,J2);
  2445. TestItemCount(J,2);
  2446. TestJSONType(J[0],jtObject);
  2447. AssertEquals('J[0] is TJSONObject',TJSONObject,J[0].ClassType);
  2448. AssertEquals('J.Objects[0] is TJSONObject',TJSONObject,J.Objects[0].ClassType);
  2449. TestAsInteger(J.Objects[0][A],0);
  2450. TestAsInteger(J.Objects[0][B],1);
  2451. TestAsInt64(J.Objects[0][A],0);
  2452. TestAsInt64(J.Objects[0][B],1);
  2453. TestAsQword(J.Objects[0][A],0);
  2454. TestAsQword(J.Objects[0][B],1);
  2455. TestJSON(J,'[{ "a" : 0, "b" : 1 }, "A string"]');
  2456. finally
  2457. FreeAndNil(J);
  2458. end;
  2459. end;
  2460. procedure TTestArray.TestInsertArray;
  2461. Var
  2462. J,J2 : TJSONArray;
  2463. begin
  2464. J:=TJSonArray.Create;
  2465. try
  2466. J.Add('Something nice');
  2467. J2:=TJSonArray.Create;
  2468. J2.Add(0);
  2469. J2.Add(1);
  2470. J.Insert(0,J2);
  2471. TestItemCount(J,2);
  2472. TestJSONType(J[0],jtArray);
  2473. AssertEquals('J[0] is TJSONArray',TJSONArray,J[0].ClassType);
  2474. AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[0].ClassType);
  2475. TestAsInteger(J.Arrays[0][0],0);
  2476. TestAsInteger(J.Arrays[0][1],1);
  2477. TestAsInt64(J.Arrays[0][0],0);
  2478. TestAsInt64(J.Arrays[0][1],1);
  2479. TestAsQWord(J.Arrays[0][0],0);
  2480. TestAsQWord(J.Arrays[0][1],1);
  2481. TestJSON(J,'[[0, 1], "Something nice"]');
  2482. finally
  2483. FreeAndNil(J);
  2484. end;
  2485. end;
  2486. procedure TTestArray.TestMove;
  2487. Var
  2488. J : TJSONArray;
  2489. begin
  2490. J:=TJSonArray.Create;
  2491. try
  2492. J.Add('First string');
  2493. J.Add('Second string');
  2494. J.Add('Third string');
  2495. J.Move(2,1);
  2496. TestItemCount(J,3);
  2497. AssertEquals('J[2] is TJSONString',TJSONString,J[1].ClassType);
  2498. AssertEquals('J[1] is TJSONString',TJSONString,J[2].ClassType);
  2499. TestAsString(J[1],'Third string');
  2500. TestAsString(J[2],'Second string');
  2501. finally
  2502. FreeAndNil(J);
  2503. end;
  2504. end;
  2505. procedure TTestArray.TestExchange;
  2506. Var
  2507. J : TJSONArray;
  2508. begin
  2509. J:=TJSonArray.Create;
  2510. try
  2511. J.Add('First string');
  2512. J.Add('Second string');
  2513. J.Add('Third string');
  2514. J.Exchange(2,0);
  2515. TestItemCount(J,3);
  2516. AssertEquals('J[2] is TJSONString',TJSONString,J[0].ClassType);
  2517. AssertEquals('J[1] is TJSONString',TJSONString,J[2].ClassType);
  2518. TestAsString(J[0],'Third string');
  2519. TestAsString(J[2],'First string');
  2520. finally
  2521. FreeAndNil(J);
  2522. end;
  2523. end;
  2524. procedure TTestArray.TestAddObject;
  2525. Const
  2526. A = 'a';
  2527. B = 'b';
  2528. Var
  2529. J : TJSONArray;
  2530. J2 : TJSONObject;
  2531. begin
  2532. J:=TJSonArray.Create;
  2533. try
  2534. J2:=TJSonObject.Create;
  2535. J2.Add(A,0);
  2536. J2.Add(B,1);
  2537. J.Add(J2);
  2538. TestItemCount(J,1);
  2539. TestJSONType(J[0],jtObject);
  2540. AssertEquals('J[0] is TJSONObject',TJSONObject,J[0].ClassType);
  2541. AssertEquals('J.Objects[0] is TJSONObject',TJSONObject,J.Objects[0].ClassType);
  2542. TestAsInteger(J.Objects[0][A],0);
  2543. TestAsInteger(J.Objects[0][B],1);
  2544. TestAsInt64(J.Objects[0][A],0);
  2545. TestAsInt64(J.Objects[0][B],1);
  2546. TestAsQword(J.Objects[0][A],0);
  2547. TestAsQword(J.Objects[0][B],1);
  2548. TestJSON(J,'[{ "a" : 0, "b" : 1 }]');
  2549. finally
  2550. FreeAndNil(J);
  2551. end;
  2552. end;
  2553. procedure TTestArray.TestDelete;
  2554. Var
  2555. J : TJSONArray;
  2556. begin
  2557. J:=TJSonArray.Create;
  2558. try
  2559. J.Add(0);
  2560. J.Add(1);
  2561. TestItemCount(J,2);
  2562. TestJSONType(J[0],jtNumber);
  2563. TestJSONType(J[1],jtNumber);
  2564. TestJSON(J,'[0, 1]');
  2565. J.Delete(1);
  2566. TestItemCount(J,1);
  2567. J.Delete(0);
  2568. TestItemCount(J,0);
  2569. finally
  2570. FreeAndNil(J);
  2571. end;
  2572. end;
  2573. procedure TTestArray.TestRemove;
  2574. Var
  2575. J : TJSONArray;
  2576. I : TJSONData;
  2577. begin
  2578. J:=TJSonArray.Create;
  2579. try
  2580. J.Add(0);
  2581. J.Add(1);
  2582. J.Add(2);
  2583. TestItemCount(J,3);
  2584. TestJSONType(J[0],jtNumber);
  2585. TestJSONType(J[1],jtNumber);
  2586. TestJSONType(J[2],jtNumber);
  2587. TestJSON(J,'[0, 1, 2]');
  2588. I:=J[1];
  2589. J.Remove(I);
  2590. TestItemCount(J,2);
  2591. TestAsInteger(J[0],0);
  2592. TestAsInteger(J[1],2);
  2593. TestAsInt64(J[0],0);
  2594. TestAsInt64(J[1],2);
  2595. TestAsQWord(J[0],0);
  2596. TestAsQWord(J[1],2);
  2597. finally
  2598. FreeAndNil(J);
  2599. end;
  2600. end;
  2601. procedure TTestArray.TestClone;
  2602. Var
  2603. J,J2 : TJSONArray;
  2604. D : TJSONData;
  2605. begin
  2606. J:=TJSonArray.Create;
  2607. try
  2608. J.Add(1);
  2609. J.Add('aloha');
  2610. D:=J.Clone;
  2611. try
  2612. TestJSONType(D,jtArray);
  2613. J2:=TJSonArray(D);
  2614. TestItemCount(J2,2);
  2615. TestJSONType(J2[0],jtNumber);
  2616. TestJSONType(J2[1],jtString);
  2617. TestAsInteger(J2[0],1);
  2618. TestAsString(J2[1],'aloha');
  2619. finally
  2620. D.Free;
  2621. end;
  2622. finally
  2623. FreeAndNil(J);
  2624. end;
  2625. end;
  2626. procedure TTestArray.TestMyClone;
  2627. Var
  2628. J : TMyArray;
  2629. D : TJSONData;
  2630. begin
  2631. J:=TMyArray.Create;
  2632. try
  2633. J.Add(1);
  2634. J.Add('aloha');
  2635. D:=J.Clone;
  2636. try
  2637. TestJSONType(D,jtArray);
  2638. AssertEquals('Correct class',TMyArray,D.ClassType);
  2639. finally
  2640. D.Free;
  2641. end;
  2642. finally
  2643. FreeAndNil(J);
  2644. end;
  2645. end;
  2646. procedure TTestArray.TestFormat;
  2647. Var
  2648. J : TJSONArray;
  2649. begin
  2650. J:=TJSonArray.Create;
  2651. try
  2652. J.Add(0);
  2653. J.Add(1);
  2654. J.Add(2);
  2655. TestItemCount(J,3);
  2656. TestJSONType(J[0],jtNumber);
  2657. TestJSONType(J[1],jtNumber);
  2658. TestJSONType(J[2],jtNumber);
  2659. TestJSON(J,'[0, 1, 2]');
  2660. AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineArray],1));
  2661. AssertEquals('FormatJSON, default','['+sLinebreak+' 0,'+sLinebreak+' 1,'+sLinebreak+' 2'+sLinebreak+']',J.FormatJSON());
  2662. AssertEquals('FormatJSON, use tab','['+sLinebreak+#9'0,'+sLinebreak+#9'1,'+sLinebreak+#9'2'+sLinebreak+']',J.FormatJSON([foUseTabChar],1));
  2663. J.Add(TJSONObject.Create(['x',1,'y',2]));
  2664. 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));
  2665. finally
  2666. J.Free
  2667. end;
  2668. end;
  2669. procedure TTestArray.TestFormatNil;
  2670. Var
  2671. J : TJSONArray;
  2672. begin
  2673. J:=TJSonArray.Create;
  2674. try
  2675. J.Add(1);
  2676. J.Add(TJSONObject(Nil));
  2677. TestJSON(J,'[1, null]');
  2678. AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineArray],1));
  2679. finally
  2680. J.Free;
  2681. end;
  2682. end;
  2683. { TTestObject }
  2684. procedure TTestObject.TestCreate;
  2685. begin
  2686. TestJSONType(J,jtObject);
  2687. TestItemCount(J,0);
  2688. TestJSON(J,'{}');
  2689. TestIsNull(J,False);
  2690. TestAsBoolean(J,False,True);
  2691. TestAsInteger(J,1,True);
  2692. TestAsInt64(J,1,True);
  2693. TestAsQword(J,1,True);
  2694. TestAsString(J,'',True);
  2695. TestAsFloat(J,0.0,True);
  2696. end;
  2697. procedure TTestObject.TestAddInteger;
  2698. Const
  2699. A = 'a';
  2700. begin
  2701. J.Add(A,Integer(0));
  2702. TestItemCount(J,1);
  2703. TestJSONType(J[A],jtNumber);
  2704. AssertEquals('J[''a''] is TJSONIntegerNumber',J[A].ClassType,TJSONIntegerNumber);
  2705. AssertEquals('j.Types[''a'']=jtNumber',ord(J.Types[A]),Ord(jtNumber));
  2706. AssertEquals('J.Integers[''a'']=0',0,J.integers[A]);
  2707. TestAsInteger(J[A],0);
  2708. TestAsInt64(J[A],0);
  2709. TestAsQword(J[A],0);
  2710. TestJSON(J,'{ "'+A+'" : 0 }');
  2711. end;
  2712. procedure TTestObject.TestAddInt64;
  2713. Const
  2714. A = 'a';
  2715. begin
  2716. J.Add(A,Int64(0));
  2717. TestItemCount(J,1);
  2718. TestJSONType(J[A],jtNumber);
  2719. AssertEquals('J[''a''] is TJSONInt64Number',J[A].ClassType,TJSONInt64Number);
  2720. AssertEquals('j.Types[''a'']=jtNumber',ord(J.Types[A]),Ord(jtNumber));
  2721. AssertEquals('J.Int64s[''a'']=0',0,J.Int64s[A]);
  2722. TestAsInteger(J[A],0);
  2723. TestAsInt64(J[A],0);
  2724. TestAsQword(J[A],0);
  2725. TestJSON(J,'{ "'+A+'" : 0 }');
  2726. end;
  2727. procedure TTestObject.TestAddFloat;
  2728. Const
  2729. A = 'a';
  2730. Var
  2731. S : String;
  2732. F : TJSONFloat;
  2733. begin
  2734. F:=1.2;
  2735. J.Add(A,F);
  2736. TestItemCount(J,1);
  2737. TestJSONType(J[A],jtNumber);
  2738. AssertEquals('J[''a''] is TJSONFloatNumber',TJSONfloatNumber,J[a].ClassType);
  2739. AssertEquals('j.Types[''a'']=jtNumber',Ord(jtNumber),ord(J.Types[a]));
  2740. AssertEquals('J.Floats[''a'']='+FloatToStr(F),F,J.Floats[a]);
  2741. TestAsFloat(J[A],F);
  2742. Str(F,S);
  2743. TestJSON(J,'{ "'+a+'" :'+S+' }');
  2744. end;
  2745. procedure TTestObject.Setup;
  2746. begin
  2747. inherited Setup;
  2748. FJ:=TJSONObject.Create;
  2749. end;
  2750. procedure TTestObject.TearDown;
  2751. begin
  2752. FreeAndNil(FJ);
  2753. inherited TearDown;
  2754. end;
  2755. procedure TTestObject.TestAddBoolean(B : Boolean);
  2756. Const
  2757. A = 'a';
  2758. begin
  2759. B:=True;
  2760. J.Add(A,B);
  2761. TestItemCount(J,1);
  2762. TestJSONType(J[A],jtBoolean);
  2763. AssertEquals('J[''a''] is TJSONBoolean',TJSONBoolean,J[a].ClassType);
  2764. TestAsBoolean(J[a],B);
  2765. AssertEquals('J.Booleans[''a'']='+BoolToStr(B)+'"',B,J.Booleans[a]);
  2766. If B then
  2767. TestJSON(J,'{ "'+a+'" : true }')
  2768. else
  2769. TestJSON(J,'{ "'+a+'" : false }');
  2770. end;
  2771. procedure TTestObject.TestAccessError;
  2772. begin
  2773. J.Strings['NonExist'];
  2774. end;
  2775. procedure TTestObject.TestAddBooleanTrue;
  2776. begin
  2777. TestAddBoolean(True);
  2778. end;
  2779. procedure TTestObject.TestAddBooleanFalse;
  2780. begin
  2781. TestAddBoolean(False);
  2782. end;
  2783. procedure TTestObject.TestAddString;
  2784. Const
  2785. A = 'a';
  2786. Var
  2787. S : String;
  2788. begin
  2789. S:='A string';
  2790. J.Add(A,S);
  2791. TestItemCount(J,1);
  2792. TestJSONType(J[a],jtString);
  2793. AssertEquals('J[''a''] is TJSONString',TJSONString,J[A].ClassType);
  2794. TestAsString(J[a],S);
  2795. AssertEquals('J.Strings[''a'']="'+S+'"',S,J.Strings[A]);
  2796. TestJSON(J,'{ "'+a+'" : "'+StringToJSONString(S)+'" }');
  2797. end;
  2798. procedure TTestObject.TestAddNull;
  2799. Const
  2800. A = 'a';
  2801. begin
  2802. J.Add(a);
  2803. TestItemCount(J,1);
  2804. TestJSONType(J[a],jtNull);
  2805. AssertEquals('J[''a''] is TJSONNull',TJSONNull,J[A].ClassType);
  2806. AssertEquals('J.Nulls[''a'']=True',True,J.Nulls[A]);
  2807. TestIsNull(J[a],true);
  2808. TestJSON(J,'{ "'+a+'" : null }');
  2809. end;
  2810. procedure TTestObject.TestAddObject;
  2811. Const
  2812. A = 'a';
  2813. B = 'b';
  2814. C = 'c';
  2815. Var
  2816. J2 : TJSONObject;
  2817. begin
  2818. J2:=TJSonObject.Create;
  2819. J2.Add(B,0);
  2820. J2.Add(C,1);
  2821. J.Add(A,J2);
  2822. TestItemCount(J,1);
  2823. TestJSONType(J[A],jtObject);
  2824. AssertEquals('J[''a''] is TJSONObject',TJSONObject,J[A].ClassType);
  2825. AssertEquals('J.Objects[''a''] is TJSONObject',TJSONObject,J.Objects[A].ClassType);
  2826. TestAsInteger(J.Objects[A][B],0);
  2827. TestAsInteger(J.Objects[A][C],1);
  2828. TestAsInt64(J.Objects[A][B],0);
  2829. TestAsInt64(J.Objects[A][C],1);
  2830. TestAsQword(J.Objects[A][B],0);
  2831. TestAsQword(J.Objects[A][C],1);
  2832. TestJSON(J,'{ "a" : { "b" : 0, "c" : 1 } }');
  2833. end;
  2834. procedure TTestObject.TestAddArray;
  2835. Const
  2836. A = 'a';
  2837. Var
  2838. J2 : TJSONArray;
  2839. begin
  2840. J2:=TJSonArray.Create;
  2841. J2.Add(0);
  2842. J2.Add(1);
  2843. J.Add(A,J2);
  2844. TestItemCount(J,1);
  2845. TestJSONType(J[A],jtArray);
  2846. AssertEquals('J[''a''] is TJSONArray',TJSONArray,J[A].ClassType);
  2847. AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[A].ClassType);
  2848. TestAsInteger(J.Arrays[A][0],0);
  2849. TestAsInteger(J.Arrays[A][1],1);
  2850. TestAsInt64(J.Arrays[A][0],0);
  2851. TestAsInt64(J.Arrays[A][1],1);
  2852. TestAsQword(J.Arrays[A][0],0);
  2853. TestAsQword(J.Arrays[A][1],1);
  2854. TestJSON(J,'{ "a" : [0, 1] }');
  2855. end;
  2856. procedure TTestObject.TestDelete;
  2857. Const
  2858. A = 'a';
  2859. B = 'b';
  2860. begin
  2861. J.Add(A,0);
  2862. J.Add(B,1);
  2863. TestItemCount(J,2);
  2864. TestJSONType(J[A],jtNumber);
  2865. TestJSONType(J[A],jtNumber);
  2866. TestJSON(J,'{ "a" : 0, "b" : 1 }');
  2867. J.Delete(1);
  2868. TestItemCount(J,1);
  2869. J.Delete(0);
  2870. TestItemCount(J,0);
  2871. end;
  2872. procedure TTestObject.TestRemove;
  2873. Const
  2874. A = 'a';
  2875. B = 'b';
  2876. C = 'c';
  2877. Var
  2878. I : TJSONData;
  2879. begin
  2880. J.Add(A,1);
  2881. J.Add(B,2);
  2882. J.Add(C,3);
  2883. TestItemCount(J,3);
  2884. TestJSONType(J[A],jtNumber);
  2885. TestJSONType(J[B],jtNumber);
  2886. TestJSONType(J[C],jtNumber);
  2887. TestJSON(J,'{ "a" : 1, "b" : 2, "c" : 3 }');
  2888. I:=J[b];
  2889. J.Remove(I);
  2890. TestItemCount(J,2);
  2891. TestAsInteger(J[a],1);
  2892. TestAsInteger(J[c],3);
  2893. TestAsInt64(J[a],1);
  2894. TestAsInt64(J[c],3);
  2895. TestAsQword(J[a],1);
  2896. TestAsQword(J[c],3);
  2897. end;
  2898. procedure TTestObject.TestClone;
  2899. Var
  2900. J2 : TJSONObject;
  2901. D : TJSONData;
  2902. begin
  2903. J.Add('p1',1);
  2904. J.Add('p2','aloha');
  2905. D:=J.Clone;
  2906. try
  2907. TestJSONType(D,jtObject);
  2908. J2:=TJSonObject(D);
  2909. TestItemCount(J2,2);
  2910. TestJSONType(J2['p1'],jtNumber);
  2911. TestJSONType(J2['p2'],jtString);
  2912. TestAsInteger(J2['p1'],1);
  2913. TestAsString(J2['p2'],'aloha');
  2914. finally
  2915. D.Free;
  2916. end;
  2917. end;
  2918. procedure TTestObject.TestMyClone;
  2919. Var
  2920. D : TJSONData;
  2921. O : TMyObject;
  2922. begin
  2923. D:=Nil;
  2924. O:=TMyObject.Create;
  2925. try
  2926. O.Add('p1',1);
  2927. O.Add('p2','aloha');
  2928. D:=O.Clone;
  2929. TestJSONType(D,jtObject);
  2930. AssertEquals('Correct class',TMYObject,D.ClassType);
  2931. finally
  2932. D.Free;
  2933. O.Free;
  2934. end;
  2935. end;
  2936. procedure TTestObject.TestExtract;
  2937. Const
  2938. A = 'a';
  2939. B = 'b';
  2940. Var
  2941. JA,JB : TJSONData;
  2942. E : TJSONData;
  2943. begin
  2944. J.Add(A,0);
  2945. J.Add(B,1);
  2946. TestItemCount(J,2);
  2947. JA:=J[A];
  2948. JB:=J[B];
  2949. TestJSONType(JA,jtNumber);
  2950. TestJSONType(JB,jtNumber);
  2951. TestJSON(J,'{ "a" : 0, "b" : 1 }');
  2952. E:=J.Extract(1);
  2953. AssertSame('Extracted JA',JB,E);
  2954. E.Free;
  2955. TestItemCount(J,1);
  2956. E:=J.Extract(0);
  2957. AssertSame('Extracted JB',JA,E);
  2958. E.Free;
  2959. TestItemCount(J,0);
  2960. end;
  2961. procedure TTestObject.TestNonExistingAccessError;
  2962. begin
  2963. AssertException(EJSON,@TestAccessError);
  2964. end;
  2965. procedure TTestObject.TestFormat;
  2966. Var
  2967. O : TJSONObject;
  2968. begin
  2969. O:=TJSONObject.Create(['x',1,'y',2]);
  2970. try
  2971. TestJSON(O,'{ "x" : 1, "y" : 2 }');
  2972. AssertEquals('Format equals JSON',O.AsJSON,O.FormatJSON([foSingleLineObject]));
  2973. AssertEquals('Format using SkipWhiteSpace','{"x":1,"y":2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace]));
  2974. AssertEquals('Format using SkipWhiteSpace,foSkipWhiteSpaceOnlyLeading','{"x": 1,"y": 2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace,foSkipWhiteSpaceOnlyLeading]));
  2975. AssertEquals('Format using SkipWhiteSpace,unquotednames','{x:1,y:2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace,foDoNotQuoteMembers]));
  2976. AssertEquals('Format []','{'+sLineBreak+' "x" : 1,'+sLineBreak+' "y" : 2'+sLineBreak+'}',O.FormatJSON([]));
  2977. AssertEquals('Format [foDoNotQuoteMembers]','{'+sLineBreak+' x : 1,'+sLineBreak+' y : 2'+sLineBreak+'}',O.FormatJSON([foDoNotQuoteMembers]));
  2978. AssertEquals('Format [foUseTabChar,foDoNotQuoteMembers]','{'+sLineBreak+#9'x : 1,'+sLineBreak+#9'y : 2'+sLineBreak+'}',O.FormatJSON([foUseTabChar,foDoNotQuoteMembers],1));
  2979. O.Add('s',TJSONObject.Create(['w',10,'h',20]));
  2980. 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));
  2981. finally
  2982. O.Free;
  2983. end;
  2984. end;
  2985. procedure TTestObject.TestFormatNil;
  2986. begin
  2987. J.Add('a',1);
  2988. J.Add('b',TJSONObject(Nil));
  2989. TestJSON(J,'{ "a" : 1, "b" : null }');
  2990. AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineObject],1));
  2991. end;
  2992. procedure TTestObject.TestFormatForceLF;
  2993. Var
  2994. O : TJSONObject;
  2995. begin
  2996. if sLineBreak=#10 then
  2997. Ignore('Not relevant when linebreak is LF');
  2998. O:=TJSONObject.Create(['x',1,'y',2]);
  2999. try
  3000. TestJSON(O,'{ "x" : 1, "y" : 2 }');
  3001. AssertEquals('FormatJSON, forced LF','{'+#10+' "x" : 1,'+#10+' "y" : 2'+#10+'}',O.FormatJSON([foForceLF]));
  3002. finally
  3003. O.Free;
  3004. end;
  3005. end;
  3006. procedure TTestObject.TestFind;
  3007. Const
  3008. A = 'A';
  3009. S = 'A string';
  3010. B = 'a';
  3011. S2 = 'Another string';
  3012. C = 'c';
  3013. S3 = 'Yet Another string';
  3014. begin
  3015. J.Add(A,S);
  3016. J.Add(B,S2);
  3017. J.Add(C,S3);
  3018. TestJSONType(J,jtObject);
  3019. TestIsNull(J,False);
  3020. TestItemCount(J,3);
  3021. TestJSONType(J[A],jtString);
  3022. TestJSONType(J[B],jtString);
  3023. TestJSON(J,'{ "A" : "'+S+'", "a" : "'+S2+'", "c" : "'+S3+'" }');
  3024. AssertEquals('Nonexisting, case sensitive',-1,J.IndexOfName('D'));
  3025. AssertEquals('Nonexisting, case insensitive',-1,J.IndexOfName('D',True));
  3026. AssertEquals('1 Existing , case sensitive',0,J.IndexOfName(A));
  3027. AssertEquals('2 Existing exact match, case insensitive',0,J.IndexOfName(A,true));
  3028. AssertEquals('3 Existing , case sensitive',1,J.IndexOfName(B));
  3029. AssertEquals('4 Existing exact match, case insensitive',1,J.IndexOfName(B,true));
  3030. AssertEquals('5 Existing , case sensitive again',2,J.IndexOfName(C));
  3031. AssertEquals('6 Existing case-insensitive match, case insensitive',2,J.IndexOfName(Uppercase(C),true));
  3032. end;
  3033. procedure TTestObject.TestIfFind;
  3034. Var
  3035. B: TJSONBoolean;
  3036. S: TJSONString;
  3037. N: TJSONNumber;
  3038. D: TJSONData;
  3039. begin
  3040. J.Add('s', 'astring');
  3041. J.Add('b', true);
  3042. J.Add('n', 1);
  3043. TestJSONType(J,jtObject);
  3044. TestIsNull(J,False);
  3045. TestItemCount(J,3);
  3046. AssertEquals('boolean found', true, j.Find('b', B));
  3047. AssertEquals('string found', true, j.Find('s', S));
  3048. AssertEquals('number found', true, j.Find('n', N));
  3049. AssertEquals('data found', true, j.Find('s', D));
  3050. end;
  3051. procedure TTestObject.AppendA;
  3052. begin
  3053. J.Add('A','S')
  3054. end;
  3055. procedure TTestObject.TestDuplicate;
  3056. begin
  3057. J.Add('A',TJSONObject.Create);
  3058. AssertException(EJSON,@AppendA);
  3059. end;
  3060. procedure TTestObject.TestCreateString;
  3061. Const
  3062. A = 'A';
  3063. S = 'A string';
  3064. begin
  3065. J.Add(A,S);
  3066. TestJSONType(J,jtObject);
  3067. TestItemCount(J,1);
  3068. TestJSONType(J[A],jtString);
  3069. TestJSON(J,'{ "A" : "'+S+'" }');
  3070. TestIsNull(J,False);
  3071. end;
  3072. procedure TTestObject.TestCreateStringUnquoted;
  3073. Const
  3074. A = 'A';
  3075. S = 'A string';
  3076. begin
  3077. TJSONObject.UnquotedMemberNames:=True;
  3078. J.Add(A,S);
  3079. TestJSONType(J,jtObject);
  3080. TestItemCount(J,1);
  3081. TestJSONType(J[A],jtString);
  3082. TestJSON(J,'{ A : "'+S+'" }');
  3083. TestIsNull(J,False);
  3084. end;
  3085. procedure TTestObject.TestCreatePchar;
  3086. Const
  3087. A = 'A';
  3088. S = 'A string';
  3089. Var
  3090. O : TJSONObject;
  3091. begin
  3092. O:=TJSONObject.Create([A,PAnsiChar(S)]);
  3093. try
  3094. TestJSONType(O,jtObject);
  3095. TestItemCount(O,1);
  3096. TestJSONType(O[A],jtString);
  3097. TestJSON(O,'{ "A" : "'+S+'" }');
  3098. TestIsNull(O,False);
  3099. finally
  3100. FreeAndNil(O);
  3101. end;
  3102. end;
  3103. procedure TTestObject.TestCreatePcharUnquoted;
  3104. Const
  3105. A = 'A';
  3106. S = 'A string';
  3107. Var
  3108. O : TJSONObject;
  3109. begin
  3110. TJSONObject.UnQuotedMemberNames:=True;
  3111. O:=TJSONObject.Create([A,PAnsiChar(S)]);
  3112. try
  3113. TestJSONType(O,jtObject);
  3114. TestItemCount(O,1);
  3115. TestJSONType(O[A],jtString);
  3116. TestJSON(O,'{ A : "'+S+'" }');
  3117. TestIsNull(O,False);
  3118. finally
  3119. FreeAndNil(O);
  3120. end;
  3121. end;
  3122. procedure TTestObject.TestCreateStrings;
  3123. Const
  3124. A = 'A';
  3125. B = 'B';
  3126. S = 'A string';
  3127. T = 'B string';
  3128. Var
  3129. O : TJSONObject;
  3130. begin
  3131. O:=TJSONObject.Create([A,S,B,T]);
  3132. try
  3133. TestJSONType(O,jtObject);
  3134. TestItemCount(O,2);
  3135. TestJSONType(O[A],jtString);
  3136. TestJSONType(O[B],jtString);
  3137. TestJSON(O,'{ "A" : "'+S+'", "B" : "'+T+'" }');
  3138. TestIsNull(O,False);
  3139. finally
  3140. FreeAndNil(O);
  3141. end;
  3142. end;
  3143. procedure TTestObject.TestCreateStringsCompressed;
  3144. Const
  3145. A = 'A';
  3146. B = 'B';
  3147. S = 'A string';
  3148. T = 'B string';
  3149. Var
  3150. O : TJSONObject;
  3151. begin
  3152. TJSONData.CompressedJSON:=True;
  3153. O:=TJSONObject.Create([A,S,B,T]);
  3154. try
  3155. TestJSONType(O,jtObject);
  3156. TestItemCount(O,2);
  3157. TestJSONType(O[A],jtString);
  3158. TestJSONType(O[B],jtString);
  3159. TestJSON(O,'{"A":"'+S+'","B":"'+T+'"}');
  3160. TestIsNull(O,False);
  3161. finally
  3162. FreeAndNil(O);
  3163. end;
  3164. end;
  3165. procedure TTestObject.TestCreateStringsCompressedUnquoted;
  3166. Const
  3167. A = 'A';
  3168. B = 'B';
  3169. S = 'A string';
  3170. T = 'B string';
  3171. Var
  3172. O : TJSONObject;
  3173. begin
  3174. TJSONData.CompressedJSON:=True;
  3175. TJSONObject.UnQuotedMemberNames:=True;
  3176. O:=TJSONObject.Create([A,S,B,T]);
  3177. try
  3178. TestJSONType(O,jtObject);
  3179. TestItemCount(O,2);
  3180. TestJSONType(O[A],jtString);
  3181. TestJSONType(O[B],jtString);
  3182. TestJSON(O,'{A:"'+S+'",B:"'+T+'"}');
  3183. TestIsNull(O,False);
  3184. finally
  3185. FreeAndNil(O);
  3186. end;
  3187. end;
  3188. procedure TTestObject.TestCreateInteger;
  3189. Const
  3190. A = 'A';
  3191. S = 3;
  3192. Var
  3193. O : TJSONObject;
  3194. begin
  3195. O:=TJSONObject.Create([A,S]);
  3196. try
  3197. TestJSONType(O,jtObject);
  3198. TestItemCount(O,1);
  3199. TestJSONType(O[A],jtNumber);
  3200. TestJSON(O,'{ "A" : 3 }');
  3201. finally
  3202. FreeAndNil(O);
  3203. end;
  3204. end;
  3205. procedure TTestObject.TestCreateIntegerUnquoted;
  3206. Const
  3207. A = 'A';
  3208. S = 3;
  3209. Var
  3210. O : TJSONObject;
  3211. begin
  3212. TJSONObject.UnQuotedMemberNames:=True;
  3213. O:=TJSONObject.Create([A,S]);
  3214. try
  3215. TestJSONType(O,jtObject);
  3216. TestItemCount(O,1);
  3217. TestJSONType(O[A],jtNumber);
  3218. TestJSON(O,'{ A : 3 }');
  3219. finally
  3220. FreeAndNil(O);
  3221. end;
  3222. end;
  3223. procedure TTestObject.TestCreateFloat;
  3224. Const
  3225. A = 'A';
  3226. S : double = 1.2;
  3227. Var
  3228. O : TJSONObject;
  3229. r : String;
  3230. begin
  3231. O:=TJSONObject.Create([A,S]);
  3232. try
  3233. TestJSONType(O,jtObject);
  3234. TestItemCount(O,1);
  3235. TestJSONType(O[A],jtNumber);
  3236. Str(S,R);
  3237. TestJSON(O,'{ "A" :'+R+' }');
  3238. finally
  3239. FreeAndNil(O);
  3240. end;
  3241. end;
  3242. procedure TTestObject.TestCreateFloatUnquoted;
  3243. Const
  3244. A = 'A';
  3245. S : double = 1.2;
  3246. Var
  3247. O : TJSONObject;
  3248. r : String;
  3249. begin
  3250. TJSONObject.UnQuotedMemberNames:=True;
  3251. O:=TJSONObject.Create([A,S]);
  3252. try
  3253. TestJSONType(O,jtObject);
  3254. TestItemCount(O,1);
  3255. TestJSONType(O[A],jtNumber);
  3256. Str(S,R);
  3257. TestJSON(O,'{ A :'+R+' }');
  3258. finally
  3259. FreeAndNil(O);
  3260. end;
  3261. end;
  3262. procedure TTestObject.TestCreateInt64;
  3263. Const
  3264. A = 'A';
  3265. S : Int64 = $FFFFFFFFFFFFF;
  3266. Var
  3267. O : TJSONObject;
  3268. begin
  3269. O:=TJSONObject.Create([A,S]);
  3270. try
  3271. TestJSONType(O,jtObject);
  3272. TestItemCount(O,1);
  3273. TestJSONType(O[A],jtNumber);
  3274. TestJSON(O,'{ "A" : '+IntToStr(S)+' }');
  3275. finally
  3276. FreeAndNil(O);
  3277. end;
  3278. end;
  3279. procedure TTestObject.TestCreateInt64Unquoted;
  3280. Const
  3281. A = 'A';
  3282. S : Int64 = $FFFFFFFFFFFFF;
  3283. Var
  3284. O : TJSONObject;
  3285. begin
  3286. TJSONObject.UnQuotedMemberNames:=True;
  3287. O:=TJSONObject.Create([A,S]);
  3288. try
  3289. TestJSONType(O,jtObject);
  3290. TestItemCount(O,1);
  3291. TestJSONType(O[A],jtNumber);
  3292. TestJSON(O,'{ A : '+IntToStr(S)+' }');
  3293. finally
  3294. FreeAndNil(O);
  3295. end;
  3296. end;
  3297. procedure TTestObject.TestCreateQWord;
  3298. Const
  3299. A = 'A';
  3300. S : QWord = $FFFFFFFFFFFFF;
  3301. Var
  3302. O : TJSONObject;
  3303. begin
  3304. O:=TJSONObject.Create([A,S]);
  3305. try
  3306. TestJSONType(O,jtObject);
  3307. TestItemCount(O,1);
  3308. TestJSONType(O[A],jtNumber);
  3309. TestJSON(O,'{ "A" : '+IntToStr(S)+' }');
  3310. finally
  3311. FreeAndNil(O);
  3312. end;
  3313. end;
  3314. procedure TTestObject.TestCreateQWordUnquoted;
  3315. Const
  3316. A = 'A';
  3317. S : QWord = $FFFFFFFFFFFFF;
  3318. Var
  3319. O : TJSONObject;
  3320. begin
  3321. TJSONObject.UnQuotedMemberNames:=True;
  3322. O:=TJSONObject.Create([A,S]);
  3323. try
  3324. TestJSONType(O,jtObject);
  3325. TestItemCount(O,1);
  3326. TestJSONType(O[A],jtNumber);
  3327. TestJSON(O,'{ A : '+IntToStr(S)+' }');
  3328. finally
  3329. FreeAndNil(O);
  3330. end;
  3331. end;
  3332. procedure TTestObject.TestCreateBoolean;
  3333. Const
  3334. A = 'A';
  3335. S = True;
  3336. Var
  3337. O : TJSONObject;
  3338. begin
  3339. O:=TJSONObject.Create([A,S]);
  3340. try
  3341. TestJSONType(O,jtObject);
  3342. TestItemCount(O,1);
  3343. TestJSONType(O[A],jtBoolean);
  3344. TestJSON(O,'{ "A" : true }');
  3345. finally
  3346. FreeAndNil(O);
  3347. end;
  3348. end;
  3349. procedure TTestObject.TestCreateBooleanUnquoted;
  3350. Const
  3351. A = 'A';
  3352. S = True;
  3353. Var
  3354. O : TJSONObject;
  3355. begin
  3356. TJSONObject.UnQuotedMemberNames:=True;
  3357. O:=TJSONObject.Create([A,S]);
  3358. try
  3359. TestJSONType(O,jtObject);
  3360. TestItemCount(O,1);
  3361. TestJSONType(O[A],jtBoolean);
  3362. TestJSON(O,'{ A : true }');
  3363. finally
  3364. FreeAndNil(O);
  3365. end;
  3366. end;
  3367. procedure TTestObject.TestCreateJSONObject;
  3368. Const
  3369. A = 'A';
  3370. Var
  3371. O : TJSONObject;
  3372. begin
  3373. O:=TJSONObject.Create([A,TJSONObject.Create]);
  3374. try
  3375. TestItemCount(O,1);
  3376. TestJSONType(O[A],jtObject);
  3377. TestJSON(O,'{ "A" : {} }');
  3378. finally
  3379. FreeAndNil(O);
  3380. end;
  3381. end;
  3382. procedure TTestObject.TestCreateJSONObjectUnquoted;
  3383. Const
  3384. A = 'A';
  3385. Var
  3386. O : TJSONObject;
  3387. begin
  3388. TJSONObject.UnQuotedMemberNames:=True;
  3389. O:=TJSONObject.Create([A,TJSONObject.Create]);
  3390. try
  3391. TestItemCount(O,1);
  3392. TestJSONType(O[A],jtObject);
  3393. TestJSON(O,'{ A : {} }');
  3394. finally
  3395. FreeAndNil(O);
  3396. end;
  3397. end;
  3398. procedure TTestObject.TestCreateJSONString;
  3399. Const
  3400. A = 'A';
  3401. S = 'A string';
  3402. Var
  3403. O : TJSONObject;
  3404. begin
  3405. O:=TJSONObject.Create([A,TJSONString.Create(S)]);
  3406. try
  3407. TestItemCount(O,1);
  3408. TestJSONType(O[A],jtString);
  3409. TestJSON(O,'{ "A" : "'+S+'" }');
  3410. finally
  3411. FreeAndNil(O);
  3412. end;
  3413. end;
  3414. procedure TTestObject.TestCreateJSONStringUnquoted;
  3415. Const
  3416. A = 'A';
  3417. S = 'A string';
  3418. Var
  3419. O : TJSONObject;
  3420. begin
  3421. TJSONObject.UnQuotedMemberNames:=True;
  3422. O:=TJSONObject.Create([A,TJSONString.Create(S)]);
  3423. try
  3424. TestItemCount(O,1);
  3425. TestJSONType(O[A],jtString);
  3426. TestJSON(O,'{ A : "'+S+'" }');
  3427. finally
  3428. FreeAndNil(O);
  3429. end;
  3430. end;
  3431. procedure TTestObject.TestCreateObject;
  3432. Const
  3433. A = 'A';
  3434. Var
  3435. O : TJSONObject;
  3436. OO : TObject;
  3437. begin
  3438. O:=Nil;
  3439. try
  3440. Try
  3441. OO:=TObject.Create;
  3442. O:=TJSONObject.Create([A,OO]);
  3443. Fail('Array constructor accepts only TJSONData');
  3444. finally
  3445. FreeAndNil(O);
  3446. FreeAndNil(OO);
  3447. end;
  3448. except
  3449. // Should be OK.
  3450. end;
  3451. end;
  3452. procedure TTestObject.TestCreateJSONUnicodeString;
  3453. Const
  3454. A = 'A';
  3455. S : Unicodestring = 'A string';
  3456. Var
  3457. O : TJSONObject;
  3458. begin
  3459. O:=TJSONObject.Create([A,S]);
  3460. try
  3461. TestItemCount(O,1);
  3462. TestJSONType(O[A],jtString);
  3463. TestJSON(O,'{ "A" : "'+UTF8Encode(S)+'" }');
  3464. finally
  3465. FreeAndNil(O);
  3466. end;
  3467. end;
  3468. procedure TTestObject.TestCreateJSONWideString;
  3469. Const
  3470. A = 'A';
  3471. W : WideString = 'A string';
  3472. Var
  3473. O : TJSONObject;
  3474. begin
  3475. O:=TJSONObject.Create([A,W]);
  3476. try
  3477. TestItemCount(O,1);
  3478. TestJSONType(O[A],jtString);
  3479. TestJSON(O,'{ "A" : "'+UTF8Encode(W)+'" }');
  3480. finally
  3481. FreeAndNil(O);
  3482. end;
  3483. end;
  3484. procedure TTestObject.TestCreateNilPointer;
  3485. Const
  3486. A = 'A';
  3487. Var
  3488. O : TJSONObject;
  3489. P : Pointer;
  3490. begin
  3491. O:=Nil;
  3492. P:=Nil;
  3493. Try
  3494. O:=TJSONObject.Create([A,P]);
  3495. TestJSONType(O[A],jtNull);
  3496. finally
  3497. FreeAndNil(O);
  3498. end;
  3499. end;
  3500. procedure TTestObject.TestCreatePointer;
  3501. Const
  3502. A = 'A';
  3503. Var
  3504. O : TJSONObject;
  3505. P : Pointer;
  3506. begin
  3507. O:=Nil;
  3508. P:=@Self;
  3509. try
  3510. Try
  3511. O:=TJSONObject.Create([A,P]);
  3512. Fail('Array constructor accepts only NIL pointers');
  3513. finally
  3514. FreeAndNil(O);
  3515. end;
  3516. except
  3517. // Should be OK.
  3518. end;
  3519. end;
  3520. { TTestJSONString }
  3521. procedure TTestJSONString.TestTo(const Src, Dest: String; Strict : Boolean = False);
  3522. Var
  3523. S : String;
  3524. begin
  3525. S:='StringToJSONString('''+Src+''')='''+Dest+'''';
  3526. AssertEquals(S,Dest,StringToJSONString(Src,Strict));
  3527. end;
  3528. procedure TTestJSONString.TestFrom(const Src, Dest: String);
  3529. Var
  3530. S : String;
  3531. begin
  3532. S:='JSONStringToString('''+Src+''')='''+Dest+'''';
  3533. Flush(output);
  3534. AssertEquals(S,Dest,JSONStringToString(Src));
  3535. end;
  3536. procedure TTestJSONString.TestJSONStringToString;
  3537. Const
  3538. // Glowing star in UTF8
  3539. GlowingStar = #$F0#$9F#$8C#$9F;
  3540. Chinese = #$95e8#$88ab#$8111#$5b50#$6324#$574f#$4e86;
  3541. Chinese4b = #$95e8#$d867#$de3d#$88ab#$8111#$5b50#$6324#$574f#$4e86;
  3542. begin
  3543. TestFrom('','');
  3544. TestFrom('A','A');
  3545. TestFrom('AB','AB');
  3546. TestFrom('ABC','ABC');
  3547. TestFrom('\\','\');
  3548. TestFrom('\/','/');
  3549. TestFrom('\"','"');
  3550. TestFrom('\b',#8);
  3551. TestFrom('\t',#9);
  3552. TestFrom('\n',#10);
  3553. TestFrom('\f',#12);
  3554. TestFrom('\r',#13);
  3555. TestFrom('\bBC',#8'BC');
  3556. TestFrom('\tBC',#9'BC');
  3557. TestFrom('\nBC',#10'BC');
  3558. TestFrom('\fBC',#12'BC');
  3559. TestFrom('\rBC',#13'BC');
  3560. TestFrom('A\b','A'#8);
  3561. TestFrom('A\t','A'#9);
  3562. TestFrom('A\n','A'#10);
  3563. TestFrom('A\f','A'#12);
  3564. TestFrom('A\r','A'#13);
  3565. TestFrom('A\bBC','A'#8'BC');
  3566. TestFrom('A\tBC','A'#9'BC');
  3567. TestFrom('A\nBC','A'#10'BC');
  3568. TestFrom('A\fBC','A'#12'BC');
  3569. TestFrom('A\rBC','A'#13'BC');
  3570. TestFrom('\\\\','\\');
  3571. TestFrom('\/\/','//');
  3572. TestFrom('\"\"','""');
  3573. TestFrom('\b\b',#8#8);
  3574. TestFrom('\t\t',#9#9);
  3575. TestFrom('\n\n',#10#10);
  3576. TestFrom('\f\f',#12#12);
  3577. TestFrom('\r\r',#13#13);
  3578. TestFrom('\u00f8','ø'); // this is ø
  3579. TestFrom('\u00f8\"','ø"'); // this is ø"
  3580. TestFrom('\ud83c\udf1f',GlowingStar);
  3581. TestFrom('\u0041\u0042','AB'); //issue #0038622
  3582. TestFrom('\u0041\u0042\u0043','ABC');
  3583. TestFrom('\u0041\u0042\u0043\u0044','ABCD');
  3584. TestFrom('\u95e8\u88ab\u8111\u5b50\u6324\u574f\u4e86',Utf8Encode(Chinese));
  3585. TestFrom('\u95e8\ud867\ude3d\u88ab\u8111\u5b50\u6324\u574f\u4e86',Utf8Encode(Chinese4b));
  3586. end;
  3587. procedure TTestJSONString.TestStringToJSONString;
  3588. begin
  3589. TestTo('','');
  3590. TestTo('A','A');
  3591. TestTo('AB','AB');
  3592. TestTo('ABC','ABC');
  3593. TestTo('\','\\');
  3594. TestTo('/','/');
  3595. TestTo('/','\/',True);
  3596. TestTo('"','\"');
  3597. TestTo(#8,'\b');
  3598. TestTo(#9,'\t');
  3599. TestTo(#10,'\n');
  3600. TestTo(#12,'\f');
  3601. TestTo(#13,'\r');
  3602. TestTo(#8'BC','\bBC');
  3603. TestTo(#9'BC','\tBC');
  3604. TestTo(#10'BC','\nBC');
  3605. TestTo(#12'BC','\fBC');
  3606. TestTo(#13'BC','\rBC');
  3607. TestTo('A'#8,'A\b');
  3608. TestTo('A'#9,'A\t');
  3609. TestTo('A'#10,'A\n');
  3610. TestTo('A'#12,'A\f');
  3611. TestTo('A'#13,'A\r');
  3612. TestTo('A'#8'BC','A\bBC');
  3613. TestTo('A'#9'BC','A\tBC');
  3614. TestTo('A'#10'BC','A\nBC');
  3615. TestTo('A'#12'BC','A\fBC');
  3616. TestTo('A'#13'BC','A\rBC');
  3617. TestTo('\\','\\\\');
  3618. TestTo('//','//');
  3619. TestTo('//','\/\/',true);
  3620. TestTo('""','\"\"');
  3621. TestTo(#8#8,'\b\b');
  3622. TestTo(#9#9,'\t\t');
  3623. TestTo(#10#10,'\n\n');
  3624. TestTo(#12#12,'\f\f');
  3625. TestTo(#13#13,'\r\r');
  3626. TestTo(#0#1#2#3#4#5#6#7#11,'\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u000B');
  3627. TestTo(#14#15#16#17#18#19,'\u000E\u000F\u0010\u0011\u0012\u0013');
  3628. TestTo(#20#29#30#31#32,'\u0014\u001D\u001E\u001F ');
  3629. end;
  3630. initialization
  3631. RegisterTest(TTestJSONString);
  3632. RegisterTest(TTestNull);
  3633. RegisterTest(TTestBoolean);
  3634. RegisterTest(TTestInteger);
  3635. RegisterTest(TTestInt64);
  3636. RegisterTest(TTestQWord);
  3637. RegisterTest(TTestFloat);
  3638. RegisterTest(TTestString);
  3639. RegisterTest(TTestArray);
  3640. RegisterTest(TTestObject);
  3641. RegisterTest(TTestJSONPath);
  3642. RegisterTest(TTestFactory);
  3643. RegisterTest(TTestIterator);
  3644. end.