@@ -138,7 +138,7 @@ impl Serialize for VariantDispatch {
138138 Color ( v) => newtype_variant ! ( VariantType :: Color , v) ,
139139 NodePath ( v) => newtype_variant ! ( VariantType :: NodePath , v) ,
140140 Rid ( v) => newtype_variant ! ( VariantType :: Rid , v) ,
141- Object ( _) => newtype_variant ! ( VariantType :: Object , & Option :: < ( ) > :: None ) ,
141+ Object ( _) => newtype_variant ! ( VariantType :: Object , & Variant :: new ( ) ) ,
142142 Dictionary ( v) => {
143143 newtype_variant ! ( VariantType :: Dictionary , & DictionaryDispatch ( v. new_ref( ) ) )
144144 }
@@ -496,13 +496,9 @@ fn int_tagged(key: i64, value: Variant) -> Option<Variant> {
496496 let i = key;
497497 if i == value. get_type ( ) as i64 {
498498 return Some ( value) ;
499- } else if ( i == VariantType :: Object as i64 )
500- && ( value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) )
501- {
499+ } else if ( i == VariantType :: Object as i64 ) && ( value. get_type ( ) == VariantType :: Nil ) {
502500 return Some ( Variant :: new ( ) ) ;
503- } else if ( i == VariantType :: Rid as i64 )
504- && ( value. get_type ( ) == Option :: < ( ) > :: None . to_variant ( ) . get_type ( ) )
505- {
501+ } else if ( i == VariantType :: Rid as i64 ) && ( value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) ) {
506502 return Some ( Rid :: new ( ) . to_variant ( ) ) ;
507503 } else if let Some ( arr) = value. try_to_array ( ) {
508504 if i == VariantType :: ByteArray as i64 {
@@ -603,3 +599,92 @@ fn f32_field(v: &Variant) -> Option<f32> {
603599 . map ( |f| f as f32 )
604600 . or_else ( || v. try_to_i64 ( ) . map ( |i| i as f32 ) )
605601}
602+
603+ #[ cfg( feature = "gd_test" ) ]
604+ #[ doc( hidden) ]
605+ pub mod tests {
606+ use super :: * ;
607+
608+ #[ derive( Debug , PartialEq , Serialize , Deserialize ) ]
609+ struct VariantSerdeTest {
610+ some : Option < Variant > ,
611+ none : Option < Variant > ,
612+ b : Bool ,
613+ int : I64 ,
614+ float : F64 ,
615+ str : GodotString ,
616+ vec2 : Vector2 ,
617+ // rect2: Rect2, //TODO: PartialEq
618+ vec3 : Vector3 ,
619+ // xform_2d: Transform2D, //TODO: PartialEq
620+ plane : Plane ,
621+ quat : Quat ,
622+ aabb : Aabb ,
623+ basis : Basis ,
624+ xform : Transform ,
625+ color : Color ,
626+ path : NodePath ,
627+ rid : Rid ,
628+ // obj: Object, //TODO: how best to test this?
629+ // dict: Dictionary, //TODO: PartialEq
630+ // v_arr: VariantArray, //TODO: PartialEq
631+ byte_arr : ByteArray ,
632+ int_arr : Int32Array ,
633+ float_arr : Float32Array ,
634+ str_arr : StringArray ,
635+ vec2_arr : Vector2Array ,
636+ vec3_arr : Vector3Array ,
637+ color_arr : ColorArray ,
638+ }
639+
640+ #[ cfg( feature = "gd_test" ) ]
641+ impl VariantSerdeTest {
642+ #[ doc( hidden) ]
643+ fn new ( ) -> Self {
644+ Self {
645+ some : Some ( Variant :: from_bool ( true ) ) ,
646+ none : None ,
647+ b : false ,
648+ int : 1 ,
649+ float : 2.0 ,
650+ str : "this is a str" . into ( ) ,
651+ vec2 : Vector2 :: RIGHT ,
652+ vec3 : Vector3 :: BACK ,
653+ plane : Plane {
654+ normal : Vector3 :: ONE . normalized ( ) ,
655+ d : 3.0 ,
656+ } ,
657+ quat : Quat :: new ( 4.1 , 5.2 , 6.3 , 7.5 ) ,
658+ aabb : Aabb {
659+ position : Default :: default ( ) ,
660+ size : Default :: default ( ) ,
661+ } ,
662+ basis : Basis :: identity ( ) . rotated ( Vector3 :: UP , std:: f32:: consts:: TAU / 3.0 ) ,
663+ xform : Transform {
664+ basis : Default :: default ( ) ,
665+ origin : Default :: default ( ) ,
666+ } ,
667+ color : Color :: from_rgb ( 0.549 , 0.0 , 1.0 ) ,
668+ path : "/root/Node" . into ( ) ,
669+ rid : Rid :: new ( ) ,
670+ byte_arr : Default :: default ( ) ,
671+ int_arr : Default :: default ( ) ,
672+ float_arr : Default :: default ( ) ,
673+ str_arr : Default :: default ( ) ,
674+ vec2_arr : Default :: default ( ) ,
675+ vec3_arr : Default :: default ( ) ,
676+ color_arr : Default :: default ( ) ,
677+ }
678+ }
679+ }
680+
681+ pub fn test_ron_round_trip ( ) -> bool {
682+ let test = VariantSerdeTest :: new ( ) ;
683+ let test_str = ron:: to_string ( & test) ;
684+ if test_str. is_err ( ) { return false }
685+ let mut de = ron:: Deserializer :: from_str ( test_str. as_ref ( ) . unwrap ( ) ) ;
686+ if de. is_err ( ) { return false }
687+ VariantSerdeTest :: deserialize ( de. as_mut ( ) . unwrap ( ) )
688+ . map_or ( false , |test_again| godot_dbg ! ( test_again == test) )
689+ }
690+ }
0 commit comments