testjsondata.pas 86 KB

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