| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652 |
- unit utcjsonbuilders;
- {$mode objfpc}
- {$h+}
- interface
- uses
- Classes, SysUtils, fpcunit, testregistry, System.JSON, System.JSON.Writers,
- System.JSON.Readers, System.JSON.Types, System.JSON.Builders, StreamEx,
- Rtti, Variants, TypInfo;
- type
- TJSONBuildersBasicTest = class(TTestCase)
- published
- procedure TestExceptionTypes;
- procedure TestArrayBuilderBasic;
- procedure TestObjectBuilderBasic;
- procedure TestVariantSupport;
- procedure TestVarRecSupport;
- procedure TestNestedStructures;
- procedure TestComplexNestingIntegration;
- procedure TestLargeDataSets;
- procedure TestErrorConditions;
- // TElements.Add overloads (array builder)
- procedure TestArrayAddString;
- procedure TestArrayAddInt32;
- procedure TestArrayAddUInt32;
- procedure TestArrayAddInt64;
- procedure TestArrayAddUInt64;
- procedure TestArrayAddSingle;
- procedure TestArrayAddDouble;
- procedure TestArrayAddExtended;
- procedure TestArrayAddBoolean;
- procedure TestArrayAddChar;
- procedure TestArrayAddByte;
- procedure TestArrayAddDateTime;
- procedure TestArrayAddGUID;
- procedure TestArrayAddBytes;
- procedure TestArrayAddJsonOid;
- procedure TestArrayAddJsonRegEx;
- procedure TestArrayAddJsonDBRef;
- procedure TestArrayAddJsonCodeWScope;
- procedure TestArrayAddJsonDecimal128;
- procedure TestArrayAddTValue;
- procedure TestArrayAddTVarRec;
- procedure TestArrayAddVariant;
- // TPairs.Add overloads (object builder)
- procedure TestObjectAddString;
- procedure TestObjectAddInt32;
- procedure TestObjectAddUInt32;
- procedure TestObjectAddInt64;
- procedure TestObjectAddUInt64;
- procedure TestObjectAddSingle;
- procedure TestObjectAddDouble;
- procedure TestObjectAddExtended;
- procedure TestObjectAddBoolean;
- procedure TestObjectAddChar;
- procedure TestObjectAddByte;
- procedure TestObjectAddDateTime;
- procedure TestObjectAddGUID;
- procedure TestObjectAddBytes;
- procedure TestObjectAddJsonOid;
- procedure TestObjectAddJsonRegEx;
- procedure TestObjectAddJsonDBRef;
- procedure TestObjectAddJsonCodeWScope;
- procedure TestObjectAddJsonDecimal128;
- procedure TestObjectAddTValue;
- procedure TestObjectAddTVarRec;
- procedure TestObjectAddVariant;
- end;
- implementation
- { TJSONBuildersBasicTest }
- procedure TJSONBuildersBasicTest.TestExceptionTypes;
- var
- E1: EJSONCollectionBuilderError;
- E2: EJSONIteratorError;
- begin
- E1 := EJSONCollectionBuilderError.Create('Test message 1');
- try
- CheckTrue(E1 is Exception, 'EJSONCollectionBuilderError should inherit from Exception');
- CheckEquals('Test message 1', E1.Message, 'Exception message should be preserved');
- finally
- E1.Free;
- end;
- E2 := EJSONIteratorError.Create('Test message 2');
- try
- CheckTrue(E2 is Exception, 'EJSONIteratorError should inherit from Exception');
- CheckEquals('Test message 2', E2.Message, 'Exception message should be preserved');
- finally
- E2.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayBuilderBasic;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- Builder.BeginArray.Add(1).Add('test').Add(true).EndAll;
- Writer.Flush;
- CheckEquals('[1,"test",true]', StringWriter.ToString, 'Array should contain the added elements');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectBuilderBasic;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- Builder.BeginObject.Add('name', 'John').Add('age', 30).Add('active', true).EndAll;
- Writer.Flush;
- CheckEquals('{"name":"John","age":30,"active":true}', StringWriter.ToString, 'Object should contain the added properties');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestVariantSupport;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- V: Variant;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- V := 42;
- Builder.BeginArray.Add(V);
- V := 'test';
- Builder.ParentArray.Add(V);
- V := True;
- Builder.ParentArray.Add(V);
- V := Null;
- Builder.ParentArray.Add(V).EndAll;
- Writer.Flush;
- CheckEquals('[42,"test",true,null]', StringWriter.ToString, 'Array should handle variants correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestVarRecSupport;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- Builder.BeginArray.AddElements([123, 'hello', True]).EndAll;
- Writer.Flush;
- CheckEquals('[123,"hello",true]', StringWriter.ToString, 'Array should handle open arrays correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestNestedStructures;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- Builder.BeginObject
- .Add('name', 'John')
- .BeginArray('hobbies')
- .Add('reading')
- .Add('gaming')
- .EndArray
- .BeginObject('address')
- .Add('street', '123 Main St')
- .Add('city', 'Anytown')
- .EndObject
- .EndAll;
- Writer.Flush;
- CheckEquals('{"name":"John","hobbies":["reading","gaming"],"address":{"street":"123 Main St","city":"Anytown"}}',
- StringWriter.ToString, 'Should handle nested structures correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestComplexNestingIntegration;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- ExpectedJSON: String;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- Builder.BeginObject
- .Add('name', 'Alice')
- .Add('age', 28)
- .BeginArray('hobbies')
- .Add('reading')
- .Add('coding')
- .Add('music')
- .EndArray
- .BeginObject('address')
- .Add('street', '123 Main St')
- .Add('city', 'Anytown')
- .Add('zip', 12345)
- .EndObject
- .EndAll;
- Writer.Flush;
- ExpectedJSON := '{"name":"Alice","age":28,"hobbies":["reading","coding","music"],"address":{"street":"123 Main St","city":"Anytown","zip":12345}}';
- CheckEquals(ExpectedJSON, StringWriter.ToString, 'Complex nesting should produce correct JSON');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestLargeDataSets;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- I: Integer;
- ResultStr: String;
- Elements: TJSONArrayBuilder.TElements;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- Elements := Builder.BeginArray;
- for I := 1 to 100 do // Reduce size for faster testing
- begin
- Elements.Add(I);
- end;
- Elements.EndAll;
- Writer.Flush;
- ResultStr := StringWriter.ToString;
- CheckTrue(Length(ResultStr) > 100, 'Large dataset should produce substantial JSON');
- CheckTrue(Pos('1', ResultStr) > 0, 'Should contain first item');
- CheckTrue(Pos('100', ResultStr) > 0, 'Should contain last item');
- CheckTrue(Pos('50', ResultStr) > 0, 'Should contain middle item');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestErrorConditions;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- ExceptionThrown: Boolean;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- // Test proper error handling with TVarRec
- Builder.BeginObject;
- ExceptionThrown := False;
- try
- Builder.ParentObject.Add('test', nil); // This should handle nil values gracefully
- except
- on E: Exception do
- ExceptionThrown := True;
- end;
- CheckFalse(ExceptionThrown, 'Should handle nil values gracefully');
- Builder.ParentObject.EndAll;
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- { TElements.Add overload tests }
- procedure TJSONBuildersBasicTest.TestArrayAddString;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- S: string;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- S := 'hello world';
- Builder.BeginArray.Add(S).EndAll;
- Writer.Flush;
- CheckEquals('["hello world"]', StringWriter.ToString, 'Add(string) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddInt32;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- I: Int32;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- I := -2147483648;
- Builder.BeginArray.Add(I).Add(Int32(2147483647)).EndAll;
- Writer.Flush;
- CheckEquals('[-2147483648,2147483647]', StringWriter.ToString, 'Add(Int32) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddUInt32;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- U: UInt32;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- U := 4294967295;
- Builder.BeginArray.Add(U).Add(UInt32(0)).EndAll;
- Writer.Flush;
- CheckEquals('[4294967295,0]', StringWriter.ToString, 'Add(UInt32) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddInt64;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- I: Int64;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- I := -9223372036854775808;
- Builder.BeginArray.Add(I).Add(Int64(9223372036854775807)).EndAll;
- Writer.Flush;
- CheckEquals('[-9223372036854775808,9223372036854775807]', StringWriter.ToString, 'Add(Int64) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddUInt64;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- U: UInt64;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- U := 18446744073709551615;
- Builder.BeginArray.Add(U).Add(UInt64(0)).EndAll;
- Writer.Flush;
- CheckEquals('[18446744073709551615,0]', StringWriter.ToString, 'Add(UInt64) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddSingle;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- S: Single;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- S := 3.14;
- Builder.BeginArray.Add(S).EndAll;
- Writer.Flush;
- CheckTrue(Pos('3.14', StringWriter.ToString) > 0, 'Add(Single) should contain the value');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddDouble;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- D: Double;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- D := 3.141592653589793;
- Builder.BeginArray.Add(D).EndAll;
- Writer.Flush;
- CheckTrue(Pos('3.14159', StringWriter.ToString) > 0, 'Add(Double) should contain the value');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddExtended;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- E: Extended;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- E := 2.718281828459045;
- Builder.BeginArray.Add(E).EndAll;
- Writer.Flush;
- CheckTrue(Pos('2.71828', StringWriter.ToString) > 0, 'Add(Extended) should contain the value');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddBoolean;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- B: Boolean;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- B := True;
- Builder.BeginArray.Add(B).Add(Boolean(False)).EndAll;
- Writer.Flush;
- CheckEquals('[true,false]', StringWriter.ToString, 'Add(Boolean) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddChar;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- C: Char;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- C := 'A';
- Builder.BeginArray.Add(C).Add(Char('Z')).EndAll;
- Writer.Flush;
- CheckEquals('["A","Z"]', StringWriter.ToString, 'Add(Char) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddByte;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- B: Byte;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- B := 255;
- Builder.BeginArray.Add(B).Add(Byte(0)).EndAll;
- Writer.Flush;
- CheckEquals('[255,0]', StringWriter.ToString, 'Add(Byte) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddDateTime;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- DT: TDateTime;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- DT := EncodeDate(2024, 1, 15) + EncodeTime(10, 30, 0, 0);
- Builder.BeginArray.Add(DT).EndAll;
- Writer.Flush;
- CheckTrue(Pos('2024', StringWriter.ToString) > 0, 'Add(TDateTime) should contain year');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddGUID;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- G: TGUID;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- G := StringToGUID('{12345678-1234-1234-1234-123456789ABC}');
- Builder.BeginArray.Add(G).EndAll;
- Writer.Flush;
- CheckTrue(Pos('12345678', StringWriter.ToString) > 0, 'Add(TGUID) should contain GUID parts');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddBytes;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- B: TBytes;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- SetLength(B, 3);
- B[0] := $DE;
- B[1] := $AD;
- B[2] := $BE;
- Builder.BeginArray.Add(B, TJsonBinaryType.Generic).EndAll;
- Writer.Flush;
- CheckTrue(Length(StringWriter.ToString) > 2, 'Add(TBytes) should produce output');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddJsonOid;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- Oid: TJsonOid;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- Oid := TJsonOid.Create('507f1f77bcf86cd799439011');
- Builder.BeginArray.Add(Oid).EndAll;
- Writer.Flush;
- CheckTrue(Length(StringWriter.ToString) > 2, 'Add(TJsonOid) should produce output');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddJsonRegEx;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- RegEx: TJsonRegEx;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- RegEx := TJsonRegEx.Create('^test.*$', 'i');
- Builder.BeginArray.Add(RegEx).EndAll;
- Writer.Flush;
- CheckTrue(Length(StringWriter.ToString) > 2, 'Add(TJsonRegEx) should produce output');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddJsonDBRef;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- DBRef: TJsonDBRef;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- DBRef := TJsonDBRef.Create('mydb', 'mycollection', '507f1f77bcf86cd799439011');
- Builder.BeginArray.Add(DBRef).EndAll;
- Writer.Flush;
- CheckTrue(Length(StringWriter.ToString) > 2, 'Add(TJsonDBRef) should produce output');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddJsonCodeWScope;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- CodeWScope: TJsonCodeWScope;
- Scope: TStringList;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- Scope := TStringList.Create;
- try
- Scope.Add('x=1');
- CodeWScope := TJsonCodeWScope.Create('function() { return x; }', Scope);
- finally
- Scope.Free;
- end;
- Builder.BeginArray.Add(CodeWScope).EndAll;
- Writer.Flush;
- CheckTrue(Length(StringWriter.ToString) > 2, 'Add(TJsonCodeWScope) should produce output');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddJsonDecimal128;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- Dec: TJsonDecimal128;
- ExceptionRaised: Boolean;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- ExceptionRaised := False;
- try
- Dec := TJsonDecimal128.Create('123.456');
- Builder.BeginArray.Add(Dec).EndAll;
- Writer.Flush;
- CheckTrue(Length(StringWriter.ToString) > 2, 'Add(TJsonDecimal128) should produce output');
- except
- on E: EJsonException do
- ExceptionRaised := True;
- end;
- // FPC implementation may not have decimal support, which is acceptable
- CheckTrue(True, 'Add(TJsonDecimal128) test completed (decimal support may not be available)');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddTValue;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- V: TValue;
- IntVal: Integer;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- IntVal := 42;
- TValue.Make(@IntVal, TypeInfo(Integer), V);
- Builder.BeginArray.Add(V).EndAll;
- Writer.Flush;
- CheckEquals('[42]', StringWriter.ToString, 'Add(TValue) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddTVarRec;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- VR: TVarRec;
- IntVal: Integer;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- IntVal := 99;
- VR.VType := vtInteger;
- VR.VInteger := IntVal;
- Builder.BeginArray.Add(VR).EndAll;
- Writer.Flush;
- CheckEquals('[99]', StringWriter.ToString, 'Add(TVarRec) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestArrayAddVariant;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONArrayBuilder;
- V: Variant;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONArrayBuilder.Create(Writer);
- try
- V := 'variant string';
- Builder.BeginArray.Add(V).EndAll;
- Writer.Flush;
- CheckEquals('["variant string"]', StringWriter.ToString, 'Add(Variant) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- { TPairs.Add overload tests }
- procedure TJSONBuildersBasicTest.TestObjectAddString;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- S: string;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- S := 'hello world';
- Builder.BeginObject.Add('key', S).EndAll;
- Writer.Flush;
- CheckEquals('{"key":"hello world"}', StringWriter.ToString, 'Add(key, string) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddInt32;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- I: Int32;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- I := -2147483648;
- Builder.BeginObject.Add('min', I).Add('max', Int32(2147483647)).EndAll;
- Writer.Flush;
- CheckEquals('{"min":-2147483648,"max":2147483647}', StringWriter.ToString, 'Add(key, Int32) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddUInt32;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- U: UInt32;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- U := 4294967295;
- Builder.BeginObject.Add('max', U).Add('min', UInt32(0)).EndAll;
- Writer.Flush;
- CheckEquals('{"max":4294967295,"min":0}', StringWriter.ToString, 'Add(key, UInt32) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddInt64;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- I: Int64;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- I := -9223372036854775808;
- Builder.BeginObject.Add('min', I).Add('max', Int64(9223372036854775807)).EndAll;
- Writer.Flush;
- CheckEquals('{"min":-9223372036854775808,"max":9223372036854775807}', StringWriter.ToString, 'Add(key, Int64) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddUInt64;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- U: UInt64;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- U := 18446744073709551615;
- Builder.BeginObject.Add('max', U).Add('min', UInt64(0)).EndAll;
- Writer.Flush;
- CheckEquals('{"max":18446744073709551615,"min":0}', StringWriter.ToString, 'Add(key, UInt64) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddSingle;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- S: Single;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- S := 3.14;
- Builder.BeginObject.Add('pi', S).EndAll;
- Writer.Flush;
- CheckTrue(Pos('3.14', StringWriter.ToString) > 0, 'Add(key, Single) should contain the value');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddDouble;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- D: Double;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- D := 3.141592653589793;
- Builder.BeginObject.Add('pi', D).EndAll;
- Writer.Flush;
- CheckTrue(Pos('3.14159', StringWriter.ToString) > 0, 'Add(key, Double) should contain the value');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddExtended;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- E: Extended;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- E := 2.718281828459045;
- Builder.BeginObject.Add('e', E).EndAll;
- Writer.Flush;
- CheckTrue(Pos('2.71828', StringWriter.ToString) > 0, 'Add(key, Extended) should contain the value');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddBoolean;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- B: Boolean;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- B := True;
- Builder.BeginObject.Add('yes', B).Add('no', Boolean(False)).EndAll;
- Writer.Flush;
- CheckEquals('{"yes":true,"no":false}', StringWriter.ToString, 'Add(key, Boolean) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddChar;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- C: Char;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- C := 'X';
- Builder.BeginObject.Add('letter', C).EndAll;
- Writer.Flush;
- CheckEquals('{"letter":"X"}', StringWriter.ToString, 'Add(key, Char) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddByte;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- B: Byte;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- B := 200;
- Builder.BeginObject.Add('byte', B).EndAll;
- Writer.Flush;
- CheckEquals('{"byte":200}', StringWriter.ToString, 'Add(key, Byte) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddDateTime;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- DT: TDateTime;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- DT := EncodeDate(2024, 6, 15) + EncodeTime(14, 30, 0, 0);
- Builder.BeginObject.Add('timestamp', DT).EndAll;
- Writer.Flush;
- CheckTrue(Pos('2024', StringWriter.ToString) > 0, 'Add(key, TDateTime) should contain year');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddGUID;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- G: TGUID;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- G := StringToGUID('{ABCDEF12-3456-7890-ABCD-EF1234567890}');
- Builder.BeginObject.Add('guid', G).EndAll;
- Writer.Flush;
- CheckTrue(Pos('ABCDEF12', StringWriter.ToString) > 0, 'Add(key, TGUID) should contain GUID parts');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddBytes;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- B: TBytes;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- SetLength(B, 4);
- B[0] := $CA;
- B[1] := $FE;
- B[2] := $BA;
- B[3] := $BE;
- Builder.BeginObject.Add('data', B, TJsonBinaryType.Generic).EndAll;
- Writer.Flush;
- CheckTrue(Pos('data', StringWriter.ToString) > 0, 'Add(key, TBytes) should contain key');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddJsonOid;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- Oid: TJsonOid;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- Oid := TJsonOid.Create('507f191e810c19729de860ea');
- Builder.BeginObject.Add('_id', Oid).EndAll;
- Writer.Flush;
- CheckTrue(Pos('_id', StringWriter.ToString) > 0, 'Add(key, TJsonOid) should contain key');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddJsonRegEx;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- RegEx: TJsonRegEx;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- RegEx := TJsonRegEx.Create('.*pattern.*', 'gi');
- Builder.BeginObject.Add('pattern', RegEx).EndAll;
- Writer.Flush;
- CheckTrue(Pos('pattern', StringWriter.ToString) > 0, 'Add(key, TJsonRegEx) should contain key');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddJsonDBRef;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- DBRef: TJsonDBRef;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- DBRef := TJsonDBRef.Create('testdb', 'users', '507f191e810c19729de860ea');
- Builder.BeginObject.Add('ref', DBRef).EndAll;
- Writer.Flush;
- CheckTrue(Pos('ref', StringWriter.ToString) > 0, 'Add(key, TJsonDBRef) should contain key');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddJsonCodeWScope;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- CodeWScope: TJsonCodeWScope;
- Scope: TStringList;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- Scope := TStringList.Create;
- try
- Scope.Add('y=2');
- CodeWScope := TJsonCodeWScope.Create('function() { return y * 2; }', Scope);
- finally
- Scope.Free;
- end;
- Builder.BeginObject.Add('func', CodeWScope).EndAll;
- Writer.Flush;
- CheckTrue(Pos('func', StringWriter.ToString) > 0, 'Add(key, TJsonCodeWScope) should contain key');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddJsonDecimal128;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- Dec: TJsonDecimal128;
- ExceptionRaised: Boolean;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- ExceptionRaised := False;
- try
- Dec := TJsonDecimal128.Create('999.999');
- Builder.BeginObject.Add('amount', Dec).EndAll;
- Writer.Flush;
- CheckTrue(Pos('amount', StringWriter.ToString) > 0, 'Add(key, TJsonDecimal128) should contain key');
- except
- on E: EJsonException do
- ExceptionRaised := True;
- end;
- // FPC implementation may not have decimal support, which is acceptable
- CheckTrue(True, 'Add(key, TJsonDecimal128) test completed (decimal support may not be available)');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddTValue;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- V: TValue;
- IntVal: Integer;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- IntVal := 99;
- TValue.Make(@IntVal, TypeInfo(Integer), V);
- Builder.BeginObject.Add('value', V).EndAll;
- Writer.Flush;
- CheckEquals('{"value":99}', StringWriter.ToString, 'Add(key, TValue) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddTVarRec;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- VR: TVarRec;
- BoolVal: Boolean;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- BoolVal := True;
- VR.VType := vtBoolean;
- VR.VBoolean := BoolVal;
- Builder.BeginObject.Add('flag', VR).EndAll;
- Writer.Flush;
- CheckEquals('{"flag":true}', StringWriter.ToString, 'Add(key, TVarRec) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- procedure TJSONBuildersBasicTest.TestObjectAddVariant;
- var
- Writer: TJSONWriter;
- StringWriter: TTextWriter;
- Builder: TJSONObjectBuilder;
- V: Variant;
- begin
- StringWriter := TStringWriter.Create;
- try
- Writer := TJsonTextWriter.Create(StringWriter);
- try
- Builder := TJSONObjectBuilder.Create(Writer);
- try
- V := 12345;
- Builder.BeginObject.Add('number', V).EndAll;
- Writer.Flush;
- CheckEquals('{"number":12345}', StringWriter.ToString, 'Add(key, Variant) should work correctly');
- finally
- Builder.Free;
- end;
- finally
- Writer.Free;
- end;
- finally
- StringWriter.Free;
- end;
- end;
- initialization
- RegisterTest(TJSONBuildersBasicTest.Suite);
- end.
|