use super::Q;
use crate::macros::serialize::{deserialize, serialize};
use core::fmt;
use serde::{
Deserialize, Serialize,
de::{Error, MapAccess, Unexpected, Visitor},
ser::SerializeStruct,
};
use std::str::FromStr;
serialize!("value", Q);
deserialize!("value", Value, Q);
#[cfg(test)]
mod test_serialize {
use crate::rational::Q;
use std::str::FromStr;
#[test]
fn serialize_output_positive() {
let q = Q::from((17, 3));
let cmp_str = "{\"value\":\"17/3\"}";
assert_eq!(cmp_str, serde_json::to_string(&q).unwrap());
}
#[test]
fn serialize_output_negative() {
let q = Q::from((-17, 3));
let cmp_str = "{\"value\":\"-17/3\"}";
assert_eq!(cmp_str, serde_json::to_string(&q).unwrap());
}
#[test]
fn serialize_output_positive_large() {
let val_str = format!("{}/2", u64::MAX);
let q = Q::from_str(&val_str).unwrap();
let cmp_str = format!("{{\"value\":\"{val_str}\"}}");
assert_eq!(cmp_str, serde_json::to_string(&q).unwrap());
}
#[test]
fn serialize_output_negative_large() {
let val_str = format!("-{}/2", u64::MAX);
let q = Q::from_str(&val_str).unwrap();
let cmp_str = format!("{{\"value\":\"{val_str}\"}}");
assert_eq!(cmp_str, serde_json::to_string(&q).unwrap());
}
}
#[cfg(test)]
mod test_deserialize {
use crate::rational::Q;
use std::str::FromStr;
#[test]
fn deserialize_positive() {
let q_string = "{\"value\":\"17/3\"}";
assert_eq!(
Q::from((17, 3)),
serde_json::from_str::<Q>(q_string).unwrap()
);
}
#[test]
fn deserialize_negative() {
let q_string = "{\"value\":\"-17/3\"}";
assert_eq!(
Q::from((-17, 3)),
serde_json::from_str::<Q>(q_string).unwrap()
);
}
#[test]
fn deserialize_positive_large() {
let val_str = format!("{}/2", u64::MAX);
let z_string = format!("{{\"value\":\"{val_str}\"}}");
assert_eq!(
Q::from_str(&val_str).unwrap(),
serde_json::from_str::<Q>(&z_string).unwrap()
)
}
#[test]
fn deserialize_negative_large() {
let val_str = format!("-{}/2", u64::MAX);
let z_string = format!("{{\"value\":\"{val_str}\"}}");
assert_eq!(
Q::from_str(&val_str).unwrap(),
serde_json::from_str::<Q>(&z_string).unwrap()
)
}
#[test]
fn no_field_value() {
let a: Result<Q, serde_json::Error> = serde_json::from_str("{{\"tree\":\"{17}\"}}");
assert!(a.is_err());
let b: Result<Q, serde_json::Error> = serde_json::from_str("{{}}");
assert!(b.is_err());
}
#[test]
fn too_many_fields() {
let a: Result<Q, serde_json::Error> =
serde_json::from_str("{{\"tree\":\"{17/3}\", \"value\":\"{17}\"}}");
assert!(a.is_err());
let b: Result<Q, serde_json::Error> =
serde_json::from_str("{{\"value\":\"{}\", \"value\":\"{17}\"}}");
assert!(b.is_err());
}
}