From 6296068a496449d98f1cb0de71db8305e0043084 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Fri, 14 May 2010 14:32:02 +0000 Subject: [PATCH] Remove project dependency on luaj vm1 --- build.xml | 2 +- test/junit/org/luaj/vm2/CompatibiltyTest.java | 1 - test/junit/org/luaj/vm2/ScriptDrivenTest.java | 4 +- .../vm2/vm1/Luajvm1CompatibilityTest.java | 41 +++++++++++++----- test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip | Bin 31382 -> 31602 bytes 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/build.xml b/build.xml index aab85d87..fbc10afb 100644 --- a/build.xml +++ b/build.xml @@ -42,7 +42,7 @@ - + diff --git a/test/junit/org/luaj/vm2/CompatibiltyTest.java b/test/junit/org/luaj/vm2/CompatibiltyTest.java index 7d4c1194..0910e157 100644 --- a/test/junit/org/luaj/vm2/CompatibiltyTest.java +++ b/test/junit/org/luaj/vm2/CompatibiltyTest.java @@ -24,7 +24,6 @@ package org.luaj.vm2; import junit.framework.Test; import junit.framework.TestSuite; -import org.luaj.vm2.compiler.LuaC; import org.luaj.vm2.luajc.LuaJC; /** diff --git a/test/junit/org/luaj/vm2/ScriptDrivenTest.java b/test/junit/org/luaj/vm2/ScriptDrivenTest.java index f6816274..432024a4 100644 --- a/test/junit/org/luaj/vm2/ScriptDrivenTest.java +++ b/test/junit/org/luaj/vm2/ScriptDrivenTest.java @@ -162,7 +162,7 @@ public class ScriptDrivenTest extends TestCase { } } - private String collectProcessOutput(String[] cmd, final InputStream input) + public static String collectProcessOutput(String[] cmd, final InputStream input) throws IOException, InterruptedException { Runtime r = Runtime.getRuntime(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -237,7 +237,7 @@ public class ScriptDrivenTest extends TestCase { return new String(baos.toByteArray()); } - private void copy(InputStream is, OutputStream os) throws IOException { + private static void copy(InputStream is, OutputStream os) throws IOException { byte[] buf = new byte[1024]; int r; while ((r = is.read(buf)) >= 0) { diff --git a/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java b/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java index f1d446de..0075d6b5 100644 --- a/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java +++ b/test/junit/org/luaj/vm2/vm1/Luajvm1CompatibilityTest.java @@ -33,24 +33,28 @@ import junit.framework.TestCase; import org.luaj.vm2.LuaThread; import org.luaj.vm2.LuaValue; +import org.luaj.vm2.ScriptDrivenTest; /** - * Test for compatiblity between luaj 1.0 and 2.0 vms + * Test for compatiblity between luaj 1.0 and 2.0. * + * Runs an archive of the tests that were used in + * the luaj-vm 1.0 development, modified to account + * for changes to interpetation of the lua vm spec. */ public class Luajvm1CompatibilityTest extends TestCase { private static final String zipfile = "luajvm1-tests.zip"; private static String jarpath; - private void runTest(String test) { + protected void runTest(String test) { try { URL zip = getClass().getResource(zipfile); jarpath = "jar:"+zip.toExternalForm()+"!/"; - String luaj10 = luaj10Run(test); + String lua = luaRun(test); String luaj20 = luaj20Run(test); - assertEquals( luaj10, luaj20 ); - } catch ( IOException ioe ) { + assertEquals( lua, luaj20 ); + } catch ( Exception ioe ) { fail( ioe.toString() ); } } @@ -65,8 +69,24 @@ public class Luajvm1CompatibilityTest extends TestCase { return null; } } - - private String luaj10Run(String test) throws IOException { + + private String luaRun(String test) throws Exception { + InputStream script =open(test+".lua"); + if ( script == null ) + fail("Could not load script for test case: " + test); + try { + String luaCommand = System.getProperty("LUA_COMMAND"); + if ( luaCommand == null ) + luaCommand = "lua"; + String[] args = new String[] { luaCommand, "-", "jse" }; + return ScriptDrivenTest.collectProcessOutput(args, script); + } finally { + script.close(); + } + } + + /* + private String luaj10Run(String test) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { org.luaj.vm.Platform.setInstance(new org.luaj.platform.J2sePlatform() { @@ -87,7 +107,8 @@ public class Luajvm1CompatibilityTest extends TestCase { outputStream.close(); } } - + */ + private String luaj20Run(String test) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream( outputStream ); @@ -102,7 +123,7 @@ public class Luajvm1CompatibilityTest extends TestCase { if ( is == null ) return LuaValue.valueOf("not found: "+file); try { - return org.luaj.vm2.LoadState.load(is, file, env); + return org.luaj.vm2.LoadState.load(is, "@stdin", env); } catch (IOException e) { return LuaValue.valueOf(e.toString()); } finally { @@ -116,7 +137,6 @@ public class Luajvm1CompatibilityTest extends TestCase { return outputStream.toString(); } finally { printStream.close(); -// script.close(); } } @@ -129,7 +149,6 @@ public class Luajvm1CompatibilityTest extends TestCase { public void testTest4() { runTest("test4"); } public void testTest5() { runTest("test5"); } public void testTest6() { runTest("test6"); } - public void testTest7() { runTest("test7"); } public void testTest8() { runTest("test8"); } public void testTest9() { runTest("test9"); } public void testAutoload() { runTest("autoload"); } diff --git a/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip b/test/junit/org/luaj/vm2/vm1/luajvm1-tests.zip index 19e4fca5741cb9987a7568f92f483be576638ebe..9dd526ff0de11fd9cdc0d11ebd68c06aecd2a49d 100644 GIT binary patch delta 7625 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 delta 7380 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 T$q0o2LV$pKih=3+7yrKiHjJHk