toml-rs/test-suite/tests/macros.rs
2019-05-08 12:12:14 -07:00

370 lines
9 KiB
Rust

#![recursion_limit = "256"]
#[macro_use]
extern crate toml;
use std::f64;
macro_rules! table {
($($key:expr => $value:expr,)*) => {{
// https://github.com/rust-lang/rust/issues/60643
#[allow(unused_mut)]
let mut table = toml::value::Table::new();
$(
table.insert($key.to_string(), $value.into());
)*
toml::Value::Table(table)
}};
}
macro_rules! array {
($($element:expr,)*) => {{
// https://github.com/rust-lang/rust/issues/60643
#[allow(unused_mut)]
let mut array = toml::value::Array::new();
$(
array.push($element.into());
)*
toml::Value::Array(array)
}};
}
macro_rules! datetime {
($s:tt) => {
$s.parse::<toml::value::Datetime>().unwrap()
};
}
#[test]
fn test_cargo_toml() {
// Simple sanity check of:
//
// - Ordinary tables
// - Inline tables
// - Inline arrays
// - String values
// - Table keys containing hyphen
// - Table headers containing hyphen
let actual = toml! {
[package]
name = "toml"
version = "0.4.5"
authors = ["Alex Crichton <alex@alexcrichton.com>"]
[badges]
travis-ci = { repository = "alexcrichton/toml-rs" }
[dependencies]
serde = "1.0"
[dev-dependencies]
serde_derive = "1.0"
serde_json = "1.0"
};
let expected = table! {
"package" => table! {
"name" => "toml".to_owned(),
"version" => "0.4.5".to_owned(),
"authors" => array! {
"Alex Crichton <alex@alexcrichton.com>".to_owned(),
},
},
"badges" => table! {
"travis-ci" => table! {
"repository" => "alexcrichton/toml-rs".to_owned(),
},
},
"dependencies" => table! {
"serde" => "1.0".to_owned(),
},
"dev-dependencies" => table! {
"serde_derive" => "1.0".to_owned(),
"serde_json" => "1.0".to_owned(),
},
};
assert_eq!(actual, expected);
}
#[test]
fn test_array() {
// Copied from the TOML spec.
let actual = toml! {
[[fruit]]
name = "apple"
[fruit.physical]
color = "red"
shape = "round"
[[fruit.variety]]
name = "red delicious"
[[fruit.variety]]
name = "granny smith"
[[fruit]]
name = "banana"
[[fruit.variety]]
name = "plantain"
};
let expected = table! {
"fruit" => array! {
table! {
"name" => "apple",
"physical" => table! {
"color" => "red",
"shape" => "round",
},
"variety" => array! {
table! {
"name" => "red delicious",
},
table! {
"name" => "granny smith",
},
},
},
table! {
"name" => "banana",
"variety" => array! {
table! {
"name" => "plantain",
},
},
},
},
};
assert_eq!(actual, expected);
}
#[test]
fn test_number() {
let actual = toml! {
positive = 1
negative = -1
table = { positive = 1, negative = -1 }
array = [ 1, -1 ]
neg_zero = -0
pos_zero = +0
float = 3.14
sf1 = inf
sf2 = +inf
sf3 = -inf
sf7 = +0.0
sf8 = -0.0
hex = 0xa_b_c
oct = 0o755
bin = 0b11010110
};
let expected = table! {
"positive" => 1,
"negative" => -1,
"table" => table! {
"positive" => 1,
"negative" => -1,
},
"array" => array! {
1,
-1,
},
"neg_zero" => -0,
"pos_zero" => 0,
"float" => 3.14,
"sf1" => f64::INFINITY,
"sf2" => f64::INFINITY,
"sf3" => f64::NEG_INFINITY,
"sf7" => 0.0,
"sf8" => -0.0,
"hex" => 2748,
"oct" => 493,
"bin" => 214,
};
assert_eq!(actual, expected);
}
#[test]
fn test_nan() {
let actual = toml! {
sf4 = nan
sf5 = +nan
sf6 = -nan
};
assert!(actual["sf4"].as_float().unwrap().is_nan());
assert!(actual["sf5"].as_float().unwrap().is_nan());
assert!(actual["sf6"].as_float().unwrap().is_nan());
}
#[test]
fn test_datetime() {
let actual = toml! {
// Copied from the TOML spec.
odt1 = 1979-05-27T07:32:00Z
odt2 = 1979-05-27T00:32:00-07:00
odt3 = 1979-05-27T00:32:00.999999-07:00
odt4 = 1979-05-27 07:32:00Z
ldt1 = 1979-05-27T07:32:00
ldt2 = 1979-05-27T00:32:00.999999
ld1 = 1979-05-27
lt1 = 07:32:00
lt2 = 00:32:00.999999
table = {
odt1 = 1979-05-27T07:32:00Z,
odt2 = 1979-05-27T00:32:00-07:00,
odt3 = 1979-05-27T00:32:00.999999-07:00,
odt4 = 1979-05-27 07:32:00Z,
ldt1 = 1979-05-27T07:32:00,
ldt2 = 1979-05-27T00:32:00.999999,
ld1 = 1979-05-27,
lt1 = 07:32:00,
lt2 = 00:32:00.999999,
}
array = [
1979-05-27T07:32:00Z,
1979-05-27T00:32:00-07:00,
1979-05-27T00:32:00.999999-07:00,
1979-05-27 07:32:00Z,
1979-05-27T07:32:00,
1979-05-27T00:32:00.999999,
1979-05-27,
07:32:00,
00:32:00.999999,
]
};
let expected = table! {
"odt1" => datetime!("1979-05-27T07:32:00Z"),
"odt2" => datetime!("1979-05-27T00:32:00-07:00"),
"odt3" => datetime!("1979-05-27T00:32:00.999999-07:00"),
"odt4" => datetime!("1979-05-27 07:32:00Z"),
"ldt1" => datetime!("1979-05-27T07:32:00"),
"ldt2" => datetime!("1979-05-27T00:32:00.999999"),
"ld1" => datetime!("1979-05-27"),
"lt1" => datetime!("07:32:00"),
"lt2" => datetime!("00:32:00.999999"),
"table" => table! {
"odt1" => datetime!("1979-05-27T07:32:00Z"),
"odt2" => datetime!("1979-05-27T00:32:00-07:00"),
"odt3" => datetime!("1979-05-27T00:32:00.999999-07:00"),
"odt4" => datetime!("1979-05-27 07:32:00Z"),
"ldt1" => datetime!("1979-05-27T07:32:00"),
"ldt2" => datetime!("1979-05-27T00:32:00.999999"),
"ld1" => datetime!("1979-05-27"),
"lt1" => datetime!("07:32:00"),
"lt2" => datetime!("00:32:00.999999"),
},
"array" => array! {
datetime!("1979-05-27T07:32:00Z"),
datetime!("1979-05-27T00:32:00-07:00"),
datetime!("1979-05-27T00:32:00.999999-07:00"),
datetime!("1979-05-27 07:32:00Z"),
datetime!("1979-05-27T07:32:00"),
datetime!("1979-05-27T00:32:00.999999"),
datetime!("1979-05-27"),
datetime!("07:32:00"),
datetime!("00:32:00.999999"),
},
};
assert_eq!(actual, expected);
}
// This test requires rustc >= 1.20.
#[test]
#[cfg(feature = "test-quoted-keys-in-macro")]
fn test_quoted_key() {
let actual = toml! {
"quoted" = true
table = { "quoted" = true }
[target."cfg(windows)".dependencies]
winapi = "0.2.8"
};
let expected = table! {
"quoted" => true,
"table" => table! {
"quoted" => true,
},
"target" => table! {
"cfg(windows)" => table! {
"dependencies" => table! {
"winapi" => "0.2.8",
},
},
},
};
assert_eq!(actual, expected);
}
#[test]
fn test_empty() {
let actual = toml! {
empty_inline_table = {}
empty_inline_array = []
[empty_table]
[[empty_array]]
};
let expected = table! {
"empty_inline_table" => table! {},
"empty_inline_array" => array! {},
"empty_table" => table! {},
"empty_array" => array! {
table! {},
},
};
assert_eq!(actual, expected);
}
#[test]
fn test_dotted_keys() {
let actual = toml! {
a.b = 123
a.c = 1979-05-27T07:32:00Z
[table]
a.b.c = 1
a . b . d = 2
in = { type.name = "cat", type.color = "blue" }
};
let expected = table! {
"a" => table! {
"b" => 123,
"c" => datetime!("1979-05-27T07:32:00Z"),
},
"table" => table! {
"a" => table! {
"b" => table! {
"c" => 1,
"d" => 2,
},
},
"in" => table! {
"type" => table! {
"name" => "cat",
"color" => "blue",
},
},
},
};
assert_eq!(actual, expected);
}