use crate::{input::TemplateInput, template::Template, value::Value};
macro_rules! template_test {
($name:ident, $input:expr, $tpl:literal, $expected:literal) => {
#[test]
fn $name() {
let tpl = Template::parse($tpl).unwrap();
assert_eq!(tpl.render(&$input).unwrap(), $expected);
}
};
}
struct Input;
impl TemplateInput for Input {
fn get(&self, key: &str) -> Option<Value> {
if key == "meow" {
Some(Value::String("gay".to_owned()))
} else if key == "meows" {
Some(Value::List(vec![
Value::String("meow".to_owned()),
Value::String("nyan".to_owned()),
Value::String("miauw".to_owned()),
Value::String("nyaa".to_owned()),
]))
} else {
None
}
}
}
fn make_input() -> Input {
Input
}
template_test!(empty, make_input(), "", "");
template_test!(literal_meow, make_input(), "meow", "meow");
template_test!(stache_meow, make_input(), "{{meow}}", "gay");
template_test!(
if_statement_var,
make_input(),
"{% if meow %}woa{% end %}{% if meows %} x3{% end %}",
"woa x3"
);
template_test!(
if_statement_true,
make_input(),
"{% if true %}woa{% end %}",
"woa"
);
template_test!(
if_statement_false,
make_input(),
"{% if false %}woa{% end %}",
""
);
template_test!(
if_statement_null,
make_input(),
"{% if null %}woa{% end %}",
""
);
template_test!(
if_statement_string_empty,
make_input(),
r#"{% if "" %}woa{% end %}"#,
""
);
template_test!(
if_statement_string_flirty,
make_input(),
r#"{% if "hi ur cute ;3" %}woa{% end %}"#,
"woa"
);
template_test!(
if_statement_list_empty,
make_input(),
r#"{% if [] %}woa{% end %}"#,
""
);
template_test!(
if_statement_list_aggressive,
make_input(),
r#"{% if ["woa gowai >:("] %}woa{% end %}"#,
"woa"
);
template_test!(
for_statement_var_1,
make_input(),
r#"{% for item in meows %}woa{% end %}"#,
"woawoawoawoa"
);
template_test!(
for_statement_var_2,
make_input(),
r#"{% for item in meows %}woa{{item}}{% end %}"#,
"woameowwoanyanwoamiauwwoanyaa"
);
template_test!(
for_statement_literal,
make_input(),
r#"hi{% for item in ["uwu", "owo", "awa"] %} {{item}}{% end %}"#,
"hi uwu owo awa"
);
template_test!(
let_1,
make_input(),
r#"{% let x3 = "x3" %}*nuzzles u* {{ x3 }}"#,
"*nuzzles u* x3"
);
template_test!(
let_2,
make_input(),
r#"{% let nyan = meow %}*nuzzles u* {{ nyan }}"#,
"*nuzzles u* gay"
);
template_test!(
stuff,
make_input(),
r#"hewo! {% let nyan = meow %}{% let nya = null %}{% if nyan %}you are {{meow}}{% end %}{% if nya %}oh noes!{% end %} {% for meow in meows %}{{meow}} {% end %}{{meow}}{% if false %}nope{% end %}{% if null %}nope{% end %}{% if true %} yuh{% end %}"#,
"hewo! you are gay meow nyan miauw nyaa gay yuh"
);