@Test
  public void renderTest() throws RecognitionException {

    String[][] tests = {
      {"{% assign name = 'freestyle' %}{{ name }}", "freestyle"},
      {"{% assign age = 42 %}{{ age }}", "42"},
    };

    for (String[] test : tests) {

      Template template = Template.parse(test[0]);
      String rendered = String.valueOf(template.render());

      assertThat(rendered, is(test[1]));
    }

    String json = "{\"values\":[\"A\", [\"B1\", \"B2\"], \"C\"]}";

    assertThat(
        Template.parse("{% assign foo = values %}.{{ foo[1][1] }}.").render(json), is(".B2."));

    json = "{\"values\":[\"A\", {\"bar\":{\"xyz\":[\"B1\", \"ok\"]}}, \"C\"]}";

    assertThat(
        Template.parse("{% assign foo = values %}.{{ foo[1].bar.xyz[1] }}.").render(json),
        is(".ok."));
  }
  /*
   * def test_assign
   *   assigns = {'var' => 'content' }
   *   assert_template_result('var2:  var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns)
   *
   * end
   */
  @Test
  public void assignTest() throws Exception {

    assertThat(
        Template.parse("var2:{{var2}} {%assign var2 = var%} var2:{{var2}}")
            .render(" { \"var\" : \"content\" } "),
        is("var2:  var2:content"));
  }
  /*
   * def test_assigned_variable
   *   assert_template_result('.foo.',
   *                          '{% assign foo = values %}.{{ foo[0] }}.',
   *                          'values' => %w{foo bar baz})
   *
   *   assert_template_result('.bar.',
   *                          '{% assign foo = values %}.{{ foo[1] }}.',
   *                          'values' => %w{foo bar baz})
   * end
   *
   * def test_assign_with_filter
   *   assert_template_result('.bar.',
   *                          '{% assign foo = values | split: "," %}.{{ foo[1] }}.',
   *                          'values' => "foo,bar,baz")
   * end
   */
  @Test
  public void applyOriginalTest() {

    final String[] values = {"foo", "bar", "baz"};

    assertThat(
        Template.parse("{% assign foo = values %}.{{ foo[0] }}.").render("values", values),
        is(".foo."));
    assertThat(
        Template.parse("{% assign foo = values %}.{{ foo[1] }}.").render("values", values),
        is(".bar."));

    assertThat(
        Template.parse("{% assign foo = values | split: \",\" %}.{{ foo[1] }}.")
            .render("values", "foo,bar,baz"),
        is(".bar."));
  }
  /*
   * def test_assign_is_global
   *   assert_equal 'variable',
   *                Liquid::Template.parse( '{%for i in (1..2) %}{% assign a = "variable"%}{% endfor %}{{a}}'  ).render
   * end
   */
  @Test
  public void assign_is_globalTest() throws Exception {

    assertThat(
        Template.parse("{%for i in (1..2) %}{% assign a = \"variable\"%}{% endfor %}{{a}}")
            .render(),
        is("variable"));
  }
  /*
   * def test_assign_with_colon_and_spaces
   *   assigns = {'var' => {'a:b c' => {'paged' => '1' }}}
   *   assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns)
   * end
   */
  @Test
  public void assign_with_colon_and_spacesTest() throws Exception {

    assertThat(
        Template.parse("{%assign var2 = var[\"a:b c\"].paged %}var2: {{var2}}")
            .render("{\"var\" : {\"a:b c\" : {\"paged\" : \"1\" }}}"),
        is("var2: 1"));
  }
  /* def test_hyphenated_assign
   *   assigns = {'a-b' => '1' }
   *   assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
   *
   * end
   */
  @Test
  public void hyphenated_assignTest() throws Exception {

    assertThat(
        Template.parse("a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}")
            .render(" { \"a-b\" : \"1\" } "),
        is("a-b:1 a-b:2"));
  }
  /*
   * def test_replace
   *   assert_equal 'b b b b', @filters.replace("a a a a", 'a', 'b')
   *   assert_equal 'b a a a', @filters.replace_first("a a a a", 'a', 'b')
   *   assert_template_result 'b a a a', "{{ 'a a a a' | replace_first: 'a', 'b' }}"
   * end
   */
  @Test
  public void applyOriginalTest() {

    Filter filter = Filter.getFilter("replace_first");

    assertThat(filter.apply("a a a a", "a", "b"), is((Object) "b a a a"));
    assertThat(Template.parse("{{ 'a a a a' | replace_first: 'a', 'b' }}").render(), is("b a a a"));
  }
  @Test
  public void applyTest() throws RecognitionException {

    String[][] tests = {
      {"{{ '' | replace_first:'a', 'A' }}", ""},
      {"{{ nil | replace_first:'a', 'A' }}", ""},
      {"{{ 'aabbabab' | replace_first:'ab', 'A' }}", "aAbabab"},
      {"{{ 'ababab' | replace_first:'a', 'A' }}", "Ababab"},
    };

    for (String[] test : tests) {

      Template template = Template.parse(test[0]);
      String rendered = String.valueOf(template.render());

      assertThat(rendered, is(test[1]));
    }
  }
  /*
   * def test_hyphenated_variable
   *
   *   @context['oh-my'] = 'godz'
   *   assert_equal 'godz', @context['oh-my']
   *
   * end
   */
  @Test
  public void hyphenatedVariableTest() throws Exception {

    assertThat(Template.parse("{% assign oh-my = 'godz' %}{{ oh-my }}").render(), is("godz"));
  }
  /*
   * def test_assign_an_empty_string
   *   assert_equal '', Liquid::Template.parse( '{% assign a = ""%}{{a}}'  ).render
   * end
   */
  @Test
  public void assign_an_empty_stringTest() throws Exception {

    assertThat(Template.parse("{% assign a = \"\"%}{{a}}").render(), is(""));
  }
  /*
   * def test_assign
   *   assert_equal 'variable', Liquid::Template.parse( '{% assign a = "variable"%}{{a}}'  ).render
   * end
   */
  @Test
  public void assign2Test() throws Exception {

    assertThat(Template.parse("{% assign a = \"variable\"%}{{a}}").render(), is("variable"));
  }
 @Test(expected = RuntimeException.class)
 public void applyTestInvalidPattern2() throws RecognitionException {
   Template.parse("{{ 'ababab' | replace_first:'a', nil }}").render();
 }