testjsondata.pas 85 KB

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