extern crate rustache;
use rustache::{HashBuilder, Render};
use std::io::Cursor;
#[test]
fn test_spec_interpolation_none() {
let data = HashBuilder::new();
let mut rv = Cursor::new(Vec::new());
data.render("Hello from {Mustache}!", &mut rv).unwrap();
assert_eq!("Hello from {Mustache}!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_basic() {
let data = HashBuilder::new().insert("subject", "world");
let mut rv = Cursor::new(Vec::new());
data.render("Hello, {{subject}}!", &mut rv).unwrap();
assert_eq!("Hello, world!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_html_escaping() {
let data = HashBuilder::new().insert("forbidden", "& \" < >");
let mut rv = Cursor::new(Vec::new());
data.render("These characters should be HTML escaped: {{forbidden}}", &mut rv).unwrap();
assert_eq!("These characters should be HTML escaped: & " < >".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_no_html_escaping_triple_mustache() {
let data = HashBuilder::new().insert("forbidden", "& \" < >");
let mut rv = Cursor::new(Vec::new());
data.render("These characters should not be HTML escaped: {{{forbidden}}}", &mut rv).unwrap();
assert_eq!("These characters should not be HTML escaped: & \" < >".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_no_html_escaping_ampersand() {
let data = HashBuilder::new().insert("forbidden", "& \" < >");
let mut rv = Cursor::new(Vec::new());
data.render("These characters should not be HTML escaped: {{&forbidden}}", &mut rv).unwrap();
assert_eq!("These characters should not be HTML escaped: & \" < >".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_integer_basic() {
let data = HashBuilder::new().insert("mph", 85);
let mut rv = Cursor::new(Vec::new());
data.render("{{mph}} miles an hour!", &mut rv).unwrap();
assert_eq!("85 miles an hour!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_integer_triple_mustache() {
let data = HashBuilder::new().insert("mph", 85);
let mut rv = Cursor::new(Vec::new());
data.render("{{{mph}}} miles an hour!", &mut rv).unwrap();
assert_eq!("85 miles an hour!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_integer_ampersand() {
let data = HashBuilder::new().insert("mph", 85);
let mut rv = Cursor::new(Vec::new());
data.render("{{mph}} miles an hour!", &mut rv).unwrap();
assert_eq!("85 miles an hour!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_float_basic() {
let data = HashBuilder::new().insert("power", 1.210);
let mut rv = Cursor::new(Vec::new());
data.render("{{power}} jiggawatts!", &mut rv).unwrap();
assert_eq!("1.21 jiggawatts!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_float_triple_mustache() {
let data = HashBuilder::new().insert("power", 1.210);
let mut rv = Cursor::new(Vec::new());
data.render("{{{power}}} jiggawatts!", &mut rv).unwrap();
assert_eq!("1.21 jiggawatts!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_float_ampersand() {
let data = HashBuilder::new().insert("power", 1.210);
let mut rv = Cursor::new(Vec::new());
data.render("{{&power}} jiggawatts!", &mut rv).unwrap();
assert_eq!("1.21 jiggawatts!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_context_miss() {
let data = HashBuilder::new();
let mut rv = Cursor::new(Vec::new());
data.render("I ({{cannot}}) be seen!", &mut rv).unwrap();
assert_eq!("I () be seen!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_context_miss_triple_mustache() {
let data = HashBuilder::new();
let mut rv = Cursor::new(Vec::new());
data.render("I ({{{cannot}}}) be seen!", &mut rv).unwrap();
assert_eq!("I () be seen!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_context_miss_ampersand() {
let data = HashBuilder::new();
let mut rv = Cursor::new(Vec::new());
data.render("I ({{cannot}}) be seen!", &mut rv).unwrap();
assert_eq!("I () be seen!".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_names_basic() {
let data = HashBuilder::new().insert("person", HashBuilder::new().insert("name", "Joe"));
let mut rv = Cursor::new(Vec::new());
data.render("\"{{person.name}}\" == \"{{#person}}{{name}}{{/person}}\"", &mut rv).unwrap();
assert_eq!("\"Joe\" == \"Joe\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_names_triple_mustache() {
let data = HashBuilder::new()
.insert("person", HashBuilder::new()
.insert("name", "Joe")
);
let mut rv = Cursor::new(Vec::new());
data.render("\"{{{person.name}}}\" == \"{{#person}}{{{name}}}{{/person}}\"", &mut rv).unwrap();
assert_eq!("\"Joe\" == \"Joe\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_names_ampersand() {
let data = HashBuilder::new()
.insert("person", HashBuilder::new()
.insert("name", "Joe")
);
let mut rv = Cursor::new(Vec::new());
data.render("\"{{&person.name}}\" == \"{{#person}}{{&name}}{{/person}}\"", &mut rv).unwrap();
assert_eq!("\"Joe\" == \"Joe\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_names_arbitrary_depth() {
let data = HashBuilder::new()
.insert("a", HashBuilder::new()
.insert("b", HashBuilder::new()
.insert("c", HashBuilder::new()
.insert("d", HashBuilder::new()
.insert("e", HashBuilder::new()
.insert("name", "Phil")
)
)
)
)
);
let mut rv = Cursor::new(Vec::new());
data.render("\"{{a.b.c.d.e.name}}\" == \"Phil\"", &mut rv).unwrap();
assert_eq!("\"Phil\" == \"Phil\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_broken_chains() {
let data = HashBuilder::new();
let mut rv = Cursor::new(Vec::new());
data.render("\"{{a.b.c}}\" == \"\"", &mut rv).unwrap();
assert_eq!("\"\" == \"\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_broken_chain_resolution() {
let data = HashBuilder::new()
.insert("a", HashBuilder::new()
.insert("b", HashBuilder::new())
)
.insert("c", HashBuilder::new()
.insert("name", "Jim")
);
let mut rv = Cursor::new(Vec::new());
data.render("\"{{a.b.c}}\" == \"\"", &mut rv).unwrap();
assert_eq!("\"\" == \"\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_initial_resolution() {
let data = HashBuilder::new()
.insert("a", HashBuilder::new()
.insert("b", HashBuilder::new()
.insert("c", HashBuilder::new()
.insert("d", HashBuilder::new()
.insert("e", HashBuilder::new()
.insert("name", "Phil")
)
)
)
)
)
.insert("b", HashBuilder::new()
.insert("c", HashBuilder::new()
.insert("d", HashBuilder::new()
.insert("e", HashBuilder::new()
.insert("name", "Wrong")
)
)
)
);
let mut rv = Cursor::new(Vec::new());
data.render("\"{{#a}}{{b.c.d.e.name}}{{/a}}\" == \"Phil\"", &mut rv).unwrap();
assert_eq!("\"Phil\" == \"Phil\"".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_dotted_context_precedence() {
let data = HashBuilder::new()
.insert("a", HashBuilder::new()
.insert("b", HashBuilder::new())
)
.insert("b", HashBuilder::new()
.insert("c", HashBuilder::new()
.insert("name", "ERROR")
)
);
let mut rv = Cursor::new(Vec::new());
data.render("{{#a}}{{b.c}}{{/a}}", &mut rv).unwrap();
assert_eq!("".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_surrounding_whitespace_basic() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render("| {{string}} |", &mut rv).unwrap();
assert_eq!("| --- |".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_surrounding_whitespace_triple_mustache() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render("| {{{string}}} |", &mut rv).unwrap();
assert_eq!("| --- |".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_surrounding_whitespace_ampersand() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render("| {{&string}} |", &mut rv).unwrap();
assert_eq!("| --- |".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_standalone_basic() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render(" {{string}}\n", &mut rv).unwrap();
assert_eq!(" ---\n".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_standalone_triple_mustache() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render(" {{{string}}}\n", &mut rv).unwrap();
assert_eq!(" ---\n".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_standalone_ampersand() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render(" {{&string}}\n", &mut rv).unwrap();
assert_eq!(" ---\n".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_with_padding() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render("|{{ string }}|", &mut rv).unwrap();
assert_eq!("|---|".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_triple_mustache_with_padding() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render("|{{{ string }}}|", &mut rv).unwrap();
assert_eq!("|---|".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}
#[test]
fn test_spec_interpolation_ampersand_with_padding() {
let data = HashBuilder::new().insert("string", "---");
let mut rv = Cursor::new(Vec::new());
data.render("|{{& string }}|", &mut rv).unwrap();
assert_eq!("|---|".to_string(), String::from_utf8(rv.into_inner()).unwrap());
}