1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#![cfg(feature = "serde")]
use core::convert::TryFrom;
use js_int::{int, Int};
use serde::{de::IntoDeserializer, Deserialize};
use serde_test::{assert_ser_tokens, Token};
#[test]
fn serialize() {
assert_serialize(100);
assert_serialize(0);
assert_serialize(-100);
}
fn assert_serialize(number: i32) {
assert_ser_tokens(
&Int::from(number),
&[Token::NewtypeStruct { name: "Int" }, Token::I64(number as _)],
)
}
#[test]
fn deserialize() {
assert_eq!(deserialize_from(100).unwrap(), int!(100));
assert_eq!(deserialize_from(0).unwrap(), int!(0));
assert_eq!(deserialize_from(-100).unwrap(), int!(-100));
assert_eq!(deserialize_from(-9007199254740991i64).unwrap(), Int::MIN);
assert_eq!(deserialize_from(9007199254740991i64).unwrap(), Int::MAX);
assert!(deserialize_from(9007199254740992i64).is_err());
assert!(deserialize_from(-9007199254740992i64).is_err());
}
#[test]
#[cfg_attr(feature = "float_deserialize", ignore)]
fn dont_deserialize_integral_float() {
assert!(deserialize_from(-10.0).is_err());
assert!(deserialize_from(-0.0).is_err());
assert!(deserialize_from(1.0).is_err());
assert!(deserialize_from(9007199254740991.0).is_err());
assert!(deserialize_from(9007199254740992.0).is_err());
}
#[test]
#[cfg_attr(feature = "lax_deserialize", ignore)]
fn dont_deserialize_fractional_float() {
assert!(deserialize_from(0.5).is_err());
assert!(deserialize_from(42.1337).is_err());
assert!(deserialize_from(-42.1337).is_err());
}
#[test]
#[cfg_attr(not(feature = "float_deserialize"), ignore)]
fn deserialize_integral_float() {
assert_eq!(deserialize_from(-10.0).unwrap(), int!(-10));
assert_eq!(deserialize_from(-0.0).unwrap(), int!(0));
assert_eq!(deserialize_from(1.0).unwrap(), int!(1));
assert_eq!(deserialize_from(9007199254740991.0).unwrap(), Int::MAX);
assert!(deserialize_from(9007199254740992.0).is_err());
// NOTE: This still ends up as integral because the .49 exceeds the representable range of f64
assert_eq!(
deserialize_from(9007199254740991.49).unwrap(),
Int::try_from(9007199254740991i64).unwrap()
);
assert!(deserialize_from(f64::NAN).is_err());
assert!(deserialize_from(f64::INFINITY).is_err());
assert!(deserialize_from(f64::NEG_INFINITY).is_err());
}
#[test]
#[cfg_attr(not(feature = "lax_deserialize"), ignore)]
fn deserialize_fractional_float() {
assert_eq!(deserialize_from(0.5).unwrap(), int!(0));
assert_eq!(deserialize_from(42.1337).unwrap(), int!(42));
assert_eq!(deserialize_from(-42.1337).unwrap(), int!(-42));
}
fn deserialize_from<'de, Value: IntoDeserializer<'de>>(
value: Value,
) -> Result<Int, serde::de::value::Error> {
Int::deserialize(value.into_deserializer())
}
|