use hyperchad_template::{ContainerVecExt, container};
#[test]
fn literals() {
let result = container! { ("<pinkie>") };
assert_eq!(result.display_to_string(false, false).unwrap(), "<pinkie>");
}
#[test]
fn blocks() {
let result = container! {
({
let mut result = 1i32;
for i in 2..11 {
result *= i;
}
result
})
};
assert_eq!(result.display_to_string(false, false).unwrap(), "3628800");
}
#[test]
fn string_interpolation() {
let name = "Pinkie Pie";
let result = container! { "Hello, " (name) "!" };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"Hello, Pinkie Pie!"
);
}
#[test]
fn numeric_interpolation() {
let number = 42;
let result = container! { "The answer is " (number) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"The answer is 42"
);
}
#[test]
fn attributes() {
let alt = "Pinkie Pie";
let result = container! { image src="pinkie.jpg" alt=(alt); };
assert_eq!(
result.display_to_string(false, false).unwrap(),
r#"<img src="pinkie.jpg" alt="Pinkie Pie" />"#
);
}
#[test]
fn class_shorthand() {
let _pinkie_class = "pinkie";
let result = container! { div.pinkie { "Fun!" } };
assert_eq!(
result.display_to_string(false, false).unwrap(),
r#"<div class="pinkie">Fun!</div>"#
);
}
#[test]
fn class_shorthand_block() {
let _class_prefix = "pinkie-";
let result = container! { div.pinkie-123 { "Fun!" } };
assert_eq!(
result.display_to_string(false, false).unwrap(),
r#"<div class="pinkie-123">Fun!</div>"#
);
}
#[test]
fn id_shorthand() {
let pinkie_id = "pinkie";
let result = container! { div #(pinkie_id) { "Fun!" } };
assert_eq!(
result.display_to_string(false, false).unwrap(),
r#"<div id="pinkie">Fun!</div>"#
);
}
static BEST_PONY: &str = "Pinkie Pie";
#[test]
fn statics() {
let result = container! { (BEST_PONY) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"Pinkie Pie"
);
}
#[test]
fn locals() {
let best_pony = "Pinkie Pie";
let result = container! { (best_pony) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"Pinkie Pie"
);
}
struct Creature {
name: &'static str,
adorableness: u32,
}
impl Creature {
fn repugnance(&self) -> u32 {
10 - self.adorableness
}
}
#[test]
fn structs() {
let pinkie = Creature {
name: "Pinkie Pie",
adorableness: 9,
};
let result = container! {
"Name: " (pinkie.name) ". Rating: " (pinkie.repugnance())
};
assert_eq!(
result.display_to_string(false, false).unwrap(),
"Name: Pinkie Pie. Rating: 1"
);
}
#[test]
fn tuple_accessors() {
let a = ("ducks", "geese");
let result = container! { (a.0) };
assert_eq!(result.display_to_string(false, false).unwrap(), "ducks");
}
#[test]
fn splice_with_path() {
mod inner {
pub fn name() -> &'static str {
"Maud"
}
}
let result = container! { (inner::name()) };
assert_eq!(result.display_to_string(false, false).unwrap(), "Maud");
}
#[test]
fn nested_macro_invocation() {
let best_pony = "Pinkie Pie";
let result = container! { (format!("{best_pony} is best pony")) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"Pinkie Pie is best pony"
);
}
#[test]
fn expression_grouping() {
let result = container! { (1 + 1) };
assert_eq!(result.display_to_string(false, false).unwrap(), "2");
}
#[test]
fn multiple_expressions() {
let x = 5;
let y = 10;
let result = container! { (x) " + " (y) " = " (x + y) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"5 + 10 = 15"
);
}
#[test]
fn boolean_expressions() {
let is_true = true;
let is_false = false;
let result = container! { (is_true) " and " (is_false) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"true and false"
);
}
#[test]
fn array_access() {
let items = ["apple", "banana", "cherry"];
let result = container! { (items[0]) " and " (items[2]) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"apple and cherry"
);
}
#[test]
fn method_calls() {
let text = "Hello World";
let result = container! { (text.to_lowercase()) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"hello world"
);
}
#[test]
fn chained_method_calls() {
let text = " Hello World ";
let result = container! { (text.trim().to_uppercase()) };
assert_eq!(
result.display_to_string(false, false).unwrap(),
"HELLO WORLD"
);
}
#[test]
fn option_handling() {
let some_value = Some("exists");
let none_value: Option<&str> = None;
let result = container! {
(some_value.unwrap_or("default")) " "
(none_value.unwrap_or("default"))
};
assert_eq!(
result.display_to_string(false, false).unwrap(),
"exists default"
);
}
#[test]
fn vector_operations() {
let numbers = [1, 2, 3, 4, 5];
let result = container! {
"Length: " (numbers.len()) ", Sum: " (numbers.iter().sum::<i32>())
};
assert_eq!(
result.display_to_string(false, false).unwrap(),
"Length: 5, Sum: 15"
);
}