@@ -601,6 +601,13 @@ mod impl_serde {
601
601
use num_traits:: Float ;
602
602
use std:: f64;
603
603
604
+ #[ cfg( test) ]
605
+ extern crate serde_test;
606
+ #[ cfg( test) ]
607
+ use self :: serde_test:: { Token , assert_tokens, assert_de_tokens_error} ;
608
+ #[ cfg( test) ]
609
+ use self :: serde_test:: Error :: Message ;
610
+
604
611
impl < T : Float + Serialize > Serialize for OrderedFloat < T > {
605
612
fn serialize < S : Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
606
613
self . 0 . serialize ( s)
@@ -621,10 +628,29 @@ mod impl_serde {
621
628
622
629
impl < T : Float + Deserialize > Deserialize for NotNaN < T > {
623
630
fn deserialize < D : Deserializer > ( d : D ) -> Result < Self , D :: Error > {
624
- T :: deserialize ( d) . and_then ( |v| {
625
- NotNaN :: new ( v )
626
- . map_err ( |_| < D :: Error as Error > :: invalid_value ( Unexpected :: Float ( f64:: NAN ) , & "NaN" ) )
631
+ let float = T :: deserialize ( d) ? ;
632
+ NotNaN :: new ( float ) . map_err ( |_| {
633
+ Error :: invalid_value ( Unexpected :: Float ( f64:: NAN ) , & "float (but not NaN)" )
627
634
} )
628
635
}
629
636
}
637
+
638
+ #[ test]
639
+ fn test_ordered_float ( ) {
640
+ let float = OrderedFloat ( 1.0f64 ) ;
641
+ assert_tokens ( & float, & [ Token :: F64 ( 1.0 ) ] ) ;
642
+ }
643
+
644
+ #[ test]
645
+ fn test_not_nan ( ) {
646
+ let float = NotNaN ( 1.0f64 ) ;
647
+ assert_tokens ( & float, & [ Token :: F64 ( 1.0 ) ] ) ;
648
+ }
649
+
650
+ #[ test]
651
+ fn test_fail_on_nan ( ) {
652
+ assert_de_tokens_error :: < NotNaN < f64 > > (
653
+ & [ Token :: F64 ( f64:: NAN ) ] ,
654
+ Message ( "invalid value: floating point `NaN`, expected float (but not NaN)" . into ( ) ) ) ;
655
+ }
630
656
}
0 commit comments