@@ -389,4 +389,372 @@ public JsonGenerator writeName(String name) {
389389 p .close ();
390390 g .close ();
391391 }
392+
393+ @ Test
394+ void generatorDelegateWriteString () throws IOException
395+ {
396+ StringWriter sw = new StringWriter ();
397+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
398+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
399+
400+ del .writeStartArray ();
401+
402+ // writeString(String)
403+ del .writeString ("test" );
404+
405+ // writeString(char[], int, int)
406+ char [] chars = "hello world" .toCharArray ();
407+ del .writeString (chars , 0 , 5 );
408+
409+ // writeString(SerializableString)
410+ del .writeString (new tools .jackson .core .io .SerializedString ("serialized" ));
411+
412+ del .writeEndArray ();
413+ del .close ();
414+
415+ assertEquals ("[\" test\" ,\" hello\" ,\" serialized\" ]" , sw .toString ());
416+ g0 .close ();
417+ }
418+
419+ @ Test
420+ void generatorDelegateWriteBinary () throws IOException
421+ {
422+ StringWriter sw = new StringWriter ();
423+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
424+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
425+
426+ del .writeStartArray ();
427+
428+ byte [] data = new byte [] { 1 , 2 , 3 , 4 , 5 };
429+ del .writeBinary (data , 1 , 3 );
430+
431+ del .writeEndArray ();
432+ del .close ();
433+
434+ // Binary should be base64 encoded
435+ assertNotNull (sw .toString ());
436+ assertTrue (sw .toString ().contains ("[\" " ));
437+ g0 .close ();
438+ }
439+
440+ @ Test
441+ void generatorDelegateWriteRaw () throws IOException
442+ {
443+ StringWriter sw = new StringWriter ();
444+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
445+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
446+
447+ del .writeStartArray ();
448+
449+ // writeRaw(String)
450+ del .writeRaw ("123" );
451+ del .writeRaw (',' );
452+
453+ // writeRaw(String, int, int)
454+ del .writeRaw ("456789" , 0 , 3 );
455+ del .writeRaw (',' );
456+
457+ // writeRaw(char[], int, int)
458+ char [] chars = "abc" .toCharArray ();
459+ del .writeRaw (chars , 0 , 3 );
460+
461+ del .writeEndArray ();
462+ del .close ();
463+
464+ assertEquals ("[123,456,abc]" , sw .toString ());
465+ g0 .close ();
466+ }
467+
468+ @ Test
469+ void generatorDelegateWriteName () throws IOException
470+ {
471+ StringWriter sw = new StringWriter ();
472+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
473+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
474+
475+ del .writeStartObject ();
476+
477+ // writeName(String)
478+ del .writeName ("field1" );
479+ del .writeNumber (1 );
480+
481+ // writeName(SerializableString)
482+ del .writeName (new tools .jackson .core .io .SerializedString ("field2" ));
483+ del .writeString ("value" );
484+
485+ del .writeEndObject ();
486+ del .close ();
487+
488+ assertEquals ("{\" field1\" :1,\" field2\" :\" value\" }" , sw .toString ());
489+ g0 .close ();
490+ }
491+
492+ @ Test
493+ void generatorDelegateConfigure () throws IOException
494+ {
495+ StringWriter sw = new StringWriter ();
496+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
497+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
498+
499+ assertFalse (del .isEnabled (StreamWriteFeature .WRITE_BIGDECIMAL_AS_PLAIN ));
500+
501+ JsonGenerator result = del .configure (StreamWriteFeature .WRITE_BIGDECIMAL_AS_PLAIN , true );
502+ assertSame (del , result , "configure() should return the delegate, not the underlying generator" );
503+
504+ assertTrue (del .isEnabled (StreamWriteFeature .WRITE_BIGDECIMAL_AS_PLAIN ));
505+ assertTrue (g0 .isEnabled (StreamWriteFeature .WRITE_BIGDECIMAL_AS_PLAIN ));
506+
507+ del .close ();
508+ g0 .close ();
509+ }
510+
511+ @ Test
512+ void generatorDelegateReturnValues () throws IOException
513+ {
514+ StringWriter sw = new StringWriter ();
515+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
516+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
517+
518+ // Verify that all write methods return the delegate (this), not the underlying generator
519+ assertSame (del , del .writeStartArray ());
520+ assertSame (del , del .writeNumber (1 ));
521+ assertSame (del , del .writeString ("test" ));
522+ assertSame (del , del .writeBoolean (true ));
523+ assertSame (del , del .writeNull ());
524+ assertSame (del , del .writeEndArray ());
525+
526+ assertSame (del , del .writeStartObject ());
527+ assertSame (del , del .writeName ("field" ));
528+ assertSame (del , del .writeNumber (2 ));
529+ assertSame (del , del .writeEndObject ());
530+
531+ del .close ();
532+ g0 .close ();
533+ }
534+
535+ @ Test
536+ void generatorDelegateCapabilities () throws IOException
537+ {
538+ StringWriter sw = new StringWriter ();
539+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
540+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
541+
542+ // Test capability methods
543+ assertSame (g0 .streamWriteCapabilities (), del .streamWriteCapabilities ());
544+
545+ // Test has() method for various capabilities
546+ for (tools .jackson .core .StreamWriteCapability cap : tools .jackson .core .StreamWriteCapability .values ()) {
547+ assertEquals (g0 .has (cap ), del .has (cap ), "Capability " + cap + " should match" );
548+ }
549+
550+ del .close ();
551+ g0 .close ();
552+ }
553+
554+ @ Test
555+ void generatorDelegateContexts () throws IOException
556+ {
557+ StringWriter sw = new StringWriter ();
558+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
559+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
560+
561+ // streamWriteContext should be delegated
562+ assertSame (g0 .streamWriteContext (), del .streamWriteContext ());
563+
564+ del .writeStartArray ();
565+ assertSame (g0 .streamWriteContext (), del .streamWriteContext ());
566+
567+ // objectWriteContext should be delegated
568+ assertSame (g0 .objectWriteContext (), del .objectWriteContext ());
569+
570+ del .close ();
571+ g0 .close ();
572+ }
573+
574+ @ Test
575+ void generatorDelegateOutputInfo () throws IOException
576+ {
577+ StringWriter sw = new StringWriter ();
578+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
579+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
580+
581+ // streamWriteOutputTarget should be delegated
582+ assertSame (g0 .streamWriteOutputTarget (), del .streamWriteOutputTarget ());
583+
584+ del .writeStartArray ();
585+ del .writeNumber (123 );
586+
587+ // streamWriteOutputBuffered should be delegated
588+ assertEquals (g0 .streamWriteOutputBuffered (), del .streamWriteOutputBuffered ());
589+
590+ del .close ();
591+ g0 .close ();
592+ }
593+
594+ @ Test
595+ void generatorDelegateWritePOJOWithDelegation () throws IOException
596+ {
597+ StringWriter sw = new StringWriter ();
598+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
599+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 , true ); // delegateCopyMethods = true
600+
601+ del .writeStartArray ();
602+
603+ // null POJO should write null (works regardless of delegateCopyMethods)
604+ del .writePOJO (null );
605+
606+ del .writeEndArray ();
607+ del .close ();
608+
609+ assertEquals ("[null]" , sw .toString ());
610+ g0 .close ();
611+ }
612+
613+ @ Test
614+ void generatorDelegateWriteTreeWithDelegation () throws IOException
615+ {
616+ StringWriter sw = new StringWriter ();
617+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
618+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 , true ); // delegateCopyMethods = true
619+
620+ del .writeStartArray ();
621+
622+ // null tree should write null
623+ del .writeTree (null );
624+
625+ del .writeEndArray ();
626+ del .close ();
627+
628+ assertEquals ("[null]" , sw .toString ());
629+ g0 .close ();
630+ }
631+
632+ @ Test
633+ void generatorDelegateNumberVariations () throws IOException
634+ {
635+ StringWriter sw = new StringWriter ();
636+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
637+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
638+
639+ del .writeStartArray ();
640+
641+ // Test all number writing variations
642+ del .writeNumber ((short ) 1 );
643+ del .writeNumber (2 );
644+ del .writeNumber (3L );
645+ del .writeNumber (BigInteger .valueOf (4 ));
646+ del .writeNumber (5.0 );
647+ del .writeNumber (6.0f );
648+ del .writeNumber (new BigDecimal ("7.5" ));
649+ del .writeNumber ("8" );
650+
651+ // writeNumber(char[], int, int)
652+ char [] numChars = "123" .toCharArray ();
653+ del .writeNumber (numChars , 0 , 3 );
654+
655+ del .writeEndArray ();
656+ del .close ();
657+
658+ assertEquals ("[1,2,3,4,5.0,6.0,7.5,8,123]" , sw .toString ());
659+ g0 .close ();
660+ }
661+
662+ @ Test
663+ void generatorDelegateGettersAndSetters () throws IOException
664+ {
665+ StringWriter sw = new StringWriter ();
666+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
667+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
668+
669+ // Test various getter methods
670+ assertEquals (g0 .getHighestNonEscapedChar (), del .getHighestNonEscapedChar ());
671+ assertEquals (g0 .getCharacterEscapes (), del .getCharacterEscapes ());
672+ assertEquals (g0 .getPrettyPrinter (), del .getPrettyPrinter ());
673+ assertEquals (g0 .streamWriteFeatures (), del .streamWriteFeatures ());
674+
675+ del .close ();
676+ g0 .close ();
677+ }
678+
679+ @ Test
680+ void generatorDelegateFlushBehavior () throws IOException
681+ {
682+ StringWriter sw = new StringWriter ();
683+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
684+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
685+
686+ del .writeStartArray ();
687+ del .writeNumber (1 );
688+
689+ assertFalse (del .isClosed ());
690+
691+ del .flush ();
692+ assertFalse (del .isClosed ());
693+ assertFalse (g0 .isClosed ());
694+
695+ // Should be flushed to output
696+ assertTrue (sw .toString ().startsWith ("[" ));
697+
698+ del .close ();
699+ assertTrue (del .isClosed ());
700+ assertTrue (g0 .isClosed ());
701+
702+ g0 .close ();
703+ }
704+
705+ @ Test
706+ void generatorDelegateUTF8Methods () throws IOException
707+ {
708+ ByteArrayOutputStream out = new ByteArrayOutputStream ();
709+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), out );
710+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
711+
712+ del .writeStartArray ();
713+
714+ byte [] utf8 = "hello" .getBytes ("UTF-8" );
715+ del .writeUTF8String (utf8 , 0 , utf8 .length );
716+
717+ del .writeEndArray ();
718+ del .close ();
719+
720+ String result = out .toString ("UTF-8" );
721+ assertEquals ("[\" hello\" ]" , result );
722+ g0 .close ();
723+ }
724+
725+ @ Test
726+ void generatorDelegateAccess () throws IOException
727+ {
728+ StringWriter sw = new StringWriter ();
729+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
730+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
731+
732+ // Test delegate() method
733+ assertSame (g0 , del .delegate ());
734+
735+ del .close ();
736+ g0 .close ();
737+ }
738+
739+ @ Test
740+ void generatorDelegateWriteOmittedProperty () throws IOException
741+ {
742+ StringWriter sw = new StringWriter ();
743+ JsonGenerator g0 = JSON_F .createGenerator (ObjectWriteContext .empty (), sw );
744+ JsonGeneratorDelegate del = new JsonGeneratorDelegate (g0 );
745+
746+ del .writeStartObject ();
747+ del .writeName ("visible" );
748+ del .writeNumber (1 );
749+
750+ // writeOmittedProperty should be delegated
751+ assertSame (del , del .writeOmittedProperty ("omitted" ));
752+
753+ del .writeEndObject ();
754+ del .close ();
755+
756+ // Omitted property should not appear in output
757+ assertEquals ("{\" visible\" :1}" , sw .toString ());
758+ g0 .close ();
759+ }
392760}
0 commit comments