package com.github.mustachejava;

import com.github.mustachejava.reflect.GuardedBinding;
import com.github.mustachejava.reflect.MissingWrapper;
import com.github.mustachejava.reflect.ReflectionObjectHandler;
import com.github.mustachejava.util.Wrapper;
import org.junit.Test;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

public class FailOnMissingTest {
  @Test
  public void testFail() {
    ReflectionObjectHandler roh = new ReflectionObjectHandler() {
      @Override
      public Binding createBinding(String name, final TemplateContext tc, Code code) {
        return new GuardedBinding(this, name, tc, code) {
          @Override
          protected synchronized Wrapper getWrapper(String name, Object[] scopes) {
            Wrapper wrapper = super.getWrapper(name, scopes);
            if (wrapper instanceof MissingWrapper) {
              throw new MustacheException(name + " not found in " + tc);
            }
            return wrapper;
          }
        };
      }
    };
    DefaultMustacheFactory dmf = new DefaultMustacheFactory();
    dmf.setObjectHandler(roh);
    try {
      Mustache test = dmf.compile(new StringReader("{{test}}"), "test");
      StringWriter sw = new StringWriter();
      test.execute(sw, new Object() {
        String test = "ok";
      }).close();
      assertEquals("ok", sw.toString());
      test.execute(new StringWriter(), new Object());
      fail("Should have failed");
    } catch (MustacheException me) {
      assertEquals("test not found in [test:1] @[test:1]", me.getCause().getMessage());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
