testjsondata.pp 83 KB

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