12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145 |
- {
- This file is part of the Free Component Library
- JSON FPCUNit test for data structures
- Copyright (c) 2007 by Michael Van Canneyt [email protected]
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$mode objfpc}
- {$h+}
- unit testjsondata;
- interface
- uses
- Classes, SysUtils, fpcunit, testregistry, fpjson;
- type
- TMyNull = Class(TJSONNull);
- TMyInteger = Class(TJSONIntegerNumber);
- TMyInt64 = Class(TJSONInt64Number);
- TMyQWord = Class(TJSONQWordNumber);
- TMyFloat = Class(TJSONFloatNumber);
- TMyString = Class(TJSONString);
- TMyBoolean = Class(TJSONBoolean);
- TMyArray = Class(TJSONArray);
- TMyObject = Class(TJSONObject);
- { TTestJSONString }
- TTestJSONString = Class(TTestCase)
- Private
- Procedure TestTo(Const Src,Dest : String; Strict : Boolean = False);
- Procedure TestFrom(Const Src,Dest : String);
- Published
- Procedure TestJSONStringToString;
- Procedure TestStringToJSONString;
- end;
-
- { TTestJSON }
-
- TTestJSON = Class(TTestCase)
- private
- Protected
- procedure SetDefaultInstanceTypes;
- procedure SetMyInstanceTypes;
- Procedure SetUp; override;
- Procedure TestItemCount(J : TJSONData;Expected : Integer);
- Procedure TestJSONType(J : TJSONData;Expected : TJSONType);
- Procedure TestJSON(J : TJSONData;Expected : TJSONStringType);
- Procedure TestIsNull(J : TJSONData;Expected : Boolean);
- Procedure TestAsBoolean(J : TJSONData;Expected : Boolean; ExpectError : boolean = False);
- Procedure TestAsInteger(J : TJSONData; Expected : Integer; ExpectError : boolean = False);
- Procedure TestAsInt64(J : TJSONData; Expected : Int64; ExpectError : boolean = False);
- Procedure TestAsQWord(J : TJSONData; Expected : QWord; ExpectError : boolean = False);
- Procedure TestAsString(J : TJSONData; Expected : String; ExpectError : boolean = False);
- Procedure TestAsFloat(J : TJSONData; Expected : TJSONFloat; ExpectError : boolean = False);
- end;
-
- { TTestNull }
- TTestNull = class(TTestJSON)
- published
- procedure TestNull;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
-
- { TTestBoolean }
- TTestBoolean = class(TTestJSON)
- published
- procedure TestTrue;
- procedure TestFalse;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
-
- { TTestInteger }
- TTestInteger = class(TTestJSON)
- Private
- Procedure DoTest(I : Integer);
- published
- procedure TestPositive;
- procedure TestNegative;
- procedure TestZero;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
- { TTestInt64 }
- TTestInt64 = class(TTestJSON)
- Private
- Procedure DoTest(I : Int64);
- published
- procedure TestPositive;
- procedure TestNegative;
- procedure TestZero;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
- { TTestQword }
- TTestQword = class(TTestJSON)
- Private
- Procedure DoTest(Q : QWord);
- published
- procedure TestPositive;
- procedure TestZero;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
- { TTestFloat }
- TTestFloat = class(TTestJSON)
- Private
- Procedure DoTest(F : TJSONFloat);
- published
- procedure TestPositive;
- procedure TestNegative;
- procedure TestZero;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
- { TTestString }
- TTestString = class(TTestJSON)
- private
- procedure DoTestFloat(F: TJSOnFloat; S: String; OK: Boolean);
- published
- procedure TestString;
- procedure TestControlString;
- procedure TestSolidus;
- procedure TestInteger;
- procedure TestNegativeInteger;
- procedure TestFloat;
- procedure TestNegativeFloat;
- Procedure TestBooleanTrue;
- Procedure TestBooleanFalse;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- end;
-
- { TTestArray }
- TTestArray = class(TTestJSON)
- private
- procedure TestAddBoolean(B : Boolean);
- procedure TestInsertBoolean(B : Boolean);
- published
- Procedure TestCreate;
- Procedure TestCreateString;
- Procedure TestCreatePchar;
- procedure TestCreateStrings;
- procedure TestCreateStringsCompressed;
- procedure TestCreateInteger;
- procedure TestCreateInt64;
- procedure TestCreateFloat;
- procedure TestCreateBoolean;
- procedure TestCreateObject;
- procedure TestCreateJSONString;
- procedure TestCreateJSONObject;
- procedure TestCreateNilPointer;
- procedure TestCreatePointer;
- procedure TestAddInteger;
- procedure TestAddInt64;
- procedure TestAddFloat;
- procedure TestAddBooleanTrue;
- procedure TestAddBooleanFalse;
- procedure TestAddString;
- procedure TestAddNull;
- procedure TestAddObject;
- procedure TestAddArray;
- procedure TestInsertInteger;
- procedure TestInsertInt64;
- procedure TestInsertFloat;
- procedure TestInsertBooleanTrue;
- procedure TestInsertBooleanFalse;
- procedure TestInsertString;
- procedure TestInsertNull;
- procedure TestInsertObject;
- procedure TestInsertArray;
- procedure TestMove;
- procedure TestExchange;
- procedure TestDelete;
- procedure TestRemove;
- Procedure TestClone;
- Procedure TestMyClone;
- Procedure TestFormat;
- Procedure TestFormatNil;
- end;
-
- { TTestObject }
- TTestObject = class(TTestJSON)
- private
- FJ: TJSONObject;
- procedure AppendA;
- protected
- Procedure Setup; override;
- Procedure TearDown; override;
- procedure TestAddBoolean(B : Boolean);
- Procedure TestAccessError;
- Property J : TJSONObject Read FJ;
- published
- Procedure TestCreate;
- Procedure TestCreateString;
- Procedure TestCreateStringUnquoted;
- Procedure TestCreatePchar;
- Procedure TestCreatePcharUnquoted;
- procedure TestCreateStrings;
- procedure TestCreateStringsCompressed;
- procedure TestCreateStringsCompressedUnquoted;
- procedure TestCreateInteger;
- procedure TestCreateIntegerUnquoted;
- procedure TestCreateInt64;
- procedure TestCreateInt64Unquoted;
- procedure TestCreateFloat;
- procedure TestCreateFloatUnquoted;
- procedure TestCreateBoolean;
- procedure TestCreateBooleanUnquoted;
- procedure TestCreateObject;
- procedure TestCreateJSONUnicodeString;
- procedure TestCreateJSONWideString;
- procedure TestCreateJSONString;
- procedure TestCreateJSONStringUnquoted;
- procedure TestCreateJSONObject;
- procedure TestCreateJSONObjectUnquoted;
- procedure TestCreateNilPointer;
- procedure TestCreatePointer;
- procedure TestAddInteger;
- procedure TestAddInt64;
- procedure TestAddFloat;
- procedure TestAddBooleanTrue;
- procedure TestAddBooleanFalse;
- procedure TestAddString;
- procedure TestAddNull;
- procedure TestAddObject;
- procedure TestAddArray;
- procedure TestDelete;
- procedure TestRemove;
- procedure TestClone;
- procedure TestMyClone;
- procedure TestExtract;
- Procedure TestNonExistingAccessError;
- Procedure TestFormat;
- Procedure TestFormatNil;
- Procedure TestFind;
- Procedure TestIfFind;
- Procedure TestDuplicate;
- end;
- { TTestJSONPath }
- TTestJSONPath = class(TTestJSON)
- private
- FData: TJSONData;
- Protected
- Procedure TearDown; override;
- Property Data : TJSONData read FData Write FData;
- Published
- Procedure TestNullEmpty;
- Procedure TestNullGet;
- Procedure TestNullNonExisting;
- Procedure TestNullNotEmpty;
- Procedure TestBooleanEmpty;
- Procedure TestBooleanNotEmpty;
- Procedure TestIntegerEmpty;
- Procedure TestIntegerNotEmpty;
- Procedure TestInt64Empty;
- Procedure TestInt64NotEmpty;
- Procedure TestFloatEmpty;
- Procedure TestFloatNotEmpty;
- Procedure TestStringEmpty;
- Procedure TestStringNotEmpty;
- Procedure TestArrayEmpty;
- Procedure TestArrayNotIndex;
- Procedure TestArrayIncompleteIndex;
- Procedure TestArrayNonNumericalIndex;
- Procedure TestArrayOutOfRangeIndex;
- Procedure TestArrayCorrectIndex;
- Procedure TestArrayRecursiveArray;
- Procedure TestArrayRecursiveObject;
- Procedure TestObjectEmpty;
- Procedure TestObjectDots;
- Procedure TestObjectExisting;
- Procedure TestObjectNonExisting;
- Procedure TestObjectTrailingDot;
- Procedure TestObjectRecursiveArray;
- Procedure TestObjectRecursiveObject;
- Procedure TestDeepRecursive;
- end;
- { TTestFactory }
- TTestFactory = class(TTestJSON)
- Private
- FType : TJSONInstanceType;
- FClass : TJSONDataClass;
- FData: TJSONData;
- Protected
- Procedure DoSet;
- Procedure TearDown; override;
- Procedure AssertElement0(AClass : TJSONDataClass);
- Procedure AssertElementA(AClass : TJSONDataClass);
- Property Data : TJSONData read FData Write FData;
- Published
- Procedure TestSet;
- Procedure TestSetInvalid;
- Procedure CreateNull;
- Procedure CreateInteger;
- Procedure CreateInt64;
- Procedure CreateFloat;
- Procedure CreateBoolean;
- Procedure CreateString;
- Procedure CreateArray;
- Procedure CreateObject;
- Procedure ArrayAddNull;
- Procedure ArrayAddInteger;
- Procedure ArrayAddInt64;
- Procedure ArrayAddFloat;
- Procedure ArrayAddBoolean;
- Procedure ArrayAddString;
- Procedure ArrayCreateNull;
- Procedure ArrayCreateInteger;
- Procedure ArrayCreateInt64;
- Procedure ArrayCreateFloat;
- Procedure ArrayCreateBoolean;
- Procedure ArrayCreateString;
- Procedure ObjectAddNull;
- Procedure ObjectAddInteger;
- Procedure ObjectAddInt64;
- Procedure ObjectAddFloat;
- Procedure ObjectAddBoolean;
- Procedure ObjectAddString;
- Procedure ObjectCreateNull;
- Procedure ObjectCreateInteger;
- Procedure ObjectCreateInt64;
- Procedure ObjectCreateFloat;
- Procedure ObjectCreateBoolean;
- Procedure ObjectCreateString;
- end;
- { TTestIterator }
- TTestIterator = class(TTestJSON)
- private
- FData: TJSONData;
- Protected
- Procedure TearDown; override;
- Procedure TestSingle;
- Procedure TestLoop(ACount : Integer);
- Property Data : TJSONData Read FData Write FData;
- Published
- Procedure TestNull;
- Procedure TestInteger;
- Procedure TestInt64;
- Procedure TestFloat;
- Procedure TestBoolean;
- Procedure TestString;
- Procedure TestArray;
- Procedure TestObject;
- end;
- implementation
- { TTestIterator }
- procedure TTestIterator.TearDown;
- begin
- FreeAndNil(FData);
- inherited TearDown;
- end;
- procedure TTestIterator.TestSingle;
- Var
- F : TJSONEnum;
- C : Integer;
- begin
- C:=0;
- For F in Data do
- begin
- Inc(C);
- If C>1 then
- Fail(Data.ClassName+' loops more than once');
- AssertEquals(Data.ClassName+' has empty key','',F.Key);
- AssertEquals(Data.ClassName+' has empty numerical key',0,F.KeyNum);
- AssertSame(Data.ClassName+' returns data',Data,F.Value);
- end;
- If C<1 then
- Fail(Data.ClassName+' Loops not even once');
- end;
- procedure TTestIterator.TestLoop(ACount: Integer);
- Var
- F : TJSONEnum;
- C : Integer;
- begin
- C:=0;
- For F in Data do
- begin
- AssertEquals(Data.ClassName+' has correct string key',IntToStr(C),F.Key);
- AssertEquals(Data.ClassName+' has correct numerical key',C,F.KeyNum);
- AssertSame(Data.ClassName+' returns correct data',Data.Items[C],F.Value);
- Inc(C);
- end;
- AssertEquals(Data.ClassName+' correct loop count',ACount,C);
- end;
- procedure TTestIterator.TestNull;
- begin
- Data:=TJSONNull.Create;
- TestSingle;
- end;
- procedure TTestIterator.TestInteger;
- begin
- Data:=TJSONIntegerNumber.Create(1);
- TestSingle;
- end;
- procedure TTestIterator.TestInt64;
- begin
- Data:=TJSONInt64Number.Create(1);
- TestSingle;
- end;
- procedure TTestIterator.TestFloat;
- begin
- Data:=TJSONFloatNumber.Create(1.2);
- TestSingle;
- end;
- procedure TTestIterator.TestBoolean;
- begin
- Data:=TJSONBoolean.Create(True);
- TestSingle;
- end;
- procedure TTestIterator.TestString;
- begin
- Data:=TJSONString.Create('Data');
- TestSingle;
- end;
- procedure TTestIterator.TestArray;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- TestLoop(3);
- end;
- procedure TTestIterator.TestObject;
- begin
- Data:=TJSONObject.Create(['0',1,'1',2,'2',3]);
- TestLoop(3);
- end;
- { TTestFactory }
- procedure TTestFactory.DoSet;
- begin
- SetJSONInstanceType(FType,FClass);
- end;
- procedure TTestFactory.TearDown;
- begin
- FreeAndNil(FData);
- inherited TearDown;
- end;
- procedure TTestFactory.AssertElement0(AClass: TJSONDataClass);
- begin
- AssertEquals('Correct class',TMyArray,Data.ClassType);
- AssertEquals('Have 1 element',1,Data.Count);
- AssertEquals('Correct class',AClass,(Data as TJSONArray)[0].ClassType);
- end;
- procedure TTestFactory.AssertElementA(AClass: TJSONDataClass);
- begin
- AssertEquals('Correct class',TMyObject,Data.ClassType);
- AssertEquals('Have element a',0,TMyObject(Data).IndexOfName('a'));
- AssertEquals('Correct class',AClass,(Data as TJSONObject).Elements['a'].ClassType);
- end;
- procedure TTestFactory.TestSet;
- begin
- SetMyInstanceTypes;
- AssertEquals('Correct type for unknown',TJSONData,GetJSONInstanceType(jitUnknown));
- AssertEquals('Correct type for integer',TMyInteger,GetJSONInstanceType(jitNumberInteger));
- AssertEquals('Correct type for int64',TMyInt64,GetJSONInstanceType(jitNumberInt64));
- AssertEquals('Correct type for float',TMyFloat,GetJSONInstanceType(jitNumberFloat));
- AssertEquals('Correct type for boolean',TMyBoolean,GetJSONInstanceType(jitBoolean));
- AssertEquals('Correct type for null',TMyNull,GetJSONInstanceType(jitNUll));
- AssertEquals('Correct type for String',TMyString,GetJSONInstanceType(jitString));
- AssertEquals('Correct type for Array',TMyArray,GetJSONInstanceType(jitArray));
- AssertEquals('Correct type for Object',TMyObject,GetJSONInstanceType(jitObject));
- end;
- procedure TTestFactory.TestSetInvalid;
- Const
- MyJSONInstanceTypes :
- Array [TJSONInstanceType] of TJSONDataClass = (TJSONData, TMyInteger,
- TMyInt64,TMyQWord,TMyFloat, TMyString, TMyBoolean, TMyNull, TMyArray,
- TMyObject);
- Var
- Ti : TJSONInstanceType;
- begin
- For ti:=Succ(Low(TJSONInstanceType)) to High(TJSONInstanceType) do
- begin
- FType:=Ti;
- FClass:=MyJSONInstanceTypes[Pred(ti)];
- AssertException('Set '+FClass.ClassName,EJSON,@DoSet);
- end;
- FType:=jitString;
- FClass:=Nil;
- AssertException('Set Nil',EJSON,@DoSet);
- end;
- procedure TTestFactory.CreateNull;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSON;
- AssertEquals('Correct class',TMyNull,Data.ClassType);
- end;
- procedure TTestFactory.CreateInteger;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSON(1);
- AssertEquals('Correct class',TMyInteger,Data.ClassType);
- end;
- procedure TTestFactory.CreateInt64;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSON(Int64(1));
- AssertEquals('Correct class',TMyInt64,Data.ClassType);
- end;
- procedure TTestFactory.CreateFloat;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSON(1.2);
- AssertEquals('Correct class',TMyFloat,Data.ClassType);
- end;
- procedure TTestFactory.CreateBoolean;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSON(True);
- AssertEquals('Correct class',TMyBoolean,Data.ClassType);
- end;
- procedure TTestFactory.CreateString;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSON('True');
- AssertEquals('Correct class',TMyString,Data.ClassType);
- end;
- procedure TTestFactory.CreateArray;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray(['True']);
- AssertEquals('Correct class',TMyArray,Data.ClassType);
- end;
- procedure TTestFactory.CreateObject;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a','True']);
- AssertEquals('Correct class',TMyObject,Data.ClassType);
- end;
- procedure TTestFactory.ArrayAddNull;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([]);
- TJSONArray(Data).Add();
- AssertElement0(TMyNull);
- end;
- procedure TTestFactory.ArrayAddInteger;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([]);
- TJSONArray(Data).Add(1);
- AssertElement0(TMyInteger);
- end;
- procedure TTestFactory.ArrayAddInt64;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([]);
- TJSONArray(Data).Add(Int64(1));
- AssertElement0(TMyInt64);
- end;
- procedure TTestFactory.ArrayAddFloat;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([]);
- TJSONArray(Data).Add(1.2);
- AssertElement0(TMyFloat);
- end;
- procedure TTestFactory.ArrayAddBoolean;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([]);
- TJSONArray(Data).Add(True);
- AssertElement0(TMyBoolean);
- end;
- procedure TTestFactory.ArrayAddString;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([]);
- TJSONArray(Data).Add('True');
- AssertElement0(TMyString);
- end;
- procedure TTestFactory.ArrayCreateNull;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([Nil]);
- AssertElement0(TMyNull);
- end;
- procedure TTestFactory.ArrayCreateInteger;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([1]);
- AssertElement0(TMyInteger);
- end;
- procedure TTestFactory.ArrayCreateInt64;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([int64(1)]);
- AssertElement0(TMyInt64);
- end;
- procedure TTestFactory.ArrayCreateFloat;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([1.2]);
- AssertElement0(TMyFloat);
- end;
- procedure TTestFactory.ArrayCreateBoolean;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray([True]);
- AssertElement0(TMyBoolean);
- end;
- procedure TTestFactory.ArrayCreateString;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONArray(['true']);
- AssertElement0(TMyString);
- end;
- procedure TTestFactory.ObjectAddNull;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject([]);
- TJSONObject(Data).Add('a');
- AssertElementA(TMyNull);
- end;
- procedure TTestFactory.ObjectAddInteger;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject([]);
- TJSONObject(Data).Add('a',1);
- AssertElementA(TMyInteger);
- end;
- procedure TTestFactory.ObjectAddInt64;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject([]);
- TJSONObject(Data).Add('a',Int64(1));
- AssertElementA(TMyInt64);
- end;
- procedure TTestFactory.ObjectAddFloat;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject([]);
- TJSONObject(Data).Add('a',1.2);
- AssertElementA(TMyFloat);
- end;
- procedure TTestFactory.ObjectAddBoolean;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject([]);
- TJSONObject(Data).Add('a',True);
- AssertElementA(TMyBoolean);
- end;
- procedure TTestFactory.ObjectAddString;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject([]);
- TJSONObject(Data).Add('a','True');
- AssertElementA(TMyString);
- end;
- procedure TTestFactory.ObjectCreateNull;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a',Nil]);
- AssertElementA(TMyNull);
- end;
- procedure TTestFactory.ObjectCreateInteger;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a',1]);
- AssertElementA(TMyInteger);
- end;
- procedure TTestFactory.ObjectCreateInt64;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a',int64(1)]);
- AssertElementA(TMyInt64);
- end;
- procedure TTestFactory.ObjectCreateFloat;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a',1.2]);
- AssertElementA(TMyFloat);
- end;
- procedure TTestFactory.ObjectCreateBoolean;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a',True]);
- AssertElementA(TMyBoolean);
- end;
- procedure TTestFactory.ObjectCreateString;
- begin
- SetMyInstanceTypes;
- Data:=CreateJSONObject(['a','true']);
- AssertElementA(TMyString);
- end;
- { TTestJSONPath }
- procedure TTestJSONPath.TearDown;
- begin
- FreeAndNil(FData);
- inherited TearDown;
- end;
- procedure TTestJSONPath.TestNullEmpty;
- begin
- Data:=TJSONNull.Create;
- AssertSame('Empty on NULL returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestNullGet;
- begin
- Data:=TJSONNull.Create;
- AssertSame('Empty get on NULL returns object itself',Data,Data.GetPath(''));
- end;
- procedure TTestJSONPath.TestNullNonExisting;
- Var
- Msg : String;
- begin
- Data:=TJSONNull.Create;
- try
- Data.GetPath('a.b.c');
- Msg:='No exception raised'
- except
- on E : Exception do
- begin
- If Not (E is EJSON) then
- Msg:='Wrong exception class. Got '+E.ClassName+' instead of EJSON'
- else
- If E.Message<>'Path "a.b.c" invalid: element "a.b.c" not found.' then
- Msg:='Wrong exception message, expected: "Path "a.b.c" invalid: element "a.b.c" not found.", actual: "'+E.Message+'"';
- end;
- end;
- If (Msg<>'') then
- Fail(Msg);
- end;
- procedure TTestJSONPath.TestNullNotEmpty;
- begin
- Data:=TJSONNull.Create;
- AssertNull('Not empty on NULL returns nil',Data.FindPath('a'));
- end;
- procedure TTestJSONPath.TestBooleanEmpty;
- begin
- Data:=TJSONBoolean.Create(true);
- AssertSame('Empty on Boolean returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestBooleanNotEmpty;
- begin
- Data:=TJSONBoolean.Create(True);
- AssertNull('Not empty on Boolean returns nil',Data.FindPath('a'));
- end;
- procedure TTestJSONPath.TestIntegerEmpty;
- begin
- Data:=TJSONIntegerNumber.Create(1);
- AssertSame('Empty on integer returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestIntegerNotEmpty;
- begin
- Data:=TJSONIntegerNumber.Create(1);
- AssertNull('Not Empty on integer returns object itself',Data.FIndPath('a'));
- end;
- procedure TTestJSONPath.TestInt64Empty;
- begin
- Data:=TJSONInt64Number.Create(1);
- AssertSame('Empty on Int64 returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestInt64NotEmpty;
- begin
- Data:=TJSONInt64Number.Create(1);
- AssertNull('Not Empty on Int64 returns object itself',Data.FIndPath('a'));
- end;
- procedure TTestJSONPath.TestFloatEmpty;
- begin
- Data:=TJSONFloatNumber.Create(1);
- AssertSame('Empty on Float returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestFloatNotEmpty;
- begin
- Data:=TJSONFloatNumber.Create(1);
- AssertNull('Not Empty on Float returns object itself',Data.FIndPath('a'));
- end;
- procedure TTestJSONPath.TestStringEmpty;
- begin
- Data:=TJSONString.Create('1');
- AssertSame('Empty on String returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestStringNotEmpty;
- begin
- Data:=TJSONString.Create('1');
- AssertNull('Not Empty on String returns object itself',Data.FIndPath('a'));
- end;
- procedure TTestJSONPath.TestArrayEmpty;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- AssertSame('Empty on array returns object itself',Data,Data.FIndPath(''));
- end;
- procedure TTestJSONPath.TestArrayNotIndex;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- AssertNull('Not index indication on array returns object itself',Data.FindPath('oo'));
- end;
- procedure TTestJSONPath.TestArrayIncompleteIndex;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- AssertNull('Not complete index indication on array returns object itself',Data.FindPath('[1'));
- AssertNull('Not complete index indication on array returns object itself',Data.FindPath('['));
- end;
- procedure TTestJSONPath.TestArrayNonNumericalIndex;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- AssertNull('Not complete index indication on array returns object itself',Data.FindPath('[a]'));
- end;
- procedure TTestJSONPath.TestArrayOutOfRangeIndex;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- AssertNull('Not complete index indication on array returns object itself',Data.FindPath('[-1]'));
- AssertNull('Not complete index indication on array returns object itself',Data.FindPath('[3]'));
- end;
- procedure TTestJSONPath.TestArrayCorrectIndex;
- begin
- Data:=TJSONArray.Create([1,2,3]);
- AssertSame('Index 0 on array returns item 0',Data.Items[0],Data.FindPath('[0]'));
- AssertSame('Index 1 on array returns item 1',Data.Items[1],Data.FindPath('[1]'));
- AssertSame('Index 2 on array returns item 2',Data.Items[2],Data.FindPath('[2]'));
- end;
- procedure TTestJSONPath.TestArrayRecursiveArray;
- Var
- A : TJSONArray;
- begin
- A:=TJSONArray.Create([1,2,3]);
- Data:=TJSONArray.Create([A,1,2,3]);
- AssertSame('Index [0][0] on array returns item 0',A.Items[0],Data.FindPath('[0][0]'));
- AssertSame('Index [0][1] on array returns item 1',A.Items[1],Data.FindPath('[0][1]'));
- AssertSame('Index [0][2] on array returns item 2',A.Items[2],Data.FindPath('[0][2]'));
- end;
- procedure TTestJSONPath.TestArrayRecursiveObject;
- Var
- A : TJSONObject;
- begin
- A:=TJSONObject.Create(['a',1,'b',2,'c',3]);
- Data:=TJSONArray.Create([A,1,2,3]);
- AssertSame('[0]a on array returns element a of item 0',A.Elements['a'],Data.FindPath('[0]a'));
- AssertSame('[0]b on array returns element b of item 0',A.Elements['b'],Data.FindPath('[0]b'));
- AssertSame('[0]c on array returns element c of item 0',A.Elements['c'],Data.FindPath('[0]c'));
- AssertSame('[0].a on array returns element a of item 0',A.Elements['a'],Data.FindPath('[0].a'));
- AssertSame('[0].b on array returns element b of item 0',A.Elements['b'],Data.FindPath('[0].b'));
- AssertSame('[0].c on array returns element c of item 0',A.Elements['c'],Data.FindPath('[0].c'));
- end;
- procedure TTestJSONPath.TestObjectEmpty;
- begin
- Data:=TJSONObject.Create(['a',1,'b',2,'c',3]);
- AssertSame('Empty on object returns object',Data,Data.FindPath(''));
- end;
- procedure TTestJSONPath.TestObjectDots;
- begin
- Data:=TJSONObject.Create(['a',1,'b',2,'c',3]);
- AssertSame('Dot on object returns object',Data,Data.FindPath('.'));
- AssertSame('2 Dots on object returns object',Data,Data.FindPath('..'));
- AssertSame('3 Dots on object returns object',Data,Data.FindPath('...'));
- end;
- procedure TTestJSONPath.TestObjectExisting;
- begin
- Data:=TJSONObject.Create(['a',1,'b',2,'c',3]);
- AssertSame('a on object returns element a',TJSONObject(Data).Elements['a'],Data.FindPath('a'));
- AssertSame('.a on object returns element a',TJSONObject(Data).Elements['a'],Data.FindPath('.a'));
- AssertSame('..a on object returns element a',TJSONObject(Data).Elements['a'],Data.FindPath('..a'));
- end;
- procedure TTestJSONPath.TestObjectNonExisting;
- begin
- Data:=TJSONObject.Create(['a',1,'b',2,'c',3]);
- AssertNull('d on object returns nil',Data.FindPath('d'));
- end;
- procedure TTestJSONPath.TestObjectTrailingDot;
- begin
- Data:=TJSONObject.Create(['a',1,'b',2,'c',3]);
- AssertNull('a. on object returns nil',Data.FindPath('a.'));
- end;
- procedure TTestJSONPath.TestObjectRecursiveArray;
- Var
- A : TJSONArray;
- begin
- A:=TJSONArray.Create([1,2,3]);
- Data:=TJSONObject.Create(['a',A,'b',2,'c',3]);
- AssertSame('a[0] returns item 0 of array a',A.Items[0],Data.FindPath('a[0]'));
- end;
- procedure TTestJSONPath.TestObjectRecursiveObject;
- Var
- O : TJSONObject;
- D : TJSONData;
- begin
- D :=TJSONIntegerNumber.Create(1);
- O:=TJSONObject.Create(['b',D]);
- Data:=TJSONObject.Create(['a',O]);
- AssertSame('a.b returns correct data ',D,Data.FindPath('a.b'));
- AssertSame('a..b returns correct data ',D,Data.FindPath('a..b'));
- end;
- procedure TTestJSONPath.TestDeepRecursive;
- Var
- A : TJSONArray;
- D : TJSONData;
- begin
- D :=TJSONIntegerNumber.Create(1);
- A:=TJSONArray.Create([0,'string',TJSONObject.Create(['b',D])]);
- Data:=TJSONObject.Create(['a',TJSONObject.Create(['c',A])]);
- AssertSame('a.c[2].b returns correct data ',D,Data.FindPath('a.c[2].b'));
- AssertSame('a.c[2]b returns correct data ',D,Data.FindPath('a.c[2]b'));
- AssertNull('a.c[2]d returns nil ',Data.FindPath('a.c[2]d'));
- end;
- { TTestJSON }
- Const
- DefJSONInstanceTypes :
- Array [TJSONInstanceType] of TJSONDataClass = (TJSONData, TJSONIntegerNumber,
- TJSONInt64Number,TJSONQWordNumber,TJSONFloatNumber, TJSONString, TJSONBoolean,
- TJSONNull, TJSONArray, TJSONObject);
- Const
- MyJSONInstanceTypes :
- Array [TJSONInstanceType] of TJSONDataClass = (TJSONData, TMyInteger,
- TMyInt64, TMyQWord,TMyFloat, TMyString, TMyBoolean, TMyNull, TMyArray,
- TMyObject);
- procedure TTestJSON.SetDefaultInstanceTypes;
- Var
- Ti : TJSONInstanceType;
- begin
- For ti:=Low(TJSONInstanceType) to High(TJSONInstanceType) do
- SetJSONInstanceType(Ti,DefJSONInstanceTypes[ti]);
- end;
- procedure TTestJSON.SetMyInstanceTypes;
- Var
- Ti : TJSONInstanceType;
- begin
- For ti:=Low(TJSONInstanceType) to High(TJSONInstanceType) do
- AssertEquals('Previous value is returned by SetJSONInstanceType',DefJSONInstanceTypes[ti],SetJSONInstanceType(Ti,MyJSONInstanceTypes[ti]));
- end;
- Procedure TTestJSON.SetUp;
- begin
- inherited SetUp;
- SetDefaultInstanceTypes;
- TJSONData.CompressedJSON:=False;
- TJSONObject.UnquotedMemberNames:=False;
- end;
- Procedure TTestJSON.TestItemCount(J: TJSONData; Expected: Integer);
- begin
- AssertEquals(J.ClassName+'.ItemCount',Expected,J.Count);
- end;
- Procedure TTestJSON.TestJSONType(J: TJSONData; Expected: TJSONType);
- begin
- AssertEquals(J.ClassName+'.JSONType',Ord(Expected),Ord(J.JSONType));
- end;
- Procedure TTestJSON.TestJSON(J: TJSONData; Expected: TJSONStringType);
- begin
- AssertEquals(J.ClassName+'.AsJSON',Expected,J.AsJSON);
- end;
- Procedure TTestJSON.TestIsNull(J: TJSONData; Expected: Boolean);
- begin
- AssertEquals(J.ClassName+'.IsNull',Expected,J.IsNull);
- end;
- Procedure TTestJSON.TestAsBoolean(J: TJSONData; Expected: Boolean;
- ExpectError: boolean);
- Var
- B : Boolean;
- AssignOK : Boolean;
- Msg : String;
-
- begin
- AssignOK:=False;
- Try
- B:=J.AsBoolean;
- AssignOK:=True;
- If Not ExpectError then
- AssertEquals(J.Classname+'.AsBoolean',Expected,B);
- except
- On E : Exception do
- begin
- AssignOK:=False;
- Msg:=E.Message;
- end;
- end;
- If ExpectError then
- begin
- If AssignOK then
- Fail(J.ClassName+'.AsBoolean must raise error');
- end
- else
- begin
- If not AssignOK then
- Fail(J.ClassName+'.AsBoolean raised unexpected exception: '+Msg)
- end;
- end;
- Procedure TTestJSON.TestAsInteger(J: TJSONData; Expected: Integer;
- ExpectError: boolean);
- Var
- I : Integer;
- AssignOK : Boolean;
- Msg : String;
- begin
- AssignOK:=False;
- Try
- I:=J.AsInteger;
- AssignOK:=True;
- If Not ExpectError then
- AssertEquals(J.Classname+'.AsInteger',Expected,I);
- except
- On E : Exception do
- begin
- AssignOK:=False;
- Msg:=E.Message;
- end;
- end;
- If ExpectError then
- begin
- If AssignOK then
- Fail(J.ClassName+'.AsInteger must raise error');
- end
- else
- begin
- If not AssignOK then
- Fail(J.ClassName+'.AsInteger raised unexpected exception: '+Msg)
- end;
- end;
- Procedure TTestJSON.TestAsInt64(J: TJSONData; Expected: Int64;
- ExpectError: boolean);
- Var
- I : Int64;
- AssignOK : Boolean;
- Msg : String;
- begin
- AssignOK:=False;
- Try
- I:=J.AsInt64;
- AssignOK:=True;
- If Not ExpectError then
- AssertEquals(J.Classname+'.AsInt64',Expected,I);
- except
- On E : Exception do
- begin
- AssignOK:=False;
- Msg:=E.Message;
- end;
- end;
- If ExpectError then
- begin
- If AssignOK then
- Fail(J.ClassName+'.AsInt64 must raise error');
- end
- else
- begin
- If not AssignOK then
- Fail(J.ClassName+'.AsInt64 raised unexpected exception: '+Msg)
- end;
- end;
- Procedure TTestJSON.TestAsQWord(J: TJSONData; Expected: QWord;
- ExpectError: boolean);
- Var
- Q : QWord;
- AssignOK : Boolean;
- Msg : String;
- begin
- AssignOK:=False;
- Try
- Q:=J.AsQWord;
- AssignOK:=True;
- If Not ExpectError then
- AssertEquals(J.Classname+'.AsQWord',IntToStr(Expected),IntToStr(Q));
- except
- On E : Exception do
- begin
- AssignOK:=False;
- Msg:=E.Message;
- end;
- end;
- If ExpectError then
- begin
- If AssignOK then
- Fail(J.ClassName+'.AsQWord must raise error');
- end
- else
- begin
- If not AssignOK then
- Fail(J.ClassName+'.AsInt64 raised unexpected exception: '+Msg)
- end;
- end;
- Procedure TTestJSON.TestAsString(J: TJSONData; Expected: String;
- ExpectError: boolean);
-
- Var
- S : String;
- AssignOK : Boolean;
- Msg : String;
- begin
- AssignOK:=False;
- Try
- S:=J.AsString;
- AssignOK:=True;
- If Not ExpectError then
- AssertEquals(J.Classname+'.AsString',Expected,S);
- except
- On E : Exception do
- begin
- AssignOK:=False;
- Msg:=E.Message;
- end;
- end;
- If ExpectError then
- begin
- If AssignOK then
- Fail(J.ClassName+'.AsString must raise error');
- end
- else
- begin
- If not AssignOK then
- Fail(J.ClassName+'.AsString raised unexpected exception: '+Msg)
- end;
- end;
- Procedure TTestJSON.TestAsFloat(J: TJSONData; Expected: TJSONFloat;
- ExpectError: boolean);
-
- Var
- F : TJSONFloat;
- AssignOK : Boolean;
- Msg : String;
- begin
- AssignOK:=False;
- Try
- F:=J.AsFloat;
- AssignOK:=True;
- If Not ExpectError then
- AssertEquals(J.Classname+'.AsFloat',Expected,F);
- except
- On E : Exception do
- begin
- AssignOK:=False;
- Msg:=E.Message;
- end;
- end;
- If ExpectError then
- begin
- If AssignOK then
- Fail(J.ClassName+'.AsFloat must raise error');
- end
- else
- begin
- If not AssignOK then
- Fail(J.ClassName+'.AsFloat raised unexpected exception: '+Msg)
- end;
- end;
- { TTestBoolean }
- procedure TTestBoolean.TestTrue;
- Var
- J : TJSONBoolean;
- begin
- J:=TJSONBoolean.Create(True);
- try
- TestJSONType(J,jtBoolean);
- TestItemCount(J,0);
- TestJSON(J,'true');
- TestIsNull(J,False);
- TestAsBoolean(J,True);
- TestAsInteger(J,1);
- TestAsInt64(J,1);
- TestAsQword(J,1);
- TestAsString(J,BoolToStr(True,'true','false'));
- TestAsFloat(J,1.0);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestBoolean.TestFalse;
- Var
- J : TJSONBoolean;
- begin
- J:=TJSONBoolean.Create(False);
- try
- TestJSONType(J,jtBoolean);
- TestItemCount(J,0);
- TestJSON(J,'false');
- TestIsNull(J,False);
- TestAsBoolean(J,False);
- TestAsInteger(J,0);
- TestAsInt64(J,0);
- TestAsQWord(J,0);
- TestAsString(J,BoolToStr(False,'true','false'));
- TestAsFloat(J,0.0);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestBoolean.TestClone;
- Var
- B : TJSONBoolean;
- D : TJSONData;
- begin
- B:=TJSONBoolean.Create(true);
- try
- D:=B.Clone;
- try
- TestJSONType(D,jtBoolean);
- TestAsBoolean(D,true);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(B);
- end;
- end;
- procedure TTestBoolean.TestMyClone;
- Var
- B : TMyBoolean;
- D : TJSONData;
- begin
- B:=TMyBoolean.Create(true);
- try
- D:=B.Clone;
- try
- TestJSONType(D,jtBoolean);
- AssertEquals('Correct class',TMyBoolean,D.ClassType);
- TestAsBoolean(D,true);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(B);
- end;
- end;
- procedure TTestBoolean.TestFormat;
- Var
- B : TJSONBoolean;
- begin
- B:=TJSONBoolean.Create(true);
- try
- AssertEquals('FormatJSON same as asJSON',B.asJSON,B.FormatJSON);
- finally
- B.Free;
- end;
- end;
- { TTestNull }
- procedure TTestNull.TestNull;
- Var
- J : TJSONNull;
- begin
- J:=TJSONNull.Create;
- try
- TestJSONType(J,jtNull);
- TestItemCount(J,0);
- TestJSON(J,'null');
- TestIsNull(J,True);
- TestAsBoolean(J,False,True);
- TestAsInteger(J,0,true);
- TestAsInt64(J,0,true);
- TestAsQWord(J,0,true);
- TestAsString(J,BoolToStr(False),true);
- TestAsFloat(J,0.0,true);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestNull.TestClone;
- Var
- J : TJSONNull;
- D : TJSONData;
- begin
- J:=TJSONNull.Create;
- try
- D:=J.Clone;
- try
- TestIsNull(D,True);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestNull.TestMyClone;
- Var
- J : TMyNull;
- D : TJSONData;
- begin
- J:=TMyNull.Create;
- try
- D:=J.Clone;
- try
- TestIsNull(D,True);
- AssertEquals('Correct class',TMyNull,D.ClassType);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestNull.TestFormat;
- Var
- J : TJSONNull;
- begin
- J:=TJSONNull.Create;
- try
- AssertEquals('FormatJSON same as asJSON',J.asJSON,J.FormatJSON);
- finally
- J.Free;
- end;
- end;
- { TTestString }
- procedure TTestString.TestString;
- Const
- S = 'A string';
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create(S);
- try
- TestJSONType(J,jtString);
- TestItemCount(J,0);
- TestJSON(J,'"'+S+'"');
- TestIsNull(J,False);
- TestAsBoolean(J,False,True);
- TestAsInteger(J,0,true);
- TestAsInt64(J,0,true);
- TestAsQWord(J,0,true);
- TestAsString(J,S);
- TestAsFloat(J,0.0,true);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestControlString;
- Var
- J : TJSONString;
- I : Integer;
- T : String;
- begin
- J:=TJSONString.Create('');
- try
- For I:=0 to 31 do
- begin
- J.AsString:='-->'+Char(I)+'<--';
- Case I of
- 8 : T:='\b';
- 9 : T:='\t';
- 10 : T:='\n';
- 12 : T:='\f';
- 13 : T:='\r';
- else
- T:='\u'+HexStr(I,4);
- end;
- AssertEquals('Control char','"-->'+T+'<--"',J.AsJSON);
- end;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestSolidus;
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create('');
- try
- J.AsString:='http://www.json.org/';
- TJSONString.StrictEscaping:=True;
- TestJSON(J,'"http:\/\/www.json.org\/"');
- TJSONString.StrictEscaping:=False;
- TestJSON(J,'"http://www.json.org/"');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestInteger;
- Const
- S = '1';
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create(S);
- try
- TestJSONType(J,jtString);
- TestItemCount(J,0);
- TestJSON(J,'"'+S+'"');
- TestIsNull(J,False);
- TestAsBoolean(J,True,False);
- TestAsInteger(J,1,False);
- TestAsInt64(J,1,False);
- TestAsQWord(J,1,False);
- TestAsString(J,S);
- TestAsFloat(J,1.0,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestNegativeInteger;
- Const
- S = '-1';
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create(S);
- try
- TestJSONType(J,jtString);
- TestItemCount(J,0);
- TestJSON(J,'"'+S+'"');
- TestIsNull(J,False);
- TestAsBoolean(J,True,False);
- TestAsInteger(J,-1,False);
- TestAsInt64(J,-1,False);
- TestAsQWord(J,QWord(-1),True);
- TestAsString(J,S);
- TestAsFloat(J,-1.0,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestFloat;
- begin
- DoTestFloat(1.0,'1.0',True);
- DoTestFloat(1.0,'1',True);
- DoTestFloat(1.0,'1e0',True);
- DoTestFloat(1.2,'1.2',True);
- DoTestFloat(12.0,'1.2e1',True);
- end;
- procedure TTestString.TestNegativeFloat;
- begin
- DoTestFloat(-1.0,'-1.0',True);
- DoTestFloat(-1.0,'-1',True);
- DoTestFloat(-1.0,'-1e0',True);
- DoTestFloat(-1.2,'-1.2',True);
- DoTestFloat(-12.0,'-1.2e1',True);
- end;
- procedure TTestString.TestBooleanTrue;
- Const
- S = 'true';
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create(S);
- try
- TestJSONType(J,jtString);
- TestItemCount(J,0);
- TestJSON(J,'"'+S+'"');
- TestIsNull(J,False);
- TestAsBoolean(J,True,False);
- TestAsInteger(J,-1,True);
- TestAsInt64(J,-1,True);
- TestAsQWord(J,QWord(-1),True);
- TestAsString(J,S);
- TestAsFloat(J,-1.0,True);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestBooleanFalse;
- Const
- S = 'false';
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create(S);
- try
- TestJSONType(J,jtString);
- TestItemCount(J,0);
- TestJSON(J,'"'+S+'"');
- TestIsNull(J,False);
- TestAsBoolean(J,False,False);
- TestAsInteger(J,0,True);
- TestAsInt64(J,0,True);
- TestAsQWord(J,0,True);
- TestAsString(J,S);
- TestAsFloat(J,0,True);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestString.TestClone;
- Var
- S : TJSONString;
- D : TJSONData;
- begin
- S:=TJSONString.Create('aloha');
- try
- D:=S.Clone;
- try
- TestJSONType(D,jtString);
- TestAsString(D,'aloha');
- finally
- D.Free;
- end;
- finally
- FreeAndNil(S);
- end;
- end;
- procedure TTestString.TestMyClone;
- Var
- S : TMyString;
- D : TJSONData;
- begin
- S:=TMyString.Create('aloha');
- try
- D:=S.Clone;
- try
- AssertEquals('Correct class',TMyString,D.ClassType);
- TestJSONType(D,jtString);
- TestAsString(D,'aloha');
- finally
- D.Free;
- end;
- finally
- FreeAndNil(S);
- end;
- end;
- procedure TTestString.TestFormat;
- Var
- S : TJSONString;
- begin
- S:=TJSONString.Create('aloha');
- try
- AssertEquals('FormatJSON equals JSON',S.AsJSON,S.FormatJSOn);
- finally
- FreeAndNil(S);
- end;
- end;
- procedure TTestString.DoTestFloat(F : TJSOnFloat;S : String; OK : Boolean);
- Var
- J : TJSONString;
- begin
- J:=TJSONString.Create(S);
- try
- TestJSONType(J,jtString);
- TestItemCount(J,0);
- TestJSON(J,'"'+S+'"');
- TestIsNull(J,False);
- TestAsBoolean(J,(F<>0),Not OK);
- TestAsInteger(J,Round(F),(Pos('.',S)<>0) or (Pos('E',UpperCase(S))<>0));
- TestAsInt64(J,Round(F),(Pos('.',S)<>0) or (Pos('E',UpperCase(S))<>0));
- if F>0 then
- TestAsQword(J,Round(F),(Pos('.',S)<>0) or (Pos('E',UpperCase(S))<>0));
- TestAsString(J,S);
- TestAsFloat(J,F,Not OK);
- finally
- FreeAndNil(J);
- end;
- end;
- { TTestInteger }
- procedure TTestInteger.DoTest(I: Integer);
- Var
- J : TJSONIntegerNumber;
- begin
- J:=TJSONIntegerNumber.Create(I);
- try
- TestJSONType(J,jtNumber);
- TestItemCount(J,0);
- AssertEquals('Numbertype is ntInteger',ord(ntInteger),Ord(J.NumberType));
- TestJSON(J,IntToStr(i));
- TestIsNull(J,False);
- TestAsBoolean(J,(I<>0));
- TestAsInteger(J,I);
- TestAsInt64(J,I);
- TestAsQword(J,I);
- TestAsString(J,IntToStr(I));
- TestAsFloat(J,I);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestInteger.TestPositive;
- begin
- DoTest(1);
- end;
- procedure TTestInteger.TestNegative;
- begin
- DoTest(-1);
- end;
- procedure TTestInteger.TestZero;
- begin
- DoTest(0);
- end;
- procedure TTestInteger.TestClone;
- Var
- I : TJSONIntegerNumber;
- D : TJSONData;
- begin
- I:=TJSONIntegerNumber.Create(99);
- try
- D:=I.Clone;
- try
- TestJSONType(D,jtNumber);
- TestAsInteger(D,99);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(I);
- end;
- end;
- procedure TTestInteger.TestMyClone;
- Var
- I : TMyInteger;
- D : TJSONData;
- begin
- I:=TMyInteger.Create(99);
- try
- D:=I.Clone;
- try
- AssertEquals('Correct class',TMyInteger,D.ClassType);
- TestJSONType(D,jtNumber);
- TestAsInteger(D,99);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(I);
- end;
- end;
- procedure TTestInteger.TestFormat;
- Var
- I : TJSONIntegerNumber;
- begin
- I:=TJSONIntegerNumber.Create(99);
- try
- AssertEquals('FormatJSON equal to JSON',I.AsJSON,I.FormatJSON);
- finally
- FreeAndNil(I);
- end;
- end;
- { TTestInt64 }
- procedure TTestInt64.DoTest(I: Int64);
- Var
- J : TJSONInt64Number;
- begin
- J:=TJSONInt64Number.Create(I);
- try
- TestJSONType(J,jtNumber);
- TestItemCount(J,0);
- AssertEquals('Numbertype is ntInt64',ord(ntInt64),Ord(J.NumberType));
- TestJSON(J,IntToStr(i));
- TestIsNull(J,False);
- TestAsBoolean(J,(I<>0));
- TestAsInteger(J,I);
- TestAsInt64(J,I);
- TestAsQword(J,I);
- TestAsString(J,IntToStr(I));
- TestAsFloat(J,I);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestInt64.TestPositive;
- begin
- DoTest(1);
- end;
- procedure TTestInt64.TestNegative;
- begin
- DoTest(-1);
- end;
- procedure TTestInt64.TestZero;
- begin
- DoTest(0);
- end;
- procedure TTestInt64.TestClone;
- Var
- I : TJSONInt64Number;
- D : TJSONData;
- begin
- I:=TJSONInt64Number.Create(99);
- try
- D:=I.Clone;
- try
- TestJSONType(D,jtNumber);
- AssertEquals('Numbertype is ntInt64',ord(ntInt64),Ord(TJSONInt64Number(D).NumberType));
- TestAsInteger(D,99);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(I);
- end;
- end;
- procedure TTestInt64.TestMyClone;
- Var
- I : TMyInt64;
- D : TJSONData;
- begin
- I:=TMyInt64.Create(99);
- try
- D:=I.Clone;
- try
- AssertEquals('Correct class',TMyInt64,D.ClassType);
- TestJSONType(D,jtNumber);
- AssertEquals('Numbertype is ntInt64',ord(ntInt64),Ord(TMyInt64(D).NumberType));
- TestAsInteger(D,99);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(I);
- end;
- end;
- procedure TTestInt64.TestFormat;
- Var
- I : TJSONInt64Number;
- begin
- I:=TJSONInt64Number.Create(99);
- try
- AssertEquals('FormatJSON equal to JSON',I.AsJSON,I.FormatJSON);
- finally
- FreeAndNil(I);
- end;
- end;
- { TTestQWord }
- procedure TTestQWord.DoTest(Q: QWord);
- Var
- J : TJSONQWordNumber;
- begin
- J:=TJSONQWordNumber.Create(Q);
- try
- TestJSONType(J,jtNumber);
- TestItemCount(J,0);
- AssertEquals('Numbertype is ntQWord',ord(ntQWord),Ord(J.NumberType));
- TestJSON(J,IntToStr(Q));
- TestIsNull(J,False);
- TestAsBoolean(J,(Q<>0));
- TestAsInteger(J,Q);
- TestAsInt64(J,Q);
- TestAsQword(J,Q);
- TestAsString(J,IntToStr(Q));
- TestAsFloat(J,Q);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestQWord.TestPositive;
- begin
- DoTest(1);
- end;
- procedure TTestQWord.TestZero;
- begin
- DoTest(0);
- end;
- procedure TTestQWord.TestClone;
- Var
- I : TJSONQWordNumber;
- D : TJSONData;
- begin
- I:=TJSONQWordNumber.Create(99);
- try
- D:=I.Clone;
- try
- TestJSONType(D,jtNumber);
- AssertEquals('Numbertype is ntQWord',ord(ntQWord),Ord(TJSONQWordNumber(D).NumberType));
- TestAsInteger(D,99);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(I);
- end;
- end;
- procedure TTestQWord.TestMyClone;
- Var
- I : TMyQWord;
- D : TJSONData;
- begin
- I:=TMyQWord.Create(99);
- try
- D:=I.Clone;
- try
- AssertEquals('Correct class',TMyQWord,D.ClassType);
- TestJSONType(D,jtNumber);
- AssertEquals('Numbertype is ntQWord',ord(ntQWord),Ord(TMyQWord(D).NumberType));
- TestAsInteger(D,99);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(I);
- end;
- end;
- procedure TTestQWord.TestFormat;
- Var
- I : TJSONQWordNumber;
- begin
- I:=TJSONQWordNumber.Create(99);
- try
- AssertEquals('FormatJSON equal to JSON',I.AsJSON,I.FormatJSON);
- finally
- FreeAndNil(I);
- end;
- end;
- { TTestFloat }
- procedure TTestFloat.DoTest(F: TJSONFloat);
- Var
- J : TJSONFloatNumber;
- S : String;
-
- begin
- Str(F,S);
- If S[1]=' ' then
- Delete(S,1,1);
- J:=TJSONFloatNumber.Create(F);
- try
- TestJSONType(J,jtNumber);
- TestItemCount(J,0);
- AssertEquals('Numbertype is ntFloat',ord(ntFloat),Ord(J.NumberType));
- TestJSON(J,S);
- TestIsNull(J,False);
- TestAsBoolean(J,(F<>0));
- TestAsInteger(J,Round(F));
- TestAsInt64(J,Round(F));
- TestAsQword(J,Round(F));
- TestAsString(J,S);
- TestAsFloat(J,F);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestFloat.TestPositive;
- begin
- DoTest(1.0);
- DoTest(1.2);
- DoTest(1.2e1);
- DoTest(1.2e-1);
- DoTest(1.2e10);
- DoTest(1.2e-10);
- end;
- procedure TTestFloat.TestNegative;
- begin
- DoTest(-1.0);
- DoTest(-1.2);
- DoTest(-1.2e1);
- DoTest(-1.2e-1);
- DoTest(-1.2e10);
- DoTest(-1.2e-10);
- end;
- procedure TTestFloat.TestZero;
- begin
- DoTest(0.0);
- end;
- procedure TTestFloat.TestClone;
- Var
- F : TJSONFloatNumber;
- D : TJSONData;
- begin
- F:=TJSONFloatNumber.Create(1.23);
- try
- D:=F.Clone;
- try
- TestJSONType(D,jtNumber);
- AssertEquals('Numbertype is ntFloat',ord(ntFloat),Ord(TJSONFloatNumber(D).NumberType));
- TestAsFloat(D,1.23);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(F);
- end;
- end;
- procedure TTestFloat.TestMyClone;
- Var
- F : TMyFloat;
- D : TJSONData;
- begin
- F:=TMyFloat.Create(1.23);
- try
- D:=F.Clone;
- try
- AssertEquals('Correct class',TMyFloat,D.ClassType);
- TestJSONType(D,jtNumber);
- AssertEquals('Numbertype is ntFloat',ord(ntFloat),Ord(TMyFloat(D).NumberType));
- TestAsFloat(D,1.23);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(F);
- end;
- end;
- procedure TTestFloat.TestFormat;
- Var
- F : TJSONFloatNumber;
- begin
- F:=TJSONFloatNumber.Create(1.23);
- try
- AssertEquals('FormatJSON equals asJSON',F.AsJSON,F.FormatJSON);
- finally
- FreeAndNil(F);
- end;
- end;
- { TTestArray }
- procedure TTestArray.TestCreate;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,0);
- TestJSON(J,'[]');
- TestIsNull(J,False);
- TestAsBoolean(J,False,True);
- TestAsInteger(J,1,True);
- TestAsInt64(J,1,True);
- TestAsQWord(J,1,True);
- TestAsString(J,'',True);
- TestAsFloat(J,0.0,True);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateString;
- Const
- S = 'A string';
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([S]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,1);
- TestJSONType(J[0],jtString);
- TestJSON(J,'["'+S+'"]');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreatePchar;
- Const
- S = 'A string';
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([Pchar(S)]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,1);
- TestJSONType(J[0],jtString);
- TestJSON(J,'["'+S+'"]');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateStrings;
- Const
- S = 'A string';
- T = 'B string';
-
- Var
- J : TJSONArray;
- begin
- J:=TJSONArray.Create([S,T]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,2);
- TestJSONType(J[0],jtString);
- TestJSONType(J[1],jtString);
- TestJSON(J,'["'+S+'", "'+T+'"]');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateStringsCompressed;
- Const
- S = 'A string';
- T = 'B string';
- Var
- J : TJSONArray;
- begin
- TJSONData.CompressedJSON:=True;
- J:=TJSONArray.Create([S,T]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,2);
- TestJSONType(J[0],jtString);
- TestJSONType(J[1],jtString);
- TestJSON(J,'["'+S+'","'+T+'"]');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateInteger;
- Const
- S = 3;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([S]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,1);
- TestJSONType(J[0],jtNumber);
- TestJSON(J,'[3]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateFloat;
- Const
- S : double = 1.2;
- Var
- J : TJSONArray;
- r : String;
-
- begin
- J:=TJSonArray.Create([S]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,1);
- TestJSONType(J[0],jtNumber);
- Str(S,R);
- Delete(R,1,1);
- TestJSON(J,'['+R+']');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateInt64;
- Const
- S : Int64 = $FFFFFFFFFFFFF;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([S]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,1);
- TestJSONType(J[0],jtNumber);
- TestJSON(J,'['+IntToStr(S)+']');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateBoolean;
- Const
- S = True;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([S]);
- try
- TestJSONType(J,jtArray);
- TestItemCount(J,1);
- TestJSONType(J[0],jtBoolean);
- TestJSON(J,'[true]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateJSONObject;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([TJSONObject.Create]);
- try
- TestItemCount(J,1);
- TestJSONType(J[0],jtObject);
- TestJSON(J,'[{}]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateJSONString;
- Const
- S = 'A string';
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create([TJSONString.Create(S)]);
- try
- TestItemCount(J,1);
- TestJSONType(J[0],jtString);
- TestJSON(J,'["'+S+'"]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreateObject;
- Var
- J : TJSONArray;
- O : TObject;
-
- begin
- J:=Nil;
- try
- Try
- O:=TObject.Create;
- J:=TJSONArray.Create([O]);
- Fail('Array constructor accepts only TJSONData');
- finally
- FreeAndNil(J);
- FreeAndNil(O);
- end;
- except
- // Should be OK.
- end;
- end;
- procedure TTestArray.TestCreateNilPointer;
- Var
- J : TJSONArray;
- P : Pointer;
-
- begin
- J:=Nil;
- P:=Nil;
- Try
- J:=TJSONArray.Create([P]);
- TestJSONType(J[0],jtNull);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestCreatePointer;
- Var
- J : TJSONArray;
- P : Pointer;
-
- begin
- J:=Nil;
- P:=@Self;
- try
- Try
- J:=TJSONArray.Create([P]);
- Fail('Array constructor accepts only NIL pointers');
- finally
- FreeAndNil(J);
- end;
- except
- // Should be OK.
- end;
- end;
- procedure TTestArray.TestAddInteger;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(Integer(0));
- TestItemCount(J,1);
- TestJSONType(J[0],jtNumber);
- AssertEquals('J[0] is TJSONIntegerNumber',J[0].ClassType,TJSONIntegerNumber);
- AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
- AssertEquals('J.Integers[0]=0',0,J.integers[0]);
- TestAsInteger(J[0],0);
- TestAsInt64(J[0],0);
- TestAsQword(J[0],0);
- TestJSON(J,'[0]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddInt64;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(Int64(0));
- TestItemCount(J,1);
- TestJSONType(J[0],jtNumber);
- AssertEquals('J[0] is TJSONInt64Number',J[0].ClassType,TJSONInt64Number);
- AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
- AssertEquals('J.Int64s[0]=0',0,J.Int64s[0]);
- TestAsInteger(J[0],0);
- TestAsInt64(J[0],0);
- TestAsQword(J[0],0);
- TestJSON(J,'[0]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddFloat;
- Var
- J : TJSONArray;
- S : String;
- F : TJSONFloat;
- begin
- F:=1.2;
- J:=TJSonArray.Create;
- try
- J.Add(F);
- TestItemCount(J,1);
- TestJSONType(J[0],jtNumber);
- AssertEquals('J[0] is TJSONFloatNumber',TJSONfloatNumber,J[0].ClassType);
- AssertEquals('j.Types[0]=jtNumber',Ord(jtNumber),ord(J.Types[0]));
- AssertEquals('J.Floats[0]='+FloatToStr(F),F,J.Floats[0]);
- TestAsFloat(J[0],F);
- Str(F,S);
- Delete(S,1,1);
- TestJSON(J,'['+S+']');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddBoolean(B : Boolean);
- Var
- J : TJSONArray;
- begin
- B:=True;
- J:=TJSonArray.Create;
- try
- J.Add(B);
- TestItemCount(J,1);
- TestJSONType(J[0],jtBoolean);
- AssertEquals('J[0] is TJSONBoolean',TJSONBoolean,J[0].ClassType);
- TestAsBoolean(J[0],B);
- AssertEquals('J.Booleans[0]='+BoolToStr(B)+'"',B,J.Booleans[0]);
- If B then
- TestJSON(J,'[true]')
- else
- TestJSON(J,'[false]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertBoolean(B: Boolean);
- Var
- J : TJSONArray;
- begin
- B:=True;
- J:=TJSonArray.Create;
- try
- J.Add(Not B);
- J.Insert(0,B);
- TestItemCount(J,2);
- TestJSONType(J[0],jtBoolean);
- AssertEquals('J[0] is TJSONBoolean',TJSONBoolean,J[0].ClassType);
- TestAsBoolean(J[0],B);
- AssertEquals('J.Booleans[0]='+BoolToStr(B)+'"',B,J.Booleans[0]);
- If B then
- TestJSON(J,'[true, false]')
- else
- TestJSON(J,'[false, true]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddBooleanTrue;
- begin
- TestAddBoolean(True);
- end;
- procedure TTestArray.TestAddBooleanFalse;
- begin
- TestAddBoolean(False);
- end;
- procedure TTestArray.TestAddString;
- Var
- J : TJSONArray;
- S : String;
-
- begin
- S:='A string';
- J:=TJSonArray.Create;
- try
- J.Add(S);
- TestItemCount(J,1);
- TestJSONType(J[0],jtString);
- AssertEquals('J[0] is TJSONString',TJSONString,J[0].ClassType);
- TestAsString(J[0],S);
- AssertEquals('J.Strings[0]="'+S+'"',S,J.Strings[0]);
- TestJSON(J,'["'+StringToJSONString(S)+'"]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddNull;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add;
- TestItemCount(J,1);
- TestJSONType(J[0],jtNull);
- AssertEquals('J[0] is TJSONNull',TJSONNull,J[0].ClassType);
- AssertEquals('J.Nulls[0]=True',True,J.Nulls[0]);
- TestIsNull(J[0],true);
- TestJSON(J,'[null]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddArray;
- Var
- J,J2 : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J2:=TJSonArray.Create;
- J2.Add(0);
- J2.Add(1);
- J.Add(J2);
- TestItemCount(J,1);
- TestJSONType(J[0],jtArray);
- AssertEquals('J[0] is TJSONArray',TJSONArray,J[0].ClassType);
- AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[0].ClassType);
- TestAsInteger(J.Arrays[0][0],0);
- TestAsInteger(J.Arrays[0][1],1);
- TestAsInt64(J.Arrays[0][0],0);
- TestAsInt64(J.Arrays[0][1],1);
- TestAsQword(J.Arrays[0][0],0);
- TestAsQword(J.Arrays[0][1],1);
- TestJSON(J,'[[0, 1]]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertInteger;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(Integer(1));
- J.Insert(0,Integer(0));
- TestItemCount(J,2);
- TestJSONType(J[0],jtNumber);
- AssertEquals('J[0] is TJSONIntegerNumber',J[0].ClassType,TJSONIntegerNumber);
- AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
- AssertEquals('J.Integers[0]=0',0,J.integers[0]);
- TestAsInteger(J[0],0);
- TestAsInt64(J[0],0);
- TestAsQword(J[0],0);
- TestJSON(J,'[0, 1]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertInt64;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(Int64(1));
- J.Insert(0,Int64(0));
- TestItemCount(J,2);
- TestJSONType(J[0],jtNumber);
- AssertEquals('J[0] is TJSONInt64Number',J[0].ClassType,TJSONInt64Number);
- AssertEquals('j.Types[0]=jtNumber',ord(J.Types[0]),Ord(jtNumber));
- AssertEquals('J.Int64s[0]=0',0,J.Int64s[0]);
- TestAsInteger(J[0],0);
- TestAsInt64(J[0],0);
- TestAsQword(J[0],0);
- TestJSON(J,'[0, 1]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertFloat;
- Var
- J : TJSONArray;
- S,S2 : String;
- F : TJSONFloat;
- begin
- F:=1.2;
- J:=TJSonArray.Create;
- try
- J.Add(2.3);
- J.Insert(0,F);
- TestItemCount(J,2);
- TestJSONType(J[0],jtNumber);
- AssertEquals('J[0] is TJSONFloatNumber',TJSONfloatNumber,J[0].ClassType);
- AssertEquals('j.Types[0]=jtNumber',Ord(jtNumber),ord(J.Types[0]));
- AssertEquals('J.Floats[0]='+FloatToStr(F),F,J.Floats[0]);
- TestAsFloat(J[0],F);
- Str(F,S);
- Delete(S,1,1);
- F:=2.3;
- Str(F,S2);
- Delete(S2,1,1);
- TestJSON(J,'['+S+', '+S2+']');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertBooleanTrue;
- begin
- TestInsertBoolean(True);
- end;
- procedure TTestArray.TestInsertBooleanFalse;
- begin
- TestInsertBoolean(False);
- end;
- procedure TTestArray.TestInsertString;
- Var
- J : TJSONArray;
- S : String;
- begin
- S:='A string';
- J:=TJSonArray.Create;
- try
- J.Add('Another string');
- J.Insert(0,S);
- TestItemCount(J,2);
- TestJSONType(J[0],jtString);
- AssertEquals('J[0] is TJSONString',TJSONString,J[0].ClassType);
- TestAsString(J[0],S);
- AssertEquals('J.Strings[0]="'+S+'"',S,J.Strings[0]);
- TestJSON(J,'["'+StringToJSONString(S)+'", "Another string"]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertNull;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(123);
- J.Insert(0);
- TestItemCount(J,2);
- TestJSONType(J[0],jtNull);
- AssertEquals('J[0] is TJSONNull',TJSONNull,J[0].ClassType);
- AssertEquals('J.Nulls[0]=True',True,J.Nulls[0]);
- TestIsNull(J[0],true);
- TestJSON(J,'[null, 123]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertObject;
- Const
- A = 'a';
- B = 'b';
- Var
- J : TJSONArray;
- J2 : TJSONObject;
- begin
- J:=TJSonArray.Create;
- try
- J.Add('A string');
- J2:=TJSonObject.Create;
- J2.Add(A,0);
- J2.Add(B,1);
- J.Insert(0,J2);
- TestItemCount(J,2);
- TestJSONType(J[0],jtObject);
- AssertEquals('J[0] is TJSONObject',TJSONObject,J[0].ClassType);
- AssertEquals('J.Objects[0] is TJSONObject',TJSONObject,J.Objects[0].ClassType);
- TestAsInteger(J.Objects[0][A],0);
- TestAsInteger(J.Objects[0][B],1);
- TestAsInt64(J.Objects[0][A],0);
- TestAsInt64(J.Objects[0][B],1);
- TestAsQword(J.Objects[0][A],0);
- TestAsQword(J.Objects[0][B],1);
- TestJSON(J,'[{ "a" : 0, "b" : 1 }, "A string"]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestInsertArray;
- Var
- J,J2 : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add('Something nice');
- J2:=TJSonArray.Create;
- J2.Add(0);
- J2.Add(1);
- J.Insert(0,J2);
- TestItemCount(J,2);
- TestJSONType(J[0],jtArray);
- AssertEquals('J[0] is TJSONArray',TJSONArray,J[0].ClassType);
- AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[0].ClassType);
- TestAsInteger(J.Arrays[0][0],0);
- TestAsInteger(J.Arrays[0][1],1);
- TestAsInt64(J.Arrays[0][0],0);
- TestAsInt64(J.Arrays[0][1],1);
- TestAsQWord(J.Arrays[0][0],0);
- TestAsQWord(J.Arrays[0][1],1);
- TestJSON(J,'[[0, 1], "Something nice"]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestMove;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add('First string');
- J.Add('Second string');
- J.Add('Third string');
- J.Move(2,1);
- TestItemCount(J,3);
- AssertEquals('J[2] is TJSONString',TJSONString,J[1].ClassType);
- AssertEquals('J[1] is TJSONString',TJSONString,J[2].ClassType);
- TestAsString(J[1],'Third string');
- TestAsString(J[2],'Second string');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestExchange;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add('First string');
- J.Add('Second string');
- J.Add('Third string');
- J.Exchange(2,0);
- TestItemCount(J,3);
- AssertEquals('J[2] is TJSONString',TJSONString,J[0].ClassType);
- AssertEquals('J[1] is TJSONString',TJSONString,J[2].ClassType);
- TestAsString(J[0],'Third string');
- TestAsString(J[2],'First string');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestAddObject;
- Const
- A = 'a';
- B = 'b';
-
- Var
- J : TJSONArray;
- J2 : TJSONObject;
- begin
- J:=TJSonArray.Create;
- try
- J2:=TJSonObject.Create;
- J2.Add(A,0);
- J2.Add(B,1);
- J.Add(J2);
- TestItemCount(J,1);
- TestJSONType(J[0],jtObject);
- AssertEquals('J[0] is TJSONObject',TJSONObject,J[0].ClassType);
- AssertEquals('J.Objects[0] is TJSONObject',TJSONObject,J.Objects[0].ClassType);
- TestAsInteger(J.Objects[0][A],0);
- TestAsInteger(J.Objects[0][B],1);
- TestAsInt64(J.Objects[0][A],0);
- TestAsInt64(J.Objects[0][B],1);
- TestAsQword(J.Objects[0][A],0);
- TestAsQword(J.Objects[0][B],1);
- TestJSON(J,'[{ "a" : 0, "b" : 1 }]');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestDelete;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(0);
- J.Add(1);
- TestItemCount(J,2);
- TestJSONType(J[0],jtNumber);
- TestJSONType(J[1],jtNumber);
- TestJSON(J,'[0, 1]');
- J.Delete(1);
- TestItemCount(J,1);
- J.Delete(0);
- TestItemCount(J,0);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestRemove;
- Var
- J : TJSONArray;
- I : TJSONData;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(0);
- J.Add(1);
- J.Add(2);
- TestItemCount(J,3);
- TestJSONType(J[0],jtNumber);
- TestJSONType(J[1],jtNumber);
- TestJSONType(J[2],jtNumber);
- TestJSON(J,'[0, 1, 2]');
- I:=J[1];
- J.Remove(I);
- TestItemCount(J,2);
- TestAsInteger(J[0],0);
- TestAsInteger(J[1],2);
- TestAsInt64(J[0],0);
- TestAsInt64(J[1],2);
- TestAsQWord(J[0],0);
- TestAsQWord(J[1],2);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestClone;
- Var
- J,J2 : TJSONArray;
- D : TJSONData;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(1);
- J.Add('aloha');
- D:=J.Clone;
- try
- TestJSONType(D,jtArray);
- J2:=TJSonArray(D);
- TestItemCount(J2,2);
- TestJSONType(J2[0],jtNumber);
- TestJSONType(J2[1],jtString);
- TestAsInteger(J2[0],1);
- TestAsString(J2[1],'aloha');
- finally
- D.Free;
- end;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestMyClone;
- Var
- J : TMyArray;
- D : TJSONData;
- begin
- J:=TMyArray.Create;
- try
- J.Add(1);
- J.Add('aloha');
- D:=J.Clone;
- try
- TestJSONType(D,jtArray);
- AssertEquals('Correct class',TMyArray,D.ClassType);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestArray.TestFormat;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(0);
- J.Add(1);
- J.Add(2);
- TestItemCount(J,3);
- TestJSONType(J[0],jtNumber);
- TestJSONType(J[1],jtNumber);
- TestJSONType(J[2],jtNumber);
- TestJSON(J,'[0, 1, 2]');
- AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineArray],1));
- AssertEquals('FormatJSON, default','['+sLinebreak+' 0,'+sLinebreak+' 1,'+sLinebreak+' 2'+sLinebreak+']',J.FormatJSON());
- AssertEquals('FormatJSON, use tab','['+sLinebreak+#9'0,'+sLinebreak+#9'1,'+sLinebreak+#9'2'+sLinebreak+']',J.FormatJSON([foUseTabChar],1));
- J.Add(TJSONObject.Create(['x',1,'y',2]));
- 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));
- finally
- J.Free
- end;
- end;
- procedure TTestArray.TestFormatNil;
- Var
- J : TJSONArray;
- begin
- J:=TJSonArray.Create;
- try
- J.Add(1);
- J.Add(TJSONObject(Nil));
- TestJSON(J,'[1, null]');
- AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineArray],1));
- finally
- J.Free;
- end;
- end;
- { TTestObject }
- procedure TTestObject.TestCreate;
- begin
- TestJSONType(J,jtObject);
- TestItemCount(J,0);
- TestJSON(J,'{}');
- TestIsNull(J,False);
- TestAsBoolean(J,False,True);
- TestAsInteger(J,1,True);
- TestAsInt64(J,1,True);
- TestAsQword(J,1,True);
- TestAsString(J,'',True);
- TestAsFloat(J,0.0,True);
- end;
- procedure TTestObject.TestAddInteger;
- Const
- A = 'a';
- begin
- J.Add(A,Integer(0));
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- AssertEquals('J[''a''] is TJSONIntegerNumber',J[A].ClassType,TJSONIntegerNumber);
- AssertEquals('j.Types[''a'']=jtNumber',ord(J.Types[A]),Ord(jtNumber));
- AssertEquals('J.Integers[''a'']=0',0,J.integers[A]);
- TestAsInteger(J[A],0);
- TestAsInt64(J[A],0);
- TestAsQword(J[A],0);
- TestJSON(J,'{ "'+A+'" : 0 }');
- end;
- procedure TTestObject.TestAddInt64;
- Const
- A = 'a';
- begin
- J.Add(A,Int64(0));
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- AssertEquals('J[''a''] is TJSONInt64Number',J[A].ClassType,TJSONInt64Number);
- AssertEquals('j.Types[''a'']=jtNumber',ord(J.Types[A]),Ord(jtNumber));
- AssertEquals('J.Int64s[''a'']=0',0,J.Int64s[A]);
- TestAsInteger(J[A],0);
- TestAsInt64(J[A],0);
- TestAsQword(J[A],0);
- TestJSON(J,'{ "'+A+'" : 0 }');
- end;
- procedure TTestObject.TestAddFloat;
- Const
- A = 'a';
- Var
- S : String;
- F : TJSONFloat;
- begin
- F:=1.2;
- J.Add(A,F);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- AssertEquals('J[''a''] is TJSONFloatNumber',TJSONfloatNumber,J[a].ClassType);
- AssertEquals('j.Types[''a'']=jtNumber',Ord(jtNumber),ord(J.Types[a]));
- AssertEquals('J.Floats[''a'']='+FloatToStr(F),F,J.Floats[a]);
- TestAsFloat(J[A],F);
- Str(F,S);
- TestJSON(J,'{ "'+a+'" :'+S+' }');
- end;
- procedure TTestObject.Setup;
- begin
- inherited Setup;
- FJ:=TJSONObject.Create;
- end;
- procedure TTestObject.TearDown;
- begin
- FreeAndNil(FJ);
- inherited TearDown;
- end;
- procedure TTestObject.TestAddBoolean(B : Boolean);
- Const
- A = 'a';
-
- begin
- B:=True;
- J.Add(A,B);
- TestItemCount(J,1);
- TestJSONType(J[A],jtBoolean);
- AssertEquals('J[''a''] is TJSONBoolean',TJSONBoolean,J[a].ClassType);
- TestAsBoolean(J[a],B);
- AssertEquals('J.Booleans[''a'']='+BoolToStr(B)+'"',B,J.Booleans[a]);
- If B then
- TestJSON(J,'{ "'+a+'" : true }')
- else
- TestJSON(J,'{ "'+a+'" : false }');
- end;
- procedure TTestObject.TestAccessError;
- begin
- J.Strings['NonExist'];
- end;
- procedure TTestObject.TestAddBooleanTrue;
- begin
- TestAddBoolean(True);
- end;
- procedure TTestObject.TestAddBooleanFalse;
- begin
- TestAddBoolean(False);
- end;
- procedure TTestObject.TestAddString;
- Const
- A = 'a';
- Var
- S : String;
- begin
- S:='A string';
- J.Add(A,S);
- TestItemCount(J,1);
- TestJSONType(J[a],jtString);
- AssertEquals('J[''a''] is TJSONString',TJSONString,J[A].ClassType);
- TestAsString(J[a],S);
- AssertEquals('J.Strings[''a'']="'+S+'"',S,J.Strings[A]);
- TestJSON(J,'{ "'+a+'" : "'+StringToJSONString(S)+'" }');
- end;
- procedure TTestObject.TestAddNull;
- Const
- A = 'a';
- begin
- J.Add(a);
- TestItemCount(J,1);
- TestJSONType(J[a],jtNull);
- AssertEquals('J[''a''] is TJSONNull',TJSONNull,J[A].ClassType);
- AssertEquals('J.Nulls[''a'']=True',True,J.Nulls[A]);
- TestIsNull(J[a],true);
- TestJSON(J,'{ "'+a+'" : null }');
- end;
- procedure TTestObject.TestAddObject;
- Const
- A = 'a';
- B = 'b';
- C = 'c';
- Var
- J2 : TJSONObject;
- begin
- J2:=TJSonObject.Create;
- J2.Add(B,0);
- J2.Add(C,1);
- J.Add(A,J2);
- TestItemCount(J,1);
- TestJSONType(J[A],jtObject);
- AssertEquals('J[''a''] is TJSONObject',TJSONObject,J[A].ClassType);
- AssertEquals('J.Objects[''a''] is TJSONObject',TJSONObject,J.Objects[A].ClassType);
- TestAsInteger(J.Objects[A][B],0);
- TestAsInteger(J.Objects[A][C],1);
- TestAsInt64(J.Objects[A][B],0);
- TestAsInt64(J.Objects[A][C],1);
- TestAsQword(J.Objects[A][B],0);
- TestAsQword(J.Objects[A][C],1);
- TestJSON(J,'{ "a" : { "b" : 0, "c" : 1 } }');
- end;
- procedure TTestObject.TestAddArray;
- Const
- A = 'a';
- Var
- J2 : TJSONArray;
- begin
- J2:=TJSonArray.Create;
- J2.Add(0);
- J2.Add(1);
- J.Add(A,J2);
- TestItemCount(J,1);
- TestJSONType(J[A],jtArray);
- AssertEquals('J[''a''] is TJSONArray',TJSONArray,J[A].ClassType);
- AssertEquals('J.Arrays[0] is TJSONArray',TJSONArray,J.Arrays[A].ClassType);
- TestAsInteger(J.Arrays[A][0],0);
- TestAsInteger(J.Arrays[A][1],1);
- TestAsInt64(J.Arrays[A][0],0);
- TestAsInt64(J.Arrays[A][1],1);
- TestAsQword(J.Arrays[A][0],0);
- TestAsQword(J.Arrays[A][1],1);
- TestJSON(J,'{ "a" : [0, 1] }');
- end;
- procedure TTestObject.TestDelete;
- Const
- A = 'a';
- B = 'b';
-
- begin
- J.Add(A,0);
- J.Add(B,1);
- TestItemCount(J,2);
- TestJSONType(J[A],jtNumber);
- TestJSONType(J[A],jtNumber);
- TestJSON(J,'{ "a" : 0, "b" : 1 }');
- J.Delete(1);
- TestItemCount(J,1);
- J.Delete(0);
- TestItemCount(J,0);
- end;
- procedure TTestObject.TestRemove;
- Const
- A = 'a';
- B = 'b';
- C = 'c';
-
- Var
- I : TJSONData;
- begin
- J.Add(A,1);
- J.Add(B,2);
- J.Add(C,3);
- TestItemCount(J,3);
- TestJSONType(J[A],jtNumber);
- TestJSONType(J[B],jtNumber);
- TestJSONType(J[C],jtNumber);
- TestJSON(J,'{ "a" : 1, "b" : 2, "c" : 3 }');
- I:=J[b];
- J.Remove(I);
- TestItemCount(J,2);
- TestAsInteger(J[a],1);
- TestAsInteger(J[c],3);
- TestAsInt64(J[a],1);
- TestAsInt64(J[c],3);
- TestAsQword(J[a],1);
- TestAsQword(J[c],3);
- end;
- procedure TTestObject.TestClone;
- Var
- J2 : TJSONObject;
- D : TJSONData;
- begin
- J.Add('p1',1);
- J.Add('p2','aloha');
- D:=J.Clone;
- try
- TestJSONType(D,jtObject);
- J2:=TJSonObject(D);
- TestItemCount(J2,2);
- TestJSONType(J2['p1'],jtNumber);
- TestJSONType(J2['p2'],jtString);
- TestAsInteger(J2['p1'],1);
- TestAsString(J2['p2'],'aloha');
- finally
- D.Free;
- end;
- end;
- procedure TTestObject.TestMyClone;
- Var
- D : TJSONData;
- O : TMyObject;
- begin
- D:=Nil;
- O:=TMyObject.Create;
- try
- O.Add('p1',1);
- O.Add('p2','aloha');
- D:=O.Clone;
- TestJSONType(D,jtObject);
- AssertEquals('Correct class',TMYObject,D.ClassType);
- finally
- D.Free;
- O.Free;
- end;
- end;
- procedure TTestObject.TestExtract;
- Const
- A = 'a';
- B = 'b';
- Var
- JA,JB : TJSONData;
- E : TJSONData;
- begin
- J.Add(A,0);
- J.Add(B,1);
- TestItemCount(J,2);
- JA:=J[A];
- JB:=J[B];
- TestJSONType(JA,jtNumber);
- TestJSONType(JB,jtNumber);
- TestJSON(J,'{ "a" : 0, "b" : 1 }');
- E:=J.Extract(1);
- AssertSame('Extracted JA',JB,E);
- E.Free;
- TestItemCount(J,1);
- E:=J.Extract(0);
- AssertSame('Extracted JB',JA,E);
- E.Free;
- TestItemCount(J,0);
- end;
- procedure TTestObject.TestNonExistingAccessError;
- begin
- AssertException(EJSON,@TestAccessError);
- end;
- procedure TTestObject.TestFormat;
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create(['x',1,'y',2]);
- try
- TestJSON(O,'{ "x" : 1, "y" : 2 }');
- AssertEquals('Format equals JSON',O.AsJSON,O.FormatJSON([foSingleLineObject]));
- AssertEquals('Format using SkipWhiteSpace','{"x":1,"y":2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace]));
- AssertEquals('Format using SkipWhiteSpace,foSkipWhiteSpaceOnlyLeading','{"x": 1,"y": 2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace,foSkipWhiteSpaceOnlyLeading]));
- AssertEquals('Format using SkipWhiteSpace,unquotednames','{x:1,y:2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace,foDoNotQuoteMembers]));
- AssertEquals('Format []','{'+sLineBreak+' "x" : 1,'+sLineBreak+' "y" : 2'+sLineBreak+'}',O.FormatJSON([]));
- AssertEquals('Format [foDoNotQuoteMembers]','{'+sLineBreak+' x : 1,'+sLineBreak+' y : 2'+sLineBreak+'}',O.FormatJSON([foDoNotQuoteMembers]));
- AssertEquals('Format [foUseTabChar,foDoNotQuoteMembers]','{'+sLineBreak+#9'x : 1,'+sLineBreak+#9'y : 2'+sLineBreak+'}',O.FormatJSON([foUseTabChar,foDoNotQuoteMembers],1));
- O.Add('s',TJSONObject.Create(['w',10,'h',20]));
- 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));
- finally
- O.Free;
- end;
- end;
- procedure TTestObject.TestFormatNil;
- begin
- J.Add('a',1);
- J.Add('b',TJSONObject(Nil));
- TestJSON(J,'{ "a" : 1, "b" : null }');
- AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineObject],1));
- end;
- procedure TTestObject.TestFind;
- Const
- A = 'A';
- S = 'A string';
- B = 'a';
- S2 = 'Another string';
- C = 'c';
- S3 = 'Yet Another string';
- begin
- J.Add(A,S);
- J.Add(B,S2);
- J.Add(C,S3);
- TestJSONType(J,jtObject);
- TestIsNull(J,False);
- TestItemCount(J,3);
- TestJSONType(J[A],jtString);
- TestJSONType(J[B],jtString);
- TestJSON(J,'{ "A" : "'+S+'", "a" : "'+S2+'", "c" : "'+S3+'" }');
- AssertEquals('Nonexisting, case sensitive',-1,J.IndexOfName('D'));
- AssertEquals('Nonexisting, case insensitive',-1,J.IndexOfName('D',True));
- AssertEquals('1 Existing , case sensitive',0,J.IndexOfName(A));
- AssertEquals('2 Existing exact match, case insensitive',0,J.IndexOfName(A,true));
- AssertEquals('3 Existing , case sensitive',1,J.IndexOfName(B));
- AssertEquals('4 Existing exact match, case insensitive',1,J.IndexOfName(B,true));
- AssertEquals('5 Existing , case sensitive again',2,J.IndexOfName(C));
- AssertEquals('6 Existing case-insensitive match, case insensitive',2,J.IndexOfName(Uppercase(C),true));
- end;
- Procedure TTestObject.TestIfFind;
- Var
- B: TJSONBoolean;
- S: TJSONString;
- N: TJSONNumber;
- D: TJSONData;
- begin
- J.Add('s', 'astring');
- J.Add('b', true);
- J.Add('n', 1);
- TestJSONType(J,jtObject);
- TestIsNull(J,False);
- TestItemCount(J,3);
- AssertEquals('boolean found', true, j.Find('b', B));
- AssertEquals('string found', true, j.Find('s', S));
- AssertEquals('number found', true, j.Find('n', N));
- AssertEquals('data found', true, j.Find('s', D));
- end;
- procedure TTestObject.AppendA;
- begin
- J.Add('A','S')
- end;
- procedure TTestObject.TestDuplicate;
- begin
- J.Add('A',TJSONObject.Create);
- AssertException(EJSON,@AppendA);
- end;
- procedure TTestObject.TestCreateString;
- Const
- A = 'A';
- S = 'A string';
- begin
- J.Add(A,S);
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ "A" : "'+S+'" }');
- TestIsNull(J,False);
- end;
- procedure TTestObject.TestCreateStringUnquoted;
- Const
- A = 'A';
- S = 'A string';
- begin
- TJSONObject.UnquotedMemberNames:=True;
- J.Add(A,S);
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ A : "'+S+'" }');
- TestIsNull(J,False);
- end;
- procedure TTestObject.TestCreatePchar;
- Const
- A = 'A';
- S = 'A string';
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,Pchar(S)]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtString);
- TestJSON(O,'{ "A" : "'+S+'" }');
- TestIsNull(O,False);
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreatePcharUnquoted;
- Const
- A = 'A';
- S = 'A string';
- Var
- O : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,Pchar(S)]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtString);
- TestJSON(O,'{ A : "'+S+'" }');
- TestIsNull(O,False);
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateStrings;
- Const
- A = 'A';
- B = 'B';
- S = 'A string';
- T = 'B string';
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,S,B,T]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,2);
- TestJSONType(O[A],jtString);
- TestJSONType(O[B],jtString);
- TestJSON(O,'{ "A" : "'+S+'", "B" : "'+T+'" }');
- TestIsNull(O,False);
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateStringsCompressed;
- Const
- A = 'A';
- B = 'B';
- S = 'A string';
- T = 'B string';
- Var
- O : TJSONObject;
- begin
- TJSONData.CompressedJSON:=True;
- O:=TJSONObject.Create([A,S,B,T]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,2);
- TestJSONType(O[A],jtString);
- TestJSONType(O[B],jtString);
- TestJSON(O,'{"A":"'+S+'","B":"'+T+'"}');
- TestIsNull(O,False);
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateStringsCompressedUnquoted;
- Const
- A = 'A';
- B = 'B';
- S = 'A string';
- T = 'B string';
- Var
- O : TJSONObject;
- begin
- TJSONData.CompressedJSON:=True;
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,S,B,T]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,2);
- TestJSONType(O[A],jtString);
- TestJSONType(O[B],jtString);
- TestJSON(O,'{A:"'+S+'",B:"'+T+'"}');
- TestIsNull(O,False);
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateInteger;
- Const
- A = 'A';
- S = 3;
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtNumber);
- TestJSON(O,'{ "A" : 3 }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateIntegerUnquoted;
- Const
- A = 'A';
- S = 3;
- Var
- O : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtNumber);
- TestJSON(O,'{ A : 3 }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateFloat;
- Const
- A = 'A';
- S : double = 1.2;
- Var
- O : TJSONObject;
- r : String;
- begin
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtNumber);
- Str(S,R);
- TestJSON(O,'{ "A" :'+R+' }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateFloatUnquoted;
- Const
- A = 'A';
- S : double = 1.2;
- Var
- O : TJSONObject;
- r : String;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtNumber);
- Str(S,R);
- TestJSON(O,'{ A :'+R+' }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateInt64;
- Const
- A = 'A';
- S : Int64 = $FFFFFFFFFFFFF;
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtNumber);
- TestJSON(O,'{ "A" : '+IntToStr(S)+' }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateInt64Unquoted;
- Const
- A = 'A';
- S : Int64 = $FFFFFFFFFFFFF;
- Var
- O : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtNumber);
- TestJSON(O,'{ A : '+IntToStr(S)+' }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateBoolean;
- Const
- A = 'A';
- S = True;
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtBoolean);
- TestJSON(O,'{ "A" : true }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateBooleanUnquoted;
- Const
- A = 'A';
- S = True;
- Var
- O : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,S]);
- try
- TestJSONType(O,jtObject);
- TestItemCount(O,1);
- TestJSONType(O[A],jtBoolean);
- TestJSON(O,'{ A : true }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateJSONObject;
- Const
- A = 'A';
-
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,TJSONObject.Create]);
- try
- TestItemCount(O,1);
- TestJSONType(O[A],jtObject);
- TestJSON(O,'{ "A" : {} }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateJSONObjectUnquoted;
- Const
- A = 'A';
- Var
- O : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,TJSONObject.Create]);
- try
- TestItemCount(O,1);
- TestJSONType(O[A],jtObject);
- TestJSON(O,'{ A : {} }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateJSONString;
- Const
- A = 'A';
- S = 'A string';
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,TJSONString.Create(S)]);
- try
- TestItemCount(O,1);
- TestJSONType(O[A],jtString);
- TestJSON(O,'{ "A" : "'+S+'" }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateJSONStringUnquoted;
- Const
- A = 'A';
- S = 'A string';
- Var
- O : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- O:=TJSONObject.Create([A,TJSONString.Create(S)]);
- try
- TestItemCount(O,1);
- TestJSONType(O[A],jtString);
- TestJSON(O,'{ A : "'+S+'" }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateObject;
- Const
- A = 'A';
- Var
- O : TJSONObject;
- OO : TObject;
- begin
- O:=Nil;
- try
- Try
- OO:=TObject.Create;
- O:=TJSONObject.Create([A,OO]);
- Fail('Array constructor accepts only TJSONData');
- finally
- FreeAndNil(O);
- FreeAndNil(OO);
- end;
- except
- // Should be OK.
- end;
- end;
- procedure TTestObject.TestCreateJSONUnicodeString;
- Const
- A = 'A';
- S : Unicodestring = 'A string';
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,S]);
- try
- TestItemCount(O,1);
- TestJSONType(O[A],jtString);
- TestJSON(O,'{ "A" : "'+UTF8Encode(S)+'" }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateJSONWideString;
- Const
- A = 'A';
- W : WideString = 'A string';
- Var
- O : TJSONObject;
- begin
- O:=TJSONObject.Create([A,W]);
- try
- TestItemCount(O,1);
- TestJSONType(O[A],jtString);
- TestJSON(O,'{ "A" : "'+UTF8Encode(W)+'" }');
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreateNilPointer;
- Const
- A = 'A';
- Var
- O : TJSONObject;
- P : Pointer;
- begin
- O:=Nil;
- P:=Nil;
- Try
- O:=TJSONObject.Create([A,P]);
- TestJSONType(O[A],jtNull);
- finally
- FreeAndNil(O);
- end;
- end;
- procedure TTestObject.TestCreatePointer;
- Const
- A = 'A';
- Var
- O : TJSONObject;
- P : Pointer;
- begin
- O:=Nil;
- P:=@Self;
- try
- Try
- O:=TJSONObject.Create([A,P]);
- Fail('Array constructor accepts only NIL pointers');
- finally
- FreeAndNil(O);
- end;
- except
- // Should be OK.
- end;
- end;
- { TTestJSONString }
- procedure TTestJSONString.TestTo(const Src, Dest: String; Strict : Boolean = False);
- Var
- S : String;
- begin
- S:='StringToJSONString('''+Src+''')='''+Dest+'''';
- AssertEquals(S,Dest,StringToJSONString(Src,Strict));
- end;
- procedure TTestJSONString.TestFrom(const Src, Dest: String);
- Var
- S : String;
- begin
- S:='JSONStringToString('''+Src+''')='''+Dest+'''';
- AssertEquals(S,Dest,JSONStringToString(Src));
- end;
- procedure TTestJSONString.TestJSONStringToString;
- Const
- // Glowing star in UTF8
- GlowingStar = #$F0#$9F#$8C#$9F;
- Chinese = #$95e8#$88ab#$8111#$5b50#$6324#$574f#$4e86;
- Chinese4b = #$95e8#$d867#$de3d#$88ab#$8111#$5b50#$6324#$574f#$4e86;
- begin
- TestFrom('','');
- TestFrom('A','A');
- TestFrom('AB','AB');
- TestFrom('ABC','ABC');
- TestFrom('\\','\');
- TestFrom('\/','/');
- TestFrom('\"','"');
- TestFrom('\b',#8);
- TestFrom('\t',#9);
- TestFrom('\n',#10);
- TestFrom('\f',#12);
- TestFrom('\r',#13);
- TestFrom('\bBC',#8'BC');
- TestFrom('\tBC',#9'BC');
- TestFrom('\nBC',#10'BC');
- TestFrom('\fBC',#12'BC');
- TestFrom('\rBC',#13'BC');
- TestFrom('A\b','A'#8);
- TestFrom('A\t','A'#9);
- TestFrom('A\n','A'#10);
- TestFrom('A\f','A'#12);
- TestFrom('A\r','A'#13);
- TestFrom('A\bBC','A'#8'BC');
- TestFrom('A\tBC','A'#9'BC');
- TestFrom('A\nBC','A'#10'BC');
- TestFrom('A\fBC','A'#12'BC');
- TestFrom('A\rBC','A'#13'BC');
- TestFrom('\\\\','\\');
- TestFrom('\/\/','//');
- TestFrom('\"\"','""');
- TestFrom('\b\b',#8#8);
- TestFrom('\t\t',#9#9);
- TestFrom('\n\n',#10#10);
- TestFrom('\f\f',#12#12);
- TestFrom('\r\r',#13#13);
- TestFrom('\u00f8','ø'); // this is ø
- TestFrom('\u00f8\"','ø"'); // this is ø"
- TestFrom('\ud83c\udf1f',GlowingStar);
- TestFrom('\u0041\u0042','AB'); //issue #0038622
- TestFrom('\u0041\u0042\u0043','ABC');
- TestFrom('\u0041\u0042\u0043\u0044','ABCD');
- TestFrom('\u95e8\u88ab\u8111\u5b50\u6324\u574f\u4e86',Utf8Encode(Chinese));
- TestFrom('\u95e8\ud867\ude3d\u88ab\u8111\u5b50\u6324\u574f\u4e86',Utf8Encode(Chinese4b));
- end;
- procedure TTestJSONString.TestStringToJSONString;
- begin
- TestTo('','');
- TestTo('A','A');
- TestTo('AB','AB');
- TestTo('ABC','ABC');
- TestTo('\','\\');
- TestTo('/','/');
- TestTo('/','\/',True);
- TestTo('"','\"');
- TestTo(#8,'\b');
- TestTo(#9,'\t');
- TestTo(#10,'\n');
- TestTo(#12,'\f');
- TestTo(#13,'\r');
- TestTo(#8'BC','\bBC');
- TestTo(#9'BC','\tBC');
- TestTo(#10'BC','\nBC');
- TestTo(#12'BC','\fBC');
- TestTo(#13'BC','\rBC');
- TestTo('A'#8,'A\b');
- TestTo('A'#9,'A\t');
- TestTo('A'#10,'A\n');
- TestTo('A'#12,'A\f');
- TestTo('A'#13,'A\r');
- TestTo('A'#8'BC','A\bBC');
- TestTo('A'#9'BC','A\tBC');
- TestTo('A'#10'BC','A\nBC');
- TestTo('A'#12'BC','A\fBC');
- TestTo('A'#13'BC','A\rBC');
- TestTo('\\','\\\\');
- TestTo('//','//');
- TestTo('//','\/\/',true);
- TestTo('""','\"\"');
- TestTo(#8#8,'\b\b');
- TestTo(#9#9,'\t\t');
- TestTo(#10#10,'\n\n');
- TestTo(#12#12,'\f\f');
- TestTo(#13#13,'\r\r');
- end;
- initialization
- RegisterTest(TTestJSONString);
- RegisterTest(TTestNull);
- RegisterTest(TTestBoolean);
- RegisterTest(TTestInteger);
- RegisterTest(TTestInt64);
- RegisterTest(TTestQWord);
- RegisterTest(TTestFloat);
- RegisterTest(TTestString);
- RegisterTest(TTestArray);
- RegisterTest(TTestObject);
- RegisterTest(TTestJSONPath);
- RegisterTest(TTestFactory);
- RegisterTest(TTestIterator);
- end.
|