From ef94aa3abba229cd2d2d1803e4c454cb91519d46 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Tue, 18 Sep 2012 03:55:51 +0000 Subject: [PATCH] Add unit tests for varargs --- src/core/org/luaj/vm2/LuaClosure.java | 4 +- src/core/org/luaj/vm2/LuaValue.java | 2 +- src/core/org/luaj/vm2/Varargs.java | 16 +-- test/junit/org/luaj/vm2/VarargsTest.java | 171 ++++++++++++++--------- 4 files changed, 109 insertions(+), 84 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaClosure.java b/src/core/org/luaj/vm2/LuaClosure.java index 607761b1..24f9879b 100644 --- a/src/core/org/luaj/vm2/LuaClosure.java +++ b/src/core/org/luaj/vm2/LuaClosure.java @@ -170,10 +170,10 @@ public class LuaClosure extends LuaFunction { } public final Varargs invoke(Varargs varargs) { - return onInvoke( varargs ).eval(); + return onInvoke(varargs).eval(); } - public Varargs onInvoke(Varargs varargs) { + public final Varargs onInvoke(Varargs varargs) { LuaValue[] stack = new LuaValue[p.maxstacksize]; for ( int i=0; i * This may return a {@link TailcallVarargs} to be evaluated by the client. *

- * This should not be called directly, instead use on of the call invocation functions. + * This should not be called directly, instead use one of the call invocation functions. * * @param args the arguments to the call invocation. * @return Varargs the return values, possible a TailcallVarargs. diff --git a/src/core/org/luaj/vm2/Varargs.java b/src/core/org/luaj/vm2/Varargs.java index 30cb411f..a17d12ac 100644 --- a/src/core/org/luaj/vm2/Varargs.java +++ b/src/core/org/luaj/vm2/Varargs.java @@ -623,12 +623,8 @@ public abstract class Varargs { if (start == 1) return this; if (start > v.length) - return LuaValue.NONE; - if (start == v.length) - return v[v.length - 1]; - if (start == v.length - 1) - return new PairVarargs(v[v.length - 2], v[v.length - 1]); - return new ArrayPartVarargs(v, start - 1, v.length - (start - 1)); + return r.subargs(start - v.length); + return LuaValue.varargsOf(v, start - 1, v.length - (start - 1), r); } } @@ -686,12 +682,8 @@ public abstract class Varargs { if (start == 1) return this; if (start > length) - return LuaValue.NONE; - if (start == length) - return v[offset + length - 1]; - if (start == length - 1) - return new PairVarargs(v[offset + length - 2], v[offset + length - 1]); - return new ArrayPartVarargs(v, offset + start - 1, length - (start - 1)); + return more.subargs(start - length); + return LuaValue.varargsOf(v, offset + start - 1, length - (start - 1), more); } } } diff --git a/test/junit/org/luaj/vm2/VarargsTest.java b/test/junit/org/luaj/vm2/VarargsTest.java index 87ad374c..644c780e 100644 --- a/test/junit/org/luaj/vm2/VarargsTest.java +++ b/test/junit/org/luaj/vm2/VarargsTest.java @@ -105,78 +105,111 @@ public class VarargsTest extends TestCase { expectNegSubargsError(NONE); expectNegSubargsError(NIL); } + + static 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)); + expectEquals(E_G, a_g.subargs(5)); + expectEquals(E_G, a_g.subargs(5).subargs(1)); + expectEquals(FG, a_g.subargs(6)); + expectEquals(FG, a_g.subargs(6).subargs(1)); + expectEquals(G, a_g.subargs(7)); + expectEquals(G, a_g.subargs(7).subargs(1)); + expectEquals(NONE, a_g.subargs(8)); + expectEquals(NONE, a_g.subargs(8).subargs(1)); + standardTestsC_G(A_G.subargs(3)); + } + + static 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)); + expectEquals(FG, c_g.subargs(4)); + expectEquals(FG, c_g.subargs(4).subargs(1)); + expectEquals(G, c_g.subargs(5)); + expectEquals(G, c_g.subargs(5).subargs(1)); + expectEquals(NONE, c_g.subargs(6)); + expectEquals(NONE, c_g.subargs(6).subargs(1)); + standardTestsE_G(c_g.subargs(3)); + } + + static 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)); + expectEquals(G, e_g.subargs(3)); + expectEquals(G, e_g.subargs(3).subargs(1)); + expectEquals(NONE, e_g.subargs(4)); + expectEquals(NONE, e_g.subargs(4).subargs(1)); + standardTestsFG(e_g.subargs(2)); + } + + static void standardTestsFG(Varargs fg) { + expectEquals(FG, fg.subargs(1)); + expectEquals(G, fg.subargs(2)); + expectEquals(G, fg.subargs(2).subargs(1)); + expectEquals(NONE, fg.subargs(3)); + expectEquals(NONE, fg.subargs(3).subargs(1)); + } + + static void standardTestsNone(Varargs none) { + expectEquals(NONE, none.subargs(1)); + expectEquals(NONE, none.subargs(2)); + } public void testVarargsSubargs() { - expectEquals(A_G, A_G.subargs(1)); - expectEquals(A_G, A_G_alt.subargs(1)); - expectEquals(C_G, A_G.subargs(3)); - expectEquals(C_G, A_G_alt.subargs(3)); - expectEquals(C_G, A_G.subargs(3).subargs(1)); - expectEquals(C_G, A_G_alt.subargs(3).subargs(1)); - expectEquals(E_G, A_G.subargs(5)); - expectEquals(E_G, A_G_alt.subargs(5)); - expectEquals(E_G, A_G.subargs(5).subargs(1)); - expectEquals(E_G, A_G_alt.subargs(5).subargs(1)); - expectEquals(FG, A_G.subargs(6)); - expectEquals(FG, A_G_alt.subargs(6)); - expectEquals(FG, A_G.subargs(6).subargs(1)); - expectEquals(FG, A_G_alt.subargs(6).subargs(1)); - expectEquals(G, A_G.subargs(7)); - expectEquals(G, A_G_alt.subargs(7)); - expectEquals(G, A_G.subargs(7).subargs(1)); - expectEquals(G, A_G_alt.subargs(7).subargs(1)); - expectEquals(NONE, A_G.subargs(8)); - expectEquals(NONE, A_G_alt.subargs(8)); - expectEquals(NONE, A_G.subargs(8).subargs(1)); - expectEquals(NONE, A_G_alt.subargs(8).subargs(1)); + standardTestsA_G(A_G); + standardTestsA_G(A_G_alt); + standardTestsC_G(C_G); + standardTestsC_G(C_G_alt); + standardTestsE_G(E_G); + standardTestsE_G(E_G_alt); + standardTestsFG(FG); + standardTestsFG(FG_alt); + standardTestsNone(NONE); + } + + public 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); + a_g = LuaValue.varargsOf(new LuaValue[] { A, B, }, LuaValue.varargsOf( new LuaValue[] { C, D, E, F, G })); + standardTestsA_G(a_g); + a_g = LuaValue.varargsOf(new LuaValue[] { A, B, C, }, LuaValue.varargsOf( new LuaValue[] { D, E, F, G })); + standardTestsA_G(a_g); + a_g = LuaValue.varargsOf(new LuaValue[] { A, B, C, D, }, LuaValue.varargsOf(E, F, G)); + standardTestsA_G(a_g); + a_g = LuaValue.varargsOf(new LuaValue[] { A, B, C, D, E }, LuaValue.varargsOf( F, G )); + standardTestsA_G(a_g); + a_g = LuaValue.varargsOf(new LuaValue[] { A, B, C, D, E, F, }, G ); + standardTestsA_G(a_g); + } + + public 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); + } - expectEquals(C_G, C_G.subargs(1)); - expectEquals(C_G, C_G_alt.subargs(1)); - expectEquals(E_G, C_G.subargs(3)); - expectEquals(E_G, C_G_alt.subargs(3)); - expectEquals(E_G, C_G.subargs(3).subargs(1)); - expectEquals(E_G, C_G_alt.subargs(3).subargs(1)); - expectEquals(FG, C_G.subargs(4)); - expectEquals(FG, C_G_alt.subargs(4)); - expectEquals(FG, C_G.subargs(4).subargs(1)); - expectEquals(FG, C_G_alt.subargs(4).subargs(1)); - expectEquals(G, C_G.subargs(5)); - expectEquals(G, C_G_alt.subargs(5)); - expectEquals(G, C_G.subargs(5).subargs(1)); - expectEquals(G, C_G_alt.subargs(5).subargs(1)); - expectEquals(NONE, C_G.subargs(6)); - expectEquals(NONE, C_G_alt.subargs(6)); - expectEquals(NONE, C_G.subargs(6).subargs(1)); - expectEquals(NONE, C_G_alt.subargs(6).subargs(1)); - - expectEquals(E_G, E_G.subargs(1)); - expectEquals(E_G, E_G_alt.subargs(1)); - expectEquals(FG, E_G.subargs(2)); - expectEquals(FG, E_G_alt.subargs(2)); - expectEquals(FG, E_G.subargs(2).subargs(1)); - expectEquals(FG, E_G_alt.subargs(2).subargs(1)); - expectEquals(G, E_G.subargs(3)); - expectEquals(G, E_G_alt.subargs(3)); - expectEquals(G, E_G.subargs(3).subargs(1)); - expectEquals(G, E_G_alt.subargs(3).subargs(1)); - expectEquals(NONE, E_G.subargs(4)); - expectEquals(NONE, E_G_alt.subargs(4)); - expectEquals(NONE, E_G.subargs(4).subargs(1)); - expectEquals(NONE, E_G_alt.subargs(4).subargs(1)); - - expectEquals(FG, FG.subargs(1)); - expectEquals(FG, FG_alt.subargs(1)); - expectEquals(G, FG.subargs(2)); - expectEquals(G, FG_alt.subargs(2)); - expectEquals(G, FG.subargs(2).subargs(1)); - expectEquals(G, FG_alt.subargs(2).subargs(1)); - expectEquals(NONE, FG.subargs(3)); - expectEquals(NONE, FG_alt.subargs(3)); - expectEquals(NONE, FG.subargs(3).subargs(1)); - expectEquals(NONE, FG_alt.subargs(3).subargs(1)); - - expectEquals(NONE, NONE.subargs(1)); - expectEquals(NONE, NONE.subargs(2)); + public 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); + a_g = new Varargs.ArrayPartVarargs(Z_H_array, 1, 2, new Varargs.ArrayPartVarargs(Z_H_array, 3, 5)); + standardTestsA_G(a_g); + a_g = new Varargs.ArrayPartVarargs(Z_H_array, 1, 3, new Varargs.ArrayPartVarargs(Z_H_array, 4, 4)); + standardTestsA_G(a_g); + a_g = new Varargs.ArrayPartVarargs(Z_H_array, 1, 4, new Varargs.ArrayPartVarargs(Z_H_array, 5, 3)); + standardTestsA_G(a_g); + a_g = new Varargs.ArrayPartVarargs(Z_H_array, 1, 5, new Varargs.ArrayPartVarargs(Z_H_array, 6, 2)); + standardTestsA_G(a_g); + a_g = new Varargs.ArrayPartVarargs(Z_H_array, 1, 6, new Varargs.ArrayPartVarargs(Z_H_array, 7, 1)); + standardTestsA_G(a_g); } static void expectNegSubargsError(Varargs v) {