use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct List {
#[serde(rename = "$value")]
item: Vec<Choice>,
}
#[test]
fn simple() {
let data: List = from_str(
r#"
<root>
<one/>
<two/>
<three/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
}
#[test]
fn empty() {
#[derive(Debug, PartialEq, Deserialize)]
struct List {
#[serde(default)]
#[serde(rename = "$value")]
item: Vec<Choice>,
}
let data = from_str::<List>(r#"<root></root>"#).expect("should be Ok");
assert_eq!(data, List { item: vec![] });
let data = from_str::<List>(r#"<root/>"#).expect("should be Ok");
assert_eq!(data, List { item: vec![] });
}
#[test]
fn one_element() {
let data: List = from_str(
r#"
<root>
<one/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
item: vec![Choice::One],
}
);
}
#[test]
fn mixed_content() {
#[derive(Debug, PartialEq, Deserialize)]
struct List {
#[serde(rename = "$value")]
item: Vec<()>,
}
let data: List = from_str(
r#"
<root>
<element/>
text
<![CDATA[cdata]]>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
item: vec![(), ()],
}
);
}
mod field_before_list {
use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct Root {
node: (),
#[serde(rename = "$value")]
item: Vec<Choice>,
}
#[test]
fn before() {
let data: Root = from_str(
r#"
<root>
<node/>
<one/>
<two/>
<three/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Root {
node: (),
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
}
#[test]
fn after() {
let data: Root = from_str(
r#"
<root>
<one/>
<two/>
<three/>
<node/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Root {
node: (),
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
}
#[test]
fn overlapped() {
let data = from_str::<Root>(
r#"
<root>
<one/>
<node/>
<two/>
<three/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
node: (),
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => assert_eq!(e, "duplicate field `$value`"),
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn overlapped_with_nested_list() {
#[derive(Debug, PartialEq, Deserialize)]
struct Root {
node: (),
#[serde(rename = "$value")]
item: Vec<Choice4>,
}
let data = from_str::<Root>(
r#"
<root>
<one><inner/></one>
<node/>
<two><inner/></two>
<three><inner/></three>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
node: (),
item: vec![
Choice4::One { inner: [()] },
Choice4::Two { inner: [()] },
Choice4::Other,
],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `$value`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
}
mod field_after_list {
use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct Root {
#[serde(rename = "$value")]
item: Vec<Choice>,
node: (),
}
#[test]
fn before() {
let data: Root = from_str(
r#"
<root>
<node/>
<one/>
<two/>
<three/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Root {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
node: (),
}
);
}
#[test]
fn after() {
let data: Root = from_str(
r#"
<root>
<one/>
<two/>
<three/>
<node/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Root {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
node: (),
}
);
}
#[test]
fn overlapped() {
let data = from_str::<Root>(
r#"
<root>
<one/>
<node/>
<two/>
<three/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
node: (),
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => assert_eq!(e, "duplicate field `$value`"),
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn overlapped_with_nested_list() {
#[derive(Debug, PartialEq, Deserialize)]
struct Root {
#[serde(rename = "$value")]
item: Vec<Choice4>,
node: (),
}
let data = from_str::<Root>(
r#"
<root>
<one><inner/></one>
<node/>
<two><inner/></two>
<three><inner/></three>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
item: vec![
Choice4::One { inner: [()] },
Choice4::Two { inner: [()] },
Choice4::Other,
],
node: (),
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `$value`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
}
mod two_lists {
use super::*;
mod choice_and_fixed {
use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct Pair {
#[serde(rename = "$value")]
item: Vec<Choice>,
element: Vec<()>,
}
#[test]
fn fixed_before() {
let data: Pair = from_str(
r#"
<root>
<element/>
<element/>
<one/>
<two/>
<three/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Pair {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
element: vec![(), ()],
}
);
}
#[test]
fn fixed_after() {
let data: Pair = from_str(
r#"
<root>
<one/>
<two/>
<three/>
<element/>
<element/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Pair {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
element: vec![(), ()],
}
);
}
mod overlapped {
use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct Root {
#[serde(rename = "$value")]
item: Vec<Choice4>,
element: Vec<()>,
}
#[test]
fn fixed_before() {
let data = from_str::<Pair>(
r#"
<root>
<element/>
<one/>
<two/>
<element/>
<three/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Pair {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
element: vec![(), ()],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `element`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `element`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn fixed_after() {
let data = from_str::<Pair>(
r#"
<root>
<one/>
<element/>
<two/>
<three/>
<element/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Pair {
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
element: vec![(), ()],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `$value`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn with_nested_list_fixed_before() {
let data = from_str::<Root>(
r#"
<root>
<element/>
<one><inner/></one>
<two><inner/></two>
<element/>
<three><inner/></three>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
item: vec![
Choice4::One { inner: [()] },
Choice4::Two { inner: [()] },
Choice4::Other,
],
element: vec![(); 2],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `element`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `element`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn with_nested_list_fixed_after() {
let data = from_str::<Root>(
r#"
<root>
<one><inner/></one>
<element/>
<two><inner/></two>
<three><inner/></three>
<element/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
item: vec![
Choice4::One { inner: [()] },
Choice4::Two { inner: [()] },
Choice4::Other,
],
element: vec![(); 2],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `$value`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
}
}
mod fixed_and_choice {
use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct Pair {
element: Vec<()>,
#[serde(rename = "$value")]
item: Vec<Choice>,
}
#[test]
fn fixed_before() {
let data: Pair = from_str(
r#"
<root>
<element/>
<element/>
<one/>
<two/>
<three/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Pair {
element: vec![(), ()],
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
}
#[test]
fn fixed_after() {
let data: Pair = from_str(
r#"
<root>
<one/>
<two/>
<three/>
<element/>
<element/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
Pair {
element: vec![(), ()],
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
}
mod overlapped {
use super::*;
#[derive(Debug, PartialEq, Deserialize)]
struct Root {
element: Vec<()>,
#[serde(rename = "$value")]
item: Vec<Choice4>,
}
#[test]
fn fixed_before() {
let data = from_str::<Pair>(
r#"
<root>
<element/>
<one/>
<two/>
<element/>
<three/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Pair {
element: vec![(), ()],
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `element`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `element`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn fixed_after() {
let data = from_str::<Pair>(
r#"
<root>
<one/>
<element/>
<two/>
<three/>
<element/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Pair {
element: vec![(), ()],
item: vec![Choice::One, Choice::Two, Choice::Other("three".into())],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `$value`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn with_nested_list_fixed_before() {
let data = from_str::<Root>(
r#"
<root>
<element/>
<one><inner/></one>
<two><inner/></two>
<element/>
<three><inner/></three>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
element: vec![(); 2],
item: vec![
Choice4::One { inner: [()] },
Choice4::Two { inner: [()] },
Choice4::Other,
],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `element`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `element`"))`, but got `{:?}`"#,
e
),
}
}
#[test]
fn with_nested_list_fixed_after() {
let data = from_str::<Root>(
r#"
<root>
<one><inner/></one>
<element/>
<two><inner/></two>
<three><inner/></three>
<element/>
</root>
"#,
);
#[cfg(feature = "overlapped-lists")]
assert_eq!(
data.expect("should be Ok"),
Root {
element: vec![(); 2],
item: vec![
Choice4::One { inner: [()] },
Choice4::Two { inner: [()] },
Choice4::Other,
],
}
);
#[cfg(not(feature = "overlapped-lists"))]
match data {
Err(DeError::Custom(e)) => {
assert_eq!(e, "duplicate field `$value`")
}
e => panic!(
r#"Expected `Err(Custom("duplicate field `$value`"))`, but got `{:?}`"#,
e
),
}
}
}
}
}
#[test]
fn primitives() {
#[derive(Debug, PartialEq, Deserialize)]
struct List {
#[serde(rename = "$value")]
item: Vec<Choice3>,
}
let data: List = from_str(
r#"
<root>
<one>41</one>
<two>42</two>
<three>43</three>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
item: vec![
Choice3::One(41),
Choice3::Two("42".to_string()),
Choice3::Other,
],
}
);
from_str::<List>(
r#"
<root>
<one>41</one>
<two><item>42</item></two>
<three>43</three>
</root>
"#,
)
.expect_err("should be Err");
}
#[test]
fn text_and_value() {
#[derive(Debug, PartialEq, Deserialize)]
struct List {
#[serde(rename = "$text")]
text: (),
#[serde(rename = "$value")]
value: Vec<()>,
}
let data: List = from_str(
r#"
<root>
<item/>
<item/>
text
<![CDATA[cdata]]>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
text: (),
value: vec![(); 2],
}
);
}
mod xs_list {
use super::*;
#[derive(Debug, Deserialize, PartialEq)]
struct List {
#[serde(default)]
#[serde(rename = "$value")]
element: Vec<Vec<String>>,
}
#[test]
fn zero() {
let data: List = from_str(
r#"
<root>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(data, List { element: vec![] });
}
#[test]
fn one() {
let data: List = from_str(
r#"
<root>
<item>first list</item>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
element: vec![vec!["first".to_string(), "list".to_string()]]
}
);
}
#[test]
fn empty() {
let data: List = from_str(
r#"
<root>
<item/>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
element: vec![vec![]]
}
);
}
#[test]
fn element() {
#[derive(Debug, Deserialize, PartialEq)]
struct List {
#[serde(rename = "$value")]
element: Vec<String>,
}
let data: List = from_str(
r#"
<root>
<item>first item</item>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
element: vec!["first item".to_string()]
}
);
}
#[test]
fn many() {
let data: List = from_str(
r#"
<root>
<item>first list</item>
<item>second list</item>
</root>
"#,
)
.expect("should be Ok");
assert_eq!(
data,
List {
element: vec![
vec!["first".to_string(), "list".to_string()],
vec!["second".to_string(), "list".to_string()],
]
}
);
}
}