twig 0.1.0

Twig templating engine for Rust; work in progress.
Documentation
extern crate twig;

use super::support;
use twig::nodes::expr::{ Expr, ExprValue };

#[test]
#[should_panic(
    expected = r#"Unexpected token "string" of value "b" ("end of print statement" expected)"#
)]
fn test_string_expression_does_not_concatenate_two_consecutive_strings() {
    support::unwrap_or_display(
        support::maybe_parsed(r#"{{ "a" "b" }}"#)
    );
}

#[test]
fn test_string_expression() {
    for (template, expected) in get_tests_for_string() {
        let module = support::expect_parsed(template);
        assert_eq!(module.body.expect_print(), &expected);
    }
}

fn get_tests_for_string<'r>() -> Vec<(&'static str, Expr<'r>)> {
    vec![
        (r#"{{ "foo" }}"#, Expr::new_str_constant("foo", 1)),
        (r#"{{ "foo #{bar}" }}"#, Expr::new_at(ExprValue::Concat {
            left: Box::new(Expr::new_str_constant("foo ", 1)),
            right: Box::new(Expr::new_name("bar", 1)),
        }, 1)),
        (r#"{{ "foo #{bar} baz" }}"#, Expr::new_at(ExprValue::Concat {
            left: Box::new(Expr::new_at(ExprValue::Concat {
                left: Box::new(Expr::new_str_constant("foo ", 1)),
                right: Box::new(Expr::new_name("bar", 1)),
            }, 1)),
            right: Box::new(Expr::new_str_constant(" baz", 1)),
        }, 1)),
        (r#"{{ "foo #{"foo #{bar} baz"} baz" }}"#, Expr::new_at(ExprValue::Concat {
            left: Box::new(Expr::new_at(ExprValue::Concat {
                left: Box::new(Expr::new_str_constant("foo ", 1)),
                right: Box::new(Expr::new_at(ExprValue::Concat {
                    left: Box::new(Expr::new_at(ExprValue::Concat {
                        left: Box::new(Expr::new_str_constant("foo ", 1)),
                        right: Box::new(Expr::new_name("bar", 1)),
                    }, 1)),
                    right: Box::new(Expr::new_str_constant(" baz", 1)),
                }, 1)),
            }, 1)),
            right: Box::new(Expr::new_str_constant(" baz", 1)),
        }, 1)),
    ]
}