testjsondata.pp 84 KB

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