blob: 5d0a0480ee1a8653d67fb566057d2efd74d58407 [file] [log] [blame] [edit]
use serde_derive::Serialize;
use std::collections::HashMap;
macro_rules! serializes_to {
($value:expr, $actual:expr) => {{
let actual = serde_json5::to_string(&$value).unwrap();
assert_eq!(actual, $actual);
}};
($value:expr, $actual:expr,) => {
serializes_to!($value, $actual)
};
}
#[test]
fn serializes_bool() {
serializes_to!(true, "true");
serializes_to!(false, "false");
}
#[test]
fn serializes_i8() {
let x: i8 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_u8() {
let x: u8 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_i16() {
let x: i16 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_u16() {
let x: u16 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_i32() {
let x: i32 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_u32() {
let x: u32 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_i64() {
let x: i64 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_u64() {
let x: u64 = 42;
serializes_to!(x, "42");
}
#[test]
fn serializes_f32() {
let x: f32 = 42.42;
serializes_to!(x, "42.42");
serializes_to!(f32::INFINITY, "Infinity");
serializes_to!(f32::NEG_INFINITY, "-Infinity");
serializes_to!(f32::NAN, "NaN");
}
#[test]
fn serializes_f64() {
let x: f64 = 42.42;
serializes_to!(x, "42.42");
serializes_to!(f64::INFINITY, "Infinity");
serializes_to!(f64::NEG_INFINITY, "-Infinity");
serializes_to!(f64::NAN, "NaN");
}
#[test]
fn serializes_char() {
serializes_to!('x', "\"x\"");
serializes_to!('자', "\"자\"");
serializes_to!('"', r#""\"""#);
serializes_to!('\r', r#""\r""#);
serializes_to!('\n', r#""\n""#);
serializes_to!('\t', r#""\t""#);
serializes_to!('\\', r#""\\""#);
serializes_to!('/', r#""/""#);
serializes_to!('\u{0008}', r#""\b""#);
serializes_to!('\u{000c}', r#""\f""#);
}
#[test]
fn serializes_str() {
serializes_to!("Hello!", "\"Hello!\"");
serializes_to!("안녕하세요", "\"안녕하세요\"");
serializes_to!("\"quotes!\"", "\"\\\"quotes!\\\"\"");
serializes_to!("new\nlines", "\"new\\nlines\"");
serializes_to!("\\", "\"\\\\\"");
}
#[test]
fn serializes_string() {
serializes_to!("Hello!".to_owned(), "\"Hello!\"");
serializes_to!("안녕하세요".to_owned(), "\"안녕하세요\"");
serializes_to!("\"quotes!\"".to_owned(), "\"\\\"quotes!\\\"\"");
serializes_to!("new\nlines".to_owned(), "\"new\\nlines\"");
serializes_to!("\\".to_owned(), "\"\\\\\"");
}
#[test]
#[ignore] // TODO currently unsupported
fn serializes_bytes() {}
#[test]
#[ignore] // TODO currently unsupported
fn serializes_byte_buf() {}
#[test]
fn serializes_option() {
serializes_to!(None::<i32>, "null");
serializes_to!(Some(42), "42");
serializes_to!(Some(Some(42)), "42");
}
#[test]
fn serializes_unit() {
serializes_to!((), "null");
}
#[test]
fn serializes_unit_struct() {
#[derive(Serialize, PartialEq, Debug)]
struct A;
serializes_to!(A, "null");
}
#[test]
fn serializes_newtype_struct() {
#[derive(Serialize, PartialEq, Debug)]
struct A(i32);
#[derive(Serialize, PartialEq, Debug)]
struct B(f64);
serializes_to!(A(42), "42");
serializes_to!(B(42.), "42");
}
#[test]
fn serializes_seq() {
#[derive(Serialize, PartialEq, Debug)]
#[serde(untagged)]
enum Val {
Number(f64),
Bool(bool),
String(String),
}
serializes_to!(vec![1, 2, 3], "[1,2,3]");
serializes_to!(
vec![
Val::Number(42.),
Val::Bool(true),
Val::String("hello".to_owned())
],
"[42,true,\"hello\"]",
)
}
#[test]
fn serializes_tuple() {
serializes_to!((1, 2, 3), "[1,2,3]");
}
#[test]
fn serializes_tuple_struct() {
#[derive(Serialize, PartialEq, Debug)]
struct A(i32, f64);
#[derive(Serialize, PartialEq, Debug)]
struct B(f64, i32);
serializes_to!(A(1, 2.), "[1,2]");
serializes_to!(B(1., 2), "[1,2]");
}
#[test]
fn serializes_map() {
let mut inner = HashMap::new();
inner.insert("b".to_owned(), true);
let mut outer = HashMap::new();
outer.insert("a".to_owned(), inner);
serializes_to!(outer, "{\"a\":{\"b\":true}}");
}
#[test]
fn serializes_struct() {
#[derive(Serialize, PartialEq, Debug)]
struct S {
a: i32,
b: i32,
c: i32,
}
serializes_to!(S { a: 1, b: 2, c: 3 }, "{\"a\":1,\"b\":2,\"c\":3}");
}
#[test]
fn serializes_enum() {
#[derive(Serialize, PartialEq, Debug)]
enum E {
A,
B(i32),
C(i32, i32),
D { a: i32, b: i32 },
}
serializes_to!(E::A, "\"A\"");
serializes_to!(E::B(2), "{\"B\":2}");
serializes_to!(E::C(3, 5), "{\"C\":[3,5]}");
serializes_to!(E::D { a: 7, b: 11 }, "{\"D\":{\"a\":7,\"b\":11}}");
}
#[test]
fn test_to_writer() {
#[derive(Serialize)]
struct S {
a: i32,
b: i32,
c: i32,
}
let value = S { a: 5, b: 4, c: 3 };
let mut writer = Vec::<u8>::new();
serde_json5::to_writer(&mut writer, &value).expect("to_writer succeeds");
let data = std::str::from_utf8(&writer).expect("valid utf8");
assert_eq!(data, r#"{"a":5,"b":4,"c":3}"#);
}