@@ -649,4 +649,294 @@ mod tests {
649649
650650 Ok ( ( ) )
651651 }
652+
653+ #[ test]
654+ fn test_simple_object_to_json ( ) -> Result < ( ) , ArrowError > {
655+ use crate :: builder:: VariantBuilder ;
656+
657+ // Create a simple object with various field types
658+ let mut builder = VariantBuilder :: new ( ) ;
659+
660+ {
661+ let mut obj = builder. new_object ( ) ;
662+ obj. append_value ( "name" , "Alice" ) ;
663+ obj. append_value ( "age" , 30i32 ) ;
664+ obj. append_value ( "active" , true ) ;
665+ obj. append_value ( "score" , 95.5f64 ) ;
666+ obj. finish ( ) ;
667+ }
668+
669+ let ( metadata, value) = builder. finish ( ) ;
670+ let variant = Variant :: try_new ( & metadata, & value) ?;
671+ let json = variant_to_json_string ( & variant) ?;
672+
673+ // Parse the JSON to verify structure - handle JSON parsing errors manually
674+ let parsed: Value = serde_json:: from_str ( & json) . map_err ( |e| ArrowError :: ParseError ( format ! ( "JSON parse error: {}" , e) ) ) ?;
675+ if let Value :: Object ( obj) = parsed {
676+ assert_eq ! ( obj. get( "name" ) , Some ( & Value :: String ( "Alice" . to_string( ) ) ) ) ;
677+ assert_eq ! ( obj. get( "age" ) , Some ( & Value :: Number ( 30 . into( ) ) ) ) ;
678+ assert_eq ! ( obj. get( "active" ) , Some ( & Value :: Bool ( true ) ) ) ;
679+ assert ! ( matches!( obj. get( "score" ) , Some ( Value :: Number ( _) ) ) ) ;
680+ assert_eq ! ( obj. len( ) , 4 ) ;
681+ } else {
682+ panic ! ( "Expected JSON object" ) ;
683+ }
684+
685+ // Test variant_to_json_value as well
686+ let json_value = variant_to_json_value ( & variant) ?;
687+ assert ! ( matches!( json_value, Value :: Object ( _) ) ) ;
688+
689+ Ok ( ( ) )
690+ }
691+
692+ #[ test]
693+ fn test_empty_object_to_json ( ) -> Result < ( ) , ArrowError > {
694+ use crate :: builder:: VariantBuilder ;
695+
696+ let mut builder = VariantBuilder :: new ( ) ;
697+
698+ {
699+ let obj = builder. new_object ( ) ;
700+ obj. finish ( ) ;
701+ }
702+
703+ let ( metadata, value) = builder. finish ( ) ;
704+ let variant = Variant :: try_new ( & metadata, & value) ?;
705+ let json = variant_to_json_string ( & variant) ?;
706+ assert_eq ! ( json, "{}" ) ;
707+
708+ let json_value = variant_to_json_value ( & variant) ?;
709+ assert_eq ! ( json_value, Value :: Object ( serde_json:: Map :: new( ) ) ) ;
710+
711+ Ok ( ( ) )
712+ }
713+
714+ #[ test]
715+ fn test_object_with_special_characters_to_json ( ) -> Result < ( ) , ArrowError > {
716+ use crate :: builder:: VariantBuilder ;
717+
718+ let mut builder = VariantBuilder :: new ( ) ;
719+
720+ {
721+ let mut obj = builder. new_object ( ) ;
722+ obj. append_value ( "message" , "Hello \" World\" \n With\t Tabs" ) ;
723+ obj. append_value ( "path" , "C:\\ Users\\ Alice\\ Documents" ) ;
724+ obj. append_value ( "unicode" , "😀 Smiley" ) ;
725+ obj. finish ( ) ;
726+ }
727+
728+ let ( metadata, value) = builder. finish ( ) ;
729+ let variant = Variant :: try_new ( & metadata, & value) ?;
730+ let json = variant_to_json_string ( & variant) ?;
731+
732+ // Verify that special characters are properly escaped
733+ assert ! ( json. contains( "Hello \\ \" World\\ \" \\ nWith\\ tTabs" ) ) ;
734+ assert ! ( json. contains( "C:\\ \\ Users\\ \\ Alice\\ \\ Documents" ) ) ;
735+ assert ! ( json. contains( "😀 Smiley" ) ) ;
736+
737+ // Verify that the JSON can be parsed back
738+ let parsed: Value = serde_json:: from_str ( & json) . map_err ( |e| ArrowError :: ParseError ( format ! ( "JSON parse error: {}" , e) ) ) ?;
739+ assert ! ( matches!( parsed, Value :: Object ( _) ) ) ;
740+
741+ Ok ( ( ) )
742+ }
743+
744+ #[ test]
745+ fn test_simple_list_to_json ( ) -> Result < ( ) , ArrowError > {
746+ use crate :: builder:: VariantBuilder ;
747+
748+ let mut builder = VariantBuilder :: new ( ) ;
749+
750+ {
751+ let mut list = builder. new_list ( ) ;
752+ list. append_value ( 1i32 ) ;
753+ list. append_value ( 2i32 ) ;
754+ list. append_value ( 3i32 ) ;
755+ list. append_value ( 4i32 ) ;
756+ list. append_value ( 5i32 ) ;
757+ list. finish ( ) ;
758+ }
759+
760+ let ( metadata, value) = builder. finish ( ) ;
761+ let variant = Variant :: try_new ( & metadata, & value) ?;
762+ let json = variant_to_json_string ( & variant) ?;
763+ assert_eq ! ( json, "[1,2,3,4,5]" ) ;
764+
765+ let json_value = variant_to_json_value ( & variant) ?;
766+ if let Value :: Array ( arr) = json_value {
767+ assert_eq ! ( arr. len( ) , 5 ) ;
768+ assert_eq ! ( arr[ 0 ] , Value :: Number ( 1 . into( ) ) ) ;
769+ assert_eq ! ( arr[ 4 ] , Value :: Number ( 5 . into( ) ) ) ;
770+ } else {
771+ panic ! ( "Expected JSON array" ) ;
772+ }
773+
774+ Ok ( ( ) )
775+ }
776+
777+ #[ test]
778+ fn test_empty_list_to_json ( ) -> Result < ( ) , ArrowError > {
779+ use crate :: builder:: VariantBuilder ;
780+
781+ let mut builder = VariantBuilder :: new ( ) ;
782+
783+ {
784+ let list = builder. new_list ( ) ;
785+ list. finish ( ) ;
786+ }
787+
788+ let ( metadata, value) = builder. finish ( ) ;
789+ let variant = Variant :: try_new ( & metadata, & value) ?;
790+ let json = variant_to_json_string ( & variant) ?;
791+ assert_eq ! ( json, "[]" ) ;
792+
793+ let json_value = variant_to_json_value ( & variant) ?;
794+ assert_eq ! ( json_value, Value :: Array ( vec![ ] ) ) ;
795+
796+ Ok ( ( ) )
797+ }
798+
799+ #[ test]
800+ fn test_mixed_type_list_to_json ( ) -> Result < ( ) , ArrowError > {
801+ use crate :: builder:: VariantBuilder ;
802+
803+ let mut builder = VariantBuilder :: new ( ) ;
804+
805+ {
806+ let mut list = builder. new_list ( ) ;
807+ list. append_value ( "hello" ) ;
808+ list. append_value ( 42i32 ) ;
809+ list. append_value ( true ) ;
810+ list. append_value ( ( ) ) ; // null
811+ list. append_value ( 3.14f64 ) ;
812+ list. finish ( ) ;
813+ }
814+
815+ let ( metadata, value) = builder. finish ( ) ;
816+ let variant = Variant :: try_new ( & metadata, & value) ?;
817+ let json = variant_to_json_string ( & variant) ?;
818+
819+ let parsed: Value = serde_json:: from_str ( & json) . map_err ( |e| ArrowError :: ParseError ( format ! ( "JSON parse error: {}" , e) ) ) ?;
820+ if let Value :: Array ( arr) = parsed {
821+ assert_eq ! ( arr. len( ) , 5 ) ;
822+ assert_eq ! ( arr[ 0 ] , Value :: String ( "hello" . to_string( ) ) ) ;
823+ assert_eq ! ( arr[ 1 ] , Value :: Number ( 42 . into( ) ) ) ;
824+ assert_eq ! ( arr[ 2 ] , Value :: Bool ( true ) ) ;
825+ assert_eq ! ( arr[ 3 ] , Value :: Null ) ;
826+ assert ! ( matches!( arr[ 4 ] , Value :: Number ( _) ) ) ;
827+ } else {
828+ panic ! ( "Expected JSON array" ) ;
829+ }
830+
831+ Ok ( ( ) )
832+ }
833+
834+ #[ test]
835+ fn test_object_field_ordering_in_json ( ) -> Result < ( ) , ArrowError > {
836+ use crate :: builder:: VariantBuilder ;
837+
838+ let mut builder = VariantBuilder :: new ( ) ;
839+
840+ {
841+ let mut obj = builder. new_object ( ) ;
842+ // Add fields in non-alphabetical order
843+ obj. append_value ( "zebra" , "last" ) ;
844+ obj. append_value ( "alpha" , "first" ) ;
845+ obj. append_value ( "beta" , "second" ) ;
846+ obj. finish ( ) ;
847+ }
848+
849+ let ( metadata, value) = builder. finish ( ) ;
850+ let variant = Variant :: try_new ( & metadata, & value) ?;
851+ let json = variant_to_json_string ( & variant) ?;
852+
853+ // Parse and verify all fields are present
854+ let parsed: Value = serde_json:: from_str ( & json) . map_err ( |e| ArrowError :: ParseError ( format ! ( "JSON parse error: {}" , e) ) ) ?;
855+ if let Value :: Object ( obj) = parsed {
856+ assert_eq ! ( obj. len( ) , 3 ) ;
857+ assert_eq ! ( obj. get( "alpha" ) , Some ( & Value :: String ( "first" . to_string( ) ) ) ) ;
858+ assert_eq ! ( obj. get( "beta" ) , Some ( & Value :: String ( "second" . to_string( ) ) ) ) ;
859+ assert_eq ! ( obj. get( "zebra" ) , Some ( & Value :: String ( "last" . to_string( ) ) ) ) ;
860+ } else {
861+ panic ! ( "Expected JSON object" ) ;
862+ }
863+
864+ Ok ( ( ) )
865+ }
866+
867+ #[ test]
868+ fn test_list_with_various_primitive_types_to_json ( ) -> Result < ( ) , ArrowError > {
869+ use crate :: builder:: VariantBuilder ;
870+
871+ let mut builder = VariantBuilder :: new ( ) ;
872+
873+ {
874+ let mut list = builder. new_list ( ) ;
875+ list. append_value ( "string_value" ) ;
876+ list. append_value ( 42i32 ) ;
877+ list. append_value ( true ) ;
878+ list. append_value ( 3.14f64 ) ;
879+ list. append_value ( false ) ;
880+ list. append_value ( ( ) ) ; // null
881+ list. append_value ( 100i64 ) ;
882+ list. finish ( ) ;
883+ }
884+
885+ let ( metadata, value) = builder. finish ( ) ;
886+ let variant = Variant :: try_new ( & metadata, & value) ?;
887+ let json = variant_to_json_string ( & variant) ?;
888+
889+ let parsed: Value = serde_json:: from_str ( & json) . map_err ( |e| ArrowError :: ParseError ( format ! ( "JSON parse error: {}" , e) ) ) ?;
890+ if let Value :: Array ( arr) = parsed {
891+ assert_eq ! ( arr. len( ) , 7 ) ;
892+ assert_eq ! ( arr[ 0 ] , Value :: String ( "string_value" . to_string( ) ) ) ;
893+ assert_eq ! ( arr[ 1 ] , Value :: Number ( 42 . into( ) ) ) ;
894+ assert_eq ! ( arr[ 2 ] , Value :: Bool ( true ) ) ;
895+ assert ! ( matches!( arr[ 3 ] , Value :: Number ( _) ) ) ; // float
896+ assert_eq ! ( arr[ 4 ] , Value :: Bool ( false ) ) ;
897+ assert_eq ! ( arr[ 5 ] , Value :: Null ) ;
898+ assert_eq ! ( arr[ 6 ] , Value :: Number ( 100 . into( ) ) ) ;
899+ } else {
900+ panic ! ( "Expected JSON array" ) ;
901+ }
902+
903+ Ok ( ( ) )
904+ }
905+
906+ #[ test]
907+ fn test_object_with_various_primitive_types_to_json ( ) -> Result < ( ) , ArrowError > {
908+ use crate :: builder:: VariantBuilder ;
909+
910+ let mut builder = VariantBuilder :: new ( ) ;
911+
912+ {
913+ let mut obj = builder. new_object ( ) ;
914+ obj. append_value ( "string_field" , "test_string" ) ;
915+ obj. append_value ( "int_field" , 123i32 ) ;
916+ obj. append_value ( "bool_field" , true ) ;
917+ obj. append_value ( "float_field" , 2.71f64 ) ;
918+ obj. append_value ( "null_field" , ( ) ) ;
919+ obj. append_value ( "long_field" , 999i64 ) ;
920+ obj. finish ( ) ;
921+ }
922+
923+ let ( metadata, value) = builder. finish ( ) ;
924+ let variant = Variant :: try_new ( & metadata, & value) ?;
925+ let json = variant_to_json_string ( & variant) ?;
926+
927+ let parsed: Value = serde_json:: from_str ( & json) . map_err ( |e| ArrowError :: ParseError ( format ! ( "JSON parse error: {}" , e) ) ) ?;
928+ if let Value :: Object ( obj) = parsed {
929+ assert_eq ! ( obj. len( ) , 6 ) ;
930+ assert_eq ! ( obj. get( "string_field" ) , Some ( & Value :: String ( "test_string" . to_string( ) ) ) ) ;
931+ assert_eq ! ( obj. get( "int_field" ) , Some ( & Value :: Number ( 123 . into( ) ) ) ) ;
932+ assert_eq ! ( obj. get( "bool_field" ) , Some ( & Value :: Bool ( true ) ) ) ;
933+ assert ! ( matches!( obj. get( "float_field" ) , Some ( Value :: Number ( _) ) ) ) ;
934+ assert_eq ! ( obj. get( "null_field" ) , Some ( & Value :: Null ) ) ;
935+ assert_eq ! ( obj. get( "long_field" ) , Some ( & Value :: Number ( 999 . into( ) ) ) ) ;
936+ } else {
937+ panic ! ( "Expected JSON object" ) ;
938+ }
939+
940+ Ok ( ( ) )
941+ }
652942}
0 commit comments