@@ -138,7 +138,7 @@ impl Serialize for VariantDispatch {
138
138
Color ( v) => newtype_variant ! ( VariantType :: Color , v) ,
139
139
NodePath ( v) => newtype_variant ! ( VariantType :: NodePath , v) ,
140
140
Rid ( v) => newtype_variant ! ( VariantType :: Rid , v) ,
141
- Object ( _) => newtype_variant ! ( VariantType :: Object , & Option :: < ( ) > :: None ) ,
141
+ Object ( _) => newtype_variant ! ( VariantType :: Object , & Variant :: new ( ) ) ,
142
142
Dictionary ( v) => {
143
143
newtype_variant ! ( VariantType :: Dictionary , & DictionaryDispatch ( v. new_ref( ) ) )
144
144
}
@@ -496,13 +496,9 @@ fn int_tagged(key: i64, value: Variant) -> Option<Variant> {
496
496
let i = key;
497
497
if i == value. get_type ( ) as i64 {
498
498
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 ) {
502
500
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 ( ) ) {
506
502
return Some ( Rid :: new ( ) . to_variant ( ) ) ;
507
503
} else if let Some ( arr) = value. try_to_array ( ) {
508
504
if i == VariantType :: ByteArray as i64 {
@@ -603,3 +599,92 @@ fn f32_field(v: &Variant) -> Option<f32> {
603
599
. map ( |f| f as f32 )
604
600
. or_else ( || v. try_to_i64 ( ) . map ( |i| i as f32 ) )
605
601
}
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