Skip to content

Commit f02c184

Browse files
committed
[TEST] Add tests for objects and lists to json
1 parent f248768 commit f02c184

File tree

1 file changed

+290
-0
lines changed

1 file changed

+290
-0
lines changed

parquet-variant/src/encoder/variant_to_json.rs

Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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\"\nWith\tTabs");
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

Comments
 (0)