From 80d8fccd1a77102a8bd2a6ed5ebb705adb3feb66 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Mon, 21 Jul 2008 23:01:59 +0000 Subject: [PATCH] Add tests for J2me platform math. --- .../platform/J2meMidp10Cldc10Platform.java | 6 +- src/j2se/org/luaj/platform/J2sePlatform.java | 1 - src/test/java/org/luaj/vm/MathLibTest.java | 187 ++++++++++++++++++ 3 files changed, 191 insertions(+), 3 deletions(-) diff --git a/src/j2me/org/luaj/platform/J2meMidp10Cldc10Platform.java b/src/j2me/org/luaj/platform/J2meMidp10Cldc10Platform.java index fafa280c..1b87edc1 100644 --- a/src/j2me/org/luaj/platform/J2meMidp10Cldc10Platform.java +++ b/src/j2me/org/luaj/platform/J2meMidp10Cldc10Platform.java @@ -58,9 +58,11 @@ public class J2meMidp10Cldc10Platform extends Platform { public double mathop(int id, double a, double b) { switch ( id ) { - case MathLib.ATAN2: return a==0? (b>0? Math.PI/2: b>0? -Math.PI/2: 0): Math.atan(b/a); + case MathLib.ATAN2: return + b>0? Math.atan(a/b): + b<0? (a>=0? Math.PI-Math.atan(a/-b): -Math.PI-Math.atan(a/-b)): + (a>0? Math.PI/2: a<0? -Math.PI/2: 0); case MathLib.FMOD: return a - (b * ((int)(a/b))); - case MathLib.LDEXP: return a * dpow(2, b); case MathLib.POW: return dpow(a, b); } throw new LuaErrorException( "unsupported math op" ); diff --git a/src/j2se/org/luaj/platform/J2sePlatform.java b/src/j2se/org/luaj/platform/J2sePlatform.java index 3eb26c38..778d3628 100644 --- a/src/j2se/org/luaj/platform/J2sePlatform.java +++ b/src/j2se/org/luaj/platform/J2sePlatform.java @@ -61,7 +61,6 @@ public class J2sePlatform extends Platform { switch ( id ) { case MathLib.ATAN2: return Math.atan2(a, b); case MathLib.FMOD: return a - (b * ((int)(a/b))); - case MathLib.LDEXP: return a * Math.pow(2, b); case MathLib.POW: return Math.pow(a, b); } throw new LuaErrorException( "unsupported math op" ); diff --git a/src/test/java/org/luaj/vm/MathLibTest.java b/src/test/java/org/luaj/vm/MathLibTest.java index 5dc07225..003b5837 100644 --- a/src/test/java/org/luaj/vm/MathLibTest.java +++ b/src/test/java/org/luaj/vm/MathLibTest.java @@ -2,10 +2,20 @@ package org.luaj.vm; import junit.framework.TestCase; +import org.luaj.lib.MathLib; import org.luaj.platform.J2meMidp10Cldc10Platform; +import org.luaj.platform.J2sePlatform; public class MathLibTest extends TestCase { + private Platform j2se; + private Platform j2me; + + protected void setUp() throws Exception { + j2se = new J2sePlatform(); + j2me = new org.luaj.platform.J2meMidp10Cldc10Platform(null); + } + public void testMathDPow() { assertEquals( 1, J2meMidp10Cldc10Platform.dpow(2, 0), 0 ); assertEquals( 2, J2meMidp10Cldc10Platform.dpow(2, 1), 0 ); @@ -28,4 +38,181 @@ public class MathLibTest extends TestCase { assertEquals(1, J2meMidp10Cldc10Platform.dpow(0.0625, 0), 0 ); assertEquals(0.00048828125, J2meMidp10Cldc10Platform.dpow(0.0625, 2.75), 0 ); } + + public void testAbs() { + tryMathOp( MathLib.ABS, 23.45 ); + tryMathOp( MathLib.ABS, -23.45 ); + } + + public void testCos() { + tryTrigOps( MathLib.COS ); + } + + public void testCosh() { + tryTrigOps( MathLib.COSH ); + } + + public void testDeg() { + tryTrigOps( MathLib.DEG ); + } + + public void testExp() { + tryMathOp( MathLib.EXP, 0 ); + tryMathOp( MathLib.EXP, 0.1 ); + tryMathOp( MathLib.EXP, .9 ); + tryMathOp( MathLib.EXP, 1. ); + tryMathOp( MathLib.EXP, 9 ); + tryMathOp( MathLib.EXP, -.1 ); + tryMathOp( MathLib.EXP, -.9 ); + tryMathOp( MathLib.EXP, -1. ); + tryMathOp( MathLib.EXP, -9 ); + } + + public void testLog() { + tryMathOp( MathLib.LOG, 0.1 ); + tryMathOp( MathLib.LOG, .9 ); + tryMathOp( MathLib.LOG, 1. ); + tryMathOp( MathLib.LOG, 9 ); + tryMathOp( MathLib.LOG, -.1 ); + tryMathOp( MathLib.LOG, -.9 ); + tryMathOp( MathLib.LOG, -1. ); + tryMathOp( MathLib.LOG, -9 ); + } + + public void testLog10() { + tryMathOp( MathLib.LOG10, 0.1 ); + tryMathOp( MathLib.LOG10, .9 ); + tryMathOp( MathLib.LOG10, 1. ); + tryMathOp( MathLib.LOG10, 9 ); + tryMathOp( MathLib.LOG10, 10 ); + tryMathOp( MathLib.LOG10, 100 ); + tryMathOp( MathLib.LOG10, -.1 ); + tryMathOp( MathLib.LOG10, -.9 ); + tryMathOp( MathLib.LOG10, -1. ); + tryMathOp( MathLib.LOG10, -9 ); + tryMathOp( MathLib.LOG10, -10 ); + tryMathOp( MathLib.LOG10, -100 ); + } + + public void testRad() { + tryMathOp( MathLib.RAD, 0 ); + tryMathOp( MathLib.RAD, 0.1 ); + tryMathOp( MathLib.RAD, .9 ); + tryMathOp( MathLib.RAD, 1. ); + tryMathOp( MathLib.RAD, 9 ); + tryMathOp( MathLib.RAD, 10 ); + tryMathOp( MathLib.RAD, 100 ); + tryMathOp( MathLib.RAD, -.1 ); + tryMathOp( MathLib.RAD, -.9 ); + tryMathOp( MathLib.RAD, -1. ); + tryMathOp( MathLib.RAD, -9 ); + tryMathOp( MathLib.RAD, -10 ); + tryMathOp( MathLib.RAD, -100 ); + } + + public void testSin() { + tryTrigOps( MathLib.SIN ); + } + + public void testSinh() { + tryTrigOps( MathLib.SINH ); + } + + public void testSqrt() { + tryMathOp( MathLib.SQRT, 0 ); + tryMathOp( MathLib.SQRT, 0.1 ); + tryMathOp( MathLib.SQRT, .9 ); + tryMathOp( MathLib.SQRT, 1. ); + tryMathOp( MathLib.SQRT, 9 ); + tryMathOp( MathLib.SQRT, 10 ); + tryMathOp( MathLib.SQRT, 100 ); + } + public void testTan() { + tryTrigOps( MathLib.TAN ); + } + + public void testTanh() { + tryTrigOps( MathLib.TANH ); + } + + public void testAtan2() { + tryDoubleOps( MathLib.ATAN2, false ); + } + + public void testFmod() { + tryDoubleOps( MathLib.FMOD, false ); + } + + public void testPow() { + tryDoubleOps( MathLib.POW, true ); + } + + private void tryDoubleOps( int id, boolean positiveOnly ) { + // y>0, x>0 + tryMathOp( id, 0.1, 4.0 ); + tryMathOp( id, .9, 4.0 ); + tryMathOp( id, 1., 4.0 ); + tryMathOp( id, 9, 4.0 ); + tryMathOp( id, 10, 4.0 ); + tryMathOp( id, 100, 4.0 ); + + // y>0, x<0 + tryMathOp( id, 0.1, -4.0 ); + tryMathOp( id, .9, -4.0 ); + tryMathOp( id, 1., -4.0 ); + tryMathOp( id, 9, -4.0 ); + tryMathOp( id, 10, -4.0 ); + tryMathOp( id, 100, -4.0 ); + + if ( ! positiveOnly ) { + // y<0, x>0 + tryMathOp( id, -0.1, 4.0 ); + tryMathOp( id, -.9, 4.0 ); + tryMathOp( id, -1., 4.0 ); + tryMathOp( id, -9, 4.0 ); + tryMathOp( id, -10, 4.0 ); + tryMathOp( id, -100, 4.0 ); + + // y<0, x<0 + tryMathOp( id, -0.1, -4.0 ); + tryMathOp( id, -.9, -4.0 ); + tryMathOp( id, -1., -4.0 ); + tryMathOp( id, -9, -4.0 ); + tryMathOp( id, -10, -4.0 ); + tryMathOp( id, -100, -4.0 ); + } + + // degenerate cases + tryMathOp( id, 0, 1 ); + tryMathOp( id, 1, 0 ); + tryMathOp( id, -1, 0 ); + tryMathOp( id, 0, -1 ); + tryMathOp( id, 0, 0 ); + } + + private void tryTrigOps(int id) { + tryMathOp( id, 0 ); + tryMathOp( id, Math.PI/8 ); + tryMathOp( id, Math.PI*7/8 ); + tryMathOp( id, Math.PI*8/8 ); + tryMathOp( id, Math.PI*9/8 ); + tryMathOp( id, -Math.PI/8 ); + tryMathOp( id, -Math.PI*7/8 ); + tryMathOp( id, -Math.PI*8/8 ); + tryMathOp( id, -Math.PI*9/8 ); + } + + private void tryMathOp(int id, double x) { + double expected = j2se.mathop(id, x); + double actual = j2me.mathop(id, x); + assertEquals( expected, actual, 1.e-5 ); + } + + + private void tryMathOp(int id, double a, double b) { + double expected = j2se.mathop(id, a, b); + double actual = j2me.mathop(id, a, b); + assertEquals( expected, actual, 1.e-5 ); + } + }