testjsondata.pp 83 KB

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