testjsondata.pp 82 KB

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