// Path: src/main/java/me/geso/jtt/exception/JTTError.java
// public class JTTError extends Error {
// 	public JTTError(String string) {
// 		super(string);
// 	}
// 	
// 	public JTTError() { }
// 	
// 	public JTTError(Throwable e) {
// 		super(e);
// 	}
// 
// 	private static final long serialVersionUID = 1L;
// }
// 
// Path: src/main/java/me/geso/jtt/exception/ParserError.java
// public class ParserError extends JTTError {
// 	private static final long serialVersionUID = 1L;
// 	private Parser parser;
// 
// 	public ParserError(String msg, Parser parser) {
// 		super(msg);
// 		this.parser = parser;
// 	}
// 
// 	public String toString() {
// 		int line = parser.getLine();
// 		Source src = parser.getSource();
// 		String lines;
// 		try {
// 			lines = src.getTargetLines(line);
// 		} catch (IOException e) {
// 			lines = "(IOException)";
// 		}
// 
// 		StringBuilder buf = new StringBuilder();
// 		buf.append(this.getMessage() + " at " + parser.getFileName() + " line "
// 				+ line);
// 		buf.append("\n==============================================\n");
// 		buf.append(lines);
// 		buf.append("\n==============================================");
// 
// 		return buf.toString();
// 	}
// }
// 
// Path: src/main/java/me/geso/jtt/exception/TemplateLoadingError.java
// public class TemplateLoadingError extends JTTError {
// 	private static final long serialVersionUID = 1L;
// 
// 	@Override
// 	public String toString() {
// 		return "TemplateLoadingError [includePaths=" + includePaths
// 				+ ", fileName=" + fileName + "]";
// 	}
// 
// 	private final List<Path> includePaths;
// 	private final String fileName;
// 
// 	public TemplateLoadingError(String fileName, List<Path> includePaths) {
// 		this.fileName = fileName;
// 		this.includePaths = includePaths;
// 	}
// 
// }


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.geso.jtt.exception.JTTError;
import me.geso.jtt.exception.ParserError;
import me.geso.jtt.exception.TemplateLoadingError;
import org.junit.Test;
		}).build();
		assertEquals("95", jtt.renderString("[% sub(99, 4) %]", null));
	}

	@Test
	public void testFuncallArgumentOrder() throws ParserError, JTTError,
			IOException, TemplateLoadingError {
		this.n = 0;

		JTT jtt = new JTTBuilder().addFunction("record", args -> {
			ArrayList<Object> objs = new ArrayList<Object>();
			for (Object o : args) {
				objs.add(o);
			}
			registry.add(objs);
			return objs;
		}).addFunction("cnt", args -> {
			return n++;
		}).build();

		assertEquals("[0, 1, 2]",
				jtt.renderString("[% record(cnt(), cnt(),cnt()) %]", null));
	}

	@Test
	public void testWarningsHandler() throws ParserError, JTTError,
			TemplateLoadingError, IOException {
		final List<String> messages = new ArrayList<>();
		assertEquals(
				"(null)",
// Path: src/main/java/me/geso/jtt/exception/JTTError.java
// public class JTTError extends Error {
// 	public JTTError(String string) {
// 		super(string);
// 	}
// 	
// 	public JTTError() { }
// 	
// 	public JTTError(Throwable e) {
// 		super(e);
// 	}
// 
// 	private static final long serialVersionUID = 1L;
// }
// 
// Path: src/main/java/me/geso/jtt/exception/ParserError.java
// public class ParserError extends JTTError {
// 	private static final long serialVersionUID = 1L;
// 	private Parser parser;
// 
// 	public ParserError(String msg, Parser parser) {
// 		super(msg);
// 		this.parser = parser;
// 	}
// 
// 	public String toString() {
// 		int line = parser.getLine();
// 		Source src = parser.getSource();
// 		String lines;
// 		try {
// 			lines = src.getTargetLines(line);
// 		} catch (IOException e) {
// 			lines = "(IOException)";
// 		}
// 
// 		StringBuilder buf = new StringBuilder();
// 		buf.append(this.getMessage() + " at " + parser.getFileName() + " line "
// 				+ line);
// 		buf.append("\n==============================================\n");
// 		buf.append(lines);
// 		buf.append("\n==============================================");
// 
// 		return buf.toString();
// 	}
// }
// 
// Path: src/main/java/me/geso/jtt/exception/TemplateLoadingError.java
// public class TemplateLoadingError extends JTTError {
// 	private static final long serialVersionUID = 1L;
// 
// 	@Override
// 	public String toString() {
// 		return "TemplateLoadingError [includePaths=" + includePaths
// 				+ ", fileName=" + fileName + "]";
// 	}
// 
// 	private final List<Path> includePaths;
// 	private final String fileName;
// 
// 	public TemplateLoadingError(String fileName, List<Path> includePaths) {
// 		this.fileName = fileName;
// 		this.includePaths = includePaths;
// 	}
// 
// }


// Path: src/test/java/me/geso/jtt/JTTTest.java
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.geso.jtt.exception.JTTError;
import me.geso.jtt.exception.ParserError;
import me.geso.jtt.exception.TemplateLoadingError;
import org.junit.Test;

		}).build();
		assertEquals("95", jtt.renderString("[% sub(99, 4) %]", null));
	}

	@Test
	public void testFuncallArgumentOrder() throws ParserError, JTTError,
			IOException, TemplateLoadingError {
		this.n = 0;

		JTT jtt = new JTTBuilder().addFunction("record", args -> {
			ArrayList<Object> objs = new ArrayList<Object>();
			for (Object o : args) {
				objs.add(o);
			}
			registry.add(objs);
			return objs;
		}).addFunction("cnt", args -> {
			return n++;
		}).build();

		assertEquals("[0, 1, 2]",
				jtt.renderString("[% record(cnt(), cnt(),cnt()) %]", null));
	}

	@Test
	public void testWarningsHandler() throws ParserError, JTTError,
			TemplateLoadingError, IOException {
		final List<String> messages = new ArrayList<>();
		assertEquals(
				"(null)",
				new JTTBuilder()