use maud::html;
#[test]
fn if_expr() {
for (number, &name) in (1..4).zip(["one", "two", "three"].iter()) {
let result = html! {
@if number == 1 {
"one"
} @else if number == 2 {
"two"
} @else if number == 3 {
"three"
} @else {
"oh noes"
}
};
assert_eq!(result.into_string(), name);
}
}
#[test]
fn if_expr_in_class() {
for &(chocolate_milk, expected) in &[
(0, r#"
Chocolate milk
"#),
(1, r#"Chocolate milk
"#),
] {
let result = html! {
p.@if chocolate_milk == 0 { "empty" } @else { "full" } {
"Chocolate milk"
}
};
assert_eq!(result.into_string(), expected);
}
}
#[test]
fn if_let() {
for &(input, output) in &[(Some("yay"), "yay"), (None, "oh noes")] {
let result = html! {
@if let Some(value) = input {
(value)
} @else {
"oh noes"
}
};
assert_eq!(result.into_string(), output);
}
}
#[test]
fn while_expr() {
let mut numbers = (0..3).peekable();
let result = html! {
ul {
@while numbers.peek().is_some() {
li { (numbers.next().unwrap()) }
}
}
};
assert_eq!(
result.into_string(),
""
);
}
#[test]
fn while_let_expr() {
let mut numbers = 0..3;
#[allow(clippy::while_let_on_iterator)]
let result = html! {
ul {
@while let Some(n) = numbers.next() {
li { (n) }
}
}
};
assert_eq!(
result.into_string(),
""
);
}
#[test]
fn for_expr() {
let ponies = ["Apple Bloom", "Scootaloo", "Sweetie Belle"];
let result = html! {
ul {
@for pony in &ponies {
li { (pony) }
}
}
};
assert_eq!(
result.into_string(),
concat!(
"",
"- Apple Bloom
",
"- Scootaloo
",
"- Sweetie Belle
",
"
"
)
);
}
#[test]
fn match_expr() {
for &(input, output) in &[(Some("yay"), "yay
"), (None, "oh noes")] {
let result = html! {
@match input {
Some(value) => {
div { (value) }
},
None => {
"oh noes"
},
}
};
assert_eq!(result.into_string(), output);
}
}
#[test]
fn match_expr_without_delims() {
for &(input, output) in &[(Some("yay"), "yay"), (None, "oh noes")] {
let result = html! {
@match input {
Some(value) => (value),
None => span { "oh noes" },
}
};
assert_eq!(result.into_string(), output);
}
}
#[test]
fn match_no_trailing_comma() {
for &(input, output) in &[(Some("yay"), "yay"), (None, "oh noes")] {
let result = html! {
@match input {
Some(value) => { (value) }
None => span { "oh noes" }
}
};
assert_eq!(result.into_string(), output);
}
}
#[test]
fn match_expr_with_guards() {
for &(input, output) in &[(Some(1), "one"), (None, "none"), (Some(2), "2")] {
let result = html! {
@match input {
Some(value) if value % 3 == 1 => "one",
Some(value) => (value),
None => "none",
}
};
assert_eq!(result.into_string(), output);
}
}
#[test]
fn match_in_attribute() {
for &(input, output) in &[
(1, "1"),
(2, "2"),
(3, "3"),
] {
let result = html! {
span class=@match input {
1 => "one",
2 => "two",
_ => "many",
} { (input) }
};
assert_eq!(result.into_string(), output);
}
}
#[test]
fn let_expr() {
let result = html! {
@let x = 42;
"I have " (x) " cupcakes!"
};
assert_eq!(result.into_string(), "I have 42 cupcakes!");
}
#[test]
fn let_lexical_scope() {
let x = 42;
let result = html! {
{
@let x = 99;
"Twilight thought I had " (x) " cupcakes, "
}
"but I only had " (x) "."
};
assert_eq!(
result.into_string(),
concat!("Twilight thought I had 99 cupcakes, ", "but I only had 42.")
);
}
#[test]
fn let_type_ascription() {
let result = html! {
@let mut x: Box> = Box::new(vec![42].into_iter());
"I have " (x.next().unwrap()) " cupcakes!"
};
assert_eq!(result.into_string(), "I have 42 cupcakes!");
}