123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161 |
- {
- 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 : String);
- 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
- procedure TestAddBoolean(B : Boolean);
- Procedure TestAccessError;
- 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 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;
- 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: String);
- 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));
- 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));
- 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;
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create;
- try
- 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);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddInteger;
- Const
- A = 'a';
- Var
- J : TJSONObject;
- begin
- J:=TJSonObject.Create;
- try
- 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 }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddInt64;
- Const
- A = 'a';
- Var
- J : TJSONObject;
- begin
- J:=TJSonObject.Create;
- try
- 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 }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddFloat;
- Const
- A = 'a';
- Var
- J : TJSONObject;
- S : String;
- F : TJSONFloat;
- begin
- F:=1.2;
- J:=TJSonObject.Create;
- try
- 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+' }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddBoolean(B : Boolean);
- Const
- A = 'a';
-
- Var
- J : TJSONObject;
- begin
- B:=True;
- J:=TJSonObject.Create;
- try
- 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 }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAccessError;
- Var
- J : TJSONObject;
- begin
- J:=TJSonObject.Create;
- try
- J.Strings['NonExist'];
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddBooleanTrue;
- begin
- TestAddBoolean(True);
- end;
- procedure TTestObject.TestAddBooleanFalse;
- begin
- TestAddBoolean(False);
- end;
- procedure TTestObject.TestAddString;
- Const
- A = 'a';
- Var
- J : TJSONObject;
- S : String;
- begin
- S:='A string';
- J:=TJSonObject.Create;
- try
- 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)+'" }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddNull;
- Const
- A = 'a';
- Var
- J : TJSONObject;
- begin
- J:=TJSonObject.Create;
- try
- 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 }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddObject;
- Const
- A = 'a';
- B = 'b';
- C = 'c';
- Var
- J,J2 : TJSONObject;
- begin
- J:=TJSonObject.Create;
- try
- 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 } }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestAddArray;
- Const
- A = 'a';
- Var
- J : TJSONObject;
- J2 : TJSONArray;
- begin
- J:=TJSONObject.Create;
- try
- 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] }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestDelete;
- Const
- A = 'a';
- B = 'b';
-
- Var
- J : TJSONObject;
- begin
- J:=TJSonObject.Create;
- try
- 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);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestRemove;
- Const
- A = 'a';
- B = 'b';
- C = 'c';
-
- Var
- J : TJSONObject;
- I : TJSONData;
- begin
- J:=TJSonObject.Create;
- try
- 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);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestClone;
- Var
- J,J2 : TJSONObject;
- D : TJSONData;
- begin
- J:=TJSonObject.Create;
- try
- 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;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestMyClone;
- Var
- J : TMyObject;
- D : TJSONData;
- begin
- J:=TMyObject.Create;
- try
- J.Add('p1',1);
- J.Add('p2','aloha');
- D:=J.Clone;
- try
- TestJSONType(D,jtObject);
- AssertEquals('Correct class',TMYObject,D.ClassType);
- finally
- D.Free;
- end;
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestExtract;
- Const
- A = 'a';
- B = 'b';
- Var
- J : TJSONObject;
- JA,JB : TJSONData;
- E : TJSONData;
- begin
- J:=TJSonObject.Create;
- try
- 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);
- finally
- FreeAndNil(J);
- end;
- 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,unquotednames','{x:1,y:2}',O.FormatJSON([foSingleLineObject,foSkipWhiteSpace,foDoNotQuoteMembers]));
- AssertEquals('Format 1','{'+sLineBreak+' "x" : 1,'+sLineBreak+' "y" : 2'+sLineBreak+'}',O.FormatJSON([]));
- AssertEquals('Format 1','{'+sLineBreak+' x : 1,'+sLineBreak+' y : 2'+sLineBreak+'}',O.FormatJSON([foDoNotQuoteMembers]));
- AssertEquals('Format 1','{'+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 1','{'+sLineBreak+#9'x : 1,'+sLineBreak+#9'y : 2,'+sLineBreak+#9's : {'+sLineBreak+#9#9'w : 10,'+sLineBreak+#9#9'h : 20'+sLineBreak+#9'}'+sLineBreak+'}',O.FormatJSON([foUseTabChar,foDoNotQuoteMembers],1));
- finally
- O.Free;
- end;
- end;
- procedure TTestObject.TestFormatNil;
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create;
- try
- 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));
- finally
- J.Free;
- end;
- end;
- procedure TTestObject.TestFind;
- Const
- A = 'A';
- S = 'A string';
- B = 'a';
- S2 = 'Another string';
- C = 'c';
- S3 = 'Yet Another string';
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,S,B,S2,C,S3]);
- try
- 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));
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateString;
- Const
- A = 'A';
- S = 'A string';
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ "A" : "'+S+'" }');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateStringUnquoted;
- Const
- A = 'A';
- S = 'A string';
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnquotedMemberNames:=True;
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ A : "'+S+'" }');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreatePchar;
- Const
- A = 'A';
- S = 'A string';
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,Pchar(S)]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ "A" : "'+S+'" }');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreatePcharUnquoted;
- Const
- A = 'A';
- S = 'A string';
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,Pchar(S)]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ A : "'+S+'" }');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateStrings;
- Const
- A = 'A';
- B = 'B';
- S = 'A string';
- T = 'B string';
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,S,B,T]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,2);
- TestJSONType(J[A],jtString);
- TestJSONType(J[B],jtString);
- TestJSON(J,'{ "A" : "'+S+'", "B" : "'+T+'" }');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateStringsCompressed;
- Const
- A = 'A';
- B = 'B';
- S = 'A string';
- T = 'B string';
- Var
- J : TJSONObject;
- begin
- TJSONData.CompressedJSON:=True;
- J:=TJSONObject.Create([A,S,B,T]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,2);
- TestJSONType(J[A],jtString);
- TestJSONType(J[B],jtString);
- TestJSON(J,'{"A":"'+S+'","B":"'+T+'"}');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateStringsCompressedUnquoted;
- Const
- A = 'A';
- B = 'B';
- S = 'A string';
- T = 'B string';
- Var
- J : TJSONObject;
- begin
- TJSONData.CompressedJSON:=True;
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,S,B,T]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,2);
- TestJSONType(J[A],jtString);
- TestJSONType(J[B],jtString);
- TestJSON(J,'{A:"'+S+'",B:"'+T+'"}');
- TestIsNull(J,False);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateInteger;
- Const
- A = 'A';
- S = 3;
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- TestJSON(J,'{ "A" : 3 }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateIntegerUnquoted;
- Const
- A = 'A';
- S = 3;
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- TestJSON(J,'{ A : 3 }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateFloat;
- Const
- A = 'A';
- S : double = 1.2;
- Var
- J : TJSONObject;
- r : String;
- begin
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- Str(S,R);
- TestJSON(J,'{ "A" :'+R+' }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateFloatUnquoted;
- Const
- A = 'A';
- S : double = 1.2;
- Var
- J : TJSONObject;
- r : String;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- Str(S,R);
- TestJSON(J,'{ A :'+R+' }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateInt64;
- Const
- A = 'A';
- S : Int64 = $FFFFFFFFFFFFF;
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- TestJSON(J,'{ "A" : '+IntToStr(S)+' }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateInt64Unquoted;
- Const
- A = 'A';
- S : Int64 = $FFFFFFFFFFFFF;
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtNumber);
- TestJSON(J,'{ A : '+IntToStr(S)+' }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateBoolean;
- Const
- A = 'A';
- S = True;
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtBoolean);
- TestJSON(J,'{ "A" : true }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateBooleanUnquoted;
- Const
- A = 'A';
- S = True;
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,S]);
- try
- TestJSONType(J,jtObject);
- TestItemCount(J,1);
- TestJSONType(J[A],jtBoolean);
- TestJSON(J,'{ A : true }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateJSONObject;
- Const
- A = 'A';
-
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,TJSONObject.Create]);
- try
- TestItemCount(J,1);
- TestJSONType(J[A],jtObject);
- TestJSON(J,'{ "A" : {} }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateJSONObjectUnquoted;
- Const
- A = 'A';
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,TJSONObject.Create]);
- try
- TestItemCount(J,1);
- TestJSONType(J[A],jtObject);
- TestJSON(J,'{ A : {} }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateJSONString;
- Const
- A = 'A';
- S = 'A string';
- Var
- J : TJSONObject;
- begin
- J:=TJSONObject.Create([A,TJSONString.Create(S)]);
- try
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ "A" : "'+S+'" }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateJSONStringUnquoted;
- Const
- A = 'A';
- S = 'A string';
- Var
- J : TJSONObject;
- begin
- TJSONObject.UnQuotedMemberNames:=True;
- J:=TJSONObject.Create([A,TJSONString.Create(S)]);
- try
- TestItemCount(J,1);
- TestJSONType(J[A],jtString);
- TestJSON(J,'{ A : "'+S+'" }');
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreateObject;
- Const
- A = 'A';
- Var
- J : TJSONObject;
- O : TObject;
- begin
- J:=Nil;
- try
- Try
- O:=TObject.Create;
- J:=TJSONObject.Create([A,O]);
- Fail('Array constructor accepts only TJSONData');
- finally
- FreeAndNil(J);
- FreeAndNil(O);
- end;
- except
- // Should be OK.
- end;
- end;
- procedure TTestObject.TestCreateNilPointer;
- Const
- A = 'A';
- Var
- J : TJSONObject;
- P : Pointer;
- begin
- J:=Nil;
- P:=Nil;
- Try
- J:=TJSONObject.Create([A,P]);
- TestJSONType(J[A],jtNull);
- finally
- FreeAndNil(J);
- end;
- end;
- procedure TTestObject.TestCreatePointer;
- Const
- A = 'A';
- Var
- J : TJSONObject;
- P : Pointer;
- begin
- J:=Nil;
- P:=@Self;
- try
- Try
- J:=TJSONObject.Create([A,P]);
- Fail('Array constructor accepts only NIL pointers');
- finally
- FreeAndNil(J);
- 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;
- 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);
- 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.
|