@@ -317,6 +317,7 @@ pub fn variant_to_json_value(variant: &Variant) -> Result<Value, ArrowError> {
317317mod tests {
318318 use super :: * ;
319319 use crate :: Variant ;
320+ use chrono:: { DateTime , NaiveDate , Utc } ;
320321
321322 #[ test]
322323 fn test_null_to_json ( ) -> Result < ( ) , ArrowError > {
@@ -358,6 +359,219 @@ mod tests {
358359 Ok ( ( ) )
359360 }
360361
362+ #[ test]
363+ fn test_int16_to_json ( ) -> Result < ( ) , ArrowError > {
364+ let variant = Variant :: Int16 ( 32767 ) ;
365+ let json = variant_to_json_string ( & variant) ?;
366+ assert_eq ! ( json, "32767" ) ;
367+
368+ let json_value = variant_to_json_value ( & variant) ?;
369+ assert_eq ! ( json_value, Value :: Number ( 32767 . into( ) ) ) ;
370+
371+ // Test negative value
372+ let negative_variant = Variant :: Int16 ( -32768 ) ;
373+ let negative_json = variant_to_json_string ( & negative_variant) ?;
374+ assert_eq ! ( negative_json, "-32768" ) ;
375+ Ok ( ( ) )
376+ }
377+
378+ #[ test]
379+ fn test_int32_to_json ( ) -> Result < ( ) , ArrowError > {
380+ let variant = Variant :: Int32 ( 2147483647 ) ;
381+ let json = variant_to_json_string ( & variant) ?;
382+ assert_eq ! ( json, "2147483647" ) ;
383+
384+ let json_value = variant_to_json_value ( & variant) ?;
385+ assert_eq ! ( json_value, Value :: Number ( 2147483647 . into( ) ) ) ;
386+
387+ // Test negative value
388+ let negative_variant = Variant :: Int32 ( -2147483648 ) ;
389+ let negative_json = variant_to_json_string ( & negative_variant) ?;
390+ assert_eq ! ( negative_json, "-2147483648" ) ;
391+ Ok ( ( ) )
392+ }
393+
394+ #[ test]
395+ fn test_int64_to_json ( ) -> Result < ( ) , ArrowError > {
396+ let variant = Variant :: Int64 ( 9223372036854775807 ) ;
397+ let json = variant_to_json_string ( & variant) ?;
398+ assert_eq ! ( json, "9223372036854775807" ) ;
399+
400+ let json_value = variant_to_json_value ( & variant) ?;
401+ assert_eq ! ( json_value, Value :: Number ( 9223372036854775807i64 . into( ) ) ) ;
402+
403+ // Test negative value
404+ let negative_variant = Variant :: Int64 ( -9223372036854775808 ) ;
405+ let negative_json = variant_to_json_string ( & negative_variant) ?;
406+ assert_eq ! ( negative_json, "-9223372036854775808" ) ;
407+ Ok ( ( ) )
408+ }
409+
410+ #[ test]
411+ fn test_float_to_json ( ) -> Result < ( ) , ArrowError > {
412+ let variant = Variant :: Float ( 3.14159 ) ;
413+ let json = variant_to_json_string ( & variant) ?;
414+ assert ! ( json. starts_with( "3.14159" ) ) ;
415+
416+ let json_value = variant_to_json_value ( & variant) ?;
417+ assert ! ( matches!( json_value, Value :: Number ( _) ) ) ;
418+
419+ // Test zero
420+ let zero_variant = Variant :: Float ( 0.0 ) ;
421+ let zero_json = variant_to_json_string ( & zero_variant) ?;
422+ assert_eq ! ( zero_json, "0" ) ;
423+
424+ // Test negative
425+ let negative_variant = Variant :: Float ( -1.5 ) ;
426+ let negative_json = variant_to_json_string ( & negative_variant) ?;
427+ assert_eq ! ( negative_json, "-1.5" ) ;
428+ Ok ( ( ) )
429+ }
430+
431+ #[ test]
432+ fn test_double_to_json ( ) -> Result < ( ) , ArrowError > {
433+ let variant = Variant :: Double ( 2.718281828459045 ) ;
434+ let json = variant_to_json_string ( & variant) ?;
435+ assert ! ( json. starts_with( "2.718281828459045" ) ) ;
436+
437+ let json_value = variant_to_json_value ( & variant) ?;
438+ assert ! ( matches!( json_value, Value :: Number ( _) ) ) ;
439+
440+ // Test zero
441+ let zero_variant = Variant :: Double ( 0.0 ) ;
442+ let zero_json = variant_to_json_string ( & zero_variant) ?;
443+ assert_eq ! ( zero_json, "0" ) ;
444+
445+ // Test negative
446+ let negative_variant = Variant :: Double ( -2.5 ) ;
447+ let negative_json = variant_to_json_string ( & negative_variant) ?;
448+ assert_eq ! ( negative_json, "-2.5" ) ;
449+ Ok ( ( ) )
450+ }
451+
452+ #[ test]
453+ fn test_decimal4_to_json ( ) -> Result < ( ) , ArrowError > {
454+ let variant = Variant :: Decimal4 { integer : 12345 , scale : 2 } ;
455+ let json = variant_to_json_string ( & variant) ?;
456+ assert_eq ! ( json, "123.45" ) ;
457+
458+ let json_value = variant_to_json_value ( & variant) ?;
459+ assert ! ( matches!( json_value, Value :: Number ( _) ) ) ;
460+
461+ // Test zero scale
462+ let no_scale_variant = Variant :: Decimal4 { integer : 42 , scale : 0 } ;
463+ let no_scale_json = variant_to_json_string ( & no_scale_variant) ?;
464+ assert_eq ! ( no_scale_json, "42" ) ;
465+
466+ // Test negative
467+ let negative_variant = Variant :: Decimal4 { integer : -12345 , scale : 3 } ;
468+ let negative_json = variant_to_json_string ( & negative_variant) ?;
469+ assert_eq ! ( negative_json, "-12.345" ) ;
470+ Ok ( ( ) )
471+ }
472+
473+ #[ test]
474+ fn test_decimal8_to_json ( ) -> Result < ( ) , ArrowError > {
475+ let variant = Variant :: Decimal8 { integer : 1234567890 , scale : 3 } ;
476+ let json = variant_to_json_string ( & variant) ?;
477+ assert_eq ! ( json, "1234567.89" ) ;
478+
479+ let json_value = variant_to_json_value ( & variant) ?;
480+ assert ! ( matches!( json_value, Value :: Number ( _) ) ) ;
481+
482+ // Test large scale
483+ let large_scale_variant = Variant :: Decimal8 { integer : 123456789 , scale : 6 } ;
484+ let large_scale_json = variant_to_json_string ( & large_scale_variant) ?;
485+ assert_eq ! ( large_scale_json, "123.456789" ) ;
486+ Ok ( ( ) )
487+ }
488+
489+ #[ test]
490+ fn test_decimal16_to_json ( ) -> Result < ( ) , ArrowError > {
491+ let variant = Variant :: Decimal16 { integer : 123456789012345 , scale : 4 } ;
492+ let json = variant_to_json_string ( & variant) ?;
493+ assert_eq ! ( json, "12345678901.2345" ) ;
494+
495+ let json_value = variant_to_json_value ( & variant) ?;
496+ assert ! ( matches!( json_value, Value :: Number ( _) ) ) ;
497+
498+ // Test very large number
499+ let large_variant = Variant :: Decimal16 { integer : 999999999999999999 , scale : 2 } ;
500+ let large_json = variant_to_json_string ( & large_variant) ?;
501+ // Due to f64 precision limits, very large numbers may lose precision
502+ assert ! ( large_json. starts_with( "9999999999999999" ) || large_json. starts_with( "10000000000000000" ) ) ;
503+ Ok ( ( ) )
504+ }
505+
506+ #[ test]
507+ fn test_date_to_json ( ) -> Result < ( ) , ArrowError > {
508+ let date = NaiveDate :: from_ymd_opt ( 2023 , 12 , 25 ) . unwrap ( ) ;
509+ let variant = Variant :: Date ( date) ;
510+ let json = variant_to_json_string ( & variant) ?;
511+ assert_eq ! ( json, "\" 2023-12-25\" " ) ;
512+
513+ let json_value = variant_to_json_value ( & variant) ?;
514+ assert_eq ! ( json_value, Value :: String ( "2023-12-25" . to_string( ) ) ) ;
515+
516+ // Test leap year date
517+ let leap_date = NaiveDate :: from_ymd_opt ( 2024 , 2 , 29 ) . unwrap ( ) ;
518+ let leap_variant = Variant :: Date ( leap_date) ;
519+ let leap_json = variant_to_json_string ( & leap_variant) ?;
520+ assert_eq ! ( leap_json, "\" 2024-02-29\" " ) ;
521+ Ok ( ( ) )
522+ }
523+
524+ #[ test]
525+ fn test_timestamp_micros_to_json ( ) -> Result < ( ) , ArrowError > {
526+ let timestamp = DateTime :: parse_from_rfc3339 ( "2023-12-25T10:30:45Z" ) . unwrap ( ) . with_timezone ( & Utc ) ;
527+ let variant = Variant :: TimestampMicros ( timestamp) ;
528+ let json = variant_to_json_string ( & variant) ?;
529+ assert ! ( json. contains( "2023-12-25T10:30:45" ) ) ;
530+ assert ! ( json. starts_with( '"' ) && json. ends_with( '"' ) ) ;
531+
532+ let json_value = variant_to_json_value ( & variant) ?;
533+ assert ! ( matches!( json_value, Value :: String ( _) ) ) ;
534+ Ok ( ( ) )
535+ }
536+
537+ #[ test]
538+ fn test_timestamp_ntz_micros_to_json ( ) -> Result < ( ) , ArrowError > {
539+ let naive_timestamp = DateTime :: from_timestamp ( 1703505045 , 123456 ) . unwrap ( ) . naive_utc ( ) ;
540+ let variant = Variant :: TimestampNtzMicros ( naive_timestamp) ;
541+ let json = variant_to_json_string ( & variant) ?;
542+ assert ! ( json. contains( "2023-12-25" ) ) ;
543+ assert ! ( json. starts_with( '"' ) && json. ends_with( '"' ) ) ;
544+
545+ let json_value = variant_to_json_value ( & variant) ?;
546+ assert ! ( matches!( json_value, Value :: String ( _) ) ) ;
547+ Ok ( ( ) )
548+ }
549+
550+ #[ test]
551+ fn test_binary_to_json ( ) -> Result < ( ) , ArrowError > {
552+ let binary_data = b"Hello, World!" ;
553+ let variant = Variant :: Binary ( binary_data) ;
554+ let json = variant_to_json_string ( & variant) ?;
555+
556+ // Should be base64 encoded and quoted
557+ assert ! ( json. starts_with( '"' ) && json. ends_with( '"' ) ) ;
558+ assert ! ( json. len( ) > 2 ) ; // Should have content
559+
560+ let json_value = variant_to_json_value ( & variant) ?;
561+ assert ! ( matches!( json_value, Value :: String ( _) ) ) ;
562+
563+ // Test empty binary
564+ let empty_variant = Variant :: Binary ( b"" ) ;
565+ let empty_json = variant_to_json_string ( & empty_variant) ?;
566+ assert_eq ! ( empty_json, "\" \" " ) ;
567+
568+ // Test binary with special bytes
569+ let special_variant = Variant :: Binary ( & [ 0 , 255 , 128 , 64 ] ) ;
570+ let special_json = variant_to_json_string ( & special_variant) ?;
571+ assert ! ( special_json. starts_with( '"' ) && special_json. ends_with( '"' ) ) ;
572+ Ok ( ( ) )
573+ }
574+
361575 #[ test]
362576 fn test_string_to_json ( ) -> Result < ( ) , ArrowError > {
363577 let variant = Variant :: String ( "hello world" ) ;
@@ -391,10 +605,6 @@ mod tests {
391605 Ok ( ( ) )
392606 }
393607
394- // TODO: Add tests for objects and arrays once the implementation is complete
395- // These will be added in the next steps when we implement the missing methods
396- // in VariantObject and VariantArray
397-
398608 #[ test]
399609 fn test_json_buffer_writing ( ) -> Result < ( ) , ArrowError > {
400610 let variant = Variant :: Int8 ( 123 ) ;
@@ -406,4 +616,37 @@ mod tests {
406616 assert_eq ! ( result, "123" ) ;
407617 Ok ( ( ) )
408618 }
619+
620+ #[ test]
621+ fn test_comprehensive_type_coverage ( ) -> Result < ( ) , ArrowError > {
622+ // Test all supported types to ensure no compilation errors
623+ let test_variants = vec ! [
624+ Variant :: Null ,
625+ Variant :: BooleanTrue ,
626+ Variant :: BooleanFalse ,
627+ Variant :: Int8 ( 1 ) ,
628+ Variant :: Int16 ( 2 ) ,
629+ Variant :: Int32 ( 3 ) ,
630+ Variant :: Int64 ( 4 ) ,
631+ Variant :: Float ( 5.0 ) ,
632+ Variant :: Double ( 6.0 ) ,
633+ Variant :: Decimal4 { integer: 7 , scale: 0 } ,
634+ Variant :: Decimal8 { integer: 8 , scale: 0 } ,
635+ Variant :: Decimal16 { integer: 9 , scale: 0 } ,
636+ Variant :: Date ( NaiveDate :: from_ymd_opt( 2023 , 1 , 1 ) . unwrap( ) ) ,
637+ Variant :: TimestampMicros ( DateTime :: parse_from_rfc3339( "2023-01-01T00:00:00Z" ) . unwrap( ) . with_timezone( & Utc ) ) ,
638+ Variant :: TimestampNtzMicros ( DateTime :: from_timestamp( 0 , 0 ) . unwrap( ) . naive_utc( ) ) ,
639+ Variant :: Binary ( b"test" ) ,
640+ Variant :: String ( "test" ) ,
641+ Variant :: ShortString ( "test" ) ,
642+ ] ;
643+
644+ for variant in test_variants {
645+ // Ensure all types can be converted without panicking
646+ let _json_string = variant_to_json_string ( & variant) ?;
647+ let _json_value = variant_to_json_value ( & variant) ?;
648+ }
649+
650+ Ok ( ( ) )
651+ }
409652}
0 commit comments