yfelo 0.1.1

the Yfelo template engine
Documentation
use std::marker::PhantomData;

use dyn_std::Instance;
use once_cell::sync::Lazy;
use yfelo::{MetaSyntax, SyntaxError, Yfelo};
use yfelo::default::{Context, Expr, Language, Pattern};

const YFELO: Lazy<Yfelo> = Lazy::new(|| Yfelo::new());

const LANG: Lazy<Box<dyn yfelo::Language>> = Lazy::new(|| Box::new(PhantomData::<(Language, Expr, Pattern)>));

const META_SYNTAX: MetaSyntax = MetaSyntax {
    left: "{",
    right: "}",
};

#[test]
pub fn parse_1() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{#if}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "invalid syntax for directive 'if': expect expression".into(),
        range: (4, 4),
    });
}

#[test]
pub fn parse_2() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{#if x x}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "invalid tag syntax: expect '}'".into(),
        range: (7, 7),
    });
}

#[test]
pub fn parse_3() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{@if}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "directive 'if' should not be empty".into(),
        range: (2, 4),
    });
}

#[test]
pub fn parse_4() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{#if x}{:else y}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "invalid tag syntax: expect '}'".into(),
        range: (14, 14),
    });
}

#[test]
pub fn parse_5() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{#if x}{:else}{:else}{/if}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "'else' cannot come after 'else'".into(),
        range: (16, 20),
    });
}

#[test]
pub fn parse_6() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{#if x}{:elif}{:else}{/if}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "invalid syntax for directive 'elif': expect expression".into(),
        range: (13, 13),
    });
}

#[test]
pub fn parse_7() {
    let (y, l) = (YFELO, LANG);
    let error = y.parse("{#if x}{:else}{:elif x}{/if}", l.as_ref(), &META_SYNTAX).unwrap_err();
    assert_eq!(error, SyntaxError {
        message: "'elif' cannot come after 'else'".into(),
        range: (16, 20),
    });
}

#[test]
pub fn render_1() {
    let (y, l) = (YFELO, LANG);
    let mut ctx: Box<dyn yfelo::Context> = Box::new(Instance::new(Context::new()));
    let output = y.render("
        {#if true}
            Hello
        {:else}
            World
        {/if}
    ", l.as_ref(), &META_SYNTAX, ctx.as_mut()).unwrap();
    assert_eq!(output, "Hello");
}

#[test]
pub fn render_2() {
    let (y, l) = (YFELO, LANG);
    let mut ctx: Box<dyn yfelo::Context> = Box::new(Instance::new(Context::new()));
    let output = y.render("
        {#if false}
            Hello
        {:else}
            World
        {/if}
    ", l.as_ref(), &META_SYNTAX, ctx.as_mut()).unwrap();
    assert_eq!(output, "World");
}

#[test]
pub fn render_3() {
    let (y, l) = (YFELO, LANG);
    let mut ctx: Box<dyn yfelo::Context> = Box::new(Instance::new(Context::new()));
    let output = y.render("
        {#if false}
            Hello
        {:elif true}
            World
        {:else}
            Yfelo
        {/if}
    ", l.as_ref(), &META_SYNTAX, ctx.as_mut()).unwrap();
    assert_eq!(output, "World");
}

#[test]
pub fn render_4() {
    let (y, l) = (YFELO, LANG);
    let mut ctx: Box<dyn yfelo::Context> = Box::new(Instance::new(Context::new()));
    let output = y.render("
        {#if false}
            Hello
        {:elif false}
            World
        {:elif false}
            Yfelo
        {/if}
    ", l.as_ref(), &META_SYNTAX, ctx.as_mut()).unwrap();
    assert_eq!(output, "");
}

#[test]
pub fn render_5() {
    let (y, l) = (YFELO, LANG);
    let mut ctx: Box<dyn yfelo::Context> = Box::new(Instance::new(Context::new()));
    let output = y.render("
        {#if false}
            Hello
        {:elif false}
            World
        {:elif true}
            Yfelo
        {/if}
    ", l.as_ref(), &META_SYNTAX, ctx.as_mut()).unwrap();
    assert_eq!(output, "Yfelo");
}