blob: 31c5e03b9e65c9de67a0274c38c17172d161363c [file] [log] [blame]
use serde_derive::Serialize;
use std::collections::HashMap;
mod common;
use crate::common::serializes_to;
#[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(std::f32::INFINITY, "Infinity");
serializes_to(std::f32::NEG_INFINITY, "-Infinity");
serializes_to(std::f32::NAN, "NaN");
}
#[test]
fn serializes_f64() {
let x: f64 = 42.42;
serializes_to(x, "42.42");
serializes_to(std::f64::INFINITY, "Infinity");
serializes_to(std::f64::NEG_INFINITY, "-Infinity");
serializes_to(std::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::<Option<i32>>(None, "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}}");
}