package se.krka.kahlua.converter;
import org.junit.Test;
import se.krka.kahlua.j2se.J2SEPlatform;
import se.krka.kahlua.j2se.KahluaTableImpl;
import se.krka.kahlua.vm.KahluaTable;
import se.krka.kahlua.vm.Platform;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertSame;
import static org.junit.Assert.assertTrue;
public class KahluaConverterManagerTest {
private Platform platform = new J2SEPlatform();
private KahluaTableConverter kahluaTableConverter = new KahluaTableConverter(platform);
@Test
public void testPrimitives1() {
KahluaConverterManager manager = new KahluaConverterManager();
KahluaNumberConverter.install(manager);
Double result = manager.fromLuaToJava(new Double(1.25), double.class);
assertEquals(result.getClass(), Double.class);
assertEquals(result.doubleValue(), 1.25);
}
@Test
public void testPrimitives2() {
KahluaConverterManager manager = new KahluaConverterManager();
KahluaNumberConverter.install(manager);
Long result = manager.fromLuaToJava(new Double(123.45), long.class);
assertEquals(result.getClass(), Long.class);
assertEquals(result.longValue(), 123);
long result2 = manager.fromLuaToJava(new Double(123.45), long.class);
assertEquals(result2, 123);
}
@Test
public void testPrimitives3() {
KahluaConverterManager manager = new KahluaConverterManager();
KahluaNumberConverter.install(manager);
Object result = manager.fromJavaToLua(123);
assertEquals(result.getClass(), Double.class);
assertEquals(((Double) result).doubleValue(), 123.0);
result = manager.fromJavaToLua(new Integer(123));
assertEquals(result.getClass(), Double.class);
assertEquals(((Double) result).doubleValue(), 123.0);
}
@Test
public void testConversionError() {
KahluaConverterManager manager = new KahluaConverterManager();
Long obj = manager.fromLuaToJava(new Double(123.45), long.class);
assertEquals(null, obj);
}
@Test
public void testJavaToLua(){
KahluaConverterManager manager = new KahluaConverterManager();
KahluaNumberConverter.install(manager);
Object object = manager.fromJavaToLua(123L);
assertEquals(object, new Double(123));
}
@Test
public void testJavaToLuaDefault() {
KahluaConverterManager manager = new KahluaConverterManager();
KahluaNumberConverter.install(manager);
Object obj = new Object();
Object obj2 = manager.fromJavaToLua(obj);
assertSame(obj, obj2);
}
@Test
public void testJavaToKahluaTables() {
KahluaConverterManager manager = new KahluaConverterManager();
kahluaTableConverter.install(manager);
List<String> list = new ArrayList<String>();
list.add("First");
list.add("Second");
list.add("Third");
Object obj = manager.fromJavaToLua(list);
assertTrue(KahluaTable.class.isAssignableFrom(obj.getClass()));
KahluaTable t = (KahluaTable) obj;
assertEquals(t.len(), 3);
assertEquals(t.rawget(1), "First");
assertEquals(t.rawget(2), "Second");
assertEquals(t.rawget(3), "Third");
}
@Test
public void testJavaToKahluaTablesMap() {
KahluaConverterManager manager = new KahluaConverterManager();
kahluaTableConverter.install(manager);
Map map = new HashMap();
map.put("X", 123);
map.put("Y", "Hello");
map.put("Z", "World");
Object obj = manager.fromJavaToLua(map);
assertTrue(KahluaTable.class.isAssignableFrom(obj.getClass()));
KahluaTable t = (KahluaTable) obj;
assertEquals(t.len(), 0);
assertEquals(t.rawget("X"), 123);
assertEquals(t.rawget("Y"), "Hello");
assertEquals(t.rawget("Z"), "World");
}
@Test
public void testLuaToJavaTables() {
KahluaConverterManager manager = new KahluaConverterManager();
kahluaTableConverter.install(manager);
KahluaTable t = platform.newTable();
t.rawset(1, "First");
t.rawset(2, "Second");
t.rawset(3, "Third");
List list = manager.fromLuaToJava(t, List.class);
assertEquals(list.size(), 3);
assertEquals(list.get(0), "First");
assertEquals(list.get(1), "Second");
assertEquals(list.get(2), "Third");
}
@Test
public void testLuaToJavaTablesMap() {
KahluaConverterManager manager = new KahluaConverterManager();
kahluaTableConverter.install(manager);
KahluaTable t = platform.newTable();
t.rawset("X", "First");
t.rawset("Y", "Second");
t.rawset(t, "Third");
Map map = manager.fromLuaToJava(t, Map.class);
assertEquals(map.get("X"), "First");
assertEquals(map.get("Y"), "Second");
assertEquals(map.get(t), "Third");
}
@Test
public void testJavaToKahluaTablesRecursion() {
KahluaConverterManager manager = new KahluaConverterManager();
kahluaTableConverter.install(manager);
KahluaNumberConverter.install(manager);
Map map = new HashMap();
Map map2 = new HashMap();
map.put("X", 123);
map.put("Y", map2);
map.put("Z", "World");
Object obj = manager.fromJavaToLua(map);
assertEquals(obj.getClass(), KahluaTableImpl.class);
KahluaTable t = (KahluaTable) obj;
assertEquals(t.len(), 0);
assertEquals(t.rawget("X"), 123.0);
assertEquals(t.rawget("Y").getClass(), KahluaTableImpl.class);
assertEquals(t.rawget("Z"), "World");
}
@Test(expected = RuntimeException.class)
public void testJavaToKahluaTablesRecursionInfinite() {
KahluaConverterManager manager = new KahluaConverterManager();
kahluaTableConverter.install(manager);
Map map = new HashMap();
map.put("X", map);
Object obj = manager.fromJavaToLua(map);
}
@Test
public void testSubtypeReturn() {
KahluaConverterManager manager = new KahluaConverterManager();
Object obj2 = new StringBuilder();
Object obj = manager.fromLuaToJava(obj2, Object.class);
assertSame(obj, obj2);
}
static enum DummyEnum {
FOO, BAR
}
@Test
public void testEnumConversion() {
KahluaConverterManager manager = new KahluaConverterManager();
KahluaEnumConverter.install(manager);
DummyEnum x = DummyEnum.FOO;
Object x2 = manager.fromJavaToLua(x);
assertEquals("FOO", x2);
DummyEnum x3 = manager.fromLuaToJava(x2, DummyEnum.class);
assertEquals(DummyEnum.FOO, x3);
}
}