testjsondata.pas 84 KB

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