package se.krka.kahlua.require; import junit.framework.TestCase; import se.krka.kahlua.luaj.compiler.LuaCompiler; import se.krka.kahlua.vm.LuaClosure; import se.krka.kahlua.vm.LuaState; import java.io.IOException; import java.io.ByteArrayOutputStream; import java.io.PrintStream; public class RequireTest extends TestCase { public void testMultipleRequire() throws IOException { MockProvider provider = new MockProvider(); provider.addSource("/a", "require('/b')\nrequire('/b')"); provider.addSource("/b", "print('Great success')"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(byteArrayOutputStream); LuaState state = new LuaState(printStream); new Require(provider).install(state); LuaClosure luaClosure = LuaCompiler.loadstring("require('/a')", "foo", state.getEnvironment()); Object[] objects = state.pcall(luaClosure); assertEquals(Boolean.TRUE, objects[0]); String outputString = setNewlines(new String(byteArrayOutputStream.toByteArray())); assertEquals("Great success\n", outputString); } private String setNewlines(String s) { return s.replace("\r\n", "\n"); } public void testSourceNotFound() throws IOException { MockProvider provider = new MockProvider(); provider.addSource("/a", "require('/b')\nrequire('/b')"); provider.addSource("/b", "require('/c')"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(byteArrayOutputStream); LuaState state = new LuaState(printStream); new Require(provider).install(state); LuaClosure luaClosure = LuaCompiler.loadstring("require('/a')", "foo", state.getEnvironment()); Object[] objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: Does not exist: /c", objects[1]); objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: Does not exist: /c", objects[1]); } public void testSuccess() throws IOException { MockProvider provider = new MockProvider(); provider.addSource("/a", "require('/b')"); provider.addSource("/b", "print('Great success')"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(byteArrayOutputStream); LuaState state = new LuaState(printStream); new Require(provider).install(state); LuaClosure luaClosure = LuaCompiler.loadstring("require('/a')", "foo", state.getEnvironment()); Object[] objects = state.pcall(luaClosure); assertEquals(Boolean.TRUE, objects[0]); String outputString = setNewlines(new String(byteArrayOutputStream.toByteArray())); assertEquals("Great success\n", outputString); } public void testRuntimeError() throws IOException { MockProvider provider = new MockProvider(); provider.addSource("/a", "require('/b')"); provider.addSource("/b", "error'someerror'"); LuaState state = new LuaState(); new Require(provider).install(state); LuaClosure luaClosure = LuaCompiler.loadstring("require('/a')", "foo", state.getEnvironment()); Object[] objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: someerror", objects[1]); objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: someerror", objects[1]); } public void testCompileError() throws IOException { MockProvider provider = new MockProvider(); provider.addSource("/a", "require('/b')"); provider.addSource("/b", "all your base are belong to me"); LuaState state = new LuaState(); new Require(provider).install(state); LuaClosure luaClosure = LuaCompiler.loadstring("require('/a')", "foo", state.getEnvironment()); Object[] objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: [string \"/b\"]:1: '=' expected near `your`", objects[1]); objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: [string \"/b\"]:1: '=' expected near `your`", objects[1]); } public void testCyclic() throws IOException { MockProvider provider = new MockProvider(); provider.addSource("/a", "require('/b')"); provider.addSource("/b", "require('/a')"); LuaState state = new LuaState(); new Require(provider).install(state); LuaClosure luaClosure = LuaCompiler.loadstring("require('/a')", "foo", state.getEnvironment()); Object[] objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: Circular dependency found for: /a", objects[1]); objects = state.pcall(luaClosure); assertEquals(Boolean.FALSE, objects[0]); assertEquals("Error in: /a: Error in: /b: Circular dependency found for: /a", objects[1]); } }