#![feature(test)]

extern crate test;

use liquid::ParserBuilder;
use liquid::value::{Object, Value};

static SOURCE: &'static str = "<html>
  <head>
    <title>{{year}}</title>
  </head>
  <body>
    <h1>CSL {{year}}</h1>
    <ul>
    {% for team in teams %}
      <li class=\"{% if forloop.first %}champion{% endif %}\">
      <b>{{team.name}}</b>: {{team.score}}
      </li>
    {% endfor %}
    </ul>
  </body>
</html>";

fn make_team(name: &'static str, score: u16) -> Value {
    let mut team = Object::new();
    team.insert("name".into(), Value::scalar(name));
    team.insert("score".into(), Value::scalar(score as i32));
    Value::Object(team)
}

#[bench]
fn render_template(b: &mut test::Bencher) {
    let template = test::black_box(ParserBuilder::with_liquid().build().unwrap().parse(SOURCE).unwrap());
    let mut globals = test::black_box({
        let mut globals = Object::new();
        globals.insert("year".into(), Value::scalar(2015));
        let teams = vec![
            make_team("Jiangsu", 43),
            make_team("Beijing", 27),
            make_team("Guangzhou", 22),
            make_team("Shandong", 12),
        ];
        globals.insert("teams".into(), Value::Array(teams));
        globals
    });
    b.iter(|| template.render(&mut globals).unwrap());
}