#[test]
fn each_generates_the_item_type() {
mod template {
typed_handlebars::str!(
"test",
r#"<ul>{{#each rows}}<li>{{name}} {{email}}</li>{{/each}}</ul>"#
);
}
assert_eq!(
template::test::Vars {
rows: vec![
template::test::RowsItem {
name: "King",
email: "king@example.com"
},
template::test::RowsItem {
name: "Tubby",
email: "tubby@example.com"
},
]
}
.render(),
"<ul><li>King king@example.com</li><li>Tubby tubby@example.com</li></ul>"
);
}
#[test]
fn each_over_plain_values_needs_no_item_type() {
mod template {
typed_handlebars::str!("test", r#"{{#each tags}}[{{this}}]{{/each}}"#);
}
assert_eq!(
template::test::Vars {
tags: vec!["a", "b"]
}
.render(),
"[a][b]"
);
assert_eq!(
template::test::Vars { tags: [1, 2, 3] }.render(),
"[1][2][3]"
);
}
#[test]
fn nested_each_generates_nested_item_types() {
mod template {
typed_handlebars::str!(
"test",
r#"{{#each rows}}<tr>{{#each cells}}<td>{{value}}</td>{{/each}}</tr>{{/each}}"#
);
}
let rows = vec![
template::test::RowsItem {
cells: vec![
template::test::RowsItemCellsItem { value: 1 },
template::test::RowsItemCellsItem { value: 2 },
],
},
template::test::RowsItem {
cells: vec![template::test::RowsItemCellsItem { value: 3 }],
},
];
assert_eq!(
template::test::Vars { rows }.render(),
"<tr><td>1</td><td>2</td></tr><tr><td>3</td></tr>"
);
}
#[test]
fn dotted_paths_generate_a_record_type() {
mod template {
typed_handlebars::str!("test", r#"{{person.firstname}} {{person.lastname}}"#);
}
assert_eq!(
template::test::Vars {
person: template::test::Person {
firstname: "King",
lastname: "Tubby"
}
}
.render(),
"King Tubby"
);
}
#[test]
fn variable_names_may_be_rust_keywords() {
mod template {
typed_handlebars::str!(
"test",
r#"[{{ type }}][{{ match }}][{{ fn }}][{{ self }}][{{ crate }}][{{ loop }}]"#
);
}
assert_eq!(
template::test::Vars {
type_: "a",
match_: "b",
fn_: "c",
self_: "d",
crate_: "e",
loop_: "f"
}
.render(),
"[a][b][c][d][e][f]"
);
assert_eq!(
template::test::builder().type_("a").self_("d").render(),
"[a][][][d][][]"
);
}
#[test]
fn variable_names_may_start_with_a_digit() {
mod template {
typed_handlebars::str!("test", r#"[{{ 2nd }}][{{ 42 }}]"#);
}
assert_eq!(
template::test::Vars {
_2nd: "silver",
_42: "answer"
}
.render(),
"[silver][answer]"
);
}
#[test]
fn testing_the_item_itself_bounds_it() {
mod printed_too {
typed_handlebars::str!(
"test",
"{{#each xs}}{{#if this}}[{{this}}]{{/if}}{{/each}}"
);
}
assert_eq!(
printed_too::test::Vars { xs: vec![1, 0, 2] }.render(),
"[1][2]"
);
mod negated {
typed_handlebars::str!(
"test",
"{{#each xs}}{{#unless this}}n{{/unless}}{{/each}}"
);
}
assert_eq!(negated::test::Vars { xs: vec![1, 0] }.render(), "n");
mod through_an_alias {
typed_handlebars::str!(
"test",
"{{#each xs as |x|}}{{#if x}}[{{x}}]{{/if}}{{/each}}"
);
}
assert_eq!(
through_an_alias::test::Vars { xs: vec!["a", ""] }.render(),
"[a]"
);
mod nested {
typed_handlebars::str!(
"test",
"{{#each rows}}{{#each cells}}{{#if this}}[{{this}}]{{/if}}{{/each}};{{/each}}"
);
}
assert_eq!(
nested::test::Vars {
rows: vec![
nested::test::RowsItem { cells: vec![1, 0] },
nested::test::RowsItem { cells: vec![2] },
]
}
.render(),
"[1];[2];"
);
}
#[test]
fn an_item_that_is_only_tested_needs_no_display() {
struct OnlyTruthy(bool);
impl typed_handlebars::Truthy for OnlyTruthy {
fn is_truthy(&self) -> bool {
self.0
}
}
mod template {
typed_handlebars::str!(
"test",
"{{#each xs}}{{#if this}}y{{/if}}{{/each}}"
);
}
assert_eq!(
template::test::Vars {
xs: vec![OnlyTruthy(true), OnlyTruthy(false)]
}
.render(),
"y"
);
}
#[test]
fn a_variable_may_be_called_vars_or_builder() {
mod clashes_with_the_type {
typed_handlebars::str!("test", r#"[{{ vars.x }}]"#);
}
assert_eq!(
clashes_with_the_type::test::Vars {
vars: clashes_with_the_type::test::Vars_ { x: 1 }
}
.render(),
"[1]"
);
mod clashes_with_the_builder {
typed_handlebars::str!("test", r#"[{{ builder.x }}]"#);
}
assert_eq!(
clashes_with_the_builder::test::Vars {
builder: clashes_with_the_builder::test::Builder_ { x: 2 }
}
.render(),
"[2]"
);
assert_eq!(
clashes_with_the_type::test::builder()
.vars(clashes_with_the_type::test::Vars_::builder().x(3).build())
.render(),
"[3]"
);
}
#[test]
fn generated_names_give_way_in_template_order() {
mod item {
typed_handlebars::str!(
"test",
r#"[{{ rows_item.x }}|{{#each rows}}{{y}}{{/each}}]"#
);
}
assert_eq!(
item::test::Vars {
rows_item: item::test::RowsItem { x: 1 },
rows: vec![item::test::RowsItem_ { y: 2 }],
}
.render(),
"[1|2]"
);
mod builder {
typed_handlebars::str!("test", r#"[{{ person_builder.x }}|{{ person.y }}]"#);
}
assert_eq!(
builder::test::Vars {
person_builder: builder::test::PersonBuilder { x: 3 },
person: builder::test::Person_ { y: 4 },
}
.render(),
"[3|4]"
);
}