diff --git a/luaj-core/pom.xml b/luaj-core/pom.xml index a51d671d..021158cd 100644 --- a/luaj-core/pom.xml +++ b/luaj-core/pom.xml @@ -14,4 +14,12 @@ luaj-core Core code for LuaJ + + + org.junit.jupiter + junit-jupiter + test + + + diff --git a/luaj-core/src/test/java/.keep b/luaj-core/src/test/java/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/luaj-test/src/test/java/org/luaj/vm2/BufferedStreamTest.java b/luaj-core/src/test/java/org/luaj/vm2/BufferedStreamTest.java similarity index 86% rename from luaj-test/src/test/java/org/luaj/vm2/BufferedStreamTest.java rename to luaj-core/src/test/java/org/luaj/vm2/BufferedStreamTest.java index 9e2a2934..485a1b2c 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/BufferedStreamTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/BufferedStreamTest.java @@ -21,32 +21,29 @@ ******************************************************************************/ package org.luaj.vm2; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.io.ByteArrayInputStream; -import junit.framework.TestCase; - +import org.junit.jupiter.api.Test; import org.luaj.vm2.Globals.BufferedStream; -public class BufferedStreamTest extends TestCase { - - public BufferedStreamTest() {} +class BufferedStreamTest { private BufferedStream NewBufferedStream(int buflen, String contents) { return new BufferedStream(buflen, new ByteArrayInputStream(contents.getBytes())); } - protected void setUp() throws Exception { - super.setUp(); - } - - public void testReadEmptyStream() throws java.io.IOException { + @Test + void testReadEmptyStream() throws java.io.IOException { BufferedStream bs = NewBufferedStream(4, ""); assertEquals(-1, bs.read()); assertEquals(-1, bs.read(new byte[10])); assertEquals(-1, bs.read(new byte[10], 0, 10)); } - public void testReadByte() throws java.io.IOException { + @Test + void testReadByte() throws java.io.IOException { BufferedStream bs = NewBufferedStream(2, "abc"); assertEquals('a', bs.read()); assertEquals('b', bs.read()); @@ -54,7 +51,8 @@ public class BufferedStreamTest extends TestCase { assertEquals(-1, bs.read()); } - public void testReadByteArray() throws java.io.IOException { + @Test + void testReadByteArray() throws java.io.IOException { byte[] array = new byte[3]; BufferedStream bs = NewBufferedStream(4, "abcdef"); assertEquals(3, bs.read(array)); @@ -66,7 +64,8 @@ public class BufferedStreamTest extends TestCase { assertEquals(-1, bs.read()); } - public void testReadByteArrayOffsetLength() throws java.io.IOException { + @Test + void testReadByteArrayOffsetLength() throws java.io.IOException { byte[] array = new byte[10]; BufferedStream bs = NewBufferedStream(8, "abcdefghijklmn"); assertEquals(4, bs.read(array, 0, 4)); @@ -78,7 +77,8 @@ public class BufferedStreamTest extends TestCase { assertEquals(-1, bs.read()); } - public void testMarkOffsetBeginningOfStream() throws java.io.IOException { + @Test + void testMarkOffsetBeginningOfStream() throws java.io.IOException { byte[] array = new byte[4]; BufferedStream bs = NewBufferedStream(8, "abcdefghijkl"); assertEquals(true, bs.markSupported()); @@ -95,7 +95,8 @@ public class BufferedStreamTest extends TestCase { assertEquals(-1, bs.read()); } - public void testMarkOffsetMiddleOfStream() throws java.io.IOException { + @Test + void testMarkOffsetMiddleOfStream() throws java.io.IOException { byte[] array = new byte[4]; BufferedStream bs = NewBufferedStream(8, "abcdefghijkl"); assertEquals(true, bs.markSupported()); diff --git a/luaj-test/src/test/java/org/luaj/vm2/LuaOperationsTest.java b/luaj-core/src/test/java/org/luaj/vm2/LuaOperationsTest.java similarity index 77% rename from luaj-test/src/test/java/org/luaj/vm2/LuaOperationsTest.java rename to luaj-core/src/test/java/org/luaj/vm2/LuaOperationsTest.java index 456869b6..8b7a48ff 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/LuaOperationsTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/LuaOperationsTest.java @@ -21,17 +21,16 @@ ******************************************************************************/ package org.luaj.vm2; -import java.io.Reader; -import java.io.StringReader; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + import java.lang.reflect.InvocationTargetException; -import junit.framework.TestCase; - +import org.junit.jupiter.api.Test; import org.luaj.vm2.TypeTest.MyData; -import org.luaj.vm2.compiler.LuaC; import org.luaj.vm2.lib.ZeroArgFunction; -public class LuaOperationsTest extends TestCase { +class LuaOperationsTest { private final int sampleint = 77; private final long samplelong = 123400000000L; @@ -57,6 +56,7 @@ public class LuaOperationsTest extends TestCase { private final LuaTable table = LuaValue .listOf(new LuaValue[] { LuaValue.valueOf("aaa"), LuaValue.valueOf("bbb") }); private final LuaValue somefunc = new ZeroArgFunction() { + @Override public LuaValue call() { return NONE; } }; private final LuaThread thread = new LuaThread(new Globals(), somefunc); @@ -91,7 +91,8 @@ public class LuaOperationsTest extends TestCase { } } - public void testLen() { + @Test + void testLen() { throwsLuaError("len", somenil); throwsLuaError("len", sometrue); throwsLuaError("len", somefalse); @@ -111,7 +112,8 @@ public class LuaOperationsTest extends TestCase { throwsLuaError("len", userdatacls); } - public void testLength() { + @Test + void testLength() { throwsLuaError("length", somenil); throwsLuaError("length", sometrue); throwsLuaError("length", somefalse); @@ -130,51 +132,4 @@ public class LuaOperationsTest extends TestCase { throwsLuaError("length", userdataobj); throwsLuaError("length", userdatacls); } - - public Prototype createPrototype(String script, String name) { - try { - Globals globals = org.luaj.vm2.lib.jse.JsePlatform.standardGlobals(); - Reader reader = new StringReader(script); - return globals.compilePrototype(reader, name); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - fail(e.toString()); - return null; - } - } - - public void testFunctionClosureThreadEnv() { - - // set up suitable environments for execution - LuaValue aaa = LuaValue.valueOf("aaa"); - LuaValue eee = LuaValue.valueOf("eee"); - final Globals globals = org.luaj.vm2.lib.jse.JsePlatform.standardGlobals(); - LuaTable newenv = LuaValue.tableOf(new LuaValue[] { LuaValue.valueOf("a"), LuaValue.valueOf("aaa"), - LuaValue.valueOf("b"), LuaValue.valueOf("bbb"), }); - LuaTable mt = LuaValue.tableOf(new LuaValue[] { LuaValue.INDEX, globals }); - newenv.setmetatable(mt); - globals.set("a", aaa); - newenv.set("a", eee); - - // function tests - { - LuaFunction f = new ZeroArgFunction() { - public LuaValue call() { return globals.get("a"); } - }; - assertEquals(aaa, f.call()); - } - - // closure tests - { - Prototype p = createPrototype("return a\n", "closuretester"); - LuaClosure c = new LuaClosure(p, globals); - - // Test that a clusure with a custom enviroment uses that environment. - assertEquals(aaa, c.call()); - c = new LuaClosure(p, newenv); - assertEquals(newenv, c.upValues[0].getValue()); - assertEquals(eee, c.call()); - } - } } diff --git a/luaj-test/src/test/java/org/luaj/vm2/MetatableTest.java b/luaj-core/src/test/java/org/luaj/vm2/MetatableTest.java similarity index 97% rename from luaj-test/src/test/java/org/luaj/vm2/MetatableTest.java rename to luaj-core/src/test/java/org/luaj/vm2/MetatableTest.java index 4187ad1d..68e1ddb5 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/MetatableTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/MetatableTest.java @@ -21,15 +21,18 @@ ******************************************************************************/ package org.luaj.vm2; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.luaj.vm2.TypeTest.MyData; import org.luaj.vm2.lib.StringLib; import org.luaj.vm2.lib.ThreeArgFunction; import org.luaj.vm2.lib.TwoArgFunction; import org.luaj.vm2.lib.ZeroArgFunction; -public class MetatableTest extends TestCase { +class MetatableTest { private final String samplestring = "abcdef"; private final Object sampleobject = new Object(); @@ -38,6 +41,7 @@ public class MetatableTest extends TestCase { private final LuaValue string = LuaValue.valueOf(samplestring); private final LuaTable table = LuaValue.tableOf(); private final LuaFunction function = new ZeroArgFunction() { + @Override public LuaValue call() { return NONE; } }; private final LuaThread thread = new LuaThread(new Globals(), function); @@ -45,13 +49,14 @@ public class MetatableTest extends TestCase { private final LuaUserdata userdata = LuaValue.userdataOf(sampleobject); private final LuaUserdata userdatamt = LuaValue.userdataOf(sampledata, table); + @BeforeEach protected void setUp() throws Exception { // needed for metatable ops to work on strings new StringLib(); } + @AfterEach protected void tearDown() throws Exception { - super.tearDown(); LuaBoolean.s_metatable = null; LuaFunction.s_metatable = null; LuaNil.s_metatable = null; @@ -60,7 +65,8 @@ public class MetatableTest extends TestCase { LuaThread.s_metatable = null; } - public void testGetMetatable() { + @Test + void testGetMetatable() { assertEquals(null, LuaValue.NIL.getmetatable()); assertEquals(null, LuaValue.TRUE.getmetatable()); assertEquals(null, LuaValue.ONE.getmetatable()); @@ -73,7 +79,8 @@ public class MetatableTest extends TestCase { assertEquals(table, userdatamt.getmetatable()); } - public void testSetMetatable() { + @Test + void testSetMetatable() { LuaValue mt = LuaValue.tableOf(); assertEquals(null, table.getmetatable()); assertEquals(null, userdata.getmetatable()); @@ -127,7 +134,8 @@ public class MetatableTest extends TestCase { assertEquals(mt, thread.getmetatable()); } - public void testMetatableIndex() { + @Test + void testMetatableIndex() { assertEquals(table, table.setmetatable(null)); assertEquals(userdata, userdata.setmetatable(null)); assertEquals(userdatamt, userdatamt.setmetatable(null)); @@ -168,6 +176,7 @@ public class MetatableTest extends TestCase { // plain metatable mt.set(LuaValue.INDEX, new TwoArgFunction() { + @Override public LuaValue call(LuaValue arg1, LuaValue arg2) { return LuaValue.valueOf(arg1.typename() + "[" + arg2.tojstring() + "]=xyz"); } @@ -183,7 +192,8 @@ public class MetatableTest extends TestCase { assertEquals("thread[1]=xyz", thread.get(1).tojstring()); } - public void testMetatableNewIndex() { + @Test + void testMetatableNewIndex() { // empty metatable LuaValue mt = LuaValue.tableOf(); assertEquals(table, table.setmetatable(mt)); @@ -218,6 +228,7 @@ public class MetatableTest extends TestCase { // metatable with function call mt.set(LuaValue.NEWINDEX, new ThreeArgFunction() { + @Override public LuaValue call(LuaValue arg1, LuaValue arg2, LuaValue arg3) { fallback.rawset(arg2, LuaValue.valueOf("via-func-" + arg3)); return NONE; @@ -266,7 +277,8 @@ public class MetatableTest extends TestCase { LuaValue.valueOf(val2), }); } - public void testRawsetMetatableSet() { + @Test + void testRawsetMetatableSet() { // set up tables LuaValue m = makeTable("aa", "aaa", "bb", "bbb"); m.set(LuaValue.INDEX, m); @@ -356,7 +368,5 @@ public class MetatableTest extends TestCase { checkTable(s, www, zzz, qqq, ddd, xxx, yyy, ttt, www, nil, qqq, ddd, xxx, nil, nil); checkTable(t, aaa, zzz, ccc, sss, nil, yyy, ttt, nil, zzz, ccc, sss, nil, nil, nil); checkTable(m, aaa, bbb, nil, nil, nil, yyy, ttt, aaa, bbb, nil, nil, nil, yyy, ttt); - } - } diff --git a/luaj-test/src/test/java/org/luaj/vm2/StringTest.java b/luaj-core/src/test/java/org/luaj/vm2/StringTest.java similarity index 82% rename from luaj-test/src/test/java/org/luaj/vm2/StringTest.java rename to luaj-core/src/test/java/org/luaj/vm2/StringTest.java index fba65726..e4f1fc95 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/StringTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/StringTest.java @@ -1,20 +1,21 @@ package org.luaj.vm2; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import junit.framework.TestCase; +import org.junit.jupiter.api.Test; -import org.luaj.vm2.lib.jse.JsePlatform; +class StringTest { -public class StringTest extends TestCase { - - protected void setUp() throws Exception { - JsePlatform.standardGlobals(); - } - - public void testToInputStream() throws IOException { + @Test + void testToInputStream() throws IOException { LuaString str = LuaString.valueOf("Hello"); InputStream is = str.toInputStream(); @@ -66,7 +67,8 @@ public class StringTest extends TestCase { return sb.toString(); } - public void testUtf820482051() throws UnsupportedEncodingException { + @Test + void testUtf820482051() throws UnsupportedEncodingException { int i = 2048; char[] c = { (char) (i+0), (char) (i+1), (char) (i+2), (char) (i+3) }; String before = new String(c) + " " + i + "-" + (i+4); @@ -75,7 +77,8 @@ public class StringTest extends TestCase { assertEquals(userFriendly(before), userFriendly(after)); } - public void testUtf8() { + @Test + void testUtf8() { for (int i = 4; i < 0xffff; i += 4) { char[] c = { (char) (i+0), (char) (i+1), (char) (i+2), (char) (i+3) }; String before = new String(c) + " " + i + "-" + (i+4); @@ -90,7 +93,8 @@ public class StringTest extends TestCase { assertEquals(userFriendly(before), userFriendly(after)); } - public void testSpotCheckUtf8() throws UnsupportedEncodingException { + @Test + void testSpotCheckUtf8() throws UnsupportedEncodingException { byte[] bytes = { (byte) 194, (byte) 160, (byte) 194, (byte) 161, (byte) 194, (byte) 162, (byte) 194, (byte) 163, (byte) 194, (byte) 164 }; String expected = new String(bytes, "UTF8"); @@ -104,7 +108,8 @@ public class StringTest extends TestCase { assertEquals(expected, actual); } - public void testNullTerminated() { + @Test + void testNullTerminated() { char[] c = { 'a', 'b', 'c', '\0', 'd', 'e', 'f' }; String before = new String(c); LuaString ls = LuaString.valueOf(before); @@ -112,7 +117,8 @@ public class StringTest extends TestCase { assertEquals(userFriendly("abc\0def"), userFriendly(after)); } - public void testRecentStringsCacheDifferentHashcodes() { + @Test + void testRecentStringsCacheDifferentHashcodes() { final byte[] abc = { 'a', 'b', 'c' }; final byte[] xyz = { 'x', 'y', 'z' }; final LuaString abc1 = LuaString.valueOf(abc); @@ -125,7 +131,8 @@ public class StringTest extends TestCase { assertSame(xyz1, xyz2); } - public void testRecentStringsCacheHashCollisionCacheHit() { + @Test + void testRecentStringsCacheHashCollisionCacheHit() { final byte[] abc = { 'a', 'b', 'c' }; final byte[] lyz = { 'l', 'y', 'z' }; // chosen to have hash collision with 'abc' final LuaString abc1 = LuaString.valueOf(abc); @@ -140,7 +147,8 @@ public class StringTest extends TestCase { assertSame(lyz1, lyz2); } - public void testRecentStringsCacheHashCollisionCacheMiss() { + @Test + void testRecentStringsCacheHashCollisionCacheMiss() { final byte[] abc = { 'a', 'b', 'c' }; final byte[] lyz = { 'l', 'y', 'z' }; // chosen to have hash collision with 'abc' final LuaString abc1 = LuaString.valueOf(abc); @@ -155,7 +163,8 @@ public class StringTest extends TestCase { assertNotSame(lyz1, lyz2); } - public void testRecentStringsLongStrings() { + @Test + void testRecentStringsLongStrings() { byte[] abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".getBytes(); assertTrue(abc.length > LuaString.RECENT_STRINGS_MAX_LENGTH); LuaString abc1 = LuaString.valueOf(abc); @@ -163,7 +172,8 @@ public class StringTest extends TestCase { assertNotSame(abc1, abc2); } - public void testRecentStringsUsingJavaStrings() { + @Test + void testRecentStringsUsingJavaStrings() { final String abc = "abc"; final String lyz = "lyz"; // chosen to have hash collision with 'abc' final String xyz = "xyz"; @@ -193,7 +203,8 @@ public class StringTest extends TestCase { assertSame(xyz3, xyz4); // because hashes do not collide } - public void testLongSubstringGetsOldBacking() { + @Test + void testLongSubstringGetsOldBacking() { LuaString src = LuaString.valueOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); LuaString sub1 = src.substring(10, 40); assertSame(src.m_bytes, sub1.m_bytes); @@ -201,7 +212,8 @@ public class StringTest extends TestCase { assertEquals(sub1.m_length, 30); } - public void testShortSubstringGetsNewBacking() { + @Test + void testShortSubstringGetsNewBacking() { LuaString src = LuaString.valueOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); LuaString sub1 = src.substring(10, 20); LuaString sub2 = src.substring(10, 20); @@ -211,7 +223,8 @@ public class StringTest extends TestCase { assertFalse(src.m_bytes == sub1.m_bytes); } - public void testShortSubstringOfVeryLongStringGetsNewBacking() { + @Test + void testShortSubstringOfVeryLongStringGetsNewBacking() { LuaString src = LuaString.valueOf("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); LuaString sub1 = src.substring(10, 50); @@ -222,7 +235,8 @@ public class StringTest extends TestCase { assertFalse(src.m_bytes == sub1.m_bytes); } - public void testIndexOfByteInSubstring() { + @Test + void testIndexOfByteInSubstring() { LuaString str = LuaString.valueOf("abcdef:ghi"); LuaString sub = str.substring(2, 10); assertEquals(10, str.m_length); @@ -255,7 +269,8 @@ public class StringTest extends TestCase { assertEquals(-1, sub.indexOf((byte) 'z', 7)); } - public void testIndexOfPatternInSubstring() { + @Test + void testIndexOfPatternInSubstring() { LuaString str = LuaString.valueOf("abcdef:ghi"); LuaString sub = str.substring(2, 10); assertEquals(10, str.m_length); @@ -292,7 +307,8 @@ public class StringTest extends TestCase { assertEquals(-1, sub.indexOf(xyz, 7)); } - public void testLastIndexOfPatternInSubstring() { + @Test + void testLastIndexOfPatternInSubstring() { LuaString str = LuaString.valueOf("abcdef:ghi"); LuaString sub = str.substring(2, 10); assertEquals(10, str.m_length); @@ -313,7 +329,8 @@ public class StringTest extends TestCase { assertEquals(-1, sub.lastIndexOf(xyz)); } - public void testIndexOfAnyInSubstring() { + @Test + void testIndexOfAnyInSubstring() { LuaString str = LuaString.valueOf("abcdef:ghi"); LuaString sub = str.substring(2, 10); assertEquals(10, str.m_length); @@ -348,33 +365,4 @@ public class StringTest extends TestCase { assertEquals(1, sub.indexOfAny(CdEFGHIJ)); assertEquals(-1, sub.indexOfAny(EFGHIJKL)); } - - public void testMatchShortPatterns() { - LuaValue[] args = { LuaString.valueOf("%bxy") }; - LuaString _ = LuaString.valueOf(""); - - LuaString a = LuaString.valueOf("a"); - LuaString ax = LuaString.valueOf("ax"); - LuaString axb = LuaString.valueOf("axb"); - LuaString axby = LuaString.valueOf("axby"); - LuaString xbya = LuaString.valueOf("xbya"); - LuaString bya = LuaString.valueOf("bya"); - LuaString xby = LuaString.valueOf("xby"); - LuaString axbya = LuaString.valueOf("axbya"); - LuaValue nil = LuaValue.NIL; - - assertEquals(nil, _.invokemethod("match", args)); - assertEquals(nil, a.invokemethod("match", args)); - assertEquals(nil, ax.invokemethod("match", args)); - assertEquals(nil, axb.invokemethod("match", args)); - assertEquals(xby, axby.invokemethod("match", args)); - assertEquals(xby, xbya.invokemethod("match", args)); - assertEquals(nil, bya.invokemethod("match", args)); - assertEquals(xby, xby.invokemethod("match", args)); - assertEquals(xby, axbya.invokemethod("match", args)); - assertEquals(xby, axbya.substring(0, 4).invokemethod("match", args)); - assertEquals(nil, axbya.substring(0, 3).invokemethod("match", args)); - assertEquals(xby, axbya.substring(1, 5).invokemethod("match", args)); - assertEquals(nil, axbya.substring(2, 5).invokemethod("match", args)); - } } diff --git a/luaj-test/src/test/java/org/luaj/vm2/TableHashTest.java b/luaj-core/src/test/java/org/luaj/vm2/TableHashTest.java similarity index 96% rename from luaj-test/src/test/java/org/luaj/vm2/TableHashTest.java rename to luaj-core/src/test/java/org/luaj/vm2/TableHashTest.java index 67b92743..c18c02ff 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/TableHashTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/TableHashTest.java @@ -21,17 +21,16 @@ ******************************************************************************/ package org.luaj.vm2; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.luaj.vm2.LuaString; -import org.luaj.vm2.LuaTable; -import org.luaj.vm2.LuaValue; +import org.junit.jupiter.api.Test; import org.luaj.vm2.lib.TwoArgFunction; /** * Tests for tables used as lists. */ -public class TableHashTest extends TestCase { +public class TableHashTest { protected LuaTable new_Table() { return new LuaTable(); @@ -41,7 +40,8 @@ public class TableHashTest extends TestCase { return new LuaTable(n, m); } - public void testSetRemove() { + @Test + void testSetRemove() { LuaTable t = new_Table(); assertEquals(0, t.getHashLength()); @@ -94,7 +94,8 @@ public class TableHashTest extends TestCase { } } - public void testIndexMetatag() { + @Test + void testIndexMetatag() { LuaTable t = new_Table(); LuaTable mt = new_Table(); LuaTable fb = new_Table(); @@ -151,11 +152,13 @@ public class TableHashTest extends TestCase { assertEquals("nil", t.get(456).tojstring()); } - public void testIndexFunction() { + @Test + void testIndexFunction() { final LuaTable t = new_Table(); final LuaTable mt = new_Table(); final TwoArgFunction fb = new TwoArgFunction() { + @Override public LuaValue call(LuaValue tbl, LuaValue key) { assertEquals(tbl, t); return valueOf("from mt: " + key); @@ -205,7 +208,8 @@ public class TableHashTest extends TestCase { assertEquals("nil", t.get(456).tojstring()); } - public void testNext() { + @Test + void testNext() { final LuaTable t = new_Table(); assertEquals(LuaValue.NIL, t.next(LuaValue.NIL)); @@ -242,7 +246,8 @@ public class TableHashTest extends TestCase { assertEquals(LuaValue.NIL, t.next(LuaValue.valueOf("bb"))); } - public void testLoopWithRemoval() { + @Test + void testLoopWithRemoval() { final LuaTable t = new_Table(); t.set(LuaValue.valueOf(1), LuaValue.valueOf("1")); @@ -277,7 +282,8 @@ public class TableHashTest extends TestCase { assertEquals(5, numEntries); } - public void testLoopWithRemovalAndSet() { + @Test + void testLoopWithRemovalAndSet() { final LuaTable t = new_Table(); t.set(LuaValue.valueOf(1), LuaValue.valueOf("1")); diff --git a/luaj-test/src/test/java/org/luaj/vm2/TableTest.java b/luaj-core/src/test/java/org/luaj/vm2/TableTest.java similarity index 84% rename from luaj-test/src/test/java/org/luaj/vm2/TableTest.java rename to luaj-core/src/test/java/org/luaj/vm2/TableTest.java index 50481c2c..ebb1d124 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/TableTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/TableTest.java @@ -21,12 +21,18 @@ ******************************************************************************/ package org.luaj.vm2; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + import java.util.ArrayList; +import java.util.List; import java.util.Vector; -import junit.framework.TestCase; +import org.junit.jupiter.api.Test; -public class TableTest extends TestCase { +class TableTest { protected LuaTable new_Table() { return new LuaTable(); @@ -52,7 +58,8 @@ public class TableTest extends TestCase { return l.toArray(new LuaValue[t.length()]); } - public void testInOrderIntegerKeyInsertion() { + @Test + void testInOrderIntegerKeyInsertion() { LuaTable t = new_Table(); for (int i = 1; i <= 32; ++i) { @@ -72,7 +79,8 @@ public class TableTest extends TestCase { } - public void testRekeyCount() { + @Test + void testRekeyCount() { LuaTable t = new_Table(); // NOTE: This order of insertion is important. @@ -92,7 +100,8 @@ public class TableTest extends TestCase { assertTrue(t.getHashLength() <= 3); } - public void testOutOfOrderIntegerKeyInsertion() { + @Test + void testOutOfOrderIntegerKeyInsertion() { LuaTable t = new_Table(); for (int i = 32; i > 0; --i) { @@ -109,7 +118,8 @@ public class TableTest extends TestCase { assertEquals(0, t.getHashLength()); } - public void testStringAndIntegerKeys() { + @Test + void testStringAndIntegerKeys() { LuaTable t = new_Table(); for (int i = 0; i < 10; ++i) { @@ -143,7 +153,7 @@ public class TableTest extends TestCase { assertEquals(String.valueOf(ik), k.strvalue().tojstring()); assertTrue(ik >= 0 && ik < 10); final int mask = 1< v) { int n = v.size(); assertEquals(v.size(), t.length()); for (int j = 0; j < n; j++) { - Object vj = v.elementAt(j); - Object tj = t.get(j+1).tojstring(); - vj = ((LuaString) vj).tojstring(); - assertEquals(vj, tj); + LuaString vj = v.elementAt(j); + String tj = t.get(j+1).tojstring(); + assertEquals(vj.tojstring(), tj); } } - public void testInsertBeginningOfList() { + @Test + void testInsertBeginningOfList() { LuaTable t = new_Table(); - Vector v = new Vector(); + Vector v = new Vector<>(); for (int i = 1; i <= 32; ++i) { LuaString test = LuaValue.valueOf("Test Value! " + i); @@ -315,9 +334,10 @@ public class TableTest extends TestCase { } } - public void testInsertEndOfList() { + @Test + void testInsertEndOfList() { LuaTable t = new_Table(); - Vector v = new Vector(); + Vector v = new Vector<>(); for (int i = 1; i <= 32; ++i) { LuaString test = LuaValue.valueOf("Test Value! " + i); @@ -327,9 +347,10 @@ public class TableTest extends TestCase { } } - public void testInsertMiddleOfList() { + @Test + void testInsertMiddleOfList() { LuaTable t = new_Table(); - Vector v = new Vector(); + Vector v = new Vector<>(); for (int i = 1; i <= 32; ++i) { LuaString test = LuaValue.valueOf("Test Value! " + i); @@ -340,7 +361,7 @@ public class TableTest extends TestCase { } } - private static final void prefillLists(LuaTable t, Vector v) { + private static final void prefillLists(LuaTable t, Vector v) { for (int i = 1; i <= 32; ++i) { LuaString test = LuaValue.valueOf("Test Value! " + i); t.insert(0, test); @@ -348,9 +369,10 @@ public class TableTest extends TestCase { } } - public void testRemoveBeginningOfList() { + @Test + void testRemoveBeginningOfList() { LuaTable t = new_Table(); - Vector v = new Vector(); + Vector v = new Vector<>(); prefillLists(t, v); for (int i = 1; i <= 32; ++i) { t.remove(1); @@ -359,9 +381,10 @@ public class TableTest extends TestCase { } } - public void testRemoveEndOfList() { + @Test + void testRemoveEndOfList() { LuaTable t = new_Table(); - Vector v = new Vector(); + Vector v = new Vector<>(); prefillLists(t, v); for (int i = 1; i <= 32; ++i) { t.remove(0); @@ -370,9 +393,10 @@ public class TableTest extends TestCase { } } - public void testRemoveMiddleOfList() { + @Test + void testRemoveMiddleOfList() { LuaTable t = new_Table(); - Vector v = new Vector(); + Vector v = new Vector<>(); prefillLists(t, v); for (int i = 1; i <= 32; ++i) { int m = v.size()/2; @@ -382,7 +406,8 @@ public class TableTest extends TestCase { } } - public void testRemoveWhileIterating() { + @Test + void testRemoveWhileIterating() { LuaTable t = LuaValue.tableOf( new LuaValue[] { LuaValue.valueOf("a"), LuaValue.valueOf("aa"), LuaValue.valueOf("b"), LuaValue.valueOf("bb"), LuaValue.valueOf("c"), LuaValue.valueOf("cc"), LuaValue.valueOf("d"), @@ -390,7 +415,7 @@ public class TableTest extends TestCase { new LuaValue[] { LuaValue.valueOf("11"), LuaValue.valueOf("22"), LuaValue.valueOf("33"), LuaValue.valueOf("44"), LuaValue.valueOf("55"), }); // Find expected order after removal. - java.util.List expected = new java.util.ArrayList(); + List expected = new ArrayList<>(); Varargs n; int i; for (n = t.next(LuaValue.NIL), i = 0; !n.arg1().isnil(); n = t.next(n.arg1()), ++i) { @@ -403,7 +428,7 @@ public class TableTest extends TestCase { t.set(n.arg1(), LuaValue.NIL); } // Iterate over remaining table, and form list of entries still in table. - java.util.List actual = new java.util.ArrayList(); + List actual = new ArrayList<>(); for (n = t.next(LuaValue.NIL); !n.arg1().isnil(); n = t.next(n.arg1())) { actual.add(n.arg1() + "=" + n.arg(2)); } diff --git a/luaj-test/src/test/java/org/luaj/vm2/TypeTest.java b/luaj-core/src/test/java/org/luaj/vm2/TypeTest.java similarity index 93% rename from luaj-test/src/test/java/org/luaj/vm2/TypeTest.java rename to luaj-core/src/test/java/org/luaj/vm2/TypeTest.java index e0d583b1..f5ebe449 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/TypeTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/TypeTest.java @@ -21,17 +21,16 @@ ******************************************************************************/ package org.luaj.vm2; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + import java.lang.reflect.InvocationTargetException; -import junit.framework.TestCase; - +import org.junit.jupiter.api.Test; import org.luaj.vm2.lib.ZeroArgFunction; -import org.luaj.vm2.lib.jse.JsePlatform; -public class TypeTest extends TestCase { - static { - JsePlatform.debugGlobals(); - } +class TypeTest { private final int sampleint = 77; private final long samplelong = 123400000000L; @@ -56,6 +55,7 @@ public class TypeTest extends TestCase { private final LuaValue stringdouble = LuaValue.valueOf(samplestringdouble); private final LuaTable table = LuaValue.tableOf(); private final LuaFunction somefunc = new ZeroArgFunction() { + @Override public LuaValue call() { return NONE; } }; private final LuaThread thread = new LuaThread(new Globals(), somefunc); @@ -70,7 +70,8 @@ public class TypeTest extends TestCase { // ===================== type checks ======================= - public void testIsBoolean() { + @Test + void testIsBoolean() { assertEquals(false, somenil.isboolean()); assertEquals(true, sometrue.isboolean()); assertEquals(true, somefalse.isboolean()); @@ -90,7 +91,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isboolean()); } - public void testIsClosure() { + @Test + void testIsClosure() { assertEquals(false, somenil.isclosure()); assertEquals(false, sometrue.isclosure()); assertEquals(false, somefalse.isclosure()); @@ -110,7 +112,8 @@ public class TypeTest extends TestCase { assertEquals(true, someclosure.isclosure()); } - public void testIsFunction() { + @Test + void testIsFunction() { assertEquals(false, somenil.isfunction()); assertEquals(false, sometrue.isfunction()); assertEquals(false, somefalse.isfunction()); @@ -130,7 +133,8 @@ public class TypeTest extends TestCase { assertEquals(true, someclosure.isfunction()); } - public void testIsInt() { + @Test + void testIsInt() { assertEquals(false, somenil.isint()); assertEquals(false, sometrue.isint()); assertEquals(false, somefalse.isint()); @@ -149,7 +153,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isint()); } - public void testIsIntType() { + @Test + void testIsIntType() { assertEquals(false, somenil.isinttype()); assertEquals(false, sometrue.isinttype()); assertEquals(false, somefalse.isinttype()); @@ -169,7 +174,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isinttype()); } - public void testIsLong() { + @Test + void testIsLong() { assertEquals(false, somenil.islong()); assertEquals(false, sometrue.islong()); assertEquals(false, somefalse.islong()); @@ -188,7 +194,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.islong()); } - public void testIsNil() { + @Test + void testIsNil() { assertEquals(true, somenil.isnil()); assertEquals(false, sometrue.isnil()); assertEquals(false, somefalse.isnil()); @@ -208,7 +215,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isnil()); } - public void testIsNumber() { + @Test + void testIsNumber() { assertEquals(false, somenil.isnumber()); assertEquals(false, sometrue.isnumber()); assertEquals(false, somefalse.isnumber()); @@ -228,7 +236,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isnumber()); } - public void testIsString() { + @Test + void testIsString() { assertEquals(false, somenil.isstring()); assertEquals(false, sometrue.isstring()); assertEquals(false, somefalse.isstring()); @@ -247,7 +256,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isstring()); } - public void testIsThread() { + @Test + void testIsThread() { assertEquals(false, somenil.isthread()); assertEquals(false, sometrue.isthread()); assertEquals(false, somefalse.isthread()); @@ -265,7 +275,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isthread()); } - public void testIsTable() { + @Test + void testIsTable() { assertEquals(false, somenil.istable()); assertEquals(false, sometrue.istable()); assertEquals(false, somefalse.istable()); @@ -283,7 +294,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.istable()); } - public void testIsUserdata() { + @Test + void testIsUserdata() { assertEquals(false, somenil.isuserdata()); assertEquals(false, sometrue.isuserdata()); assertEquals(false, somefalse.isuserdata()); @@ -301,7 +313,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isuserdata()); } - public void testIsUserdataObject() { + @Test + void testIsUserdataObject() { assertEquals(false, somenil.isuserdata(Object.class)); assertEquals(false, sometrue.isuserdata(Object.class)); assertEquals(false, somefalse.isuserdata(Object.class)); @@ -318,7 +331,8 @@ public class TypeTest extends TestCase { assertEquals(false, someclosure.isuserdata(Object.class)); } - public void testIsUserdataMyData() { + @Test + void testIsUserdataMyData() { assertEquals(false, somenil.isuserdata(MyData.class)); assertEquals(false, sometrue.isuserdata(MyData.class)); assertEquals(false, somefalse.isuserdata(MyData.class)); @@ -337,7 +351,8 @@ public class TypeTest extends TestCase { // ===================== Coerce to Java ======================= - public void testToBoolean() { + @Test + void testToBoolean() { assertEquals(false, somenil.toboolean()); assertEquals(true, sometrue.toboolean()); assertEquals(false, somefalse.toboolean()); @@ -357,7 +372,8 @@ public class TypeTest extends TestCase { assertEquals(true, someclosure.toboolean()); } - public void testToByte() { + @Test + void testToByte() { assertEquals((byte) 0, somenil.tobyte()); assertEquals((byte) 0, somefalse.tobyte()); assertEquals((byte) 0, sometrue.tobyte()); @@ -377,7 +393,8 @@ public class TypeTest extends TestCase { assertEquals((byte) 0, someclosure.tobyte()); } - public void testToChar() { + @Test + void testToChar() { assertEquals((char) 0, somenil.tochar()); assertEquals((char) 0, somefalse.tochar()); assertEquals((char) 0, sometrue.tochar()); @@ -397,18 +414,19 @@ public class TypeTest extends TestCase { assertEquals((char) 0, someclosure.tochar()); } - public void testToDouble() { + @Test + void testToDouble() { assertEquals(0., somenil.todouble()); assertEquals(0., somefalse.todouble()); assertEquals(0., sometrue.todouble()); assertEquals(0., zero.todouble()); - assertEquals((double) sampleint, intint.todouble()); - assertEquals((double) samplelong, longdouble.todouble()); - assertEquals((double) sampledouble, doubledouble.todouble()); - assertEquals((double) 0, stringstring.todouble()); - assertEquals((double) sampleint, stringint.todouble()); - assertEquals((double) samplelong, stringlong.todouble()); - assertEquals((double) sampledouble, stringdouble.todouble()); + assertEquals(sampleint, intint.todouble()); + assertEquals(samplelong, longdouble.todouble()); + assertEquals(sampledouble, doubledouble.todouble()); + assertEquals(0, stringstring.todouble()); + assertEquals(sampleint, stringint.todouble()); + assertEquals(samplelong, stringlong.todouble()); + assertEquals(sampledouble, stringdouble.todouble()); assertEquals(0., thread.todouble()); assertEquals(0., table.todouble()); assertEquals(0., userdataobj.todouble()); @@ -417,17 +435,18 @@ public class TypeTest extends TestCase { assertEquals(0., someclosure.todouble()); } - public void testToFloat() { + @Test + void testToFloat() { assertEquals(0.f, somenil.tofloat()); assertEquals(0.f, somefalse.tofloat()); assertEquals(0.f, sometrue.tofloat()); assertEquals(0.f, zero.tofloat()); - assertEquals((float) sampleint, intint.tofloat()); - assertEquals((float) samplelong, longdouble.tofloat()); + assertEquals(sampleint, intint.tofloat()); + assertEquals(samplelong, longdouble.tofloat()); assertEquals((float) sampledouble, doubledouble.tofloat()); - assertEquals((float) 0, stringstring.tofloat()); - assertEquals((float) sampleint, stringint.tofloat()); - assertEquals((float) samplelong, stringlong.tofloat()); + assertEquals(0, stringstring.tofloat()); + assertEquals(sampleint, stringint.tofloat()); + assertEquals(samplelong, stringlong.tofloat()); assertEquals((float) sampledouble, stringdouble.tofloat()); assertEquals(0.f, thread.tofloat()); assertEquals(0.f, table.tofloat()); @@ -437,16 +456,17 @@ public class TypeTest extends TestCase { assertEquals(0.f, someclosure.tofloat()); } - public void testToInt() { + @Test + void testToInt() { assertEquals(0, somenil.toint()); assertEquals(0, somefalse.toint()); assertEquals(0, sometrue.toint()); assertEquals(0, zero.toint()); - assertEquals((int) sampleint, intint.toint()); + assertEquals(sampleint, intint.toint()); assertEquals((int) samplelong, longdouble.toint()); assertEquals((int) sampledouble, doubledouble.toint()); - assertEquals((int) 0, stringstring.toint()); - assertEquals((int) sampleint, stringint.toint()); + assertEquals(0, stringstring.toint()); + assertEquals(sampleint, stringint.toint()); assertEquals((int) samplelong, stringlong.toint()); assertEquals((int) sampledouble, stringdouble.toint()); assertEquals(0, thread.toint()); @@ -457,17 +477,18 @@ public class TypeTest extends TestCase { assertEquals(0, someclosure.toint()); } - public void testToLong() { + @Test + void testToLong() { assertEquals(0L, somenil.tolong()); assertEquals(0L, somefalse.tolong()); assertEquals(0L, sometrue.tolong()); assertEquals(0L, zero.tolong()); - assertEquals((long) sampleint, intint.tolong()); - assertEquals((long) samplelong, longdouble.tolong()); + assertEquals(sampleint, intint.tolong()); + assertEquals(samplelong, longdouble.tolong()); assertEquals((long) sampledouble, doubledouble.tolong()); - assertEquals((long) 0, stringstring.tolong()); - assertEquals((long) sampleint, stringint.tolong()); - assertEquals((long) samplelong, stringlong.tolong()); + assertEquals(0, stringstring.tolong()); + assertEquals(sampleint, stringint.tolong()); + assertEquals(samplelong, stringlong.tolong()); assertEquals((long) sampledouble, stringdouble.tolong()); assertEquals(0L, thread.tolong()); assertEquals(0L, table.tolong()); @@ -477,7 +498,8 @@ public class TypeTest extends TestCase { assertEquals(0L, someclosure.tolong()); } - public void testToShort() { + @Test + void testToShort() { assertEquals((short) 0, somenil.toshort()); assertEquals((short) 0, somefalse.toshort()); assertEquals((short) 0, sometrue.toshort()); @@ -497,7 +519,8 @@ public class TypeTest extends TestCase { assertEquals((short) 0, someclosure.toshort()); } - public void testToString() { + @Test + void testToString() { assertEquals("nil", somenil.tojstring()); assertEquals("false", somefalse.tojstring()); assertEquals("true", sometrue.tojstring()); @@ -517,7 +540,8 @@ public class TypeTest extends TestCase { assertEquals("function: ", someclosure.tojstring().substring(0, 10)); } - public void testToUserdata() { + @Test + void testToUserdata() { assertEquals(null, somenil.touserdata()); assertEquals(null, somefalse.touserdata()); assertEquals(null, sometrue.touserdata()); @@ -552,7 +576,8 @@ public class TypeTest extends TestCase { fail("failed to throw LuaError as required"); } - public void testOptBoolean() { + @Test + void testOptBoolean() { assertEquals(true, somenil.optboolean(true)); assertEquals(false, somenil.optboolean(false)); assertEquals(true, sometrue.optboolean(false)); @@ -573,7 +598,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optboolean", boolean.class, Boolean.FALSE); } - public void testOptClosure() { + @Test + void testOptClosure() { assertEquals(someclosure, somenil.optclosure(someclosure)); assertEquals(null, somenil.optclosure(null)); throwsError(sometrue, "optclosure", LuaClosure.class, someclosure); @@ -595,19 +621,20 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optclosure", LuaClosure.class, someclosure); } - public void testOptDouble() { + @Test + void testOptDouble() { assertEquals(33., somenil.optdouble(33.)); throwsError(sometrue, "optdouble", double.class, 33.); throwsError(somefalse, "optdouble", double.class, 33.); assertEquals(0., zero.optdouble(33.)); - assertEquals((double) sampleint, intint.optdouble(33.)); - assertEquals((double) samplelong, longdouble.optdouble(33.)); + assertEquals(sampleint, intint.optdouble(33.)); + assertEquals(samplelong, longdouble.optdouble(33.)); assertEquals(sampledouble, doubledouble.optdouble(33.)); throwsError(somefunc, "optdouble", double.class, 33.); throwsError(someclosure, "optdouble", double.class, 33.); throwsError(stringstring, "optdouble", double.class, 33.); - assertEquals((double) sampleint, stringint.optdouble(33.)); - assertEquals((double) samplelong, stringlong.optdouble(33.)); + assertEquals(sampleint, stringint.optdouble(33.)); + assertEquals(samplelong, stringlong.optdouble(33.)); assertEquals(sampledouble, stringdouble.optdouble(33.)); throwsError(thread, "optdouble", double.class, 33.); throwsError(table, "optdouble", double.class, 33.); @@ -615,7 +642,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optdouble", double.class, 33.); } - public void testOptFunction() { + @Test + void testOptFunction() { assertEquals(somefunc, somenil.optfunction(somefunc)); assertEquals(null, somenil.optfunction(null)); throwsError(sometrue, "optfunction", LuaFunction.class, somefunc); @@ -638,7 +666,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optfunction", LuaFunction.class, somefunc); } - public void testOptInt() { + @Test + void testOptInt() { assertEquals(33, somenil.optint(33)); throwsError(sometrue, "optint", int.class, new Integer(33)); throwsError(somefalse, "optint", int.class, new Integer(33)); @@ -658,7 +687,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optint", int.class, new Integer(33)); } - public void testOptInteger() { + @Test + void testOptInteger() { assertEquals(LuaValue.valueOf(33), somenil.optinteger(LuaValue.valueOf(33))); throwsError(sometrue, "optinteger", LuaInteger.class, LuaValue.valueOf(33)); throwsError(somefalse, "optinteger", LuaInteger.class, LuaValue.valueOf(33)); @@ -678,19 +708,20 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optinteger", LuaInteger.class, LuaValue.valueOf(33)); } - public void testOptLong() { + @Test + void testOptLong() { assertEquals(33L, somenil.optlong(33)); throwsError(sometrue, "optlong", long.class, new Long(33)); throwsError(somefalse, "optlong", long.class, new Long(33)); assertEquals(0L, zero.optlong(33)); assertEquals(sampleint, intint.optlong(33)); - assertEquals((long) samplelong, longdouble.optlong(33)); + assertEquals(samplelong, longdouble.optlong(33)); assertEquals((long) sampledouble, doubledouble.optlong(33)); throwsError(somefunc, "optlong", long.class, new Long(33)); throwsError(someclosure, "optlong", long.class, new Long(33)); throwsError(stringstring, "optlong", long.class, new Long(33)); assertEquals(sampleint, stringint.optlong(33)); - assertEquals((long) samplelong, stringlong.optlong(33)); + assertEquals(samplelong, stringlong.optlong(33)); assertEquals((long) sampledouble, stringdouble.optlong(33)); throwsError(thread, "optlong", long.class, new Long(33)); throwsError(table, "optlong", long.class, new Long(33)); @@ -698,7 +729,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optlong", long.class, new Long(33)); } - public void testOptNumber() { + @Test + void testOptNumber() { assertEquals(LuaValue.valueOf(33), somenil.optnumber(LuaValue.valueOf(33))); throwsError(sometrue, "optnumber", LuaNumber.class, LuaValue.valueOf(33)); throwsError(somefalse, "optnumber", LuaNumber.class, LuaValue.valueOf(33)); @@ -718,7 +750,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optnumber", LuaNumber.class, LuaValue.valueOf(33)); } - public void testOptTable() { + @Test + void testOptTable() { assertEquals(table, somenil.opttable(table)); assertEquals(null, somenil.opttable(null)); throwsError(sometrue, "opttable", LuaTable.class, table); @@ -740,7 +773,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "opttable", LuaTable.class, table); } - public void testOptThread() { + @Test + void testOptThread() { assertEquals(thread, somenil.optthread(thread)); assertEquals(null, somenil.optthread(null)); throwsError(sometrue, "optthread", LuaThread.class, thread); @@ -762,7 +796,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optthread", LuaThread.class, thread); } - public void testOptJavaString() { + @Test + void testOptJavaString() { assertEquals("xyz", somenil.optjstring("xyz")); assertEquals(null, somenil.optjstring(null)); throwsError(sometrue, "optjstring", String.class, "xyz"); @@ -783,7 +818,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optjstring", String.class, "xyz"); } - public void testOptLuaString() { + @Test + void testOptLuaString() { assertEquals(LuaValue.valueOf("xyz"), somenil.optstring(LuaValue.valueOf("xyz"))); assertEquals(null, somenil.optstring(null)); throwsError(sometrue, "optstring", LuaString.class, LuaValue.valueOf("xyz")); @@ -804,7 +840,8 @@ public class TypeTest extends TestCase { throwsError(userdatacls, "optstring", LuaString.class, LuaValue.valueOf("xyz")); } - public void testOptUserdata() { + @Test + void testOptUserdata() { assertEquals(sampleobject, somenil.optuserdata(sampleobject)); assertEquals(sampledata, somenil.optuserdata(sampledata)); assertEquals(null, somenil.optuserdata(null)); @@ -840,7 +877,8 @@ public class TypeTest extends TestCase { fail("failed to throw LuaError as required"); } - public void testOptUserdataClass() { + @Test + void testOptUserdataClass() { assertEquals(sampledata, somenil.optuserdata(MyData.class, sampledata)); assertEquals(sampleobject, somenil.optuserdata(Object.class, sampleobject)); assertEquals(null, somenil.optuserdata(null)); @@ -872,7 +910,8 @@ public class TypeTest extends TestCase { } } - public void testOptValue() { + @Test + void testOptValue() { assertEquals(zero, somenil.optvalue(zero)); assertEquals(stringstring, somenil.optvalue(stringstring)); assertEquals(sometrue, sometrue.optvalue(LuaValue.TRUE)); @@ -907,7 +946,8 @@ public class TypeTest extends TestCase { fail("failed to throw LuaError as required"); } - public void testCheckBoolean() { + @Test + void testCheckBoolean() { throwsErrorReq(somenil, "checkboolean"); assertEquals(true, sometrue.checkboolean()); assertEquals(false, somefalse.checkboolean()); @@ -927,7 +967,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkboolean"); } - public void testCheckClosure() { + @Test + void testCheckClosure() { throwsErrorReq(somenil, "checkclosure"); throwsErrorReq(sometrue, "checkclosure"); throwsErrorReq(somefalse, "checkclosure"); @@ -948,19 +989,20 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkclosure"); } - public void testCheckDouble() { + @Test + void testCheckDouble() { throwsErrorReq(somenil, "checkdouble"); throwsErrorReq(sometrue, "checkdouble"); throwsErrorReq(somefalse, "checkdouble"); assertEquals(0., zero.checkdouble()); - assertEquals((double) sampleint, intint.checkdouble()); - assertEquals((double) samplelong, longdouble.checkdouble()); + assertEquals(sampleint, intint.checkdouble()); + assertEquals(samplelong, longdouble.checkdouble()); assertEquals(sampledouble, doubledouble.checkdouble()); throwsErrorReq(somefunc, "checkdouble"); throwsErrorReq(someclosure, "checkdouble"); throwsErrorReq(stringstring, "checkdouble"); - assertEquals((double) sampleint, stringint.checkdouble()); - assertEquals((double) samplelong, stringlong.checkdouble()); + assertEquals(sampleint, stringint.checkdouble()); + assertEquals(samplelong, stringlong.checkdouble()); assertEquals(sampledouble, stringdouble.checkdouble()); throwsErrorReq(thread, "checkdouble"); throwsErrorReq(table, "checkdouble"); @@ -968,7 +1010,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkdouble"); } - public void testCheckFunction() { + @Test + void testCheckFunction() { throwsErrorReq(somenil, "checkfunction"); throwsErrorReq(sometrue, "checkfunction"); throwsErrorReq(somefalse, "checkfunction"); @@ -990,7 +1033,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkfunction"); } - public void testCheckInt() { + @Test + void testCheckInt() { throwsErrorReq(somenil, "checkint"); throwsErrorReq(sometrue, "checkint"); throwsErrorReq(somefalse, "checkint"); @@ -1010,7 +1054,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkint"); } - public void testCheckInteger() { + @Test + void testCheckInteger() { throwsErrorReq(somenil, "checkinteger"); throwsErrorReq(sometrue, "checkinteger"); throwsErrorReq(somefalse, "checkinteger"); @@ -1030,19 +1075,20 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkinteger"); } - public void testCheckLong() { + @Test + void testCheckLong() { throwsErrorReq(somenil, "checklong"); throwsErrorReq(sometrue, "checklong"); throwsErrorReq(somefalse, "checklong"); assertEquals(0L, zero.checklong()); assertEquals(sampleint, intint.checklong()); - assertEquals((long) samplelong, longdouble.checklong()); + assertEquals(samplelong, longdouble.checklong()); assertEquals((long) sampledouble, doubledouble.checklong()); throwsErrorReq(somefunc, "checklong"); throwsErrorReq(someclosure, "checklong"); throwsErrorReq(stringstring, "checklong"); assertEquals(sampleint, stringint.checklong()); - assertEquals((long) samplelong, stringlong.checklong()); + assertEquals(samplelong, stringlong.checklong()); assertEquals((long) sampledouble, stringdouble.checklong()); throwsErrorReq(thread, "checklong"); throwsErrorReq(table, "checklong"); @@ -1050,7 +1096,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checklong"); } - public void testCheckNumber() { + @Test + void testCheckNumber() { throwsErrorReq(somenil, "checknumber"); throwsErrorReq(sometrue, "checknumber"); throwsErrorReq(somefalse, "checknumber"); @@ -1070,7 +1117,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checknumber"); } - public void testCheckTable() { + @Test + void testCheckTable() { throwsErrorReq(somenil, "checktable"); throwsErrorReq(sometrue, "checktable"); throwsErrorReq(somefalse, "checktable"); @@ -1091,7 +1139,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checktable"); } - public void testCheckThread() { + @Test + void testCheckThread() { throwsErrorReq(somenil, "checkthread"); throwsErrorReq(sometrue, "checkthread"); throwsErrorReq(somefalse, "checkthread"); @@ -1112,7 +1161,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkthread"); } - public void testCheckJavaString() { + @Test + void testCheckJavaString() { throwsErrorReq(somenil, "checkjstring"); throwsErrorReq(sometrue, "checkjstring"); throwsErrorReq(somefalse, "checkjstring"); @@ -1132,7 +1182,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkjstring"); } - public void testCheckLuaString() { + @Test + void testCheckLuaString() { throwsErrorReq(somenil, "checkstring"); throwsErrorReq(sometrue, "checkstring"); throwsErrorReq(somefalse, "checkstring"); @@ -1152,7 +1203,8 @@ public class TypeTest extends TestCase { throwsErrorReq(userdatacls, "checkstring"); } - public void testCheckUserdata() { + @Test + void testCheckUserdata() { throwsErrorReq(somenil, "checkuserdata"); throwsErrorReq(sometrue, "checkuserdata"); throwsErrorReq(somefalse, "checkuserdata"); @@ -1186,7 +1238,8 @@ public class TypeTest extends TestCase { fail("failed to throw LuaError as required"); } - public void testCheckUserdataClass() { + @Test + void testCheckUserdataClass() { throwsErrorReqCheckUserdataClass(somenil, Object.class); throwsErrorReqCheckUserdataClass(somenil, MyData.class); throwsErrorReqCheckUserdataClass(sometrue, Object.class); @@ -1217,7 +1270,8 @@ public class TypeTest extends TestCase { } } - public void testCheckValue() { + @Test + void testCheckValue() { throwsErrorReq(somenil, "checknotnil"); assertEquals(sometrue, sometrue.checknotnil()); assertEquals(somefalse, somefalse.checknotnil()); diff --git a/luaj-test/src/test/java/org/luaj/vm2/UnaryBinaryOperatorsTest.java b/luaj-core/src/test/java/org/luaj/vm2/UnaryBinaryOperatorsTest.java similarity index 96% rename from luaj-test/src/test/java/org/luaj/vm2/UnaryBinaryOperatorsTest.java rename to luaj-core/src/test/java/org/luaj/vm2/UnaryBinaryOperatorsTest.java index 89a75426..2ed1ce4e 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/UnaryBinaryOperatorsTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/UnaryBinaryOperatorsTest.java @@ -21,25 +21,33 @@ ******************************************************************************/ package org.luaj.vm2; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + import java.lang.reflect.InvocationTargetException; -import junit.framework.TestCase; - +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.luaj.vm2.lib.TwoArgFunction; /** * Tests of basic unary and binary operators on main value types. */ -public class UnaryBinaryOperatorsTest extends TestCase { +class UnaryBinaryOperatorsTest { LuaValue dummy; + @BeforeEach protected void setUp() throws Exception { - super.setUp(); dummy = LuaValue.ZERO; } - public void testEqualsBool() { + @Test + void testEqualsBool() { assertEquals(LuaValue.FALSE, LuaValue.FALSE); assertEquals(LuaValue.TRUE, LuaValue.TRUE); assertTrue(LuaValue.FALSE.equals(LuaValue.FALSE)); @@ -66,7 +74,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertFalse(LuaValue.FALSE.toboolean()); } - public void testNot() { + @Test + void testNot() { LuaValue ia = LuaValue.valueOf(3); LuaValue da = LuaValue.valueOf(.25); LuaValue sa = LuaValue.valueOf("1.5"); @@ -80,7 +89,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(LuaValue.TRUE, bb.not()); } - public void testNeg() { + @Test + void testNeg() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(-4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(-.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("-2.0"); @@ -94,7 +104,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(2.0, sb.neg().todouble()); } - public void testDoublesBecomeInts() { + @Test + void testDoublesBecomeInts() { // DoubleValue.valueOf should return int LuaValue ia = LuaInteger.valueOf(345), da = LuaDouble.valueOf(345.0), db = LuaDouble.valueOf(345.5); LuaValue sa = LuaValue.valueOf("3.0"), sb = LuaValue.valueOf("3"), sc = LuaValue.valueOf("-2.0"), @@ -120,7 +131,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { } - public void testEqualsInt() { + @Test + void testEqualsInt() { LuaValue ia = LuaInteger.valueOf(345), ib = LuaInteger.valueOf(345), ic = LuaInteger.valueOf(-345); LuaString sa = LuaString.valueOf("345"), sb = LuaString.valueOf("345"), sc = LuaString.valueOf("-345"); @@ -141,7 +153,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertFalse(sa.equals(ia)); } - public void testEqualsDouble() { + @Test + void testEqualsDouble() { LuaValue da = LuaDouble.valueOf(345.5), db = LuaDouble.valueOf(345.5), dc = LuaDouble.valueOf(-345.5); LuaString sa = LuaString.valueOf("345.5"), sb = LuaString.valueOf("345.5"), sc = LuaString.valueOf("-345.5"); @@ -162,7 +175,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertFalse(sa.equals(da)); } - public void testEqInt() { + @Test + void testEqInt() { LuaValue ia = LuaInteger.valueOf(345), ib = LuaInteger.valueOf(345), ic = LuaInteger.valueOf(-123); LuaValue sa = LuaString.valueOf("345"), sb = LuaString.valueOf("345"), sc = LuaString.valueOf("-345"); @@ -186,7 +200,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(LuaValue.NIL.eq(ia), LuaValue.FALSE); } - public void testEqDouble() { + @Test + void testEqDouble() { LuaValue da = LuaDouble.valueOf(345.5), db = LuaDouble.valueOf(345.5), dc = LuaDouble.valueOf(-345.5); LuaValue sa = LuaString.valueOf("345.5"), sb = LuaString.valueOf("345.5"), sc = LuaString.valueOf("-345.5"); @@ -211,18 +226,21 @@ public class UnaryBinaryOperatorsTest extends TestCase { } private static final TwoArgFunction RETURN_NIL = new TwoArgFunction() { + @Override public LuaValue call(LuaValue lhs, LuaValue rhs) { return NIL; } }; private static final TwoArgFunction RETURN_ONE = new TwoArgFunction() { + @Override public LuaValue call(LuaValue lhs, LuaValue rhs) { return ONE; } }; - public void testEqualsMetatag() { + @Test + void testEqualsMetatag() { LuaValue tru = LuaValue.TRUE; LuaValue fal = LuaValue.FALSE; LuaValue zer = LuaValue.ZERO; @@ -359,7 +377,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { } } - public void testAdd() { + @Test + void testAdd() { LuaValue ia = LuaValue.valueOf(111), ib = LuaValue.valueOf(44); LuaValue da = LuaValue.valueOf(55.25), db = LuaValue.valueOf(3.5); LuaValue sa = LuaValue.valueOf("22.125"), sb = LuaValue.valueOf("7.25"); @@ -386,7 +405,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(77.375, sa.add(da).todouble()); } - public void testSub() { + @Test + void testSub() { LuaValue ia = LuaValue.valueOf(111), ib = LuaValue.valueOf(44); LuaValue da = LuaValue.valueOf(55.25), db = LuaValue.valueOf(3.5); LuaValue sa = LuaValue.valueOf("22.125"), sb = LuaValue.valueOf("7.25"); @@ -405,7 +425,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(-33.125, sa.sub(da).todouble()); } - public void testMul() { + @Test + void testMul() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("2.0"); @@ -424,7 +445,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(.375, sa.mul(da).todouble()); } - public void testDiv() { + @Test + void testDiv() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("2.0"); @@ -443,7 +465,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(1.5/.25, sa.div(da).todouble()); } - public void testPow() { + @Test + void testPow() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(4.), db = LuaValue.valueOf(.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("2.0"); @@ -466,7 +489,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { return y != 0? x-y*Math.floor(x/y): Double.NaN; } - public void testMod() { + @Test + void testMod() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(-4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(-.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("-2.0"); @@ -485,7 +509,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(luaMod(1.5, .25), sa.mod(da).todouble()); } - public void testArithErrors() { + @Test + void testArithErrors() { LuaValue ia = LuaValue.valueOf(111), ib = LuaValue.valueOf(44); LuaValue da = LuaValue.valueOf(55.25), db = LuaValue.valueOf(3.5); LuaValue sa = LuaValue.valueOf("22.125"), sb = LuaValue.valueOf("7.25"); @@ -516,18 +541,21 @@ public class UnaryBinaryOperatorsTest extends TestCase { } private static final TwoArgFunction RETURN_LHS = new TwoArgFunction() { + @Override public LuaValue call(LuaValue lhs, LuaValue rhs) { return lhs; } }; private static final TwoArgFunction RETURN_RHS = new TwoArgFunction() { + @Override public LuaValue call(LuaValue lhs, LuaValue rhs) { return rhs; } }; - public void testArithMetatag() { + @Test + void testArithMetatag() { LuaValue tru = LuaValue.TRUE; LuaValue fal = LuaValue.FALSE; LuaValue tbl = new LuaTable(); @@ -538,37 +566,36 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.mul(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.div(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.pow(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.mod(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; // always use left argument LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.ADD, RETURN_LHS, }); @@ -580,13 +607,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.SUB, RETURN_LHS, }); assertEquals(tru, tru.sub(fal)); @@ -597,13 +623,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.add(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.MUL, RETURN_LHS, }); assertEquals(tru, tru.mul(fal)); @@ -614,13 +639,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.DIV, RETURN_LHS, }); assertEquals(tru, tru.div(fal)); @@ -631,13 +655,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.POW, RETURN_LHS, }); assertEquals(tru, tru.pow(fal)); @@ -648,13 +671,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.MOD, RETURN_LHS, }); assertEquals(tru, tru.mod(fal)); @@ -665,13 +687,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; // always use right argument LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.ADD, RETURN_RHS, }); @@ -683,13 +704,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.SUB, RETURN_RHS, }); assertEquals(fal, tru.sub(fal)); @@ -700,13 +720,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.add(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.MUL, RETURN_RHS, }); assertEquals(fal, tru.mul(fal)); @@ -717,13 +736,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.DIV, RETURN_RHS, }); assertEquals(fal, tru.div(fal)); @@ -734,13 +752,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.POW, RETURN_RHS, }); assertEquals(fal, tru.pow(fal)); @@ -751,13 +768,12 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.MOD, RETURN_RHS, }); assertEquals(fal, tru.mod(fal)); @@ -768,20 +784,20 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { tru.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; } finally { LuaBoolean.s_metatable = null; } } - public void testArithMetatagNumberTable() { + @Test + void testArithMetatagNumberTable() { LuaValue zero = LuaValue.ZERO; LuaValue one = LuaValue.ONE; LuaValue tbl = new LuaTable(); @@ -791,13 +807,13 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { zero.add(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + tbl.setmetatable(LuaValue.tableOf(new LuaValue[] { LuaValue.ADD, RETURN_ONE, })); assertEquals(one, tbl.add(zero)); assertEquals(one, zero.add(tbl)); @@ -807,13 +823,13 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { zero.sub(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + tbl.setmetatable(LuaValue.tableOf(new LuaValue[] { LuaValue.SUB, RETURN_ONE, })); assertEquals(one, tbl.sub(zero)); assertEquals(one, zero.sub(tbl)); @@ -823,13 +839,13 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { zero.mul(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + tbl.setmetatable(LuaValue.tableOf(new LuaValue[] { LuaValue.MUL, RETURN_ONE, })); assertEquals(one, tbl.mul(zero)); assertEquals(one, zero.mul(tbl)); @@ -839,13 +855,13 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { zero.div(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + tbl.setmetatable(LuaValue.tableOf(new LuaValue[] { LuaValue.DIV, RETURN_ONE, })); assertEquals(one, tbl.div(zero)); assertEquals(one, zero.div(tbl)); @@ -855,13 +871,13 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { zero.pow(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + tbl.setmetatable(LuaValue.tableOf(new LuaValue[] { LuaValue.POW, RETURN_ONE, })); assertEquals(one, tbl.pow(zero)); assertEquals(one, zero.pow(tbl)); @@ -871,19 +887,20 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { zero.mod(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + tbl.setmetatable(LuaValue.tableOf(new LuaValue[] { LuaValue.MOD, RETURN_ONE, })); assertEquals(one, tbl.mod(zero)); assertEquals(one, zero.mod(tbl)); } - public void testCompareStrings() { + @Test + void testCompareStrings() { // these are lexical compare! LuaValue sa = LuaValue.valueOf("-1.5"); LuaValue sb = LuaValue.valueOf("-2.0"); @@ -908,7 +925,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(LuaValue.FALSE, sd.lt(sd)); } - public void testLt() { + @Test + void testLt() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); @@ -925,7 +943,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(.25 < 3., da.lt_b(ia)); } - public void testLtEq() { + @Test + void testLtEq() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); @@ -942,7 +961,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(.25 <= 3., da.lteq_b(ia)); } - public void testGt() { + @Test + void testGt() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); @@ -959,7 +979,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(.25 > 3., da.gt_b(ia)); } - public void testGtEq() { + @Test + void testGtEq() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); @@ -976,7 +997,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(.25 >= 3., da.gteq_b(ia)); } - public void testNotEq() { + @Test + void testNotEq() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("2.0"); @@ -1004,7 +1026,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(1.5 != .25, sa.neq_b(da)); } - public void testCompareErrors() { + @Test + void testCompareErrors() { LuaValue ia = LuaValue.valueOf(111), ib = LuaValue.valueOf(44); LuaValue da = LuaValue.valueOf(55.25), db = LuaValue.valueOf(3.5); LuaValue sa = LuaValue.valueOf("22.125"), sb = LuaValue.valueOf("7.25"); @@ -1034,7 +1057,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { } } - public void testCompareMetatag() { + @Test + void testCompareMetatag() { LuaValue tru = LuaValue.TRUE; LuaValue fal = LuaValue.FALSE; LuaValue tbl = new LuaTable(); @@ -1076,13 +1100,13 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(tbl2, tbl2.lteq(tbl)); assertEquals(tbl, tbl.lteq(tbl3)); assertEquals(tbl3, tbl3.lteq(tbl)); - } finally { LuaBoolean.s_metatable = null; } } - public void testAnd() { + @Test + void testAnd() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("2.0"); @@ -1108,7 +1132,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertSame(bb, bb.and(ia)); } - public void testOr() { + @Test + void testOr() { LuaValue ia = LuaValue.valueOf(3), ib = LuaValue.valueOf(4); LuaValue da = LuaValue.valueOf(.25), db = LuaValue.valueOf(.5); LuaValue sa = LuaValue.valueOf("1.5"), sb = LuaValue.valueOf("2.0"); @@ -1134,7 +1159,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertSame(ia, bb.or(ia)); } - public void testLexicalComparison() { + @Test + void testLexicalComparison() { LuaValue aaa = LuaValue.valueOf("aaa"); LuaValue baa = LuaValue.valueOf("baa"); LuaValue Aaa = LuaValue.valueOf("Aaa"); @@ -1196,7 +1222,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals(t, aaa.gteq(aaa)); } - public void testBuffer() { + @Test + void testBuffer() { LuaValue abc = LuaValue.valueOf("abcdefghi").substring(0, 3); LuaValue def = LuaValue.valueOf("abcdefghi").substring(3, 6); LuaValue ghi = LuaValue.valueOf("abcdefghi").substring(6, 9); @@ -1261,7 +1288,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals("ghidefabc", b.value().tojstring()); } - public void testConcat() { + @Test + void testConcat() { LuaValue abc = LuaValue.valueOf("abcdefghi").substring(0, 3); LuaValue def = LuaValue.valueOf("abcdefghi").substring(3, 6); LuaValue ghi = LuaValue.valueOf("abcdefghi").substring(6, 9); @@ -1279,7 +1307,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals("def123", def.concat(n123).tojstring()); } - public void testConcatBuffer() { + @Test + void testConcatBuffer() { LuaValue abc = LuaValue.valueOf("abcdefghi").substring(0, 3); LuaValue def = LuaValue.valueOf("abcdefghi").substring(3, 6); LuaValue ghi = LuaValue.valueOf("abcdefghi").substring(6, 9); @@ -1301,7 +1330,8 @@ public class UnaryBinaryOperatorsTest extends TestCase { assertEquals("abcdef123", b.value().tojstring()); } - public void testConcatMetatag() { + @Test + void testConcatMetatag() { LuaValue def = LuaValue.valueOf("abcdefghi").substring(3, 6); LuaValue ghi = LuaValue.valueOf("abcdefghi").substring(6, 9); LuaValue tru = LuaValue.TRUE; @@ -1324,37 +1354,36 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { def.concat(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + try { tbl.concat(def.buffer()).value(); fail("did not throw error"); } catch (LuaError le) { } - ; + try { def.concat(tbl.buffer()).value(); fail("did not throw error"); } catch (LuaError le) { } - ; + try { uda.concat(def.concat(tbl.buffer())).value(); fail("did not throw error"); } catch (LuaError le) { } - ; + try { ghi.concat(tbl.concat(def.buffer())).value(); fail("did not throw error"); } catch (LuaError le) { } - ; // always use right argument LuaBoolean.s_metatable = LuaValue.tableOf(new LuaValue[] { LuaValue.CONCAT, RETURN_RHS }); @@ -1369,44 +1398,44 @@ public class UnaryBinaryOperatorsTest extends TestCase { fail("did not throw error"); } catch (LuaError le) { } - ; + try { def.concat(tbl); fail("did not throw error"); } catch (LuaError le) { } - ; + try { tbl.concat(def.buffer()).value(); fail("did not throw error"); } catch (LuaError le) { } - ; + try { def.concat(tbl.buffer()).value(); fail("did not throw error"); } catch (LuaError le) { } - ; + try { uda.concat(def.concat(tbl.buffer())).value(); fail("did not throw error"); } catch (LuaError le) { } - ; + try { uda.concat(tbl.concat(def.buffer())).value(); fail("did not throw error"); } catch (LuaError le) { } - ; } finally { LuaBoolean.s_metatable = null; } } - public void testConcatErrors() { + @Test + void testConcatErrors() { LuaValue ia = LuaValue.valueOf(111), ib = LuaValue.valueOf(44); LuaValue da = LuaValue.valueOf(55.25), db = LuaValue.valueOf(3.5); LuaValue sa = LuaValue.valueOf("22.125"), sb = LuaValue.valueOf("7.25"); diff --git a/luaj-test/src/test/java/org/luaj/vm2/VarargsTest.java b/luaj-core/src/test/java/org/luaj/vm2/VarargsTest.java similarity index 92% rename from luaj-test/src/test/java/org/luaj/vm2/VarargsTest.java rename to luaj-core/src/test/java/org/luaj/vm2/VarargsTest.java index faa1d34a..fcbb769d 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/VarargsTest.java +++ b/luaj-core/src/test/java/org/luaj/vm2/VarargsTest.java @@ -21,12 +21,15 @@ ******************************************************************************/ package org.luaj.vm2; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import org.junit.jupiter.api.Test; /** * Tests of basic unary and binary operators on main value types. */ -public class VarargsTest extends TestCase { +class VarargsTest { static LuaValue A = LuaValue.valueOf("a"); static LuaValue B = LuaValue.valueOf("b"); @@ -57,7 +60,7 @@ public class VarargsTest extends TestCase { static Varargs FG_alt = new Varargs.PairVarargs(F, G); static Varargs NONE = LuaValue.NONE; - static void expectEquals(Varargs x, Varargs y) { + private void expectEquals(Varargs x, Varargs y) { assertEquals(x.narg(), y.narg()); assertEquals(x.arg1(), y.arg1()); assertEquals(x.arg(0), y.arg(0)); @@ -68,7 +71,8 @@ public class VarargsTest extends TestCase { assertEquals(x.arg(i), y.arg(i)); } - public void testSanity() { + @Test + void testSanity() { expectEquals(A_G, A_G); expectEquals(A_G_alt, A_G_alt); expectEquals(A_G, A_G_alt); @@ -86,7 +90,8 @@ public class VarargsTest extends TestCase { expectEquals(NIL, NIL); } - public void testNegativeIndices() { + @Test + void testNegativeIndices() { expectNegSubargsError(A_G); expectNegSubargsError(A_G_alt); expectNegSubargsError(B_E); @@ -106,7 +111,7 @@ public class VarargsTest extends TestCase { expectNegSubargsError(NIL); } - static void standardTestsA_G(Varargs a_g) { + private void standardTestsA_G(Varargs a_g) { expectEquals(A_G, a_g); expectEquals(A_G, a_g.subargs(1)); expectEquals(C_G, a_g.subargs(3).subargs(1)); @@ -121,7 +126,7 @@ public class VarargsTest extends TestCase { standardTestsC_G(A_G.subargs(3)); } - static void standardTestsC_G(Varargs c_g) { + private void standardTestsC_G(Varargs c_g) { expectEquals(C_G, c_g.subargs(1)); expectEquals(E_G, c_g.subargs(3)); expectEquals(E_G, c_g.subargs(3).subargs(1)); @@ -134,7 +139,7 @@ public class VarargsTest extends TestCase { standardTestsE_G(c_g.subargs(3)); } - static void standardTestsE_G(Varargs e_g) { + private void standardTestsE_G(Varargs e_g) { expectEquals(E_G, e_g.subargs(1)); expectEquals(FG, e_g.subargs(2)); expectEquals(FG, e_g.subargs(2).subargs(1)); @@ -145,7 +150,7 @@ public class VarargsTest extends TestCase { standardTestsFG(e_g.subargs(2)); } - static void standardTestsFG(Varargs fg) { + private void standardTestsFG(Varargs fg) { expectEquals(FG, fg.subargs(1)); expectEquals(G, fg.subargs(2)); expectEquals(G, fg.subargs(2).subargs(1)); @@ -153,12 +158,13 @@ public class VarargsTest extends TestCase { expectEquals(NONE, fg.subargs(3).subargs(1)); } - static void standardTestsNone(Varargs none) { + private void standardTestsNone(Varargs none) { expectEquals(NONE, none.subargs(1)); expectEquals(NONE, none.subargs(2)); } - public void testVarargsSubargs() { + @Test + void testVarargsSubargs() { standardTestsA_G(A_G); standardTestsA_G(A_G_alt); standardTestsC_G(C_G); @@ -170,7 +176,8 @@ public class VarargsTest extends TestCase { standardTestsNone(NONE); } - public void testVarargsMore() { + @Test + void testVarargsMore() { Varargs a_g; a_g = LuaValue.varargsOf(new LuaValue[] { A, }, LuaValue.varargsOf(new LuaValue[] { B, C, D, E, F, G })); standardTestsA_G(a_g); @@ -186,13 +193,15 @@ public class VarargsTest extends TestCase { standardTestsA_G(a_g); } - public void testPairVarargsMore() { + @Test + void testPairVarargsMore() { Varargs a_g = new Varargs.PairVarargs(A, new Varargs.PairVarargs(B, new Varargs.PairVarargs(C, new Varargs.PairVarargs(D, new Varargs.PairVarargs(E, new Varargs.PairVarargs(F, G)))))); standardTestsA_G(a_g); } - public void testArrayPartMore() { + @Test + void testArrayPartMore() { Varargs a_g; a_g = new Varargs.ArrayPartVarargs(Z_H_array, 1, 1, new Varargs.ArrayPartVarargs(Z_H_array, 2, 6)); standardTestsA_G(a_g); @@ -208,7 +217,7 @@ public class VarargsTest extends TestCase { standardTestsA_G(a_g); } - static void expectNegSubargsError(Varargs v) { + private void expectNegSubargsError(Varargs v) { String expected_msg = "bad argument #1: start must be > 0"; try { v.subargs(0); diff --git a/luaj-core/src/test/java/org/luaj/vm2/WeakTableTest.java b/luaj-core/src/test/java/org/luaj/vm2/WeakTableTest.java new file mode 100644 index 00000000..7e799bdd --- /dev/null +++ b/luaj-core/src/test/java/org/luaj/vm2/WeakTableTest.java @@ -0,0 +1,262 @@ +/******************************************************************************* + * Copyright (c) 2009 Luaj.org. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ +package org.luaj.vm2; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.ref.WeakReference; + +import org.junit.jupiter.api.Test; + +class WeakTableTest { + + @Test + void testWeakValuesTable() { + LuaTable t = WeakTable.make(false, true); + + Object obj = new Object(); + LuaTable tableValue = new LuaTable(); + LuaString stringValue = LuaString.valueOf("this is a test"); + LuaTable tableValue2 = new LuaTable(); + + t.set("table", tableValue); + t.set("userdata", LuaValue.userdataOf(obj, null)); + t.set("string", stringValue); + t.set("string2", LuaValue.valueOf("another string")); + t.set(1, tableValue2); + assertTrue(t.getHashLength() >= 4, "table must have at least 4 elements"); + // TODO fix assert + // assertTrue(t.getArrayLength() >= 1, "array part must have 1 element"); + + // check that table can be used to get elements + assertEquals(tableValue, t.get("table")); + assertEquals(stringValue, t.get("string")); + assertEquals(obj, t.get("userdata").checkuserdata()); + assertEquals(tableValue2, t.get(1)); + + // nothing should be collected, since we have strong references here + collectGarbage(); + + // check that elements are still there + assertEquals(tableValue, t.get("table")); + assertEquals(stringValue, t.get("string")); + assertEquals(obj, t.get("userdata").checkuserdata()); + assertEquals(tableValue2, t.get(1)); + + // drop our strong references + obj = null; + tableValue = null; + tableValue2 = null; + stringValue = null; + + // Garbage collection should cause weak entries to be dropped. + collectGarbage(); + + // check that they are dropped + assertEquals(LuaValue.NIL, t.get("table")); + assertEquals(LuaValue.NIL, t.get("userdata")); + assertEquals(LuaValue.NIL, t.get(1)); + assertFalse(t.get("string").isnil(), "strings should not be in weak references"); + } + + @Test + void testWeakKeysTable() { + LuaTable t = WeakTable.make(true, false); + + LuaValue key = LuaValue.userdataOf(new MyData(111)); + LuaValue val = LuaValue.userdataOf(new MyData(222)); + + // set up the table + t.set(key, val); + assertEquals(val, t.get(key)); + System.gc(); + assertEquals(val, t.get(key)); + + // drop key and value references, replace them with new ones + WeakReference origkey = new WeakReference<>(key); + WeakReference origval = new WeakReference<>(val); + key = LuaValue.userdataOf(new MyData(111)); + val = LuaValue.userdataOf(new MyData(222)); + + // new key and value should be interchangeable (feature of this test class) + assertEquals(key, origkey.get()); + assertEquals(val, origval.get()); + assertEquals(val, t.get(key)); + assertEquals(val, t.get(origkey.get())); + assertEquals(origval.get(), t.get(key)); + + // value should not be reachable after gc + collectGarbage(); + assertEquals(null, origkey.get()); + assertEquals(LuaValue.NIL, t.get(key)); + collectGarbage(); + assertEquals(null, origval.get()); + } + + @Test + void testNext() { + LuaTable t = WeakTable.make(true, true); + + LuaValue key = LuaValue.userdataOf(new MyData(111)); + LuaValue val = LuaValue.userdataOf(new MyData(222)); + LuaValue key2 = LuaValue.userdataOf(new MyData(333)); + LuaValue val2 = LuaValue.userdataOf(new MyData(444)); + LuaValue key3 = LuaValue.userdataOf(new MyData(555)); + LuaValue val3 = LuaValue.userdataOf(new MyData(666)); + + // set up the table + t.set(key, val); + t.set(key2, val2); + t.set(key3, val3); + + // forget one of the keys + key2 = null; + val2 = null; + collectGarbage(); + + // table should have 2 entries + int size = 0; + for (LuaValue k = t.next(LuaValue.NIL).arg1(); !k.isnil(); k = t.next(k).arg1()) { + size++; + } + assertEquals(2, size); + } + + @Test + void testWeakKeysValuesTable() { + LuaTable t = WeakTable.make(true, true); + + LuaValue key = LuaValue.userdataOf(new MyData(111)); + LuaValue val = LuaValue.userdataOf(new MyData(222)); + LuaValue key2 = LuaValue.userdataOf(new MyData(333)); + LuaValue val2 = LuaValue.userdataOf(new MyData(444)); + LuaValue key3 = LuaValue.userdataOf(new MyData(555)); + LuaValue val3 = LuaValue.userdataOf(new MyData(666)); + + // set up the table + t.set(key, val); + t.set(key2, val2); + t.set(key3, val3); + assertEquals(val, t.get(key)); + assertEquals(val2, t.get(key2)); + assertEquals(val3, t.get(key3)); + System.gc(); + assertEquals(val, t.get(key)); + assertEquals(val2, t.get(key2)); + assertEquals(val3, t.get(key3)); + + // drop key and value references, replace them with new ones + WeakReference origkey = new WeakReference<>(key); + WeakReference origval = new WeakReference<>(val); + WeakReference origkey2 = new WeakReference<>(key2); + WeakReference origval2 = new WeakReference<>(val2); + WeakReference origkey3 = new WeakReference<>(key3); + WeakReference origval3 = new WeakReference<>(val3); + key = LuaValue.userdataOf(new MyData(111)); + val = LuaValue.userdataOf(new MyData(222)); + key2 = LuaValue.userdataOf(new MyData(333)); + // don't drop val2, or key3 + val3 = LuaValue.userdataOf(new MyData(666)); + + // no values should be reachable after gc + collectGarbage(); + assertEquals(null, origkey.get()); + assertEquals(null, origval.get()); + assertEquals(null, origkey2.get()); + assertEquals(null, origval3.get()); + assertEquals(LuaValue.NIL, t.get(key)); + assertEquals(LuaValue.NIL, t.get(key2)); + assertEquals(LuaValue.NIL, t.get(key3)); + + // all originals should be gone after gc, then access + val2 = null; + key3 = null; + collectGarbage(); + assertEquals(null, origval2.get()); + assertEquals(null, origkey3.get()); + } + + @Test + void testReplace() { + LuaTable t = WeakTable.make(true, true); + + LuaValue key = LuaValue.userdataOf(new MyData(111)); + LuaValue val = LuaValue.userdataOf(new MyData(222)); + LuaValue key2 = LuaValue.userdataOf(new MyData(333)); + LuaValue val2 = LuaValue.userdataOf(new MyData(444)); + LuaValue key3 = LuaValue.userdataOf(new MyData(555)); + LuaValue val3 = LuaValue.userdataOf(new MyData(666)); + + // set up the table + t.set(key, val); + t.set(key2, val2); + t.set(key3, val3); + + LuaValue val4 = LuaValue.userdataOf(new MyData(777)); + t.set(key2, val4); + + // table should have 3 entries + int size = 0; + for (LuaValue k = t.next(LuaValue.NIL).arg1(); !k.isnil() && size < 1000; k = t.next(k).arg1()) { + size++; + } + assertEquals(3, size); + } + + public static class MyData { + public final int value; + + public MyData(int value) { + this.value = value; + } + + @Override + public int hashCode() { + return value; + } + + @Override + public boolean equals(Object o) { + return (o instanceof MyData) && ((MyData) o).value == value; + } + + @Override + public String toString() { + return "mydata-" + value; + } + } + + static void collectGarbage() { + Runtime rt = Runtime.getRuntime(); + rt.gc(); + try { + Thread.sleep(20); + rt.gc(); + Thread.sleep(20); + } catch (Exception e) { + e.printStackTrace(); + } + rt.gc(); + } +} diff --git a/luaj-jme/pom.xml b/luaj-jme/pom.xml index f2a6c4c9..741bee79 100644 --- a/luaj-jme/pom.xml +++ b/luaj-jme/pom.xml @@ -29,6 +29,11 @@ cldc-1.1-stub provided + + org.junit.jupiter + junit-jupiter + test + diff --git a/luaj-jme/src/test/java/.keep b/luaj-jme/src/test/java/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/luaj-jme/src/test/java/org/luaj/vm2/lib/jme/OsLibTest.java b/luaj-jme/src/test/java/org/luaj/vm2/lib/jme/OsLibTest.java new file mode 100644 index 00000000..39adf903 --- /dev/null +++ b/luaj-jme/src/test/java/org/luaj/vm2/lib/jme/OsLibTest.java @@ -0,0 +1,136 @@ +package org.luaj.vm2.lib.jme; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaValue; + +class OsLibTest { + + LuaValue jme_lib; + double time; + + @BeforeEach + public void setUp() { + jme_lib = JmePlatform.standardGlobals().get("os"); + time = 998571302000L/1000.0; + } + + void test(String format, String expected) { + String actual = jme_lib.get("date").call(LuaValue.valueOf(format), LuaValue.valueOf(time)).tojstring(); + assertEquals(expected, actual); + } + + @Test + void testStringDateChars() { test("foo", "foo"); } + + @Test + void testStringDate_a() { test("%a", "Thu"); } + + @Test + void testStringDate_A() { test("%A", "Thursday"); } + + @Test + void testStringDate_b() { test("%b", "Aug"); } + + @Test + void testStringDate_B() { test("%B", "August"); } + + @Test + void testStringDate_c() { test("%c", "Thu Aug 23 14:55:02 2001"); } + + @Test + void testStringDate_d() { test("%d", "23"); } + + @Test + void testStringDate_H() { test("%H", "14"); } + + @Test + void testStringDate_I() { test("%I", "02"); } + + @Test + void testStringDate_j() { test("%j", "235"); } + + @Test + void testStringDate_m() { test("%m", "08"); } + + @Test + void testStringDate_M() { test("%M", "55"); } + + @Test + void testStringDate_p() { test("%p", "PM"); } + + @Test + void testStringDate_S() { test("%S", "02"); } + + @Test + void testStringDate_U() { test("%U", "33"); } + + @Test + void testStringDate_w() { test("%w", "4"); } + + @Test + void testStringDate_W() { test("%W", "34"); } + + @Test + void testStringDate_x() { test("%x", "08/23/01"); } + + @Test + void testStringDate_X() { test("%X", "14:55:02"); } + + @Test + void testStringDate_y() { test("%y", "01"); } + + @Test + void testStringDate_Y() { test("%Y", "2001"); } + + @Test + void testStringDate_Pct() { test("%%", "%"); } + + static final double DAY = 24.*3600.; + + @Test + void testStringDate_UW_neg4() { time -= 4*DAY; test("%c %U %W", "Sun Aug 19 14:55:02 2001 33 33"); } + + @Test + void testStringDate_UW_neg3() { time -= 3*DAY; test("%c %U %W", "Mon Aug 20 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_neg2() { time -= 2*DAY; test("%c %U %W", "Tue Aug 21 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_neg1() { time -= DAY; test("%c %U %W", "Wed Aug 22 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos0() { time += 0; test("%c %U %W", "Thu Aug 23 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos1() { time += DAY; test("%c %U %W", "Fri Aug 24 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos2() { time += 2*DAY; test("%c %U %W", "Sat Aug 25 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos3() { time += 3*DAY; test("%c %U %W", "Sun Aug 26 14:55:02 2001 34 34"); } + + @Test + void testStringDate_UW_pos4() { time += 4*DAY; test("%c %U %W", "Mon Aug 27 14:55:02 2001 34 35"); } + + @Test + void testJseOsGetenvForEnvVariables() { + LuaValue USER = LuaValue.valueOf("USER"); + LuaValue jme_user = jme_lib.get("getenv").call(USER); + assertTrue(jme_user.isnil()); + System.out.println("User: " + jme_user); + } + + void testJseOsGetenvForSystemProperties() { +// System.setProperty("test.key.foo", "test.value.bar"); + LuaValue key = LuaValue.valueOf("test.key.foo"); + LuaValue value = LuaValue.valueOf("test.value.bar"); + LuaValue jme_value = jme_lib.get("getenv").call(key); + assertEquals(value, jme_value); + } +} diff --git a/luaj-jse/pom.xml b/luaj-jse/pom.xml index bce22309..cba44a6a 100644 --- a/luaj-jse/pom.xml +++ b/luaj-jse/pom.xml @@ -24,6 +24,11 @@ org.apache.bcel bcel + + org.junit.jupiter + junit-jupiter + test + diff --git a/luaj-jse/src/test/java/.keep b/luaj-jse/src/test/java/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/luaj-test/src/test/java/org/luaj/vm2/compiler/DumpLoadEndianIntTest.java b/luaj-jse/src/test/java/org/luaj/jse/DumpLoadEndianIntTest.java similarity index 89% rename from luaj-test/src/test/java/org/luaj/vm2/compiler/DumpLoadEndianIntTest.java rename to luaj-jse/src/test/java/org/luaj/jse/DumpLoadEndianIntTest.java index 0766489e..ed372072 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/compiler/DumpLoadEndianIntTest.java +++ b/luaj-jse/src/test/java/org/luaj/jse/DumpLoadEndianIntTest.java @@ -1,4 +1,7 @@ -package org.luaj.vm2.compiler; +package org.luaj.jse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -9,17 +12,17 @@ import java.io.InputStream; import java.io.Reader; import java.io.StringReader; -import junit.framework.TestCase; - +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.luaj.vm2.Globals; -import org.luaj.vm2.LoadState; import org.luaj.vm2.LuaClosure; import org.luaj.vm2.LuaFunction; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Prototype; +import org.luaj.vm2.compiler.DumpState; import org.luaj.vm2.lib.jse.JsePlatform; -public class DumpLoadEndianIntTest extends TestCase { +class DumpLoadEndianIntTest { private static final String SAVECHUNKS = "SAVECHUNKS"; private static final boolean SHOULDPASS = true; @@ -31,27 +34,30 @@ public class DumpLoadEndianIntTest extends TestCase { private Globals globals; + @BeforeEach protected void setUp() throws Exception { - super.setUp(); globals = JsePlatform.standardGlobals(); DumpState.ALLOW_INTEGER_CASTING = false; } - public void testBigDoubleCompile() { + @Test + void testBigDoubleCompile() { doTest(false, DumpState.NUMBER_FORMAT_FLOATS_OR_DOUBLES, false, mixedscript, withdoubles, withdoubles, SHOULDPASS); doTest(false, DumpState.NUMBER_FORMAT_FLOATS_OR_DOUBLES, true, mixedscript, withdoubles, withdoubles, SHOULDPASS); } - public void testLittleDoubleCompile() { + @Test + void testLittleDoubleCompile() { doTest(true, DumpState.NUMBER_FORMAT_FLOATS_OR_DOUBLES, false, mixedscript, withdoubles, withdoubles, SHOULDPASS); doTest(true, DumpState.NUMBER_FORMAT_FLOATS_OR_DOUBLES, true, mixedscript, withdoubles, withdoubles, SHOULDPASS); } - public void testBigIntCompile() { + @Test + void testBigIntCompile() { DumpState.ALLOW_INTEGER_CASTING = true; doTest(false, DumpState.NUMBER_FORMAT_INTS_ONLY, false, mixedscript, withdoubles, withints, SHOULDPASS); doTest(false, DumpState.NUMBER_FORMAT_INTS_ONLY, true, mixedscript, withdoubles, withints, SHOULDPASS); @@ -62,7 +68,8 @@ public class DumpLoadEndianIntTest extends TestCase { doTest(false, DumpState.NUMBER_FORMAT_INTS_ONLY, true, intscript, withints, withints, SHOULDPASS); } - public void testLittleIntCompile() { + @Test + void testLittleIntCompile() { DumpState.ALLOW_INTEGER_CASTING = true; doTest(true, DumpState.NUMBER_FORMAT_INTS_ONLY, false, mixedscript, withdoubles, withints, SHOULDPASS); doTest(true, DumpState.NUMBER_FORMAT_INTS_ONLY, true, mixedscript, withdoubles, withints, SHOULDPASS); @@ -73,18 +80,20 @@ public class DumpLoadEndianIntTest extends TestCase { doTest(true, DumpState.NUMBER_FORMAT_INTS_ONLY, true, intscript, withints, withints, SHOULDPASS); } - public void testBigNumpatchCompile() { + @Test + void testBigNumpatchCompile() { doTest(false, DumpState.NUMBER_FORMAT_NUM_PATCH_INT32, false, mixedscript, withdoubles, withdoubles, SHOULDPASS); doTest(false, DumpState.NUMBER_FORMAT_NUM_PATCH_INT32, true, mixedscript, withdoubles, withdoubles, SHOULDPASS); } - public void testLittleNumpatchCompile() { + @Test + void testLittleNumpatchCompile() { doTest(true, DumpState.NUMBER_FORMAT_NUM_PATCH_INT32, false, mixedscript, withdoubles, withdoubles, SHOULDPASS); doTest(true, DumpState.NUMBER_FORMAT_NUM_PATCH_INT32, true, mixedscript, withdoubles, withdoubles, SHOULDPASS); } - public void doTest(boolean littleEndian, int numberFormat, boolean stripDebug, String script, + private void doTest(boolean littleEndian, int numberFormat, boolean stripDebug, String script, String expectedPriorDump, String expectedPostDump, boolean shouldPass) { try { diff --git a/luaj-test/src/test/java/org/luaj/vm2/FragmentsTest.java b/luaj-jse/src/test/java/org/luaj/jse/FragmentsTest.java similarity index 93% rename from luaj-test/src/test/java/org/luaj/vm2/FragmentsTest.java rename to luaj-jse/src/test/java/org/luaj/jse/FragmentsTest.java index d25edfeb..1e57881b 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/FragmentsTest.java +++ b/luaj-jse/src/test/java/org/luaj/jse/FragmentsTest.java @@ -19,14 +19,22 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; +package org.luaj.jse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import java.io.Reader; import java.io.StringReader; -import junit.framework.TestCase; -import junit.framework.TestSuite; - +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaClosure; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Print; +import org.luaj.vm2.Prototype; +import org.luaj.vm2.Varargs; import org.luaj.vm2.lib.jse.JsePlatform; import org.luaj.vm2.luajc.LuaJC; @@ -35,27 +43,22 @@ import org.luaj.vm2.luajc.LuaJC; * compiling during development. * */ -public class FragmentsTest extends TestSuite { +public class FragmentsTest { static final int TEST_TYPE_LUAC = 0; static final int TEST_TYPE_LUAJC = 1; + @Nested public static class JseFragmentsTest extends FragmentsTestCase { public JseFragmentsTest() { super(TEST_TYPE_LUAC); } } + @Nested public static class LuaJCFragmentsTest extends FragmentsTestCase { public LuaJCFragmentsTest() { super(TEST_TYPE_LUAJC); } } - public static TestSuite suite() { - TestSuite suite = new TestSuite("Compiler Fragments Tests"); - suite.addTest(new TestSuite(JseFragmentsTest.class, "JSE Fragments Tests")); - suite.addTest(new TestSuite(LuaJCFragmentsTest.class, "LuaJC Fragments Tests")); - return suite; - } - - abstract protected static class FragmentsTestCase extends TestCase { + abstract protected static class FragmentsTestCase { final int TEST_TYPE; @@ -65,7 +68,7 @@ public class FragmentsTest extends TestSuite { public void runFragment(Varargs expected, String script) { try { - String name = getName(); + String name = this.getClass().getName(); Globals globals = JsePlatform.debugGlobals(); Reader reader = new StringReader(script); LuaValue chunk; @@ -91,16 +94,19 @@ public class FragmentsTest extends TestSuite { } } + @Test public void testFirstArgNilExtended() { runFragment(LuaValue.NIL, "function f1(a) print( 'f1:', a ) return a end\n" + "b = f1()\n" + "return b"); } + @Test public void testSimpleForloop() { runFragment(LuaValue.valueOf(77), "for n,p in ipairs({77}) do\n" + " print('n,p',n,p)\n" + " return p\n" + "end\n"); } + @Test public void testForloopParamUpvalues() { runFragment(LuaValue.varargsOf(new LuaValue[] { LuaValue.valueOf(77), LuaValue.valueOf(1) }), "for n,p in ipairs({77}) do\n" + " print('n,p',n,p)\n" + " foo = function()\n" + " return p,n\n" @@ -108,6 +114,7 @@ public class FragmentsTest extends TestSuite { } + @Test public void testArgVarargsUseBoth() { runFragment( LuaValue @@ -115,24 +122,29 @@ public class FragmentsTest extends TestSuite { "function v(arg,...)\n" + " return arg,...\n" + "end\n" + "return v('a','b','c')\n"); } + @Test public void testArgParamUseNone() { runFragment(LuaValue.valueOf("string"), "function v(arg,...)\n" + " return type(arg)\n" + "end\n" + "return v('abc')\n"); } + @Test public void testSetlistVarargs() { runFragment(LuaValue.valueOf("abc"), "local f = function() return 'abc' end\n" + "local g = { f() }\n" + "return g[1]\n"); } + @Test public void testSelfOp() { runFragment(LuaValue.valueOf("bcd"), "local s = 'abcde'\n" + "return s:sub(2,4)\n"); } + @Test public void testSetListWithOffsetAndVarargs() { runFragment(LuaValue.valueOf(1003), "local bar = {1000, math.sqrt(9)}\n" + "return bar[1]+bar[2]\n"); } + @Test public void testMultiAssign() { // arargs evaluations are all done before assignments runFragment( @@ -141,22 +153,26 @@ public class FragmentsTest extends TestSuite { "a,b,c = 1,10,100\n" + "a,b,c = a+b+c, a+b+c, a+b+c\n" + "return a,b,c\n"); } + @Test public void testUpvalues() { runFragment(LuaValue.valueOf(999), "local a = function(x)\n" + " return function(y)\n" + " return x + y\n" + " end\n" + "end\n" + "local b = a(222)\n" + "local c = b(777)\n" + "print( 'c=', c )\n" + "return c\n"); } + @Test public void testNonAsciiStringLiterals() { runFragment(LuaValue.valueOf("7,8,12,10,9,11,133,222"), "local a='\\a\\b\\f\\n\\t\\v\\133\\222'\n" + "local t={string.byte(a,1,#a)}\n" + "return table.concat(t,',')\n"); } + @Test public void testControlCharStringLiterals() { runFragment(LuaValue.valueOf("97,0,98,18,99,18,100,18,48,101"), "local a='a\\0b\\18c\\018d\\0180e'\n" + "local t={string.byte(a,1,#a)}\n" + "return table.concat(t,',')\n"); } + @Test public void testLoopVarNames() { runFragment(LuaValue.valueOf(" 234,1,aa 234,2,bb"), "local w = ''\n" + "function t()\n" + " for f,var in ipairs({'aa','bb'}) do\n" + " local s = 234\n" @@ -164,6 +180,7 @@ public class FragmentsTest extends TestSuite { } + @Test public void testForLoops() { runFragment(LuaValue.valueOf("12345 357 963"), "local s,t,u = '','',''\n" + "for m=1,5 do\n" + " s = s..m\n" + "end\n" + "for m=3,7,2 do\n" @@ -171,12 +188,14 @@ public class FragmentsTest extends TestSuite { + "return s..' '..t..' '..u\n"); } + @Test public void testLocalFunctionDeclarations() { runFragment(LuaValue.varargsOf(LuaValue.valueOf("function"), LuaValue.valueOf("nil")), "local function aaa()\n" + " return type(aaa)\n" + "end\n" + "local bbb = function()\n" + " return type(bbb)\n" + "end\n" + "return aaa(),bbb()\n"); } + @Test public void testNilsInTableConstructor() { runFragment(LuaValue.valueOf("1=111 2=222 3=333 "), "local t = { 111, 222, 333, nil, nil }\n" + "local s = ''\n" + "for i,v in ipairs(t) do \n" @@ -184,6 +203,7 @@ public class FragmentsTest extends TestSuite { } + @Test public void testUnreachableCode() { runFragment(LuaValue.valueOf(66), "local function foo(x) return x * 2 end\n" + "local function bar(x, y)\n" + " if x==y then\n" @@ -192,51 +212,61 @@ public class FragmentsTest extends TestSuite { } + @Test public void testVarargsWithParameters() { runFragment(LuaValue.valueOf(222), "local func = function(t,...)\n" + " return (...)\n" + "end\n" + "return func(111,222,333)\n"); } + @Test public void testNoReturnValuesPlainCall() { runFragment(LuaValue.TRUE, "local testtable = {}\n" + "return pcall( function() testtable[1]=2 end )\n"); } + @Test public void testVarargsInTableConstructor() { runFragment(LuaValue.valueOf(222), "local function foo() return 111,222,333 end\n" + "local t = {'a','b',c='c',foo()}\n" + "return t[4]\n"); } + @Test public void testVarargsInFirstArg() { runFragment(LuaValue.valueOf(123), "function aaa(x) return x end\n" + "function bbb(y) return y end\n" + "function ccc(z) return z end\n" + "return ccc( aaa(bbb(123)), aaa(456) )\n"); } + @Test public void testSetUpvalueTableInitializer() { runFragment(LuaValue.valueOf("b"), "local aliases = {a='b'}\n" + "local foo = function()\n" + " return aliases\n" + "end\n" + "return foo().a\n"); } + @Test public void testLoadNilUpvalue() { runFragment(LuaValue.NIL, "tostring = function() end\n" + "local pc \n" + "local pcall = function(...)\n" + " pc(...)\n" + "end\n" + "return NIL\n"); } + @Test public void testUpvalueClosure() { runFragment(LuaValue.NIL, "print()\n" + "local function f2() end\n" + "local function f3()\n" + " return f3\n" + "end\n" + "return NIL\n"); } + @Test public void testUninitializedUpvalue() { runFragment(LuaValue.NIL, "local f\n" + "do\n" + " function g()\n" + " print(f())\n" + " end\n" + "end\n" + "return NIL\n"); } + @Test public void testTestOpUpvalues() { runFragment(LuaValue.varargsOf(LuaValue.valueOf(1), LuaValue.valueOf(2), LuaValue.valueOf(3)), "print( nil and 'T' or 'F' )\n" + "local a,b,c = 1,2,3\n" + "function foo()\n" + " return a,b,c\n" + "end\n" + "return foo()\n"); } + @Test public void testTestSimpleBinops() { runFragment( LuaValue.varargsOf( @@ -244,11 +274,13 @@ public class FragmentsTest extends TestSuite { "local a,b,c = 2,-2.5,0\n" + "return (a==c), (b==c), (a==a), (a>c), (b>0)\n"); } + @Test public void testNumericForUpvalues() { runFragment(LuaValue.valueOf(8), "for i = 3,4 do\n" + " i = i + 5\n" + " local a = function()\n" + " return i\n" + " end\n" + " return a()\n" + "end\n"); } + @Test public void testNumericForUpvalues2() { runFragment(LuaValue.valueOf("222 222"), "local t = {}\n" + "local template = [[123 456]]\n" + "for i = 1,2 do\n" @@ -256,32 +288,38 @@ public class FragmentsTest extends TestSuite { + "return t[2]\n"); } + @Test public void testReturnUpvalue() { runFragment(LuaValue.varargsOf(new LuaValue[] { LuaValue.ONE, LuaValue.valueOf(5), }), "local a = 1\n" + "local b\n" + "function c()\n" + " b=5\n" + " return a\n" + "end\n" + "return c(),b\n"); } + @Test public void testUninitializedAroundBranch() { runFragment(LuaValue.valueOf(333), "local state\n" + "if _G then\n" + " state = 333\n" + "end\n" + "return state\n"); } + @Test public void testLoadedNilUpvalue() { runFragment(LuaValue.NIL, "local a = print()\n" + "local b = c and { d = e }\n" + "local f\n" + "local function g()\n" + " return f\n" + "end\n" + "return g()\n"); } + @Test public void testUpvalueInFirstSlot() { runFragment(LuaValue.valueOf("foo"), "local p = {'foo'}\n" + "bar = function()\n" + " return p \n" + "end\n" + "for i,key in ipairs(p) do\n" + " print()\n" + "end\n" + "return bar()[1]"); } + @Test public void testReadOnlyAndReadWriteUpvalues() { runFragment(LuaValue.varargsOf(new LuaValue[] { LuaValue.valueOf(333), LuaValue.valueOf(222) }), "local a = 111\n" + "local b = 222\n" + "local c = function()\n" + " a = a + b\n" + " return a,b\n" + "end\n" + "return c()\n"); } + @Test public void testNestedUpvalues() { runFragment( LuaValue.varargsOf(new LuaValue[] { LuaValue.valueOf(5), LuaValue.valueOf(8), LuaValue.valueOf(9) }), @@ -290,37 +328,44 @@ public class FragmentsTest extends TestSuite { + "return f(), g(8,9)\n" + "\n"); } + @Test public void testLoadBool() { runFragment(LuaValue.NONE, "print( type(foo)=='string' )\n" + "local a,b\n" + "if print() then\n" + " b = function()\n" + " return a\n" + " end\n" + "end\n"); } + @Test public void testBasicForLoop() { runFragment(LuaValue.valueOf(2), "local data\n" + "for i = 1, 2 do\n" + " data = i\n" + "end\n" + "local bar = function()\n" + " return data\n" + "end\n" + "return bar()\n"); } + @Test public void testGenericForMultipleValues() { runFragment(LuaValue.varargsOf(LuaValue.valueOf(3), LuaValue.valueOf(2), LuaValue.valueOf(1)), "local iter = function() return 1,2,3,4 end\n" + "local foo = function() return iter,5 end\n" + "for a,b,c in foo() do\n" + " return c,b,a\n" + "end\n"); } + @Test public void testPhiUpvalue() { runFragment(LuaValue.valueOf(6), "local a = foo or 0\n" + "local function b(c)\n" + " if c > a then a = c end\n" + " return a\n" + "end\n" + "b(6)\n" + "return a\n"); } + @Test public void testAssignReferUpvalues() { runFragment(LuaValue.valueOf(123), "local entity = 234\n" + "local function c()\n" + " return entity\n" + "end\n" + "entity = (a == b) and 123\n" + "if entity then\n" + " return entity\n" + "end\n"); } + @Test public void testSimpleRepeatUntil() { runFragment(LuaValue.valueOf(5), "local a\n" + "local w\n" + "repeat\n" + " a = w\n" + "until not a\n" + "return 5\n"); } + @Test public void testLoopVarUpvalues() { runFragment(LuaValue.valueOf("b"), "local env = {}\n" + "for a,b in pairs(_G) do\n" + " c = function()\n" + " return b\n" @@ -328,11 +373,13 @@ public class FragmentsTest extends TestSuite { + " return env[k] or v\n" + "end\n"); } + @Test public void testPhiVarUpvalue() { runFragment(LuaValue.valueOf(2), "local a = 1\n" + "local function b()\n" + " a = a + 1\n" + " return function() end\n" + "end\n" + "for i in b() do\n" + " a = 3\n" + "end\n" + "return a\n"); } + @Test public void testUpvaluesInElseClauses() { runFragment(LuaValue.valueOf(111), "if a then\n" + " foo(bar)\n" + "elseif _G then\n" + " local x = 111\n" + " if d then\n" @@ -340,57 +387,69 @@ public class FragmentsTest extends TestSuite { + " end\n" + " return y()\n" + " end\n" + "end\n"); } + @Test public void testUpvalueInDoBlock() { runFragment(LuaValue.NONE, "do\n" + " local x = 10\n" + " function g()\n" + " return x\n" + " end\n" + "end\n" + "g()\n"); } + @Test public void testNullError() { runFragment(LuaValue.varargsOf(LuaValue.FALSE, LuaValue.NIL), "return pcall(error)\n"); } + @Test public void testFindWithOffset() { runFragment(LuaValue.varargsOf(LuaValue.valueOf(8), LuaValue.valueOf(5)), "string = \"abcdef:ghi\"\n" + "substring = string:sub(3)\n" + "idx = substring:find(\":\")\n" + "return #substring, idx\n"); } + @Test public void testErrorArgIsString() { runFragment(LuaValue.varargsOf(LuaValue.valueOf("string"), LuaValue.valueOf("c")), "a,b = pcall(error, 'c'); return type(b), b\n"); } + @Test public void testErrorArgIsNil() { runFragment(LuaValue.varargsOf(LuaValue.valueOf("nil"), LuaValue.NIL), "a,b = pcall(error); return type(b), b\n"); } + @Test public void testErrorArgIsTable() { runFragment(LuaValue.varargsOf(LuaValue.valueOf("table"), LuaValue.valueOf("d")), "a,b = pcall(error, {c='d'}); return type(b), b.c\n"); } + @Test public void testErrorArgIsNumber() { runFragment(LuaValue.varargsOf(LuaValue.valueOf("string"), LuaValue.valueOf("1")), "a,b = pcall(error, 1); return type(b), b\n"); } + @Test public void testErrorArgIsBool() { runFragment(LuaValue.varargsOf(LuaValue.valueOf("boolean"), LuaValue.TRUE), "a,b = pcall(error, true); return type(b), b\n"); } + @Test public void testBalancedMatchOnEmptyString() { runFragment(LuaValue.NIL, "return (\"\"):match(\"%b''\")\n"); } + @Test public void testReturnValueForTableRemove() { runFragment(LuaValue.NONE, "return table.remove({ })"); } + @Test public void testTypeOfTableRemoveReturnValue() { runFragment(LuaValue.valueOf("nil"), "local k = table.remove({ }) return type(k)"); } + @Test public void testVarargBugReport() { runFragment( LuaValue.varargsOf(new LuaValue[] { LuaValue.valueOf(1), LuaValue.valueOf(2), LuaValue.valueOf(3) }), diff --git a/luaj-test/src/test/java/org/luaj/vm2/LoadOrderTest.java b/luaj-jse/src/test/java/org/luaj/jse/LoadOrderTest.java similarity index 86% rename from luaj-test/src/test/java/org/luaj/vm2/LoadOrderTest.java rename to luaj-jse/src/test/java/org/luaj/jse/LoadOrderTest.java index 35a8082e..64096299 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/LoadOrderTest.java +++ b/luaj-jse/src/test/java/org/luaj/jse/LoadOrderTest.java @@ -19,26 +19,31 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; +package org.luaj.jse; + +import static org.junit.jupiter.api.Assertions.assertNotNull; import java.io.InputStream; import java.io.Reader; -import junit.framework.TestCase; - +import org.junit.jupiter.api.Test; +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaString; import org.luaj.vm2.lib.jse.JsePlatform; import org.luaj.vm2.server.Launcher; import org.luaj.vm2.server.LuajClassLoader; // Tests using class loading orders that have caused problems for some use cases. -public class LoadOrderTest extends TestCase { +class LoadOrderTest { - public void testLoadGlobalsFirst() { + @Test + void testLoadGlobalsFirst() { Globals g = JsePlatform.standardGlobals(); assertNotNull(g); } - public void testLoadStringFirst() { + @Test + void testLoadStringFirst() { LuaString BAR = LuaString.valueOf("bar"); assertNotNull(BAR); } @@ -47,20 +52,24 @@ public class LoadOrderTest extends TestCase { // Static initializer that causes LuaString->LuaValue->LuaString private static final LuaString FOO = LuaString.valueOf("foo"); + @Override public Object[] launch(String script, Object[] arg) { return new Object[] { FOO }; } + @Override public Object[] launch(InputStream script, Object[] arg) { return null; } + @Override public Object[] launch(Reader script, Object[] arg) { return null; } } - public void testClassLoadsStringFirst() throws Exception { + @Test + void testClassLoadsStringFirst() throws Exception { Launcher launcher = LuajClassLoader.NewLauncher(TestLauncherLoadStringFirst.class); Object[] results = launcher.launch("foo", null); assertNotNull(results); diff --git a/luaj-jse/src/test/java/org/luaj/jse/LuaPrototypeTest.java b/luaj-jse/src/test/java/org/luaj/jse/LuaPrototypeTest.java new file mode 100644 index 00000000..987c56e6 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/jse/LuaPrototypeTest.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2009 Luaj.org. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ +package org.luaj.jse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.Reader; +import java.io.StringReader; + +import org.junit.jupiter.api.Test; +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaClosure; +import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Prototype; +import org.luaj.vm2.lib.ZeroArgFunction; +import org.luaj.vm2.lib.jse.JsePlatform; + +class LuaPrototypeTest { + + private Prototype createPrototype(String script, String name) { + try { + Globals globals = JsePlatform.standardGlobals(); + Reader reader = new StringReader(script); + return globals.compilePrototype(reader, name); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(e.toString()); + return null; + } + } + + @Test + void testFunctionClosureThreadEnv() { + + // set up suitable environments for execution + LuaValue aaa = LuaValue.valueOf("aaa"); + LuaValue eee = LuaValue.valueOf("eee"); + final Globals globals = JsePlatform.standardGlobals(); + LuaTable newenv = LuaValue.tableOf(new LuaValue[] { LuaValue.valueOf("a"), LuaValue.valueOf("aaa"), + LuaValue.valueOf("b"), LuaValue.valueOf("bbb"), }); + LuaTable mt = LuaValue.tableOf(new LuaValue[] { LuaValue.INDEX, globals }); + newenv.setmetatable(mt); + globals.set("a", aaa); + newenv.set("a", eee); + + // function tests + { + LuaFunction f = new ZeroArgFunction() { + @Override + public LuaValue call() { return globals.get("a"); } + }; + assertEquals(aaa, f.call()); + } + + // closure tests + { + Prototype p = createPrototype("return a\n", "closuretester"); + LuaClosure c = new LuaClosure(p, globals); + + // Test that a clusure with a custom enviroment uses that environment. + assertEquals(aaa, c.call()); + c = new LuaClosure(p, newenv); + assertEquals(newenv, c.upValues[0].getValue()); + assertEquals(eee, c.call()); + } + } +} diff --git a/luaj-test/src/test/java/org/luaj/vm2/OrphanedThreadTest.java b/luaj-jse/src/test/java/org/luaj/jse/OrphanedThreadTest.java similarity index 81% rename from luaj-test/src/test/java/org/luaj/vm2/OrphanedThreadTest.java rename to luaj-jse/src/test/java/org/luaj/jse/OrphanedThreadTest.java index 4b208f54..3f7becd2 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/OrphanedThreadTest.java +++ b/luaj-jse/src/test/java/org/luaj/jse/OrphanedThreadTest.java @@ -19,48 +19,65 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; +package org.luaj.jse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import java.lang.ref.WeakReference; -import junit.framework.TestCase; - +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaThread; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; import org.luaj.vm2.lib.OneArgFunction; import org.luaj.vm2.lib.jse.JsePlatform; -public class OrphanedThreadTest extends TestCase { +class OrphanedThreadTest { - Globals globals; - LuaThread luathread; - WeakReference luathr_ref; - LuaValue function; - WeakReference func_ref; + Globals globals; + LuaThread luathread; + LuaValue function; + + WeakReference luathr_ref; + WeakReference func_ref; + + @BeforeEach protected void setUp() throws Exception { LuaThread.thread_orphan_check_interval = 5; globals = JsePlatform.standardGlobals(); } + @AfterEach protected void tearDown() { LuaThread.thread_orphan_check_interval = 30000; } - public void testCollectOrphanedNormalThread() throws Exception { + @Test + void testCollectOrphanedNormalThread() throws Exception { function = new NormalFunction(globals); doTest(LuaValue.TRUE, LuaValue.ZERO); } - public void testCollectOrphanedEarlyCompletionThread() throws Exception { + @Test + void testCollectOrphanedEarlyCompletionThread() throws Exception { function = new EarlyCompletionFunction(globals); doTest(LuaValue.TRUE, LuaValue.ZERO); } - public void testCollectOrphanedAbnormalThread() throws Exception { + @Test + void testCollectOrphanedAbnormalThread() throws Exception { function = new AbnormalFunction(globals); doTest(LuaValue.FALSE, LuaValue.valueOf("abnormal condition")); } - public void testCollectOrphanedClosureThread() throws Exception { + @Test + void testCollectOrphanedClosureThread() throws Exception { String script = "print('in closure, arg is '..(...))\n" + "arg = coroutine.yield(1)\n" + "print('in closure.2, arg is '..arg)\n" + "arg = coroutine.yield(0)\n" + "print('leakage in closure.3, arg is '..arg)\n" + "return 'done'\n"; @@ -68,7 +85,8 @@ public class OrphanedThreadTest extends TestCase { doTest(LuaValue.TRUE, LuaValue.ZERO); } - public void testCollectOrphanedPcallClosureThread() throws Exception { + @Test + void testCollectOrphanedPcallClosureThread() throws Exception { String script = "f = function(x)\n" + " print('in pcall-closure, arg is '..(x))\n" + " arg = coroutine.yield(1)\n" + " print('in pcall-closure.2, arg is '..arg)\n" + " arg = coroutine.yield(0)\n" + " print('leakage in pcall-closure.3, arg is '..arg)\n" @@ -77,7 +95,8 @@ public class OrphanedThreadTest extends TestCase { doTest(LuaValue.TRUE, LuaValue.ZERO); } - public void testCollectOrphanedLoadCloasureThread() throws Exception { + @Test + void testCollectOrphanedLoadCloasureThread() throws Exception { String script = "t = { \"print \", \"'hello, \", \"world'\", }\n" + "i = 0\n" + "arg = ...\n" + "f = function()\n" + " i = i + 1\n" + " print('in load-closure, arg is', arg, 'next is', t[i])\n" + " arg = coroutine.yield(1)\n" + " return t[i]\n" + "end\n" + "load(f)()\n"; @@ -87,8 +106,8 @@ public class OrphanedThreadTest extends TestCase { private void doTest(LuaValue status2, LuaValue value2) throws Exception { luathread = new LuaThread(globals, function); - luathr_ref = new WeakReference(luathread); - func_ref = new WeakReference(function); + luathr_ref = new WeakReference<>(luathread); + func_ref = new WeakReference<>(function); assertNotNull(luathr_ref.get()); // resume two times @@ -121,6 +140,7 @@ public class OrphanedThreadTest extends TestCase { this.globals = globals; } + @Override public LuaValue call(LuaValue arg) { System.out.println("in normal.1, arg is " + arg); arg = globals.yield(ONE).arg1(); @@ -138,6 +158,7 @@ public class OrphanedThreadTest extends TestCase { this.globals = globals; } + @Override public LuaValue call(LuaValue arg) { System.out.println("in early.1, arg is " + arg); arg = globals.yield(ONE).arg1(); @@ -153,6 +174,7 @@ public class OrphanedThreadTest extends TestCase { this.globals = globals; } + @Override public LuaValue call(LuaValue arg) { System.out.println("in abnormal.1, arg is " + arg); arg = globals.yield(ONE).arg1(); diff --git a/luaj-test/src/test/java/org/luaj/vm2/RequireClassTest.java b/luaj-jse/src/test/java/org/luaj/jse/RequireClassTest.java similarity index 63% rename from luaj-test/src/test/java/org/luaj/vm2/RequireClassTest.java rename to luaj-jse/src/test/java/org/luaj/jse/RequireClassTest.java index eff98557..7ce82f09 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/RequireClassTest.java +++ b/luaj-jse/src/test/java/org/luaj/jse/RequireClassTest.java @@ -1,35 +1,46 @@ -package org.luaj.vm2; +package org.luaj.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.jse.require.RequireSampleClassCastExcep; +import org.luaj.jse.require.RequireSampleLoadLuaError; +import org.luaj.jse.require.RequireSampleLoadRuntimeExcep; +import org.luaj.jse.require.RequireSampleSuccess; +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.JsePlatform; -import org.luaj.vm2.require.RequireSampleClassCastExcep; -import org.luaj.vm2.require.RequireSampleLoadLuaError; -import org.luaj.vm2.require.RequireSampleLoadRuntimeExcep; -public class RequireClassTest extends TestCase { +class RequireClassTest { private LuaTable globals; private LuaValue require; + @BeforeEach public void setUp() { globals = JsePlatform.standardGlobals(); require = globals.get("require"); } - public void testLoadClass() { - LuaValue result = globals.load(new org.luaj.vm2.require.RequireSampleSuccess()); + @Test + void testLoadClass() { + LuaValue result = globals.load(new RequireSampleSuccess()); assertEquals("require-sample-success-", result.tojstring()); } - public void testRequireClassSuccess() { - LuaValue result = require.call(LuaValue.valueOf("org.luaj.vm2.require.RequireSampleSuccess")); - assertEquals("require-sample-success-org.luaj.vm2.require.RequireSampleSuccess", result.tojstring()); - result = require.call(LuaValue.valueOf("org.luaj.vm2.require.RequireSampleSuccess")); - assertEquals("require-sample-success-org.luaj.vm2.require.RequireSampleSuccess", result.tojstring()); + @Test + void testRequireClassSuccess() { + LuaValue result = require.call(LuaValue.valueOf(RequireSampleSuccess.class.getName())); + assertEquals("require-sample-success-" + RequireSampleSuccess.class.getName(), result.tojstring()); + result = require.call(LuaValue.valueOf(RequireSampleSuccess.class.getName())); + assertEquals("require-sample-success-" + RequireSampleSuccess.class.getName(), result.tojstring()); } - public void testRequireClassLoadLuaError() { + @Test + void testRequireClassLoadLuaError() { try { LuaValue result = require.call(LuaValue.valueOf(RequireSampleLoadLuaError.class.getName())); fail("incorrectly loaded class that threw lua error"); @@ -45,7 +56,8 @@ public class RequireClassTest extends TestCase { } } - public void testRequireClassLoadRuntimeException() { + @Test + void testRequireClassLoadRuntimeException() { try { LuaValue result = require.call(LuaValue.valueOf(RequireSampleLoadRuntimeExcep.class.getName())); fail("incorrectly loaded class that threw runtime exception"); @@ -62,7 +74,8 @@ public class RequireClassTest extends TestCase { } } - public void testRequireClassClassCastException() { + @Test + void testRequireClassClassCastException() { try { LuaValue result = require.call(LuaValue.valueOf(RequireSampleClassCastExcep.class.getName())); fail("incorrectly loaded class that threw class cast exception"); diff --git a/luaj-test/src/test/java/org/luaj/vm2/compiler/SimpleTests.java b/luaj-jse/src/test/java/org/luaj/jse/SimpleLuaCallsTest.java similarity index 72% rename from luaj-test/src/test/java/org/luaj/vm2/compiler/SimpleTests.java rename to luaj-jse/src/test/java/org/luaj/jse/SimpleLuaCallsTest.java index d4b40deb..9d6f9fcd 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/compiler/SimpleTests.java +++ b/luaj-jse/src/test/java/org/luaj/jse/SimpleLuaCallsTest.java @@ -1,19 +1,23 @@ -package org.luaj.vm2.compiler; +package org.luaj.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaDouble; import org.luaj.vm2.LuaInteger; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.JsePlatform; -public class SimpleTests extends TestCase { +class SimpleLuaCallsTest { private Globals globals; + @BeforeEach protected void setUp() throws Exception { - super.setUp(); globals = JsePlatform.standardGlobals(); } @@ -26,38 +30,45 @@ public class SimpleTests extends TestCase { } } - public void testTrivial() { + @Test + void testTrivial() { String s = "print( 2 )\n"; doTest(s); } - public void testAlmostTrivial() { + @Test + void testAlmostTrivial() { String s = "print( 2 )\n" + "print( 3 )\n"; doTest(s); } - public void testSimple() { + @Test + void testSimple() { String s = "print( 'hello, world' )\n" + "for i = 2,4 do\n" + " print( 'i', i )\n" + "end\n"; doTest(s); } - public void testBreak() { + @Test + void testBreak() { String s = "a=1\n" + "while true do\n" + " if a>10 then\n" + " break\n" + " end\n" + " a=a+1\n" + " print( a )\n" + "end\n"; doTest(s); } - public void testShebang() { + @Test + void testShebang() { String s = "#!../lua\n" + "print( 2 )\n"; doTest(s); } - public void testInlineTable() { + @Test + void testInlineTable() { String s = "A = {g=10}\n" + "print( A )\n"; doTest(s); } - public void testEqualsAnd() { + @Test + void testEqualsAnd() { String s = "print( 1 == b and b )\n"; doTest(s); } @@ -65,7 +76,8 @@ public class SimpleTests extends TestCase { private static final int[] samehash = { 0, 1, -1, 2, -2, 4, 8, 16, 32, Integer.MAX_VALUE, Integer.MIN_VALUE }; private static final double[] diffhash = { .5, 1, 1.5, 1, .5, 1.5, 1.25, 2.5 }; - public void testDoubleHashCode() { + @Test + void testDoubleHashCode() { for (int i = 0; i < samehash.length; i++) { LuaValue j = LuaInteger.valueOf(samehash[i]); LuaValue d = LuaDouble.valueOf(samehash[i]); @@ -78,7 +90,7 @@ public class SimpleTests extends TestCase { LuaValue d = LuaValue.valueOf(diffhash[i+1]); int hc = c.hashCode(); int hd = d.hashCode(); - assertTrue("hash codes are same: " + hc, hc != hd); + assertTrue(hc != hd, "hash codes are same: " + hc); } } } diff --git a/luaj-jse/src/test/java/org/luaj/jse/StringMatchingTest.java b/luaj-jse/src/test/java/org/luaj/jse/StringMatchingTest.java new file mode 100644 index 00000000..8fe6efd0 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/jse/StringMatchingTest.java @@ -0,0 +1,47 @@ +package org.luaj.jse; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.jse.JsePlatform; + +class StringMatchingTest { + + @BeforeEach + protected void setUp() throws Exception { + JsePlatform.standardGlobals(); + } + + @Test + void testMatchShortPatterns() { + LuaValue[] args = { LuaString.valueOf("%bxy") }; + LuaString empty = LuaString.valueOf(""); + + LuaString a = LuaString.valueOf("a"); + LuaString ax = LuaString.valueOf("ax"); + LuaString axb = LuaString.valueOf("axb"); + LuaString axby = LuaString.valueOf("axby"); + LuaString xbya = LuaString.valueOf("xbya"); + LuaString bya = LuaString.valueOf("bya"); + LuaString xby = LuaString.valueOf("xby"); + LuaString axbya = LuaString.valueOf("axbya"); + LuaValue nil = LuaValue.NIL; + + assertEquals(nil, empty.invokemethod("match", args)); + assertEquals(nil, a.invokemethod("match", args)); + assertEquals(nil, ax.invokemethod("match", args)); + assertEquals(nil, axb.invokemethod("match", args)); + assertEquals(xby, axby.invokemethod("match", args)); + assertEquals(xby, xbya.invokemethod("match", args)); + assertEquals(nil, bya.invokemethod("match", args)); + assertEquals(xby, xby.invokemethod("match", args)); + assertEquals(xby, axbya.invokemethod("match", args)); + assertEquals(xby, axbya.substring(0, 4).invokemethod("match", args)); + assertEquals(nil, axbya.substring(0, 3).invokemethod("match", args)); + assertEquals(xby, axbya.substring(1, 5).invokemethod("match", args)); + assertEquals(nil, axbya.substring(2, 5).invokemethod("match", args)); + } +} diff --git a/luaj-test/src/test/java/org/luaj/vm2/UTF8StreamTest.java b/luaj-jse/src/test/java/org/luaj/jse/UTF8StreamTest.java similarity index 87% rename from luaj-test/src/test/java/org/luaj/vm2/UTF8StreamTest.java rename to luaj-jse/src/test/java/org/luaj/jse/UTF8StreamTest.java index 5940f138..d87a9e8d 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/UTF8StreamTest.java +++ b/luaj-jse/src/test/java/org/luaj/jse/UTF8StreamTest.java @@ -19,15 +19,19 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; +package org.luaj.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jse.JsePlatform; -public class UTF8StreamTest extends TestCase { +class UTF8StreamTest { - public void testUtf8CharsInStream() { + @Test + void testUtf8CharsInStream() { String script = "x = \"98\u00b0: today's temp!\"\n" + "print('x = ', x)\n" + "return x"; Globals globals = JsePlatform.standardGlobals(); LuaValue chunk = globals.load(script); diff --git a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleClassCastExcep.java b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleClassCastExcep.java similarity index 91% rename from luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleClassCastExcep.java rename to luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleClassCastExcep.java index 9e9eea38..dc7f0910 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleClassCastExcep.java +++ b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleClassCastExcep.java @@ -1,4 +1,4 @@ -package org.luaj.vm2.require; +package org.luaj.jse.require; import org.luaj.vm2.LuaValue; diff --git a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleLoadLuaError.java b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleLoadLuaError.java similarity index 93% rename from luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleLoadLuaError.java rename to luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleLoadLuaError.java index cd1a29d5..268ad70e 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleLoadLuaError.java +++ b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleLoadLuaError.java @@ -1,4 +1,4 @@ -package org.luaj.vm2.require; +package org.luaj.jse.require; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.ZeroArgFunction; diff --git a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleLoadRuntimeExcep.java b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleLoadRuntimeExcep.java similarity index 92% rename from luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleLoadRuntimeExcep.java rename to luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleLoadRuntimeExcep.java index 57c2d03b..c627bae1 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleLoadRuntimeExcep.java +++ b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleLoadRuntimeExcep.java @@ -1,4 +1,4 @@ -package org.luaj.vm2.require; +package org.luaj.jse.require; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.ZeroArgFunction; diff --git a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleSuccess.java b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleSuccess.java similarity index 93% rename from luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleSuccess.java rename to luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleSuccess.java index edddb49b..821c26a1 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/require/RequireSampleSuccess.java +++ b/luaj-jse/src/test/java/org/luaj/jse/require/RequireSampleSuccess.java @@ -1,4 +1,4 @@ -package org.luaj.vm2.require; +package org.luaj.jse.require; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.TwoArgFunction; diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/JsePlatformTest.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/JsePlatformTest.java similarity index 78% rename from luaj-test/src/test/java/org/luaj/vm2/lib/jse/JsePlatformTest.java rename to luaj-jse/src/test/java/org/luaj/vm2/lib/jse/JsePlatformTest.java index b020322a..b6e72087 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/JsePlatformTest.java +++ b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/JsePlatformTest.java @@ -1,13 +1,15 @@ package org.luaj.vm2.lib.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; -public class JsePlatformTest extends TestCase { - public void testLuaMainPassesArguments() { +class JsePlatformTest { + @Test + void testLuaMainPassesArguments() { Globals globals = JsePlatform.standardGlobals(); LuaValue chunk = globals.load("return #arg, arg.n, arg[2], arg[1]"); Varargs results = JsePlatform.luaMain(chunk, new String[] { "aaa", "bbb" }); diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java similarity index 87% rename from luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java rename to luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java index 62d60b47..3acdc59d 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java +++ b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuaJavaCoercionTest.java @@ -1,16 +1,22 @@ package org.luaj.vm2.lib.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.luaj.vm2.LuaError; import org.luaj.vm2.LuaInteger; import org.luaj.vm2.LuaString; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; -import org.luaj.vm2.lib.MathLib; -public class LuaJavaCoercionTest extends TestCase { +class LuaJavaCoercionTest { private static LuaValue globals; private static LuaValue ZERO = LuaValue.ZERO; @@ -19,19 +25,21 @@ public class LuaJavaCoercionTest extends TestCase { private static LuaValue THREE = LuaValue.valueOf(3); private static LuaString LENGTH = LuaString.valueOf("length"); + @BeforeEach protected void setUp() throws Exception { - super.setUp(); globals = JsePlatform.standardGlobals(); } - public void testJavaIntToLuaInt() { + @Test + void testJavaIntToLuaInt() { Integer i = Integer.valueOf(777); LuaValue v = CoerceJavaToLua.coerce(i); assertEquals(LuaInteger.class, v.getClass()); assertEquals(777, v.toint()); } - public void testLuaIntToJavaInt() { + @Test + void testLuaIntToJavaInt() { LuaInteger i = LuaInteger.valueOf(777); Object o = CoerceLuaToJava.coerce(i, int.class); assertEquals(Integer.class, o.getClass()); @@ -41,21 +49,24 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals(new Integer(777), o); } - public void testJavaStringToLuaString() { + @Test + void testJavaStringToLuaString() { String s = new String("777"); LuaValue v = CoerceJavaToLua.coerce(s); assertEquals(LuaString.class, v.getClass()); assertEquals("777", v.toString()); } - public void testLuaStringToJavaString() { + @Test + void testLuaStringToJavaString() { LuaString s = LuaValue.valueOf("777"); Object o = CoerceLuaToJava.coerce(s, String.class); assertEquals(String.class, o.getClass()); assertEquals("777", o); } - public void testJavaClassToLuaUserdata() { + @Test + void testJavaClassToLuaUserdata() { LuaValue va = CoerceJavaToLua.coerce(ClassA.class); LuaValue va1 = CoerceJavaToLua.coerce(ClassA.class); LuaValue vb = CoerceJavaToLua.coerce(ClassB.class); @@ -79,7 +90,8 @@ public class LuaJavaCoercionTest extends TestCase { static class ClassB { } - public void testJavaIntArrayToLuaTable() { + @Test + void testJavaIntArrayToLuaTable() { int[] i = { 222, 333 }; LuaValue v = CoerceJavaToLua.coerce(i); assertEquals(JavaArray.class, v.getClass()); @@ -108,7 +120,8 @@ public class LuaJavaCoercionTest extends TestCase { } } - public void testLuaTableToJavaIntArray() { + @Test + void testLuaTableToJavaIntArray() { LuaTable t = new LuaTable(); t.set(1, LuaInteger.valueOf(222)); t.set(2, LuaInteger.valueOf(333)); @@ -121,7 +134,8 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals(333, i[1]); } - public void testIntArrayScoringTables() { + @Test + void testIntArrayScoringTables() { int a = 5; LuaValue la = LuaInteger.valueOf(a); LuaTable tb = new LuaTable(); @@ -146,7 +160,8 @@ public class LuaJavaCoercionTest extends TestCase { assertTrue(scc < scb); } - public void testIntArrayScoringUserdata() { + @Test + void testIntArrayScoringUserdata() { int a = 5; int[] b = { 44, 66 }; int[][] c = { { 11, 22 }, { 33, 44 } }; @@ -183,27 +198,31 @@ public class LuaJavaCoercionTest extends TestCase { } } - public void testMatchVoidArgs() { + @Test + void testMatchVoidArgs() { LuaValue v = CoerceJavaToLua.coerce(new SampleClass()); LuaValue result = v.method("sample"); assertEquals("void-args", result.toString()); } - public void testMatchIntArgs() { + @Test + void testMatchIntArgs() { LuaValue v = CoerceJavaToLua.coerce(new SampleClass()); LuaValue arg = CoerceJavaToLua.coerce(new Integer(123)); LuaValue result = v.method("sample", arg); assertEquals("int-args 123", result.toString()); } - public void testMatchIntArrayArgs() { + @Test + void testMatchIntArrayArgs() { LuaValue v = CoerceJavaToLua.coerce(new SampleClass()); LuaValue arg = CoerceJavaToLua.coerce(new int[] { 345, 678 }); LuaValue result = v.method("sample", arg); assertEquals("int-array-args 345,678", result.toString()); } - public void testMatchIntArrayArrayArgs() { + @Test + void testMatchIntArrayArrayArgs() { LuaValue v = CoerceJavaToLua.coerce(new SampleClass()); LuaValue arg = CoerceJavaToLua.coerce(new int[][] { { 22, 33 }, { 44, 55 } }); LuaValue result = v.method("sample", arg); @@ -222,7 +241,8 @@ public class LuaJavaCoercionTest extends TestCase { } } - public void testExceptionMessage() { + @Test + void testExceptionMessage() { String script = "local c = luajava.bindClass( \"" + SomeClass.class.getName() + "\" )\n" + "return pcall( c.someMethod, c )"; Varargs vresult = globals.get("load").call(LuaValue.valueOf(script)).invoke(LuaValue.NONE); @@ -230,10 +250,11 @@ public class LuaJavaCoercionTest extends TestCase { LuaValue message = vresult.arg(2); assertEquals(LuaValue.FALSE, status); int index = message.toString().indexOf("this is some message"); - assertTrue("bad message: " + message, index >= 0); + assertTrue(index >= 0, "bad message: " + message); } - public void testLuaErrorCause() { + @Test + void testLuaErrorCause() { String script = "luajava.bindClass( \"" + SomeClass.class.getName() + "\"):someMethod()"; LuaValue chunk = globals.get("load").call(LuaValue.valueOf(script)); try { @@ -251,7 +272,8 @@ public class LuaJavaCoercionTest extends TestCase { public String arrayargsMethod(String a, String[] v); } - public void testVarArgsProxy() { + @Test + void testVarArgsProxy() { String script = "return luajava.createProxy( \"" + VarArgsInterface.class.getName() + "\", \n" + "{\n" + " varargsMethod = function(a,...)\n" + " return table.concat({a,...},'-')\n" + " end,\n" + " arrayargsMethod = function(a,array)\n" + " return tostring(a)..(array and \n" @@ -273,7 +295,8 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals("foo-nil", v.arrayargsMethod("foo", null)); } - public void testBigNum() { + @Test + void testBigNum() { String script = "bigNumA = luajava.newInstance('java.math.BigDecimal','12345678901234567890');\n" + "bigNumB = luajava.newInstance('java.math.BigDecimal','12345678901234567890');\n" + "bigNumC = bigNumA:multiply(bigNumB);\n" + @@ -389,29 +412,41 @@ public class LuaJavaCoercionTest extends TestCase { public static class D extends C implements IA { } - public void testOverloadedJavaMethodObject() { doOverloadedMethodTest("Object", ""); } + @Test + void testOverloadedJavaMethodObject() { doOverloadedMethodTest("Object", ""); } - public void testOverloadedJavaMethodString() { doOverloadedMethodTest("String", "abc"); } + @Test + void testOverloadedJavaMethodString() { doOverloadedMethodTest("String", "abc"); } - public void testOverloadedJavaMethodA() { doOverloadedMethodTest("A", ""); } + @Test + void testOverloadedJavaMethodA() { doOverloadedMethodTest("A", ""); } - public void testOverloadedJavaMethodB() { doOverloadedMethodTest("B", ""); } + @Test + void testOverloadedJavaMethodB() { doOverloadedMethodTest("B", ""); } - public void testOverloadedJavaMethodC() { doOverloadedMethodTest("C", ""); } + @Test + void testOverloadedJavaMethodC() { doOverloadedMethodTest("C", ""); } - public void testOverloadedJavaMethodByte() { doOverloadedMethodTest("byte", "1"); } + @Test + void testOverloadedJavaMethodByte() { doOverloadedMethodTest("byte", "1"); } - public void testOverloadedJavaMethodChar() { doOverloadedMethodTest("char", "65000"); } + @Test + void testOverloadedJavaMethodChar() { doOverloadedMethodTest("char", "65000"); } - public void testOverloadedJavaMethodShort() { doOverloadedMethodTest("short", "-32000"); } + @Test + void testOverloadedJavaMethodShort() { doOverloadedMethodTest("short", "-32000"); } - public void testOverloadedJavaMethodInt() { doOverloadedMethodTest("int", "100000"); } + @Test + void testOverloadedJavaMethodInt() { doOverloadedMethodTest("int", "100000"); } - public void testOverloadedJavaMethodLong() { doOverloadedMethodTest("long", "50000000000"); } + @Test + void testOverloadedJavaMethodLong() { doOverloadedMethodTest("long", "50000000000"); } - public void testOverloadedJavaMethodFloat() { doOverloadedMethodTest("float", "6.5"); } + @Test + void testOverloadedJavaMethodFloat() { doOverloadedMethodTest("float", "6.5"); } - public void testOverloadedJavaMethodDouble() { doOverloadedMethodTest("double", "3.141592653589793"); } + @Test + void testOverloadedJavaMethodDouble() { doOverloadedMethodTest("double", "3.141592653589793"); } private void doOverloadedMethodTest(String typename, String value) { String script = "local a = luajava.newInstance('" + B.class.getName() + "');\n" + "local b = a:set(a:get" @@ -430,7 +465,8 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals("setr(" + typename + ") " + value, sc); } - public void testClassInheritanceLevels() { + @Test + void testClassInheritanceLevels() { assertEquals(0, CoerceLuaToJava.inheritanceLevels(Object.class, Object.class)); assertEquals(1, CoerceLuaToJava.inheritanceLevels(Object.class, String.class)); assertEquals(1, CoerceLuaToJava.inheritanceLevels(Object.class, A.class)); @@ -456,7 +492,8 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals(0, CoerceLuaToJava.inheritanceLevels(C.class, C.class)); } - public void testInterfaceInheritanceLevels() { + @Test + void testInterfaceInheritanceLevels() { assertEquals(1, CoerceLuaToJava.inheritanceLevels(IA.class, A.class)); assertEquals(1, CoerceLuaToJava.inheritanceLevels(IB.class, B.class)); assertEquals(2, CoerceLuaToJava.inheritanceLevels(IA.class, B.class)); @@ -474,7 +511,8 @@ public class LuaJavaCoercionTest extends TestCase { assertEquals(1, CoerceLuaToJava.inheritanceLevels(IA.class, IB.class)); } - public void testCoerceJavaToLuaLuaValue() { + @Test + void testCoerceJavaToLuaLuaValue() { assertSame(LuaValue.NIL, CoerceJavaToLua.coerce(LuaValue.NIL)); assertSame(LuaValue.ZERO, CoerceJavaToLua.coerce(LuaValue.ZERO)); assertSame(LuaValue.ONE, CoerceJavaToLua.coerce(LuaValue.ONE)); @@ -483,7 +521,8 @@ public class LuaJavaCoercionTest extends TestCase { assertSame(table, CoerceJavaToLua.coerce(table)); } - public void testCoerceJavaToLuaByeArray() { + @Test + void testCoerceJavaToLuaByeArray() { byte[] bytes = "abcd".getBytes(); LuaValue value = CoerceJavaToLua.coerce(bytes); assertEquals(LuaString.class, value.getClass()); diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuajavaAccessibleMembersTest.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuajavaAccessibleMembersTest.java similarity index 73% rename from luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuajavaAccessibleMembersTest.java rename to luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuajavaAccessibleMembersTest.java index 4f88e67e..d7e70210 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuajavaAccessibleMembersTest.java +++ b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuajavaAccessibleMembersTest.java @@ -1,16 +1,19 @@ package org.luaj.vm2.lib.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; -public class LuajavaAccessibleMembersTest extends TestCase { +class LuajavaAccessibleMembersTest { private Globals globals; + @BeforeEach protected void setUp() throws Exception { - super.setUp(); globals = JsePlatform.standardGlobals(); } @@ -24,33 +27,39 @@ public class LuajavaAccessibleMembersTest extends TestCase { } } - public void testAccessFromPrivateClassImplementedMethod() { + @Test + void testAccessFromPrivateClassImplementedMethod() { assertEquals("privateImpl-aaa-interface_method(bar)", invokeScript("b = luajava.newInstance('" + TestClass.class.getName() + "');" + "a = b:create_PrivateImpl('aaa');" + "return a:interface_method('bar');")); } - public void testAccessFromPrivateClassPublicMethod() { + @Test + void testAccessFromPrivateClassPublicMethod() { assertEquals("privateImpl-aaa-public_method", invokeScript("b = luajava.newInstance('" + TestClass.class.getName() + "');" + "a = b:create_PrivateImpl('aaa');" + "return a:public_method();")); } - public void testAccessFromPrivateClassGetPublicField() { + @Test + void testAccessFromPrivateClassGetPublicField() { assertEquals("aaa", invokeScript("b = luajava.newInstance('" + TestClass.class.getName() + "');" + "a = b:create_PrivateImpl('aaa');" + "return a.public_field;")); } - public void testAccessFromPrivateClassSetPublicField() { + @Test + void testAccessFromPrivateClassSetPublicField() { assertEquals("foo", invokeScript("b = luajava.newInstance('" + TestClass.class.getName() + "');" + "a = b:create_PrivateImpl('aaa');" + "a.public_field = 'foo';" + "return a.public_field;")); } - public void testAccessFromPrivateClassPublicConstructor() { + @Test + void testAccessFromPrivateClassPublicConstructor() { assertEquals("privateImpl-constructor", invokeScript("b = luajava.newInstance('" + TestClass.class.getName() + "');" + "c = b:get_PrivateImplClass();" + "return luajava.new(c);")); } - public void testAccessPublicEnum() { + @Test + void testAccessPublicEnum() { assertEquals("class org.luaj.vm2.lib.jse.TestClass$SomeEnum", invokeScript("b = luajava.newInstance('" + TestClass.class.getName() + "');" + "return b.SomeEnum")); } diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuajavaClassMembersTest.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuajavaClassMembersTest.java similarity index 90% rename from luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuajavaClassMembersTest.java rename to luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuajavaClassMembersTest.java index 54a48cbc..78cd657b 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/LuajavaClassMembersTest.java +++ b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/LuajavaClassMembersTest.java @@ -1,11 +1,16 @@ package org.luaj.vm2.lib.jse; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.Test; import org.luaj.vm2.LuaError; import org.luaj.vm2.LuaValue; -public class LuajavaClassMembersTest extends TestCase { +class LuajavaClassMembersTest { public static class A { protected A() {} } @@ -66,10 +71,13 @@ public class LuajavaClassMembersTest extends TestCase { public C(String s, int i) { m_string_field = s; m_int_field = i; } + @Override public int getint() { return 200000; } + @Override public String pick(String s) { return "class-c-pick(string:" + s + ")"; } + @Override public String pick(int i) { return "class-c-pick(int:" + i + ")"; } public static class D { @@ -87,7 +95,8 @@ public class LuajavaClassMembersTest extends TestCase { static LuaValue SOMEB = CoerceJavaToLua.coerce(new B()); static LuaValue SOMEC = CoerceJavaToLua.coerce(new C()); - public void testSetByteField() { + @Test + void testSetByteField() { B b = new B(); JavaInstance i = new JavaInstance(b); i.set("m_byte_field", ONE); @@ -101,7 +110,8 @@ public class LuajavaClassMembersTest extends TestCase { assertEquals(ZERO, i.get("m_byte_field")); } - public void testSetDoubleField() { + @Test + void testSetDoubleField() { B b = new B(); JavaInstance i = new JavaInstance(b); i.set("m_double_field", ONE); @@ -115,7 +125,8 @@ public class LuajavaClassMembersTest extends TestCase { assertEquals(ZERO, i.get("m_double_field")); } - public void testNoFactory() { + @Test + void testNoFactory() { JavaClass c = JavaClass.forClass(A.class); try { c.call(); @@ -124,7 +135,8 @@ public class LuajavaClassMembersTest extends TestCase { } } - public void testUniqueFactoryCoercible() { + @Test + void testUniqueFactoryCoercible() { JavaClass c = JavaClass.forClass(B.class); assertEquals(JavaClass.class, c.getClass()); LuaValue constr = c.get("new"); @@ -138,7 +150,8 @@ public class LuajavaClassMembersTest extends TestCase { assertEquals(0, ((B) b0).m_int_field); } - public void testUniqueFactoryUncoercible() { + @Test + void testUniqueFactoryUncoercible() { JavaClass f = JavaClass.forClass(B.class); LuaValue constr = f.get("new"); assertEquals(JavaConstructor.class, constr.getClass()); @@ -151,7 +164,8 @@ public class LuajavaClassMembersTest extends TestCase { } } - public void testOverloadedFactoryCoercible() { + @Test + void testOverloadedFactoryCoercible() { JavaClass f = JavaClass.forClass(C.class); LuaValue constr = f.get("new"); assertEquals(JavaConstructor.Overload.class, constr.getClass()); @@ -173,7 +187,8 @@ public class LuajavaClassMembersTest extends TestCase { assertEquals(456, ((C) csi).m_int_field); } - public void testOverloadedFactoryUncoercible() { + @Test + void testOverloadedFactoryUncoercible() { JavaClass f = JavaClass.forClass(C.class); try { Object c = f.call(LuaValue.userdataOf(new Object())); @@ -184,7 +199,8 @@ public class LuajavaClassMembersTest extends TestCase { } } - public void testNoAttribute() { + @Test + void testNoAttribute() { JavaClass f = JavaClass.forClass(A.class); LuaValue v = f.get("bogus"); assertEquals(v, LuaValue.NIL); @@ -195,7 +211,8 @@ public class LuajavaClassMembersTest extends TestCase { } } - public void testFieldAttributeCoercible() { + @Test + void testFieldAttributeCoercible() { JavaInstance i = new JavaInstance(new B()); i.set("m_int_field", ONE); assertEquals(1, i.get("m_int_field").toint()); @@ -208,7 +225,8 @@ public class LuajavaClassMembersTest extends TestCase { assertEquals(3, i.get("m_int_field").toint()); } - public void testUniqueMethodAttributeCoercible() { + @Test + void testUniqueMethodAttributeCoercible() { B b = new B(); JavaInstance ib = new JavaInstance(b); LuaValue b_getString = ib.get("getString"); @@ -221,7 +239,8 @@ public class LuajavaClassMembersTest extends TestCase { assertEquals(200000, b_getint.call(SOMEC).toint()); } - public void testUniqueMethodAttributeArgsCoercible() { + @Test + void testUniqueMethodAttributeArgsCoercible() { B b = new B(); JavaInstance ib = new JavaInstance(b); LuaValue uniq = ib.get("uniq"); @@ -243,7 +262,8 @@ public class LuajavaClassMembersTest extends TestCase { uniqis.invoke(LuaValue.varargsOf(new LuaValue[] { SOMEB, ONE, ABC, ONE })).arg1().tojstring()); } - public void testOverloadedMethodAttributeCoercible() { + @Test + void testOverloadedMethodAttributeCoercible() { B b = new B(); JavaInstance ib = new JavaInstance(b); LuaValue p = ib.get("pick"); @@ -256,7 +276,8 @@ public class LuajavaClassMembersTest extends TestCase { p.invoke(LuaValue.varargsOf(new LuaValue[] { SOMEB, ONE, ABC, ONE })).arg1().tojstring()); } - public void testUnboundOverloadedMethodAttributeCoercible() { + @Test + void testUnboundOverloadedMethodAttributeCoercible() { B b = new B(); JavaInstance ib = new JavaInstance(b); LuaValue p = ib.get("pick"); @@ -270,7 +291,8 @@ public class LuajavaClassMembersTest extends TestCase { p.invoke(LuaValue.varargsOf(new LuaValue[] { SOMEC, ONE, ABC, ONE })).arg1().tojstring()); } - public void testOverloadedStaticMethodAttributeCoercible() { + @Test + void testOverloadedStaticMethodAttributeCoercible() { B b = new B(); JavaInstance ib = new JavaInstance(b); LuaValue p = ib.get("staticpick"); @@ -283,7 +305,8 @@ public class LuajavaClassMembersTest extends TestCase { p.invoke(LuaValue.varargsOf(new LuaValue[] { SOMEB, ONE, ABC, ONE })).arg1().tojstring()); } - public void testGetInnerClass() { + @Test + void testGetInnerClass() { C c = new C(); JavaInstance ic = new JavaInstance(c); LuaValue d = ic.get("D"); diff --git a/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/OsLibTest.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/OsLibTest.java new file mode 100644 index 00000000..3aebd9eb --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/OsLibTest.java @@ -0,0 +1,138 @@ +package org.luaj.vm2.lib.jse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.Date; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaValue; + +class OsLibTest { + + LuaValue jse_lib; + double time; + + @BeforeEach + public void setUp() { + jse_lib = JsePlatform.standardGlobals().get("os"); + time = new Date(2001-1900, 7, 23, 14, 55, 02).getTime()/1000.0; + } + + private void test(String format, String expected) { + String actual = jse_lib.get("date").call(LuaValue.valueOf(format), LuaValue.valueOf(time)).tojstring(); + assertEquals(expected, actual); + } + + @Test + void testStringDateChars() { test("foo", "foo"); } + + @Test + void testStringDate_a() { test("%a", "Thu"); } + + @Test + void testStringDate_A() { test("%A", "Thursday"); } + + @Test + void testStringDate_b() { test("%b", "Aug"); } + + @Test + void testStringDate_B() { test("%B", "August"); } + + @Test + void testStringDate_c() { test("%c", "Thu Aug 23 14:55:02 2001"); } + + @Test + void testStringDate_d() { test("%d", "23"); } + + @Test + void testStringDate_H() { test("%H", "14"); } + + @Test + void testStringDate_I() { test("%I", "02"); } + + @Test + void testStringDate_j() { test("%j", "235"); } + + @Test + void testStringDate_m() { test("%m", "08"); } + + @Test + void testStringDate_M() { test("%M", "55"); } + + @Test + void testStringDate_p() { test("%p", "PM"); } + + @Test + void testStringDate_S() { test("%S", "02"); } + + @Test + void testStringDate_U() { test("%U", "33"); } + + @Test + void testStringDate_w() { test("%w", "4"); } + + @Test + void testStringDate_W() { test("%W", "34"); } + + @Test + void testStringDate_x() { test("%x", "08/23/01"); } + + @Test + void testStringDate_X() { test("%X", "14:55:02"); } + + @Test + void testStringDate_y() { test("%y", "01"); } + + @Test + void testStringDate_Y() { test("%Y", "2001"); } + + @Test + void testStringDate_Pct() { test("%%", "%"); } + + static final double DAY = 24.*3600.; + + @Test + void testStringDate_UW_neg4() { time -= 4*DAY; test("%c %U %W", "Sun Aug 19 14:55:02 2001 33 33"); } + + @Test + void testStringDate_UW_neg3() { time -= 3*DAY; test("%c %U %W", "Mon Aug 20 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_neg2() { time -= 2*DAY; test("%c %U %W", "Tue Aug 21 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_neg1() { time -= DAY; test("%c %U %W", "Wed Aug 22 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos0() { time += 0; test("%c %U %W", "Thu Aug 23 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos1() { time += DAY; test("%c %U %W", "Fri Aug 24 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos2() { time += 2*DAY; test("%c %U %W", "Sat Aug 25 14:55:02 2001 33 34"); } + + @Test + void testStringDate_UW_pos3() { time += 3*DAY; test("%c %U %W", "Sun Aug 26 14:55:02 2001 34 34"); } + + @Test + void testStringDate_UW_pos4() { time += 4*DAY; test("%c %U %W", "Mon Aug 27 14:55:02 2001 34 35"); } + + @Test + void testJseOsGetenvForEnvVariables() { + LuaValue USER = LuaValue.valueOf("USER"); + LuaValue jse_user = jse_lib.get("getenv").call(USER); + assertFalse(jse_user.isnil()); + } + + @Test + void testJseOsGetenvForSystemProperties() { + System.setProperty("test.key.foo", "test.value.bar"); + LuaValue key = LuaValue.valueOf("test.key.foo"); + LuaValue value = LuaValue.valueOf("test.value.bar"); + LuaValue jse_value = jse_lib.get("getenv").call(key); + assertEquals(value, jse_value); + } +} diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/TestClass.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/TestClass.java similarity index 100% rename from luaj-test/src/test/java/org/luaj/vm2/lib/jse/TestClass.java rename to luaj-jse/src/test/java/org/luaj/vm2/lib/jse/TestClass.java diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/TestInterface.java b/luaj-jse/src/test/java/org/luaj/vm2/lib/jse/TestInterface.java similarity index 100% rename from luaj-test/src/test/java/org/luaj/vm2/lib/jse/TestInterface.java rename to luaj-jse/src/test/java/org/luaj/vm2/lib/jse/TestInterface.java diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/CompileClosureTest.java b/luaj-jse/src/test/java/org/luaj/vm2/script/CompileClosureTest.java new file mode 100644 index 00000000..648d4491 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/CompileClosureTest.java @@ -0,0 +1,27 @@ +package org.luaj.vm2.script; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaValue; + +class CompileClosureTest extends DefaultBindingsTestCase { + @BeforeEach + @Override + protected void setUp() throws Exception { + System.setProperty("org.luaj.luajc", "false"); + super.setUp(); + } + + @Test + void testCompiledFunctionIsClosure() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("return 'foo'"); + LuaValue value = ((LuaScriptEngine.LuajCompiledScript) cs).function; + assertTrue(value.isclosure()); + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/CompileNonClosureTest.java b/luaj-jse/src/test/java/org/luaj/vm2/script/CompileNonClosureTest.java new file mode 100644 index 00000000..a4c191d6 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/CompileNonClosureTest.java @@ -0,0 +1,27 @@ +package org.luaj.vm2.script; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaValue; + +class CompileNonClosureTest extends DefaultBindingsTestCase { + @BeforeEach + @Override + protected void setUp() throws Exception { + System.setProperty("org.luaj.luajc", "true"); + super.setUp(); + } + + @Test + void testCompiledFunctionIsNotClosure() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("return 'foo'"); + LuaValue value = ((LuaScriptEngine.LuajCompiledScript) cs).function; + assertFalse(value.isclosure()); + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/DefaultBindingsTestCase.java b/luaj-jse/src/test/java/org/luaj/vm2/script/DefaultBindingsTestCase.java new file mode 100644 index 00000000..56b3bb75 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/DefaultBindingsTestCase.java @@ -0,0 +1,10 @@ +package org.luaj.vm2.script; + +import javax.script.Bindings; + +abstract class DefaultBindingsTestCase extends EngineTestCase { + @Override + protected Bindings createBindings() { + return e.createBindings(); + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/EngineTestCase.java b/luaj-jse/src/test/java/org/luaj/vm2/script/EngineTestCase.java new file mode 100644 index 00000000..e65b5cd3 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/EngineTestCase.java @@ -0,0 +1,186 @@ +package org.luaj.vm2.script; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.CharArrayReader; +import java.io.CharArrayWriter; +import java.io.Reader; + +import javax.script.Bindings; +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; + +abstract class EngineTestCase { + protected ScriptEngine e; + protected Bindings b; + + protected abstract Bindings createBindings(); + + @BeforeEach + protected void setUp() throws Exception { + this.e = new ScriptEngineManager().getEngineByName("luaj"); + this.b = createBindings(); + } + + @Test + void testSqrtIntResult() throws ScriptException { + e.put("x", 25); + e.eval("y = math.sqrt(x)"); + Object y = e.get("y"); + assertEquals(5, y); + } + + @Test + void testOneArgFunction() throws ScriptException { + e.put("x", 25); + e.eval("y = math.sqrt(x)"); + Object y = e.get("y"); + assertEquals(5, y); + e.put("f", new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return LuaValue.valueOf(arg.toString() + "123"); + } + }); + Object r = e.eval("return f('abc')"); + assertEquals("abc123", r); + } + + @Test + void testCompiledScript() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = math.sqrt(x); return y"); + b.put("x", 144); + assertEquals(12, cs.eval(b)); + } + + @Test + void testBuggyLuaScript() { + try { + e.eval("\n\nbuggy lua code\n\n"); + } catch (ScriptException se) { + assertEquals("eval threw javax.script.ScriptException: [string \"script\"]:3: syntax error", + se.getMessage()); + return; + } + fail("buggy script did not throw ScriptException as expected."); + } + + @Test + void testScriptRedirection() throws ScriptException { + Reader input = new CharArrayReader("abcdefg\nhijk".toCharArray()); + CharArrayWriter output = new CharArrayWriter(); + CharArrayWriter errors = new CharArrayWriter(); + String script = "print(\"string written using 'print'\")\n" + + "io.write(\"string written using 'io.write()'\\n\")\n" + + "io.stdout:write(\"string written using 'io.stdout:write()'\\n\")\n" + + "io.stderr:write(\"string written using 'io.stderr:write()'\\n\")\n" + + "io.write([[string read using 'io.stdin:read(\"*l\")':]]..io.stdin:read(\"*l\")..\"\\n\")\n"; + + // Evaluate script with redirection set + e.getContext().setReader(input); + e.getContext().setWriter(output); + e.getContext().setErrorWriter(errors); + e.eval(script); + final String expectedOutput = "string written using 'print'\n" + "string written using 'io.write()'\n" + + "string written using 'io.stdout:write()'\n" + "string read using 'io.stdin:read(\"*l\")':abcdefg\n"; + assertEquals(expectedOutput, output.toString()); + final String expectedErrors = "string written using 'io.stderr:write()'\n"; + assertEquals(expectedErrors, errors.toString()); + + // Evaluate script with redirection reset + output.reset(); + errors.reset(); + // e.getContext().setReader(null); // This will block if using actual STDIN + e.getContext().setWriter(null); + e.getContext().setErrorWriter(null); + e.eval(script); + assertEquals("", output.toString()); + assertEquals("", errors.toString()); + } + + @Test + void testBindingJavaInt() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); + b.put("x", 111); + assertEquals("x number 111", cs.eval(b)); + assertEquals(111, b.get("y")); + } + + @Test + void testBindingJavaDouble() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); + b.put("x", 125.125); + assertEquals("x number 125.125", cs.eval(b)); + assertEquals(125.125, b.get("y")); + } + + @Test + void testBindingJavaString() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); + b.put("x", "foo"); + assertEquals("x string foo", cs.eval(b)); + assertEquals("foo", b.get("y")); + } + + @Test + void testBindingJavaObject() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); + b.put("x", new SomeUserClass()); + assertEquals("x userdata some-user-value", cs.eval(b)); + assertEquals(SomeUserClass.class, b.get("y").getClass()); + } + + @Test + void testBindingJavaArray() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..#x..' '..x[1]..' '..x[2]\n"); + b.put("x", new int[] { 777, 888 }); + assertEquals("x userdata 2 777 888", cs.eval(b)); + assertEquals(int[].class, b.get("y").getClass()); + } + + @Test + void testBindingLuaFunction() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("y = function(x) return 678 + x end; return 'foo'"); + assertEquals("foo", cs.eval(b).toString()); + assertTrue(b.get("y") instanceof LuaFunction); + assertEquals(LuaValue.valueOf(801), ((LuaFunction) b.get("y")).call(LuaValue.valueOf(123))); + } + + @Test + void testUserClasses() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("x = x or luajava.newInstance('java.lang.String', 'test')\n" + + "return 'x ' .. type(x) .. ' ' .. tostring(x)\n"); + assertEquals("x string test", cs.eval(b)); + b.put("x", new SomeUserClass()); + assertEquals("x userdata some-user-value", cs.eval(b)); + } + + @Test + void testReturnMultipleValues() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("return 'foo', 'bar'\n"); + Object o = cs.eval(); + assertEquals(Object[].class, o.getClass()); + Object[] array = (Object[]) o; + assertEquals(2, array.length); + assertEquals("foo", array[0]); + assertEquals("bar", array[1]); + } + + private static class SomeUserClass { + @Override + public String toString() { + return "some-user-value"; + } + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/LookupEngineTest.java b/luaj-jse/src/test/java/org/luaj/vm2/script/LookupEngineTest.java new file mode 100644 index 00000000..4f73ae79 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/LookupEngineTest.java @@ -0,0 +1,43 @@ +package org.luaj.vm2.script; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; + +import org.junit.jupiter.api.Test; + +class LookupEngineTest { + @Test + void testGetEngineByExtension() { + ScriptEngine e = new ScriptEngineManager().getEngineByExtension(".lua"); + assertNotNull(e); + assertEquals(LuaScriptEngine.class, e.getClass()); + } + + @Test + void testGetEngineByName() { + ScriptEngine e = new ScriptEngineManager().getEngineByName("luaj"); + assertNotNull(e); + assertEquals(LuaScriptEngine.class, e.getClass()); + } + + @Test + void testGetEngineByMimeType() { + ScriptEngine e = new ScriptEngineManager().getEngineByMimeType("text/lua"); + assertNotNull(e); + assertEquals(LuaScriptEngine.class, e.getClass()); + } + + @Test + void testFactoryMetadata() { + ScriptEngine e = new ScriptEngineManager().getEngineByName("luaj"); + ScriptEngineFactory f = e.getFactory(); + assertEquals("Luaj", f.getEngineName()); + assertEquals("Luaj 0.0", f.getEngineVersion()); + assertEquals("lua", f.getLanguageName()); + assertEquals("5.2", f.getLanguageVersion()); + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/SimpleBindingsTest.java b/luaj-jse/src/test/java/org/luaj/vm2/script/SimpleBindingsTest.java new file mode 100644 index 00000000..c30d943a --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/SimpleBindingsTest.java @@ -0,0 +1,11 @@ +package org.luaj.vm2.script; + +import javax.script.Bindings; +import javax.script.SimpleBindings; + +class SimpleBindingsTest extends EngineTestCase { + @Override + protected Bindings createBindings() { + return new SimpleBindings(); + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/UserContextTest.java b/luaj-jse/src/test/java/org/luaj/vm2/script/UserContextTest.java new file mode 100644 index 00000000..bd3163d3 --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/UserContextTest.java @@ -0,0 +1,55 @@ +package org.luaj.vm2.script; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import javax.script.Bindings; +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class UserContextTest { + protected ScriptEngine e; + protected Bindings b; + protected ScriptContext c; + + @BeforeEach + public void setUp() { + this.e = new ScriptEngineManager().getEngineByName("luaj"); + this.c = new LuajContext(); + this.b = c.getBindings(ScriptContext.ENGINE_SCOPE); + } + + @Test + void testUncompiledScript() throws ScriptException { + b.put("x", 144); + assertEquals(12, e.eval("z = math.sqrt(x); return z", b)); + assertEquals(12, b.get("z")); + assertEquals(null, e.getBindings(ScriptContext.ENGINE_SCOPE).get("z")); + assertEquals(null, e.getBindings(ScriptContext.GLOBAL_SCOPE).get("z")); + + b.put("x", 25); + assertEquals(5, e.eval("z = math.sqrt(x); return z", c)); + assertEquals(5, b.get("z")); + assertEquals(null, e.getBindings(ScriptContext.ENGINE_SCOPE).get("z")); + assertEquals(null, e.getBindings(ScriptContext.GLOBAL_SCOPE).get("z")); + } + + @Test + void testCompiledScript() throws ScriptException { + CompiledScript cs = ((Compilable) e).compile("z = math.sqrt(x); return z"); + + b.put("x", 144); + assertEquals(12, cs.eval(b)); + assertEquals(12, b.get("z")); + + b.put("x", 25); + assertEquals(5, cs.eval(c)); + assertEquals(5, b.get("z")); + } +} diff --git a/luaj-jse/src/test/java/org/luaj/vm2/script/WriterTest.java b/luaj-jse/src/test/java/org/luaj/vm2/script/WriterTest.java new file mode 100644 index 00000000..a70ab95e --- /dev/null +++ b/luaj-jse/src/test/java/org/luaj/vm2/script/WriterTest.java @@ -0,0 +1,38 @@ +package org.luaj.vm2.script; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.CharArrayWriter; + +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class WriterTest { + protected ScriptEngine e; + protected Bindings b; + + @BeforeEach + public void setUp() { + this.e = new ScriptEngineManager().getEngineByName("luaj"); + this.b = e.getBindings(ScriptContext.ENGINE_SCOPE); + } + + @Test + void testWriter() throws ScriptException { + CharArrayWriter output = new CharArrayWriter(); + CharArrayWriter errors = new CharArrayWriter(); + e.getContext().setWriter(output); + e.getContext().setErrorWriter(errors); + e.eval("io.write( [[line]] )"); + assertEquals("line", output.toString()); + e.eval("io.write( [[ one\nline two\n]] )"); + assertEquals("line one\nline two\n", output.toString()); + output.reset(); + } +} diff --git a/luaj-test/pom.xml b/luaj-test/pom.xml index b3a29f6c..2ec1dde8 100644 --- a/luaj-test/pom.xml +++ b/luaj-test/pom.xml @@ -26,8 +26,20 @@ ${project.version} - junit - junit + org.junit.jupiter + junit-jupiter + test + + + org.microemu + microemulator + 2.0.4 + test + + + org.microemu + microemu-jsr-75 + 2.0.4 test diff --git a/luaj-test/src/test/java/org/luaj/vm2/CompatibiltyTest.java b/luaj-test/src/test/java/org/luaj/CompatibiltyTest.java similarity index 52% rename from luaj-test/src/test/java/org/luaj/vm2/CompatibiltyTest.java rename to luaj-test/src/test/java/org/luaj/CompatibiltyTest.java index 1e62d75e..baea7dd5 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/CompatibiltyTest.java +++ b/luaj-test/src/test/java/org/luaj/CompatibiltyTest.java @@ -19,10 +19,19 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; - -import junit.framework.TestSuite; +package org.luaj; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaBoolean; +import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaNil; +import org.luaj.vm2.LuaNumber; +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaThread; +import org.luaj.vm2.LuaValue; import org.luaj.vm2.luajc.LuaJC; /** @@ -31,24 +40,21 @@ import org.luaj.vm2.luajc.LuaJC; * Results are compared for exact match with the installed C-based lua * environment. */ -public class CompatibiltyTest extends TestSuite { +public class CompatibiltyTest { - private static final String dir = ""; - - abstract protected static class CompatibiltyTestSuite extends ScriptDrivenTest { + abstract static class CompatibiltyTestCase extends PlatformTestCase { LuaValue savedStringMetatable; - protected CompatibiltyTestSuite(PlatformType platform) { - super(platform, dir); - } - - protected void setUp() throws Exception { + @BeforeEach + @Override + protected void setUp() { savedStringMetatable = LuaString.s_metatable; + setBaseDir("compatibility"); super.setUp(); } - protected void tearDown() throws Exception { - super.tearDown(); + @AfterEach + protected void tearDown() { LuaNil.s_metatable = null; LuaBoolean.s_metatable = null; LuaNumber.s_metatable = null; @@ -57,79 +63,94 @@ public class CompatibiltyTest extends TestSuite { LuaString.s_metatable = savedStringMetatable; } - public void testBaseLib() { runTest("baselib"); } + @Test + void testBaseLib() { runTest("baselib"); } - public void testCoroutineLib() { runTest("coroutinelib"); } + @Test + void testCoroutineLib() { runTest("coroutinelib"); } - public void testDebugLib() { runTest("debuglib"); } + @Test + void testDebugLib() { runTest("debuglib"); } - public void testErrors() { runTest("errors"); } + @Test + void testErrors() { runTest("errors"); } - public void testFunctions() { runTest("functions"); } + @Test + void testFunctions() { runTest("functions"); } - public void testIoLib() { runTest("iolib"); } + @Test + void testIoLib() { runTest("iolib"); } - public void testManyUpvals() { runTest("manyupvals"); } + @Test + void testManyUpvals() { runTest("manyupvals"); } - public void testMathLib() { runTest("mathlib"); } + @Test + void testMathLib() { runTest("mathlib"); } - public void testMetatags() { runTest("metatags"); } + @Test + void testMetatags() { runTest("metatags"); } - public void testOsLib() { runTest("oslib"); } + @Test + void testOsLib() { runTest("oslib"); } - public void testStringLib() { runTest("stringlib"); } + @Test + void testStringLib() { runTest("stringlib"); } - public void testTableLib() { runTest("tablelib"); } + @Test + void testTableLib() { runTest("tablelib"); } - public void testTailcalls() { runTest("tailcalls"); } + @Test + void testTailcalls() { runTest("tailcalls"); } - public void testUpvalues() { runTest("upvalues"); } + @Test + void testUpvalues() { runTest("upvalues"); } - public void testVm() { runTest("vm"); } + @Test + void testVm() { runTest("vm"); } } - public static TestSuite suite() { - TestSuite suite = new TestSuite("Compatibility Tests"); - suite.addTest(new TestSuite(JseCompatibilityTest.class, "JSE Compatibility Tests")); - suite.addTest(new TestSuite(JmeCompatibilityTest.class, "JME Compatibility Tests")); - suite.addTest(new TestSuite(LuaJCCompatibilityTest.class, "LuaJC Compatibility Tests")); - return suite; - } + @Nested + public static class JmeCompatibilityTest extends CompatibiltyTestCase { - public static class JmeCompatibilityTest extends CompatibiltyTestSuite { - public JmeCompatibilityTest() { - super(ScriptDrivenTest.PlatformType.JME); - } - - protected void setUp() throws Exception { + @BeforeEach + @Override + protected void setUp() { + setPlatform(PlatformTestCase.PlatformType.JME); System.setProperty("JME", "true"); super.setUp(); } + + // Emulator cannot create files for writing + @Override + void testIoLib() {} } - public static class JseCompatibilityTest extends CompatibiltyTestSuite { - public JseCompatibilityTest() { - super(ScriptDrivenTest.PlatformType.JSE); - } + @Nested + public static class JseCompatibilityTest extends CompatibiltyTestCase { - protected void setUp() throws Exception { - super.setUp(); + @BeforeEach + @Override + protected void setUp() { + setPlatform(PlatformTestCase.PlatformType.JSE); System.setProperty("JME", "false"); + super.setUp(); } } - public static class LuaJCCompatibilityTest extends CompatibiltyTestSuite { - public LuaJCCompatibilityTest() { - super(ScriptDrivenTest.PlatformType.LUAJIT); - } + @Nested + public static class LuaJCCompatibilityTest extends CompatibiltyTestCase { - protected void setUp() throws Exception { - super.setUp(); + @BeforeEach + @Override + protected void setUp() { + setPlatform(PlatformTestCase.PlatformType.LUAJIT); System.setProperty("JME", "false"); + super.setUp(); LuaJC.install(globals); } // not supported on this platform - don't test - public void testDebugLib() {} + @Override + void testDebugLib() {} } } diff --git a/luaj-test/src/test/java/org/luaj/CompilerTest.java b/luaj-test/src/test/java/org/luaj/CompilerTest.java new file mode 100644 index 00000000..3f85bc8f --- /dev/null +++ b/luaj-test/src/test/java/org/luaj/CompilerTest.java @@ -0,0 +1,95 @@ +package org.luaj; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CompilerTest extends CompilingTestCase { + + @BeforeEach + @Override + protected void setUp() { + setBaseDir("lua5.2.1-tests"); + super.setUp(); + } + + @Test + void testAll() { doTest("all"); } + + @Test + void testApi() { doTest("api"); } + + @Test + void testAttrib() { doTest("attrib"); } + + @Test + void testBig() { doTest("big"); } + + @Test + void testBitwise() { doTest("bitwise"); } + + @Test + void testCalls() { doTest("calls"); } + + @Test + void testChecktable() { doTest("checktable"); } + + @Test + void testClosure() { doTest("closure"); } + + @Test + void testCode() { doTest("code"); } + + @Test + void testConstruct() { doTest("constructs"); } + + @Test + void testCoroutine() { doTest("coroutine"); } + + @Test + void testDb() { doTest("db"); } + + @Test + void testErrors() { doTest("errors"); } + + @Test + void testEvents() { doTest("events"); } + + @Test + void testFiles() { doTest("files"); } + + @Test + void testGc() { doTest("gc"); } + + @Test + void testGoto() { doTest("goto"); } + + @Test + void testLiterals() { doTest("literals"); } + + @Test + void testLocals() { doTest("locals"); } + + @Test + void testMain() { doTest("main"); } + + @Test + void testMath() { doTest("math"); } + + @Test + void testNextvar() { doTest("nextvar"); } + + @Test + void testPm() { doTest("pm"); } + + @Test + void testSort() { doTest("sort"); } + + @Test + void testStrings() { doTest("strings"); } + + @Test + void testVararg() { doTest("vararg"); } + + @Test + void testVerybig() { doTest("verybig"); } +} diff --git a/luaj-test/src/test/java/org/luaj/CompilingTestCase.java b/luaj-test/src/test/java/org/luaj/CompilingTestCase.java new file mode 100644 index 00000000..482aa16c --- /dev/null +++ b/luaj-test/src/test/java/org/luaj/CompilingTestCase.java @@ -0,0 +1,53 @@ +package org.luaj; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import org.luaj.vm2.Print; +import org.luaj.vm2.Prototype; +import org.luaj.vm2.compiler.DumpState; + +abstract class CompilingTestCase extends ResourcesTestCase { + + protected void doTest(String name) { + try { + // compile in memory + Prototype p = globals.loadPrototype(inputStreamOfLua(name), "@" + name + ".lua", "bt"); + String actual = protoToString(p); + + // load expected value from jar + Prototype e = globals.loadPrototype(inputStreamOfBytecode(name), name, "b"); + String expected = protoToString(e); + + // compare results + assertEquals(expected, actual); + + // dump into memory + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DumpState.dump(p, baos, false); + ByteArrayInputStream dumped = new ByteArrayInputStream(baos.toByteArray()); + + // re-undump + Prototype p2 = globals.loadPrototype(dumped, name, "b"); + String actual2 = protoToString(p2); + + // compare again + assertEquals(actual, actual2); + + } catch (Exception e) { + fail(e.toString()); + } + } + + private String protoToString(Prototype p) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos); + Print.ps = ps; + Print.printFunction(p, true); + return baos.toString(); + } +} diff --git a/luaj-test/src/test/java/org/luaj/vm2/ErrorsTest.java b/luaj-test/src/test/java/org/luaj/ErrorsTest.java similarity index 67% rename from luaj-test/src/test/java/org/luaj/vm2/ErrorsTest.java rename to luaj-test/src/test/java/org/luaj/ErrorsTest.java index f0e13eaf..ef17a46b 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/ErrorsTest.java +++ b/luaj-test/src/test/java/org/luaj/ErrorsTest.java @@ -19,31 +19,34 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; +package org.luaj; import java.io.IOException; import java.io.InputStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + /** * Test argument type check errors * * Results are compared for exact match with the installed C-based lua * environment. */ -public class ErrorsTest extends ScriptDrivenTest { +class ErrorsTest extends PlatformTestCase { - private static final String dir = "errors/"; - - public ErrorsTest() { - super(ScriptDrivenTest.PlatformType.JSE, dir); - } - - protected void setUp() throws Exception { + @BeforeEach + @Override + protected void setUp() { + setBaseDir("errors"); + setPlatform(PlatformTestCase.PlatformType.JSE); super.setUp(); } - public void testBaseLibArgs() { + @Test + void testBaseLibArgs() { globals.STDIN = new InputStream() { + @Override public int read() throws IOException { return -1; } @@ -51,20 +54,28 @@ public class ErrorsTest extends ScriptDrivenTest { runTest("baselibargs"); } - public void testCoroutineLibArgs() { runTest("coroutinelibargs"); } + @Test + void testCoroutineLibArgs() { runTest("coroutinelibargs"); } - public void testDebugLibArgs() { runTest("debuglibargs"); } + @Test + void testDebugLibArgs() { runTest("debuglibargs"); } - public void testIoLibArgs() { runTest("iolibargs"); } + @Test + void testIoLibArgs() { runTest("iolibargs"); } - public void testMathLibArgs() { runTest("mathlibargs"); } + @Test + void testMathLibArgs() { runTest("mathlibargs"); } - public void testModuleLibArgs() { runTest("modulelibargs"); } + @Test + void testModuleLibArgs() { runTest("modulelibargs"); } - public void testOperators() { runTest("operators"); } + @Test + void testOperators() { runTest("operators"); } - public void testStringLibArgs() { runTest("stringlibargs"); } + @Test + void testStringLibArgs() { runTest("stringlibargs"); } - public void testTableLibArgs() { runTest("tablelibargs"); } + @Test + void testTableLibArgs() { runTest("tablelibargs"); } } diff --git a/luaj-test/src/test/java/org/luaj/LuaParserTest.java b/luaj-test/src/test/java/org/luaj/LuaParserTest.java new file mode 100644 index 00000000..6fbe0687 --- /dev/null +++ b/luaj-test/src/test/java/org/luaj/LuaParserTest.java @@ -0,0 +1,20 @@ +package org.luaj; + +import static java.nio.charset.StandardCharsets.ISO_8859_1; +import static org.junit.jupiter.api.Assertions.fail; + +import org.luaj.vm2.parser.LuaParser; + +public class LuaParserTest extends CompilerTest { + + @Override + protected void doTest(String name) { + try { + LuaParser parser = new LuaParser(inputStreamOfLua(name), ISO_8859_1); + parser.Chunk(); + } catch (Exception e) { + fail(e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/luaj-test/src/test/java/org/luaj/vm2/ScriptDrivenTest.java b/luaj-test/src/test/java/org/luaj/PlatformTestCase.java similarity index 60% rename from luaj-test/src/test/java/org/luaj/vm2/ScriptDrivenTest.java rename to luaj-test/src/test/java/org/luaj/PlatformTestCase.java index d91bf74b..5d4af4a2 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/ScriptDrivenTest.java +++ b/luaj-test/src/test/java/org/luaj/PlatformTestCase.java @@ -19,135 +19,62 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ -package org.luaj.vm2; +package org.luaj; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; -import java.net.MalformedURLException; -import java.net.URL; -import junit.framework.TestCase; - -import org.luaj.vm2.lib.ResourceFinder; +import org.junit.jupiter.api.BeforeEach; +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.jme.JmePlatform; +import org.luaj.vm2.lib.jse.JsePlatform; import org.luaj.vm2.lib.jse.JseProcess; import org.luaj.vm2.luajc.LuaJC; -abstract public class ScriptDrivenTest extends TestCase implements ResourceFinder { +abstract class PlatformTestCase extends ResourcesTestCase { public static final boolean nocompile = "true".equals(System.getProperty("nocompile")); public enum PlatformType { JME, JSE, LUAJIT, } - private final PlatformType platform; - private final String subdir; - protected Globals globals; - - static final String zipdir = "test/lua/"; - static final String zipfile = "luaj3.0-tests.zip"; - - protected ScriptDrivenTest(PlatformType platform, String subdir) { - this.platform = platform; - this.subdir = subdir; - initGlobals(); - } + private PlatformType platform; private void initGlobals() { switch (platform) { default: case JSE: case LUAJIT: - globals = org.luaj.vm2.lib.jse.JsePlatform.debugGlobals(); + globals = JsePlatform.debugGlobals(); break; case JME: - globals = org.luaj.vm2.lib.jme.JmePlatform.debugGlobals(); + globals = JmePlatform.debugGlobals(); break; } } - protected void setUp() throws Exception { - super.setUp(); + @BeforeEach + @Override + protected void setUp() { initGlobals(); - globals.finder = this; - } - - // ResourceFinder implementation. - public InputStream findResource(String filename) { - InputStream is = findInPlainFile(filename); - if (is != null) - return is; - is = findInPlainFileAsResource("", filename); - if (is != null) - return is; - is = findInPlainFileAsResource("/", filename); - if (is != null) - return is; - is = findInZipFileAsPlainFile(filename); - if (is != null) - return is; - is = findInZipFileAsResource("", filename); - if (is != null) - return is; - is = findInZipFileAsResource("/", filename); - return is; - } - - private InputStream findInPlainFileAsResource(String prefix, String filename) { - return getClass().getResourceAsStream(prefix+subdir+filename); - } - - private InputStream findInPlainFile(String filename) { - try { - File f = new File(zipdir+subdir+filename); - if (f.exists()) - return new FileInputStream(f); - } catch (IOException ioe) { - ioe.printStackTrace(); - } - return null; - } - - private InputStream findInZipFileAsPlainFile(String filename) { - URL zip; - File file = new File(zipdir+zipfile); - try { - if (file.exists()) { - zip = file.toURI().toURL(); - String path = "jar:" + zip.toExternalForm() + "!/" + subdir + filename; - URL url = new URL(path); - return url.openStream(); - } - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (FileNotFoundException e) { - // Ignore and return null. - } catch (IOException ioe) { - ioe.printStackTrace(); - } - return null; - } - - private InputStream findInZipFileAsResource(String prefix, String filename) { - URL zip = null; - zip = getClass().getResource(zipfile); - if (zip != null) + globals.finder = filename -> { try { - String path = "jar:" + zip.toExternalForm() + "!/" + subdir + filename; - URL url = new URL(path); - return url.openStream(); - } catch (IOException ioe) { - ioe.printStackTrace(); + return inputStreamOfFile(filename); + } catch (IOException e) { + return null; } - return null; + }; } - // */ + protected void setPlatform(PlatformType platform) { this.platform = platform; } + protected void runTest(String testName) { try { // override print() @@ -179,8 +106,8 @@ abstract public class ScriptDrivenTest extends TestCase implements ResourceFinde } } - protected LuaValue loadScript(String name, Globals globals) throws IOException { - InputStream script = this.findResource(name + ".lua"); + private LuaValue loadScript(String name, Globals globals) throws IOException { + InputStream script = inputStreamOfLua(name); if (script == null) fail("Could not load script for test case: " + name); try { @@ -205,7 +132,7 @@ abstract public class ScriptDrivenTest extends TestCase implements ResourceFinde } private String getExpectedOutput(final String name) throws IOException, InterruptedException { - InputStream output = this.findResource(name + ".out"); + InputStream output = inputStreamOfResult(name); if (output != null) try { return readString(output); @@ -219,7 +146,7 @@ abstract public class ScriptDrivenTest extends TestCase implements ResourceFinde } private String executeLuaProcess(String name) throws IOException, InterruptedException { - InputStream script = findResource(name + ".lua"); + InputStream script = inputStreamOfLua(name); if (script == null) throw new IOException("Failed to find source file " + script); try { @@ -233,7 +160,7 @@ abstract public class ScriptDrivenTest extends TestCase implements ResourceFinde } } - public static String collectProcessOutput(String[] cmd, final InputStream input) + private static String collectProcessOutput(String[] cmd, final InputStream input) throws IOException, InterruptedException { Runtime r = Runtime.getRuntime(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -241,7 +168,7 @@ abstract public class ScriptDrivenTest extends TestCase implements ResourceFinde return new String(baos.toByteArray()); } - private String readString(InputStream is) throws IOException { + private static String readString(InputStream is) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); copy(is, baos); return new String(baos.toByteArray()); diff --git a/luaj-test/src/test/java/org/luaj/RegressionsTest.java b/luaj-test/src/test/java/org/luaj/RegressionsTest.java new file mode 100644 index 00000000..10b4c983 --- /dev/null +++ b/luaj-test/src/test/java/org/luaj/RegressionsTest.java @@ -0,0 +1,47 @@ +package org.luaj; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Framework to add regression tests as problem areas are found. + * + * To add a new regression test: 1) run "unpack.sh" in the project root 2) add a + * new "lua" file in the "regressions" subdirectory 3) run "repack.sh" in the + * project root 4) add a line to the source file naming the new test + * + * After adding a test, check in the zip file rather than the individual + * regression test files. + * + * @author jrosebor + */ +class RegressionsTest extends CompilingTestCase { + + @BeforeEach + @Override + protected void setUp() { + setBaseDir("regressions"); + super.setUp(); + } + + @Test + void testModulo() { doTest("modulo"); } + + @Test + void testConstruct() { doTest("construct"); } + + @Test + void testBigAttrs() { doTest("bigattr"); } + + @Test + void testControlChars() { doTest("controlchars"); } + + @Test + void testComparators() { doTest("comparators"); } + + @Test + void testMathRandomseed() { doTest("mathrandomseed"); } + + @Test + void testVarargs() { doTest("varargs"); } +} diff --git a/luaj-test/src/test/java/org/luaj/ResourcesTestCase.java b/luaj-test/src/test/java/org/luaj/ResourcesTestCase.java new file mode 100644 index 00000000..8a980a44 --- /dev/null +++ b/luaj-test/src/test/java/org/luaj/ResourcesTestCase.java @@ -0,0 +1,38 @@ +package org.luaj; + +import java.io.IOException; +import java.io.InputStream; + +import org.junit.jupiter.api.BeforeEach; +import org.luaj.vm2.Globals; +import org.luaj.vm2.lib.jse.JsePlatform; + +abstract class ResourcesTestCase { + + private String baseDir; + + protected Globals globals; + + @BeforeEach + protected void setUp() { + globals = JsePlatform.standardGlobals(); + } + + protected void setBaseDir(String baseDir) { this.baseDir = baseDir; } + + protected InputStream inputStreamOfFile(String file) throws IOException { + return getClass().getClassLoader().getResourceAsStream(baseDir + "/" + file); + } + + protected InputStream inputStreamOfLua(String name) throws IOException { + return inputStreamOfFile(name + ".lua"); + } + + protected InputStream inputStreamOfResult(String name) throws IOException { + return inputStreamOfFile(name + ".out"); + } + + protected InputStream inputStreamOfBytecode(String name) throws IOException { + return inputStreamOfFile(name + ".lc"); + } +} diff --git a/luaj-test/src/test/java/org/luaj/vm2/MathLibTest.java b/luaj-test/src/test/java/org/luaj/math/MathLibComparisonTest.java similarity index 86% rename from luaj-test/src/test/java/org/luaj/vm2/MathLibTest.java rename to luaj-test/src/test/java/org/luaj/math/MathLibComparisonTest.java index c19daaad..14a5a2b4 100644 --- a/luaj-test/src/test/java/org/luaj/vm2/MathLibTest.java +++ b/luaj-test/src/test/java/org/luaj/math/MathLibComparisonTest.java @@ -1,26 +1,30 @@ -package org.luaj.vm2; +package org.luaj.math; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.jme.JmePlatform; import org.luaj.vm2.lib.jse.JsePlatform; -public class MathLibTest extends TestCase { +class MathLibComparisonTest { private LuaValue j2se; private LuaValue j2me; private boolean supportedOnJ2me; - public MathLibTest() { + @BeforeEach + protected void setUp() { j2se = JsePlatform.standardGlobals().get("math"); j2me = JmePlatform.standardGlobals().get("math"); - } - - protected void setUp() throws Exception { supportedOnJ2me = true; } - public void testMathDPow() { + @Test + void testMathDPow() { assertEquals(1, j2mepow(2, 0), 0); assertEquals(2, j2mepow(2, 1), 0); assertEquals(8, j2mepow(2, 3), 0); @@ -47,26 +51,30 @@ public class MathLibTest extends TestCase { return j2me.get("pow").call(LuaValue.valueOf(x), LuaValue.valueOf(y)).todouble(); } - public void testAbs() { + @Test + void testAbs() { tryMathOp("abs", 23.45); tryMathOp("abs", -23.45); } - public void testCos() { + @Test + void testCos() { tryTrigOps("cos"); } - public void testCosh() { + @Test + void testCosh() { supportedOnJ2me = false; tryTrigOps("cosh"); } - public void testDeg() { + @Test + void testDeg() { tryTrigOps("deg"); } - public void testExp() { - //supportedOnJ2me = false; + @Test + void testExp() { tryMathOp("exp", 0); tryMathOp("exp", 0.1); tryMathOp("exp", .9); @@ -78,7 +86,8 @@ public class MathLibTest extends TestCase { tryMathOp("exp", -9); } - public void testLog() { + @Test + void testLog() { supportedOnJ2me = false; tryMathOp("log", 0.1); tryMathOp("log", .9); @@ -90,7 +99,8 @@ public class MathLibTest extends TestCase { tryMathOp("log", -9); } - public void testRad() { + @Test + void testRad() { tryMathOp("rad", 0); tryMathOp("rad", 0.1); tryMathOp("rad", .9); @@ -106,16 +116,19 @@ public class MathLibTest extends TestCase { tryMathOp("rad", -100); } - public void testSin() { + @Test + void testSin() { tryTrigOps("sin"); } - public void testSinh() { + @Test + void testSinh() { supportedOnJ2me = false; tryTrigOps("sinh"); } - public void testSqrt() { + @Test + void testSqrt() { tryMathOp("sqrt", 0); tryMathOp("sqrt", 0.1); tryMathOp("sqrt", .9); @@ -125,25 +138,30 @@ public class MathLibTest extends TestCase { tryMathOp("sqrt", 100); } - public void testTan() { + @Test + void testTan() { tryTrigOps("tan"); } - public void testTanh() { + @Test + void testTanh() { supportedOnJ2me = false; tryTrigOps("tanh"); } - public void testAtan2() { + @Test + void testAtan2() { supportedOnJ2me = false; tryDoubleOps("atan2", false); } - public void testFmod() { + @Test + void testFmod() { tryDoubleOps("fmod", false); } - public void testPow() { + @Test + void testPow() { tryDoubleOps("pow", true); } diff --git a/luaj-test/src/test/java/org/luaj/vm2/AllTests.java b/luaj-test/src/test/java/org/luaj/vm2/AllTests.java deleted file mode 100644 index 99a7bff7..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/AllTests.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Luaj.org. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - ******************************************************************************/ -package org.luaj.vm2; - -import junit.framework.Test; -import junit.framework.TestSuite; - -import org.luaj.vm2.WeakTableTest.WeakKeyTableTest; -import org.luaj.vm2.WeakTableTest.WeakKeyValueTableTest; -import org.luaj.vm2.WeakTableTest.WeakValueTableTest; -import org.luaj.vm2.compiler.CompilerUnitTests; -import org.luaj.vm2.compiler.DumpLoadEndianIntTest; -import org.luaj.vm2.compiler.LuaParserTests; -import org.luaj.vm2.compiler.RegressionTests; -import org.luaj.vm2.compiler.SimpleTests; -import org.luaj.vm2.lib.jse.JsePlatformTest; -import org.luaj.vm2.lib.jse.LuaJavaCoercionTest; -import org.luaj.vm2.lib.jse.LuajavaAccessibleMembersTest; -import org.luaj.vm2.lib.jse.LuajavaClassMembersTest; -import org.luaj.vm2.lib.jse.OsLibTest; -import org.luaj.vm2.script.ScriptEngineTests; - -public class AllTests { - - public static Test suite() { - TestSuite suite = new TestSuite("All Tests for Luaj-vm2"); - - // vm tests - TestSuite vm = new TestSuite("VM Tests"); - vm.addTestSuite(TypeTest.class); - vm.addTestSuite(UnaryBinaryOperatorsTest.class); - vm.addTestSuite(MetatableTest.class); - vm.addTestSuite(LuaOperationsTest.class); - vm.addTestSuite(StringTest.class); - vm.addTestSuite(OrphanedThreadTest.class); - vm.addTestSuite(VarargsTest.class); - vm.addTestSuite(LoadOrderTest.class); - suite.addTest(vm); - - // table tests - TestSuite table = new TestSuite("Table Tests"); - table.addTestSuite(TableTest.class); - table.addTestSuite(TableHashTest.class); - table.addTestSuite(WeakValueTableTest.class); - table.addTestSuite(WeakKeyTableTest.class); - table.addTestSuite(WeakKeyValueTableTest.class); - suite.addTest(table); - - // bytecode compilers regression tests - TestSuite bytecodetests = FragmentsTest.suite(); - suite.addTest(bytecodetests); - - // I/O tests - TestSuite io = new TestSuite("I/O Tests"); - io.addTestSuite(BufferedStreamTest.class); - io.addTestSuite(UTF8StreamTest.class); - suite.addTest(io); - - // prototype compiler - TestSuite compiler = new TestSuite("Lua Compiler Tests"); - compiler.addTestSuite(CompilerUnitTests.class); - compiler.addTestSuite(DumpLoadEndianIntTest.class); - compiler.addTestSuite(LuaParserTests.class); - compiler.addTestSuite(RegressionTests.class); - compiler.addTestSuite(SimpleTests.class); - suite.addTest(compiler); - - // library tests - TestSuite lib = new TestSuite("Library Tests"); - lib.addTestSuite(JsePlatformTest.class); - lib.addTestSuite(LuajavaAccessibleMembersTest.class); - lib.addTestSuite(LuajavaClassMembersTest.class); - lib.addTestSuite(LuaJavaCoercionTest.class); - lib.addTestSuite(RequireClassTest.class); - lib.addTestSuite(OsLibTest.class); - suite.addTest(lib); - - // Script engine tests. - TestSuite script = ScriptEngineTests.suite(); - suite.addTest(script); - - // compatiblity tests - TestSuite compat = CompatibiltyTest.suite(); - suite.addTest(compat); - compat.addTestSuite(ErrorsTest.class); - - return suite; - } - -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/WeakTableTest.java b/luaj-test/src/test/java/org/luaj/vm2/WeakTableTest.java deleted file mode 100644 index ab8ae5b2..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/WeakTableTest.java +++ /dev/null @@ -1,265 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009 Luaj.org. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - ******************************************************************************/ -package org.luaj.vm2; - -import java.lang.ref.WeakReference; - -abstract public class WeakTableTest extends TableTest { - - public static class MyData { - public final int value; - - public MyData(int value) { - this.value = value; - } - - public int hashCode() { - return value; - } - - public boolean equals(Object o) { - return (o instanceof MyData) && ((MyData) o).value == value; - } - - public String toString() { - return "mydata-" + value; - } - } - - static void collectGarbage() { - Runtime rt = Runtime.getRuntime(); - rt.gc(); - try { - Thread.sleep(20); - rt.gc(); - Thread.sleep(20); - } catch (Exception e) { - e.printStackTrace(); - } - rt.gc(); - } - - public static class WeakValueTableTest extends WeakTableTest { - protected LuaTable new_Table() { return WeakTable.make(false, true); } - - protected LuaTable new_Table(int n, int m) { return WeakTable.make(false, true); } - - public void testWeakValuesTable() { - LuaTable t = new_Table(); - - Object obj = new Object(); - LuaTable tableValue = new LuaTable(); - LuaString stringValue = LuaString.valueOf("this is a test"); - LuaTable tableValue2 = new LuaTable(); - - t.set("table", tableValue); - t.set("userdata", LuaValue.userdataOf(obj, null)); - t.set("string", stringValue); - t.set("string2", LuaValue.valueOf("another string")); - t.set(1, tableValue2); - assertTrue("table must have at least 4 elements", t.getHashLength() >= 4); - assertTrue("array part must have 1 element", t.getArrayLength() >= 1); - - // check that table can be used to get elements - assertEquals(tableValue, t.get("table")); - assertEquals(stringValue, t.get("string")); - assertEquals(obj, t.get("userdata").checkuserdata()); - assertEquals(tableValue2, t.get(1)); - - // nothing should be collected, since we have strong references here - collectGarbage(); - - // check that elements are still there - assertEquals(tableValue, t.get("table")); - assertEquals(stringValue, t.get("string")); - assertEquals(obj, t.get("userdata").checkuserdata()); - assertEquals(tableValue2, t.get(1)); - - // drop our strong references - obj = null; - tableValue = null; - tableValue2 = null; - stringValue = null; - - // Garbage collection should cause weak entries to be dropped. - collectGarbage(); - - // check that they are dropped - assertEquals(LuaValue.NIL, t.get("table")); - assertEquals(LuaValue.NIL, t.get("userdata")); - assertEquals(LuaValue.NIL, t.get(1)); - assertFalse("strings should not be in weak references", t.get("string").isnil()); - } - } - - public static class WeakKeyTableTest extends WeakTableTest { - protected LuaTable new_Table() { return WeakTable.make(true, false); } - - protected LuaTable new_Table(int n, int m) { return WeakTable.make(true, false); } - - public void testWeakKeysTable() { - LuaTable t = WeakTable.make(true, false); - - LuaValue key = LuaValue.userdataOf(new MyData(111)); - LuaValue val = LuaValue.userdataOf(new MyData(222)); - - // set up the table - t.set(key, val); - assertEquals(val, t.get(key)); - System.gc(); - assertEquals(val, t.get(key)); - - // drop key and value references, replace them with new ones - WeakReference origkey = new WeakReference(key); - WeakReference origval = new WeakReference(val); - key = LuaValue.userdataOf(new MyData(111)); - val = LuaValue.userdataOf(new MyData(222)); - - // new key and value should be interchangeable (feature of this test class) - assertEquals(key, origkey.get()); - assertEquals(val, origval.get()); - assertEquals(val, t.get(key)); - assertEquals(val, t.get((LuaValue) origkey.get())); - assertEquals(origval.get(), t.get(key)); - - // value should not be reachable after gc - collectGarbage(); - assertEquals(null, origkey.get()); - assertEquals(LuaValue.NIL, t.get(key)); - collectGarbage(); - assertEquals(null, origval.get()); - } - - public void testNext() { - LuaTable t = WeakTable.make(true, true); - - LuaValue key = LuaValue.userdataOf(new MyData(111)); - LuaValue val = LuaValue.userdataOf(new MyData(222)); - LuaValue key2 = LuaValue.userdataOf(new MyData(333)); - LuaValue val2 = LuaValue.userdataOf(new MyData(444)); - LuaValue key3 = LuaValue.userdataOf(new MyData(555)); - LuaValue val3 = LuaValue.userdataOf(new MyData(666)); - - // set up the table - t.set(key, val); - t.set(key2, val2); - t.set(key3, val3); - - // forget one of the keys - key2 = null; - val2 = null; - collectGarbage(); - - // table should have 2 entries - int size = 0; - for (LuaValue k = t.next(LuaValue.NIL).arg1(); !k.isnil(); k = t.next(k).arg1()) { - size++; - } - assertEquals(2, size); - } - } - - public static class WeakKeyValueTableTest extends WeakTableTest { - protected LuaTable new_Table() { return WeakTable.make(true, true); } - - protected LuaTable new_Table(int n, int m) { return WeakTable.make(true, true); } - - public void testWeakKeysValuesTable() { - LuaTable t = WeakTable.make(true, true); - - LuaValue key = LuaValue.userdataOf(new MyData(111)); - LuaValue val = LuaValue.userdataOf(new MyData(222)); - LuaValue key2 = LuaValue.userdataOf(new MyData(333)); - LuaValue val2 = LuaValue.userdataOf(new MyData(444)); - LuaValue key3 = LuaValue.userdataOf(new MyData(555)); - LuaValue val3 = LuaValue.userdataOf(new MyData(666)); - - // set up the table - t.set(key, val); - t.set(key2, val2); - t.set(key3, val3); - assertEquals(val, t.get(key)); - assertEquals(val2, t.get(key2)); - assertEquals(val3, t.get(key3)); - System.gc(); - assertEquals(val, t.get(key)); - assertEquals(val2, t.get(key2)); - assertEquals(val3, t.get(key3)); - - // drop key and value references, replace them with new ones - WeakReference origkey = new WeakReference(key); - WeakReference origval = new WeakReference(val); - WeakReference origkey2 = new WeakReference(key2); - WeakReference origval2 = new WeakReference(val2); - WeakReference origkey3 = new WeakReference(key3); - WeakReference origval3 = new WeakReference(val3); - key = LuaValue.userdataOf(new MyData(111)); - val = LuaValue.userdataOf(new MyData(222)); - key2 = LuaValue.userdataOf(new MyData(333)); - // don't drop val2, or key3 - val3 = LuaValue.userdataOf(new MyData(666)); - - // no values should be reachable after gc - collectGarbage(); - assertEquals(null, origkey.get()); - assertEquals(null, origval.get()); - assertEquals(null, origkey2.get()); - assertEquals(null, origval3.get()); - assertEquals(LuaValue.NIL, t.get(key)); - assertEquals(LuaValue.NIL, t.get(key2)); - assertEquals(LuaValue.NIL, t.get(key3)); - - // all originals should be gone after gc, then access - val2 = null; - key3 = null; - collectGarbage(); - assertEquals(null, origval2.get()); - assertEquals(null, origkey3.get()); - } - - public void testReplace() { - LuaTable t = WeakTable.make(true, true); - - LuaValue key = LuaValue.userdataOf(new MyData(111)); - LuaValue val = LuaValue.userdataOf(new MyData(222)); - LuaValue key2 = LuaValue.userdataOf(new MyData(333)); - LuaValue val2 = LuaValue.userdataOf(new MyData(444)); - LuaValue key3 = LuaValue.userdataOf(new MyData(555)); - LuaValue val3 = LuaValue.userdataOf(new MyData(666)); - - // set up the table - t.set(key, val); - t.set(key2, val2); - t.set(key3, val3); - - LuaValue val4 = LuaValue.userdataOf(new MyData(777)); - t.set(key2, val4); - - // table should have 3 entries - int size = 0; - for (LuaValue k = t.next(LuaValue.NIL).arg1(); !k.isnil() && size < 1000; k = t.next(k).arg1()) { - size++; - } - assertEquals(3, size); - } - } -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/compiler/AbstractUnitTests.java b/luaj-test/src/test/java/org/luaj/vm2/compiler/AbstractUnitTests.java deleted file mode 100644 index 7c9732d3..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/compiler/AbstractUnitTests.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.luaj.vm2.compiler; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintStream; -import java.net.MalformedURLException; -import java.net.URL; - -import junit.framework.TestCase; - -import org.luaj.vm2.Globals; -import org.luaj.vm2.LoadState; -import org.luaj.vm2.Print; -import org.luaj.vm2.Prototype; -import org.luaj.vm2.lib.jse.JsePlatform; - -abstract public class AbstractUnitTests extends TestCase { - - private final String dir; - private final String jar; - private Globals globals; - - public AbstractUnitTests(String zipdir, String zipfile, String dir) { - URL zip = null; - zip = getClass().getResource(zipfile); - if (zip == null) { - File file = new File(zipdir + "/" + zipfile); - try { - if (file.exists()) - zip = file.toURI().toURL(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - if (zip == null) - throw new RuntimeException("not found: " + zipfile); - this.jar = "jar:" + zip.toExternalForm() + "!/"; - this.dir = dir; - } - - protected void setUp() throws Exception { - super.setUp(); - globals = JsePlatform.standardGlobals(); - } - - protected String pathOfFile(String file) { - return jar + dir + "/" + file; - } - - protected InputStream inputStreamOfPath(String path) throws IOException { - URL url = new URL(path); - return url.openStream(); - } - - protected InputStream inputStreamOfFile(String file) throws IOException { - return inputStreamOfPath(pathOfFile(file)); - } - - protected void doTest(String file) { - try { - // load source from jar - String path = pathOfFile(file); - byte[] lua = bytesFromJar(path); - - // compile in memory - InputStream is = new ByteArrayInputStream(lua); - Prototype p = globals.loadPrototype(is, "@" + file, "bt"); - String actual = protoToString(p); - - // load expected value from jar - byte[] luac = bytesFromJar(path.substring(0, path.length()-4) + ".lc"); - Prototype e = loadFromBytes(luac, file); - String expected = protoToString(e); - - // compare results - assertEquals(expected, actual); - - // dump into memory - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DumpState.dump(p, baos, false); - byte[] dumped = baos.toByteArray(); - - // re-undump - Prototype p2 = loadFromBytes(dumped, file); - String actual2 = protoToString(p2); - - // compare again - assertEquals(actual, actual2); - - } catch (IOException e) { - fail(e.toString()); - } - } - - protected byte[] bytesFromJar(String path) throws IOException { - InputStream is = inputStreamOfPath(path); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[2048]; - int n; - while ( (n = is.read(buffer)) >= 0 ) - baos.write(buffer, 0, n); - is.close(); - return baos.toByteArray(); - } - - protected Prototype loadFromBytes(byte[] bytes, String script) throws IOException { - InputStream is = new ByteArrayInputStream(bytes); - return globals.loadPrototype(is, script, "b"); - } - - protected String protoToString(Prototype p) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream ps = new PrintStream(baos); - Print.ps = ps; - new Print().printFunction(p, true); - return baos.toString(); - } - -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/compiler/CompilerUnitTests.java b/luaj-test/src/test/java/org/luaj/vm2/compiler/CompilerUnitTests.java deleted file mode 100644 index 933c72a3..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/compiler/CompilerUnitTests.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.luaj.vm2.compiler; - -public class CompilerUnitTests extends AbstractUnitTests { - - public CompilerUnitTests() { - super("test/lua", "luaj3.0-tests.zip", "lua5.2.1-tests"); - } - - public void testAll() { doTest("all.lua"); } - - public void testApi() { doTest("api.lua"); } - - public void testAttrib() { doTest("attrib.lua"); } - - public void testBig() { doTest("big.lua"); } - - public void testBitwise() { doTest("bitwise.lua"); } - - public void testCalls() { doTest("calls.lua"); } - - public void testChecktable() { doTest("checktable.lua"); } - - public void testClosure() { doTest("closure.lua"); } - - public void testCode() { doTest("code.lua"); } - - public void testConstruct() { doTest("constructs.lua"); } - - public void testCoroutine() { doTest("coroutine.lua"); } - - public void testDb() { doTest("db.lua"); } - - public void testErrors() { doTest("errors.lua"); } - - public void testEvents() { doTest("events.lua"); } - - public void testFiles() { doTest("files.lua"); } - - public void testGc() { doTest("gc.lua"); } - - public void testGoto() { doTest("goto.lua"); } - - public void testLiterals() { doTest("literals.lua"); } - - public void testLocals() { doTest("locals.lua"); } - - public void testMain() { doTest("main.lua"); } - - public void testMath() { doTest("math.lua"); } - - public void testNextvar() { doTest("nextvar.lua"); } - - public void testPm() { doTest("pm.lua"); } - - public void testSort() { doTest("sort.lua"); } - - public void testStrings() { doTest("strings.lua"); } - - public void testVararg() { doTest("vararg.lua"); } - - public void testVerybig() { doTest("verybig.lua"); } -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java b/luaj-test/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java deleted file mode 100644 index d40fcbc0..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.luaj.vm2.compiler; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; - -import org.luaj.vm2.LuaValue; -import org.luaj.vm2.parser.LuaParser; - -public class LuaParserTests extends CompilerUnitTests { - - protected void setUp() throws Exception { - super.setUp(); - LuaValue.valueOf(true); - } - - protected void doTest(String file) { - try { - InputStream is = inputStreamOfFile(file); - Reader r = new InputStreamReader(is, "ISO-8859-1"); - LuaParser parser = new LuaParser(r); - parser.Chunk(); - } catch (Exception e) { - fail(e.getMessage()); - e.printStackTrace(); - } - } -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/compiler/RegressionTests.java b/luaj-test/src/test/java/org/luaj/vm2/compiler/RegressionTests.java deleted file mode 100644 index 5a3ff5b3..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/compiler/RegressionTests.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.luaj.vm2.compiler; - -/** - * Framework to add regression tests as problem areas are found. - * - * To add a new regression test: 1) run "unpack.sh" in the project root 2) add a - * new "lua" file in the "regressions" subdirectory 3) run "repack.sh" in the - * project root 4) add a line to the source file naming the new test - * - * After adding a test, check in the zip file rather than the individual - * regression test files. - * - * @author jrosebor - */ -public class RegressionTests extends AbstractUnitTests { - - public RegressionTests() { - super("test/lua", "luaj3.0-tests.zip", "regressions"); - } - - public void testModulo() { doTest("modulo.lua"); } - - public void testConstruct() { doTest("construct.lua"); } - - public void testBigAttrs() { doTest("bigattr.lua"); } - - public void testControlChars() { doTest("controlchars.lua"); } - - public void testComparators() { doTest("comparators.lua"); } - - public void testMathRandomseed() { doTest("mathrandomseed.lua"); } - - public void testVarargs() { doTest("varargs.lua"); } -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/OsLibTest.java b/luaj-test/src/test/java/org/luaj/vm2/lib/jse/OsLibTest.java deleted file mode 100644 index 54b498cb..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/lib/jse/OsLibTest.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.luaj.vm2.lib.jse; - -import org.luaj.vm2.LuaValue; -import org.luaj.vm2.lib.OsLib; -import org.luaj.vm2.lib.jme.JmePlatform; - -import junit.framework.TestCase; - -public class OsLibTest extends TestCase { - - LuaValue jme_lib; - LuaValue jse_lib; - double time; - - public void setUp() { - jse_lib = JsePlatform.standardGlobals().get("os"); - ; - jme_lib = JmePlatform.standardGlobals().get("os"); - ; - time = new java.util.Date(2001-1900, 7, 23, 14, 55, 02).getTime()/1000.0; - } - - void t(String format, String expected) { - String actual = jme_lib.get("date").call(LuaValue.valueOf(format), LuaValue.valueOf(time)).tojstring(); - assertEquals(expected, actual); - } - - public void testStringDateChars() { t("foo", "foo"); } - - public void testStringDate_a() { t("%a", "Thu"); } - - public void testStringDate_A() { t("%A", "Thursday"); } - - public void testStringDate_b() { t("%b", "Aug"); } - - public void testStringDate_B() { t("%B", "August"); } - - public void testStringDate_c() { t("%c", "Thu Aug 23 14:55:02 2001"); } - - public void testStringDate_d() { t("%d", "23"); } - - public void testStringDate_H() { t("%H", "14"); } - - public void testStringDate_I() { t("%I", "02"); } - - public void testStringDate_j() { t("%j", "235"); } - - public void testStringDate_m() { t("%m", "08"); } - - public void testStringDate_M() { t("%M", "55"); } - - public void testStringDate_p() { t("%p", "PM"); } - - public void testStringDate_S() { t("%S", "02"); } - - public void testStringDate_U() { t("%U", "33"); } - - public void testStringDate_w() { t("%w", "4"); } - - public void testStringDate_W() { t("%W", "34"); } - - public void testStringDate_x() { t("%x", "08/23/01"); } - - public void testStringDate_X() { t("%X", "14:55:02"); } - - public void testStringDate_y() { t("%y", "01"); } - - public void testStringDate_Y() { t("%Y", "2001"); } - - public void testStringDate_Pct() { t("%%", "%"); } - - static final double DAY = 24.*3600.; - - public void testStringDate_UW_neg4() { time -= 4*DAY; t("%c %U %W", "Sun Aug 19 14:55:02 2001 33 33"); } - - public void testStringDate_UW_neg3() { time -= 3*DAY; t("%c %U %W", "Mon Aug 20 14:55:02 2001 33 34"); } - - public void testStringDate_UW_neg2() { time -= 2*DAY; t("%c %U %W", "Tue Aug 21 14:55:02 2001 33 34"); } - - public void testStringDate_UW_neg1() { time -= DAY; t("%c %U %W", "Wed Aug 22 14:55:02 2001 33 34"); } - - public void testStringDate_UW_pos0() { time += 0; t("%c %U %W", "Thu Aug 23 14:55:02 2001 33 34"); } - - public void testStringDate_UW_pos1() { time += DAY; t("%c %U %W", "Fri Aug 24 14:55:02 2001 33 34"); } - - public void testStringDate_UW_pos2() { time += 2*DAY; t("%c %U %W", "Sat Aug 25 14:55:02 2001 33 34"); } - - public void testStringDate_UW_pos3() { time += 3*DAY; t("%c %U %W", "Sun Aug 26 14:55:02 2001 34 34"); } - - public void testStringDate_UW_pos4() { time += 4*DAY; t("%c %U %W", "Mon Aug 27 14:55:02 2001 34 35"); } - - public void testJseOsGetenvForEnvVariables() { - LuaValue USER = LuaValue.valueOf("USER"); - LuaValue jse_user = jse_lib.get("getenv").call(USER); - LuaValue jme_user = jme_lib.get("getenv").call(USER); - assertFalse(jse_user.isnil()); - assertTrue(jme_user.isnil()); - System.out.println("User: " + jse_user); - } - - public void testJseOsGetenvForSystemProperties() { - System.setProperty("test.key.foo", "test.value.bar"); - LuaValue key = LuaValue.valueOf("test.key.foo"); - LuaValue value = LuaValue.valueOf("test.value.bar"); - LuaValue jse_value = jse_lib.get("getenv").call(key); - LuaValue jme_value = jme_lib.get("getenv").call(key); - assertEquals(value, jse_value); - assertEquals(value, jme_value); - } -} diff --git a/luaj-test/src/test/java/org/luaj/vm2/script/ScriptEngineTests.java b/luaj-test/src/test/java/org/luaj/vm2/script/ScriptEngineTests.java deleted file mode 100644 index 8af34378..00000000 --- a/luaj-test/src/test/java/org/luaj/vm2/script/ScriptEngineTests.java +++ /dev/null @@ -1,334 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 Luaj.org. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - ******************************************************************************/ -package org.luaj.vm2.script; - -import java.io.CharArrayReader; -import java.io.CharArrayWriter; -import java.io.Reader; - -import javax.script.Bindings; -import javax.script.Compilable; -import javax.script.CompiledScript; -import javax.script.ScriptContext; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineFactory; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import javax.script.SimpleBindings; - -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import org.luaj.vm2.LuaFunction; -import org.luaj.vm2.LuaValue; -import org.luaj.vm2.lib.OneArgFunction; - -public class ScriptEngineTests extends TestSuite { - - public static TestSuite suite() { - TestSuite suite = new TestSuite("Script Engine Tests"); - suite.addTest(new TestSuite(LookupEngineTestCase.class, "Lookup Engine")); - suite.addTest(new TestSuite(DefaultBindingsTest.class, "Default Bindings")); - suite.addTest(new TestSuite(SimpleBindingsTest.class, "Simple Bindings")); - suite.addTest(new TestSuite(CompileClosureTest.class, "Compile Closure")); - suite.addTest(new TestSuite(CompileNonClosureTest.class, "Compile NonClosure")); - suite.addTest(new TestSuite(UserContextTest.class, "User Context")); - suite.addTest(new TestSuite(WriterTest.class, "Writer")); - return suite; - } - - public static class LookupEngineTestCase extends TestCase { - public void testGetEngineByExtension() { - ScriptEngine e = new ScriptEngineManager().getEngineByExtension(".lua"); - assertNotNull(e); - assertEquals(LuaScriptEngine.class, e.getClass()); - } - - public void testGetEngineByName() { - ScriptEngine e = new ScriptEngineManager().getEngineByName("luaj"); - assertNotNull(e); - assertEquals(LuaScriptEngine.class, e.getClass()); - } - - public void testGetEngineByMimeType() { - ScriptEngine e = new ScriptEngineManager().getEngineByMimeType("text/lua"); - assertNotNull(e); - assertEquals(LuaScriptEngine.class, e.getClass()); - } - - public void testFactoryMetadata() { - ScriptEngine e = new ScriptEngineManager().getEngineByName("luaj"); - ScriptEngineFactory f = e.getFactory(); - assertEquals("Luaj", f.getEngineName()); - assertEquals("Luaj 0.0", f.getEngineVersion()); - assertEquals("lua", f.getLanguageName()); - assertEquals("5.2", f.getLanguageVersion()); - } - } - - public static class DefaultBindingsTest extends EngineTestCase { - protected Bindings createBindings() { - return e.createBindings(); - } - } - - public static class SimpleBindingsTest extends EngineTestCase { - protected Bindings createBindings() { - return new SimpleBindings(); - } - } - - public static class CompileClosureTest extends DefaultBindingsTest { - protected void setUp() throws Exception { - System.setProperty("org.luaj.luajc", "false"); - super.setUp(); - } - - public void testCompiledFunctionIsClosure() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("return 'foo'"); - LuaValue value = ((LuaScriptEngine.LuajCompiledScript) cs).function; - assertTrue(value.isclosure()); - } - } - - public static class CompileNonClosureTest extends DefaultBindingsTest { - protected void setUp() throws Exception { - System.setProperty("org.luaj.luajc", "true"); - super.setUp(); - } - - public void testCompiledFunctionIsNotClosure() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("return 'foo'"); - LuaValue value = ((LuaScriptEngine.LuajCompiledScript) cs).function; - assertFalse(value.isclosure()); - } - } - - abstract public static class EngineTestCase extends TestCase { - protected ScriptEngine e; - protected Bindings b; - - abstract protected Bindings createBindings(); - - protected void setUp() throws Exception { - this.e = new ScriptEngineManager().getEngineByName("luaj"); - this.b = createBindings(); - } - - public void testSqrtIntResult() throws ScriptException { - e.put("x", 25); - e.eval("y = math.sqrt(x)"); - Object y = e.get("y"); - assertEquals(5, y); - } - - public void testOneArgFunction() throws ScriptException { - e.put("x", 25); - e.eval("y = math.sqrt(x)"); - Object y = e.get("y"); - assertEquals(5, y); - e.put("f", new OneArgFunction() { - public LuaValue call(LuaValue arg) { - return LuaValue.valueOf(arg.toString() + "123"); - } - }); - Object r = e.eval("return f('abc')"); - assertEquals("abc123", r); - } - - public void testCompiledScript() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("y = math.sqrt(x); return y"); - b.put("x", 144); - assertEquals(12, cs.eval(b)); - } - - public void testBuggyLuaScript() { - try { - e.eval("\n\nbuggy lua code\n\n"); - } catch (ScriptException se) { - assertEquals("eval threw javax.script.ScriptException: [string \"script\"]:3: syntax error", - se.getMessage()); - return; - } - fail("buggy script did not throw ScriptException as expected."); - } - - public void testScriptRedirection() throws ScriptException { - Reader input = new CharArrayReader("abcdefg\nhijk".toCharArray()); - CharArrayWriter output = new CharArrayWriter(); - CharArrayWriter errors = new CharArrayWriter(); - String script = "print(\"string written using 'print'\")\n" - + "io.write(\"string written using 'io.write()'\\n\")\n" - + "io.stdout:write(\"string written using 'io.stdout:write()'\\n\")\n" - + "io.stderr:write(\"string written using 'io.stderr:write()'\\n\")\n" - + "io.write([[string read using 'io.stdin:read(\"*l\")':]]..io.stdin:read(\"*l\")..\"\\n\")\n"; - - // Evaluate script with redirection set - e.getContext().setReader(input); - e.getContext().setWriter(output); - e.getContext().setErrorWriter(errors); - e.eval(script); - final String expectedOutput = "string written using 'print'\n" + "string written using 'io.write()'\n" - + "string written using 'io.stdout:write()'\n" + "string read using 'io.stdin:read(\"*l\")':abcdefg\n"; - assertEquals(expectedOutput, output.toString()); - final String expectedErrors = "string written using 'io.stderr:write()'\n"; - assertEquals(expectedErrors, errors.toString()); - - // Evaluate script with redirection reset - output.reset(); - errors.reset(); - // e.getContext().setReader(null); // This will block if using actual STDIN - e.getContext().setWriter(null); - e.getContext().setErrorWriter(null); - e.eval(script); - assertEquals("", output.toString()); - assertEquals("", errors.toString()); - } - - public void testBindingJavaInt() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); - b.put("x", 111); - assertEquals("x number 111", cs.eval(b)); - assertEquals(111, b.get("y")); - } - - public void testBindingJavaDouble() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); - b.put("x", 125.125); - assertEquals("x number 125.125", cs.eval(b)); - assertEquals(125.125, b.get("y")); - } - - public void testBindingJavaString() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); - b.put("x", "foo"); - assertEquals("x string foo", cs.eval(b)); - assertEquals("foo", b.get("y")); - } - - public void testBindingJavaObject() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("y = x; return 'x '..type(x)..' '..tostring(x)\n"); - b.put("x", new SomeUserClass()); - assertEquals("x userdata some-user-value", cs.eval(b)); - assertEquals(SomeUserClass.class, b.get("y").getClass()); - } - - public void testBindingJavaArray() throws ScriptException { - CompiledScript cs = ((Compilable) e) - .compile("y = x; return 'x '..type(x)..' '..#x..' '..x[1]..' '..x[2]\n"); - b.put("x", new int[] { 777, 888 }); - assertEquals("x userdata 2 777 888", cs.eval(b)); - assertEquals(int[].class, b.get("y").getClass()); - } - - public void testBindingLuaFunction() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("y = function(x) return 678 + x end; return 'foo'"); - assertEquals("foo", cs.eval(b).toString()); - assertTrue(b.get("y") instanceof LuaFunction); - assertEquals(LuaValue.valueOf(801), ((LuaFunction) b.get("y")).call(LuaValue.valueOf(123))); - } - - public void testUserClasses() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("x = x or luajava.newInstance('java.lang.String', 'test')\n" - + "return 'x ' .. type(x) .. ' ' .. tostring(x)\n"); - assertEquals("x string test", cs.eval(b)); - b.put("x", new SomeUserClass()); - assertEquals("x userdata some-user-value", cs.eval(b)); - } - - public void testReturnMultipleValues() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("return 'foo', 'bar'\n"); - Object o = cs.eval(); - assertEquals(Object[].class, o.getClass()); - Object[] array = (Object[]) o; - assertEquals(2, array.length); - assertEquals("foo", array[0]); - assertEquals("bar", array[1]); - } - } - - public static class SomeUserClass { - public String toString() { - return "some-user-value"; - } - } - - public static class UserContextTest extends TestCase { - protected ScriptEngine e; - protected Bindings b; - protected ScriptContext c; - - public void setUp() { - this.e = new ScriptEngineManager().getEngineByName("luaj"); - this.c = new LuajContext(); - this.b = c.getBindings(ScriptContext.ENGINE_SCOPE); - } - - public void testUncompiledScript() throws ScriptException { - b.put("x", 144); - assertEquals(12, e.eval("z = math.sqrt(x); return z", b)); - assertEquals(12, b.get("z")); - assertEquals(null, e.getBindings(ScriptContext.ENGINE_SCOPE).get("z")); - assertEquals(null, e.getBindings(ScriptContext.GLOBAL_SCOPE).get("z")); - - b.put("x", 25); - assertEquals(5, e.eval("z = math.sqrt(x); return z", c)); - assertEquals(5, b.get("z")); - assertEquals(null, e.getBindings(ScriptContext.ENGINE_SCOPE).get("z")); - assertEquals(null, e.getBindings(ScriptContext.GLOBAL_SCOPE).get("z")); - } - - public void testCompiledScript() throws ScriptException { - CompiledScript cs = ((Compilable) e).compile("z = math.sqrt(x); return z"); - - b.put("x", 144); - assertEquals(12, cs.eval(b)); - assertEquals(12, b.get("z")); - - b.put("x", 25); - assertEquals(5, cs.eval(c)); - assertEquals(5, b.get("z")); - } - } - - public static class WriterTest extends TestCase { - protected ScriptEngine e; - protected Bindings b; - - public void setUp() { - this.e = new ScriptEngineManager().getEngineByName("luaj"); - this.b = e.getBindings(ScriptContext.ENGINE_SCOPE); - } - - public void testWriter() throws ScriptException { - CharArrayWriter output = new CharArrayWriter(); - CharArrayWriter errors = new CharArrayWriter(); - e.getContext().setWriter(output); - e.getContext().setErrorWriter(errors); - e.eval("io.write( [[line]] )"); - assertEquals("line", output.toString()); - e.eval("io.write( [[ one\nline two\n]] )"); - assertEquals("line one\nline two\n", output.toString()); - output.reset(); - } - } -} diff --git a/pom.xml b/pom.xml index 762f0d87..61aa0399 100644 --- a/pom.xml +++ b/pom.xml @@ -69,9 +69,9 @@ provided - junit - junit - 3.8.1 + org.junit.jupiter + junit-jupiter + 5.7.2 test @@ -90,6 +90,11 @@ build-helper-maven-plugin 3.2.0 + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 +