testjsondata.pp 84 KB

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