package se.krka.kahlua.require;
import org.junit.Test;
import se.krka.kahlua.j2se.J2SEPlatform;
import se.krka.kahlua.luaj.compiler.LuaCompiler;
import se.krka.kahlua.vm.KahluaTable;
import se.krka.kahlua.vm.KahluaThread;
import se.krka.kahlua.vm.LuaClosure;
import se.krka.kahlua.vm.Platform;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import static org.junit.Assert.assertEquals;
public class RequireTest {
@Test
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);
Platform platform = new J2SEPlatform();
KahluaTable env = platform.newEnvironment();
KahluaThread state = new KahluaThread(printStream, platform, env);
new Require(provider).install(env);
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 static String setNewLines(String s) {
return s.replace("\r\n", "\n");
}
@Test
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);
Platform platform = new J2SEPlatform();
KahluaTable env = platform.newEnvironment();
KahluaThread state = new KahluaThread(printStream, platform, env);
new Require(provider).install(env);
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]);
}
@Test
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);
Platform platform = new J2SEPlatform();
KahluaTable env = platform.newEnvironment();
KahluaThread state = new KahluaThread(printStream, platform, env);
new Require(provider).install(env);
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);
}
@Test
public void testRuntimeError() throws IOException {
MockProvider provider = new MockProvider();
provider.addSource("/a", "require('/b')");
provider.addSource("/b", "error'someerror'");
Platform platform = new J2SEPlatform();
KahluaTable env = platform.newEnvironment();
KahluaThread state = new KahluaThread(platform, env);
new Require(provider).install(env);
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]);
}
@Test
public void testCompileError() throws IOException {
MockProvider provider = new MockProvider();
provider.addSource("/a", "require('/b')");
provider.addSource("/b", "all your base are belong to me");
Platform platform = new J2SEPlatform();
KahluaTable env = platform.newEnvironment();
KahluaThread state = new KahluaThread(platform, env);
new Require(provider).install(env);
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: /b:1: '=' expected near `your`", objects[1]);
objects = state.pcall(luaClosure);
assertEquals(Boolean.FALSE, objects[0]);
assertEquals("Error in: /a: Error in: /b: /b:1: '=' expected near `your`", objects[1]);
}
@Test
public void testCyclic() throws IOException {
MockProvider provider = new MockProvider();
provider.addSource("/a", "require('/b')");
provider.addSource("/b", "require('/a')");
Platform platform = new J2SEPlatform();
KahluaTable env = platform.newEnvironment();
KahluaThread state = new KahluaThread(platform, env);
new Require(provider).install(env);
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]);
}
}