Skip to content

Commit aa7e23b

Browse files
committed
Fix serde error message and add tests
1 parent 0e5d3ab commit aa7e23b

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ unreachable = "0.1"
1515

1616
[dev-dependencies]
1717
stainless = "0.1"
18+
serde_test = "0.9"

src/lib.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)