@@ -601,6 +601,13 @@ mod impl_serde {
601601 use num_traits:: Float ;
602602 use std:: f64;
603603
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+
604611 impl < T : Float + Serialize > Serialize for OrderedFloat < T > {
605612 fn serialize < S : Serializer > ( & self , s : S ) -> Result < S :: Ok , S :: Error > {
606613 self . 0 . serialize ( s)
@@ -621,10 +628,29 @@ mod impl_serde {
621628
622629 impl < T : Float + Deserialize > Deserialize for NotNaN < T > {
623630 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)" )
627634 } )
628635 }
629636 }
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+ }
630656}
0 commit comments