mirror of https://github.com/kdl-org/kdl-rs.git
serde: deserialziation tests
This commit is contained in:
parent
cfeb23a039
commit
4130cff964
394
src/de.rs
394
src/de.rs
|
|
@ -896,3 +896,397 @@ impl<'de, 'a> de::VariantAccess<'de> for PropertyVariantAccess<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simple_struct() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
name: String,
|
||||||
|
port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
name "my-app"
|
||||||
|
port 8080
|
||||||
|
"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
name: "my-app".into(),
|
||||||
|
port: 8080,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn nested_struct() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
server: Server,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Server {
|
||||||
|
host: String,
|
||||||
|
port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
server {
|
||||||
|
host "localhost"
|
||||||
|
port 8080
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
server: Server {
|
||||||
|
host: "localhost".into(),
|
||||||
|
port: 8080,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn node_with_properties() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
server: Server,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Server {
|
||||||
|
host: String,
|
||||||
|
port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"server host="localhost" port=8080"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
server: Server {
|
||||||
|
host: "localhost".into(),
|
||||||
|
port: 8080,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sequence_of_args() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
values: Vec<i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"values 1 2 3"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
values: vec![1, 2, 3]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn repeated_nodes_as_seq() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
route: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
route "/api/users"
|
||||||
|
route "/api/posts"
|
||||||
|
route "/api/comments"
|
||||||
|
"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
route: vec![
|
||||||
|
"/api/users".into(),
|
||||||
|
"/api/posts".into(),
|
||||||
|
"/api/comments".into(),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn boolean_and_null() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
enabled: bool,
|
||||||
|
disabled: bool,
|
||||||
|
nothing: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
enabled #true
|
||||||
|
disabled #false
|
||||||
|
nothing #null
|
||||||
|
"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
enabled: true,
|
||||||
|
disabled: false,
|
||||||
|
nothing: None,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn option_some() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
name: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"name "hello""#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
name: Some("hello".into()),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn float_values() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
ratio: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"ratio 3.14"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert!((config.ratio - 3.14).abs() < f64::EPSILON);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn enum_unit_variant() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
enum Color {
|
||||||
|
Red,
|
||||||
|
Green,
|
||||||
|
Blue,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
color: Color,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"color "Red""#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(config, Config { color: Color::Red });
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deeply_nested() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Root {
|
||||||
|
level1: Level1,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Level1 {
|
||||||
|
level2: Level2,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Level2 {
|
||||||
|
value: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
level1 {
|
||||||
|
level2 {
|
||||||
|
value 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let root: Root = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
root,
|
||||||
|
Root {
|
||||||
|
level1: Level1 {
|
||||||
|
level2: Level2 { value: 42 },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn children_as_seq() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Item {
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
items {
|
||||||
|
item {
|
||||||
|
name "a"
|
||||||
|
}
|
||||||
|
item {
|
||||||
|
name "b"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
items: Items,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Items {
|
||||||
|
item: Vec<Item>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
items: Items {
|
||||||
|
item: vec![Item { name: "a".into() }, Item { name: "b".into() },],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mixed_props_and_children() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Server {
|
||||||
|
host: String,
|
||||||
|
port: u16,
|
||||||
|
routes: Routes,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Routes {
|
||||||
|
path: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
server: Server,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
server host="localhost" port=8080 {
|
||||||
|
routes {
|
||||||
|
path "/a"
|
||||||
|
path "/b"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
server: Server {
|
||||||
|
host: "localhost".into(),
|
||||||
|
port: 8080,
|
||||||
|
routes: Routes {
|
||||||
|
path: vec!["/a".into(), "/b".into()],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_document() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {}
|
||||||
|
|
||||||
|
let config: Config = from_str("").unwrap();
|
||||||
|
assert_eq!(config, Config {});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hashmap() {
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
alpha 1
|
||||||
|
beta 2
|
||||||
|
gamma 3
|
||||||
|
"#;
|
||||||
|
let map: HashMap<String, i32> = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(map.get("alpha"), Some(&1));
|
||||||
|
assert_eq!(map.get("beta"), Some(&2));
|
||||||
|
assert_eq!(map.get("gamma"), Some(&3));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn newtype_struct() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Port(u16);
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
port: Port,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"port 8080"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(config, Config { port: Port(8080) });
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn integer_types() {
|
||||||
|
#[derive(Deserialize, Debug, PartialEq)]
|
||||||
|
struct Config {
|
||||||
|
a: i8,
|
||||||
|
b: i16,
|
||||||
|
c: i32,
|
||||||
|
d: i64,
|
||||||
|
e: u8,
|
||||||
|
f: u16,
|
||||||
|
g: u32,
|
||||||
|
h: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
let kdl = r#"
|
||||||
|
a 1
|
||||||
|
b 2
|
||||||
|
c 3
|
||||||
|
d 4
|
||||||
|
e 5
|
||||||
|
f 6
|
||||||
|
g 7
|
||||||
|
h 8
|
||||||
|
"#;
|
||||||
|
let config: Config = from_str(kdl).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
config,
|
||||||
|
Config {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
c: 3,
|
||||||
|
d: 4,
|
||||||
|
e: 5,
|
||||||
|
f: 6,
|
||||||
|
g: 7,
|
||||||
|
h: 8,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue