use facet_reflect::Partial;
#[test]
fn test_empty_tuple_always_initialized() {
let partial = Partial::alloc::<()>().unwrap();
let shape = partial.shape();
if let facet_core::Type::User(facet_core::UserType::Struct(st)) = shape.ty {
assert_eq!(st.fields.len(), 0, "Empty tuple should have 0 fields");
}
let built = partial.build().unwrap();
let _value: () = built.materialize().unwrap();
}
#[test]
fn test_nested_empty_tuple_field_check() {
let mut partial = Partial::alloc::<((),)>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
println!("Is field 0 of (()) initialized? {field_0_initialized}");
let shape = partial.shape();
println!("Shape type: {:?}", shape.ty);
if !field_0_initialized {
partial = partial.begin_nth_field(0).unwrap();
let inner_shape = partial.shape();
println!("Inner shape: {inner_shape:?}");
partial = partial.end().unwrap();
}
let built = partial.build().unwrap();
let value: ((),) = built.materialize().unwrap();
assert_eq!(value, ((),));
}
#[test]
fn test_double_empty_tuple() {
let mut partial = Partial::alloc::<((), ())>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
let field_1_initialized = partial.is_field_set(1).unwrap();
println!("Field 0 initialized: {field_0_initialized}");
println!("Field 1 initialized: {field_1_initialized}");
if !field_0_initialized {
partial = partial.begin_nth_field(0).unwrap();
partial = partial.end().unwrap();
}
if !field_1_initialized {
partial = partial.begin_nth_field(1).unwrap();
partial = partial.end().unwrap();
}
let built = partial.build().unwrap();
let value: ((), ()) = built.materialize().unwrap();
assert_eq!(value, ((), ()));
}
#[test]
fn test_deeply_nested_empty_tuple() {
let mut partial = Partial::alloc::<(((),),)>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
println!("Is field 0 of (((),),) initialized? {field_0_initialized}");
if !field_0_initialized {
partial = partial.begin_nth_field(0).unwrap();
let inner_field_0_initialized = partial.is_field_set(0).unwrap();
println!("Is field 0 of ((),) initialized? {inner_field_0_initialized}");
if !inner_field_0_initialized {
partial = partial.begin_nth_field(0).unwrap(); partial = partial.end().unwrap(); }
partial = partial.end().unwrap(); }
let built = partial.build().unwrap();
let value: (((),),) = built.materialize().unwrap();
assert_eq!(value, (((),),));
}
#[test]
fn test_is_field_set_for_nested_empty_tuples() {
let partial = Partial::alloc::<(((),),)>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
println!("Is field 0 of (((),),) initialized? {field_0_initialized}");
assert!(
!field_0_initialized,
"Field 0 of (((),),) should NOT be considered initialized - it needs to be explicitly set"
);
let partial = Partial::alloc::<((((),),),)>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
println!("Is field 0 of ((((),),),) initialized? {field_0_initialized}");
assert!(
!field_0_initialized,
"Field 0 of ((((),),),) should NOT be considered initialized"
);
let partial = Partial::alloc::<((), (), ())>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
let field_1_initialized = partial.is_field_set(1).unwrap();
let field_2_initialized = partial.is_field_set(2).unwrap();
println!(
"Fields of ((), (), ()): {field_0_initialized}, {field_1_initialized}, {field_2_initialized}"
);
assert!(
!field_0_initialized && !field_1_initialized && !field_2_initialized,
"All fields should NOT be initialized - they need to be explicitly set"
);
let partial = Partial::alloc::<(((), ()), ())>().unwrap();
let field_0_initialized = partial.is_field_set(0).unwrap();
let field_1_initialized = partial.is_field_set(1).unwrap();
println!("Field 0 of (((), ()), ()) initialized? {field_0_initialized}");
println!("Field 1 of (((), ()), ()) initialized? {field_1_initialized}");
assert!(
!field_0_initialized,
"Field 0 should NOT be initialized - it's a non-empty tuple"
);
assert!(
!field_1_initialized,
"Field 1 should NOT be initialized - even though it's an empty tuple"
);
}
#[test]
fn test_building_nested_empty_tuples_without_navigation() {
let partial = Partial::alloc::<((),)>().unwrap();
let built = partial.build().unwrap();
let value: ((),) = built.materialize().unwrap();
assert_eq!(value, ((),));
let mut partial = Partial::alloc::<((),)>().unwrap();
partial = partial.begin_nth_field(0).unwrap();
partial = partial.end().unwrap();
let built = partial.build().unwrap();
let value: ((),) = built.materialize().unwrap();
assert_eq!(value, ((),));
}
#[test]
fn test_build_vec_of_unit() {
let mut partial = Partial::alloc::<Vec<()>>().unwrap();
partial = partial.init_list().unwrap();
partial = partial.begin_list_item().unwrap();
partial = partial.end().unwrap();
partial = partial.begin_list_item().unwrap();
partial = partial.end().unwrap();
let built = partial.build().unwrap();
let value: Vec<()> = built.materialize().unwrap();
assert_eq!(value, vec![(), ()]);
}