bracket 0.11.0

Fast and correct handlebars-compatible template engine
Documentation
use bracket::{
    parser::ast::{CallTarget, Node, Slice, ParameterValue},
    Registry, Result,
};

const NAME: &str = "slice.rs";

#[test]
fn slice_call() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{foo}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_escaped_call() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{{foo}}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_trim_call() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{~foo~}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_block() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{#if true}}{{foo}}{{/if}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_raw_block() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{{{raw}}}}{{foo}}{{{{/raw}}}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_comment() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{!foo}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_raw_comment() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{!-- foo --}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    assert_eq!(value, node.as_str());
    Ok(())
}

#[test]
fn slice_call_interspersed() -> Result<()> {
    let registry = Registry::new();
    let value = r"bar {{foo}} qux";
    let template = registry.parse(NAME, value)?;
    let mut it = template.node().into_iter();
    let node = it.next().unwrap();
    assert_eq!("bar ", node.as_str());
    let node = it.next().unwrap();
    assert_eq!("{{foo}}", node.as_str());
    let node = it.next().unwrap();
    assert_eq!(" qux", node.as_str());
    Ok(())
}

#[test]
fn slice_path_identifier() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{foo}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    if let Node::Statement(ref call) = node {
        if let CallTarget::Path(ref path) = call.target() {
            assert_eq!("foo", path.as_str());
        } else {
            panic!("Expecting path call target!");
        }
    } else {
        panic!("Expecting statement node!");
    }
    Ok(())
}

#[test]
fn slice_path_nested() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{foo.bar.qux}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    if let Node::Statement(ref call) = node {
        if let CallTarget::Path(ref path) = call.target() {
            assert_eq!("foo.bar.qux", path.as_str());
        } else {
            panic!("Expecting path call target!");
        }
    } else {
        panic!("Expecting statement node!");
    }
    Ok(())
}

#[test]
fn slice_path_root() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{@root.foo}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    if let Node::Statement(ref call) = node {
        if let CallTarget::Path(ref path) = call.target() {
            assert_eq!("@root.foo", path.as_str());
        } else {
            panic!("Expecting path call target!");
        }
    } else {
        panic!("Expecting statement node!");
    }
    Ok(())
}

#[test]
fn slice_path_parents() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{../../../foo/bar.txt}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    if let Node::Statement(ref call) = node {
        if let CallTarget::Path(ref path) = call.target() {
            assert_eq!("../../../foo/bar.txt", path.as_str());
        } else {
            panic!("Expecting path call target!");
        }
    } else {
        panic!("Expecting statement node!");
    }
    Ok(())
}

#[test]
fn slice_path_absolute() -> Result<()> {
    let registry = Registry::new();
    let value = r"{{include /foo/bar.txt}}";
    let template = registry.parse(NAME, value)?;
    let node = template.node().into_iter().next().unwrap();
    if let Node::Statement(ref call) = node {
        if let CallTarget::Path(ref path) = call.target() {
            assert_eq!("include", path.as_str());
            assert_eq!(1, call.arguments().len());
            let arg = call.arguments().first().unwrap();
            if let ParameterValue::Path(ref path) = arg {
                assert_eq!(true, path.absolute());
            } else {
                panic!("Expecting path for argument parameter value!");
            }

        } else {
            panic!("Expecting path call target!");
        }
    } else {
        panic!("Expecting statement node!");
    }
    Ok(())
}