@Test
  public void testExtendsWithArrayOfTemplates() throws Exception {
    JtwigResource twoResource = mock(JtwigResource.class);

    when(resource.resolve("num-two")).thenReturn(twoResource);

    when(twoResource.retrieve()).thenReturn(new ByteArrayInputStream("second".getBytes()));

    when(resource.retrieve())
        .thenReturn(
            new ByteArrayInputStream("{% extends ['num-one','num-two','num-three'] %}".getBytes()));

    underTest.output(toTheOutputStream(), context);
    assertThat(theOutput(), is("second"));
  }
  @Test
  public void testRootDocument() throws Exception {
    when(resource.retrieve()).thenReturn(new ByteArrayInputStream("joao".getBytes()));
    underTest.output(toTheOutputStream(), context);

    assertThat(theOutput(), is("joao"));
  }
  @Test
  public void testSingleHierarchy() throws Exception {
    JtwigResource joaoResource = mock(JtwigResource.class);

    when(resource.retrieve())
        .thenReturn(
            new ByteArrayInputStream(
                ("{% extends 'test' %}" + "{% block joao %}joao{% endblock %}").getBytes()));
    when(resource.resolve("test")).thenReturn(joaoResource);
    when(joaoResource.retrieve())
        .thenReturn(
            new ByteArrayInputStream("I am {% block joao %}no one{% endblock %}".getBytes()));

    underTest.output(toTheOutputStream(), context);

    assertThat(theOutput(), is("I am joao"));
  }
  @Test
  public void testTwoLevelHierarchy() throws Exception {
    JtwigResource oneResource = mock(JtwigResource.class);
    JtwigResource twoResource = mock(JtwigResource.class);

    when(resource.retrieve())
        .thenReturn(
            new ByteArrayInputStream(
                ("{% extends 'level-1' %}" + "{% block two %}two{% endblock %}").getBytes()));

    when(resource.resolve("level-1")).thenReturn(oneResource);
    when(oneResource.retrieve())
        .thenReturn(
            new ByteArrayInputStream(
                ("{% extends 'root' %}" + "{% block one %}one{% endblock %}").getBytes()));

    when(oneResource.resolve("root")).thenReturn(twoResource);
    when(twoResource.retrieve())
        .thenReturn(
            new ByteArrayInputStream(
                "Block {% block one %}1{% endblock %} and {% block two %}2{% endblock %}"
                    .getBytes()));

    underTest.output(toTheOutputStream(), context);

    assertThat(theOutput(), is("Block one and two"));
  }
  @Test
  public void testExtendsVariableDefinedTemplate() throws Exception {
    JtwigResource oneResource = mock(JtwigResource.class);
    JtwigResource twoResource = mock(JtwigResource.class);

    when(resource.resolve("num-one")).thenReturn(oneResource);
    when(resource.resolve("num-two")).thenReturn(twoResource);

    when(oneResource.retrieve()).thenReturn(new ByteArrayInputStream("first".getBytes()));
    when(twoResource.retrieve()).thenReturn(new ByteArrayInputStream("second".getBytes()));

    when(resource.retrieve()).thenReturn(new ByteArrayInputStream("{% extends var %}".getBytes()));

    context.withModelAttribute("var", "num-two");
    underTest.output(toTheOutputStream(), context);
    assertThat(theOutput(), is("second"));
  }