Implements missing 1.5 features from the Java number classes. IntegerTest is currently broken. Patch by: fabbott Review by: me (with reservations) git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1609 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/lang/Boolean.java b/user/super/com/google/gwt/emul/java/lang/Boolean.java index 4b4f43b..6c2b46a 100644 --- a/user/super/com/google/gwt/emul/java/lang/Boolean.java +++ b/user/super/com/google/gwt/emul/java/lang/Boolean.java
@@ -28,6 +28,13 @@ // CHECKSTYLE_ON + public static Boolean parseString(String s) { + if (s != null && s.equalsIgnoreCase("true")) { + return TRUE; + } + return FALSE; + } + public static String toString(boolean x) { return String.valueOf(x); }
diff --git a/user/super/com/google/gwt/emul/java/lang/Byte.java b/user/super/com/google/gwt/emul/java/lang/Byte.java index d968e77..eacee7e 100644 --- a/user/super/com/google/gwt/emul/java/lang/Byte.java +++ b/user/super/com/google/gwt/emul/java/lang/Byte.java
@@ -22,6 +22,7 @@ public static final byte MIN_VALUE = (byte) 0x80; public static final byte MAX_VALUE = (byte) 0x7F; + public static final int SIZE = 8; // Box all values according to JLS private static Byte[] boxedValues = new Byte[256]; @@ -32,7 +33,7 @@ /** * @skip - * + * * Here for shared implementation with Arrays.hashCode */ public static int hashCode(byte b) {
diff --git a/user/super/com/google/gwt/emul/java/lang/Double.java b/user/super/com/google/gwt/emul/java/lang/Double.java index bd13405..ce65260 100644 --- a/user/super/com/google/gwt/emul/java/lang/Double.java +++ b/user/super/com/google/gwt/emul/java/lang/Double.java
@@ -21,9 +21,16 @@ public final class Double extends Number implements Comparable<Double> { public static final double MAX_VALUE = 1.7976931348623157e+308; public static final double MIN_VALUE = 4.9e-324; + public static final double MIN_NORMAL = 2.2250738585072014e-308; + public static final int MAX_EXPONENT = 1023; + // ==Math.getExponent(Double.MAX_VALUE); + public static final int MIN_EXPONENT = -1022; + // ==Math.getExponent(Double.MIN_NORMAL);; + public static final double NaN = 0d / 0d; public static final double NEGATIVE_INFINITY = -1d / 0d; public static final double POSITIVE_INFINITY = 1d / 0d; + public static final int SIZE = 64; public static int compare(double x, double y) { if (x < y) {
diff --git a/user/super/com/google/gwt/emul/java/lang/Float.java b/user/super/com/google/gwt/emul/java/lang/Float.java index 8dd73fe..96e3fc0 100644 --- a/user/super/com/google/gwt/emul/java/lang/Float.java +++ b/user/super/com/google/gwt/emul/java/lang/Float.java
@@ -21,9 +21,13 @@ public final class Float extends Number implements Comparable<Float> { public static final float MAX_VALUE = 3.4028235e+38f; public static final float MIN_VALUE = 1.4e-45f; + public static final float MAX_EXPONENT = 127; + public static final float MIN_EXPONENT = -126; + public static final float MIN_NORMAL = 1.1754943508222875E-38f; public static final float NaN = 0f / 0f; public static final float NEGATIVE_INFINITY = -1f / 0f; public static final float POSITIVE_INFINITY = 1f / 0f; + public static final int SIZE = 32; public static int compare(float x, float y) { if (x < y) {
diff --git a/user/super/com/google/gwt/emul/java/lang/Integer.java b/user/super/com/google/gwt/emul/java/lang/Integer.java index d21d1f0..4427deb 100644 --- a/user/super/com/google/gwt/emul/java/lang/Integer.java +++ b/user/super/com/google/gwt/emul/java/lang/Integer.java
@@ -22,6 +22,7 @@ public static final int MIN_VALUE = 0x80000000; public static final int MAX_VALUE = 0x7fffffff; + public static final int SIZE = 32; // Box values according to JLS - between -128 and 127 private static Integer[] boxedValues = new Integer[256]; @@ -43,13 +44,61 @@ /** * @skip - * + * * Here for shared implementation with Arrays.hashCode */ public static int hashCode(int i) { return i; } + public static int highestOneBit(int i) { + if (i < 0) { + return MIN_VALUE; + } else { + int rtn; + for (rtn = 0x40000000; (rtn >> 1) > i; rtn = rtn >> 1) { + // loop down until smaller + } + return rtn; + } + } + + public static int lowestOneBit(int i) { + if (i == 0) { + return 32; + } else { + int r = 1; + while ((r & i) != 0) { + r = r * 2; + } + return r; + } + } + + public static int numberOfLeadingZeros(int i) { + if (i < 0) { + return 0; + } else if (i == 0) { + return SIZE; + } else { + return SIZE - 1 - (int) Math.floor(Math.log(i) / Math.log(2.0d)); + } + } + + public static int numberOfTrailingZeros(int i) { + if (i < 0) { + return 0; + } else if (i == 0) { + return SIZE; + } else { + int rtn = 0; + for (int r = 1; (r & i) != 0; r = r * 2) { + rtn++; + } + return rtn; + } + } + public static int parseInt(String s) throws NumberFormatException { return parseInt(s, 10); } @@ -58,6 +107,49 @@ return (int) __parseAndValidateLong(s, radix, MIN_VALUE, MAX_VALUE); } + public static int reverse(int i) { + int acc = 0; + int front = 0x80000000; + int back = 1; + int swing = 31; + while (swing > 15) { + acc = acc | ((i & front) >> swing) | ((i & back) << swing); + swing--; + front = front >> 1; + back = back << 1; + } + return acc; + } + + public static int reverseBytes(int i) { + return ((i & 0xff) << 24) | ((i & 0xff00) << 8) | ((i & 0xff0000) >> 8) + | ((i & 0xff000000) >> 24); + } + + public static int rotateLeft(int i, int distance) { + while (distance-- > 0) { + i = i << 1 | ((i < 0) ? 1 : 0); + } + return i; + } + + public static int rotateRight(int i, int distance) { + while (distance-- > 0) { + i = ((i & 1) == 0 ? 0 : 0x80000000) | i >> 1; + } + return i; + } + + public static int signum(int i) { + if (i == 0) { + return 0; + } else if (i < 0) { + return -1; + } else { + return 1; + } + } + public static String toBinaryString(int x) { return Long.toBinaryString(x); }
diff --git a/user/super/com/google/gwt/emul/java/lang/Long.java b/user/super/com/google/gwt/emul/java/lang/Long.java index ba8e9e7..95c0c54 100644 --- a/user/super/com/google/gwt/emul/java/lang/Long.java +++ b/user/super/com/google/gwt/emul/java/lang/Long.java
@@ -1,12 +1,12 @@ /* * Copyright 2007 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -21,9 +21,20 @@ public final class Long extends Number implements Comparable<Long> { public static final long MIN_VALUE = 0x8000000000000000L; public static final long MAX_VALUE = 0x7fffffffffffffffL; + public static final int SIZE = 64; // Box values according to JLS - between -128 and 127 private static Long[] boxedValues = new Long[256]; + + public static int bitCount (long i) { + int cnt = 0; + for (long q = MIN_VALUE; q > 0; q = q >> 1) { + if ((q & i) != 0) { + cnt++; + } + } + return cnt; + } public static Long decode(String s) throws NumberFormatException { return new Long(__decodeAndValidateLong(s, MIN_VALUE, MAX_VALUE)); @@ -36,6 +47,54 @@ return (int) l; } + public static long highestOneBit (long i) { + if (i < 0) { + return MIN_VALUE; + } else { + long rtn; + for (rtn = 0x4000000000000000L; (rtn >> 1) > i; rtn = rtn >> 1) { + // loop down until smaller + } + return rtn; + } + } + + public static long lowestOneBit (long i) { + if (i == 0) { + return SIZE; + } else { + long r = 1; + while ((r & i) != 0) { + r = r << 1; + } + return r; + } + } + + public static int numberOfLeadingZeros(long i) { + if (i < 0) { + return 0; + } else if (i == 0) { + return SIZE; + } else { + return SIZE - 1 - (int)Math.floor(Math.log((double)i) / Math.log(2.0d)); + } + } + + public static int numberOfTrailingZeros(long i) { + if (i < 0) { + return 0; + } else if (i == 0) { + return SIZE; + } else { + int rtn = 0; + for (int r = 1; (r & i) != 0; r = r * 2) { + rtn++; + } + return rtn; + } + } + public static long parseLong(String s) throws NumberFormatException { return parseLong(s, 10); } @@ -45,6 +104,51 @@ return __parseAndValidateLong(s, radix, MIN_VALUE, MAX_VALUE); } + public static long reverse (long i) { + long acc = 0; + long front = MIN_VALUE; + int back = 1; + int swing = SIZE - 1; + while (swing > 15) { + acc = acc | ((i & front) >> swing) | ((i & back) << swing); + swing--; + front = front >> 1; + back = back << 1; + } + return acc; + } + + public static long reverseBytes (long i) { + return ((i & 0xffL) << 56) | ((i & 0xff00L) << 40) + | ((i & 0xff0000L) << 24) | ((i & 0xff000000L) << 8) + | ((i & 0xff00000000L) >> 8) | ((i & 0xff0000000000L) >> 24) + | ((i & 0xff000000000000L) >> 40) | ((i & 0xff00000000000000L) >> 56); + } + + public static long rotateLeft (long i, int distance) { + while (distance-- > 0) { + i = i << 1 | ((i < 0) ? 1 : 0); + } + return i; + } + + public static long rotateRight (long i, int distance) { + while (distance-- > 0) { + i = ((i & 1) == 0 ? 0 : 0x80000000) | i >> 1; + } + return i; + } + + public static int signum (long i) { + if (i == 0) { + return 0; + } else if (i < 0) { + return -1; + } else { + return 1; + } + } + public static String toBinaryString(long x) { if (x == 0) { return "0"; @@ -75,7 +179,7 @@ return String.valueOf(b); } - public static Long valueOf(long i) { + public static Long valueOf (long i) { if (i > -129 && i < 128) { int rebase = (int) i + 128; if (boxedValues[rebase] == null) {
diff --git a/user/super/com/google/gwt/emul/java/lang/Math.java b/user/super/com/google/gwt/emul/java/lang/Math.java index 4d1d6fc..e7ef592 100644 --- a/user/super/com/google/gwt/emul/java/lang/Math.java +++ b/user/super/com/google/gwt/emul/java/lang/Math.java
@@ -1,12 +1,12 @@ /* * Copyright 2006 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -54,26 +54,88 @@ return Math.atan(x); }-*/; + public static native double atan2 (double y, double x) /*-{ + return Math.atan2(y,x); + }-*/; + + /* NYI: Java 1.5 includes this, but JS doesn't give us the ingredients.: Java 1.5 includes this, but JS doesn't give us the ingredients. + public static double cbrt (double x) { + return 0; + }; */ + public static native double ceil(double x) /*-{ return Math.ceil(x); }-*/; + public static double copySign (double magnitude, double sign) { + if (sign < 0) { + return (magnitude < 0) ? magnitude : -magnitude; + } else { + return (magnitude > 0) ? magnitude : -magnitude; + } + } + + public static float copySign (float magnitude, float sign) { + return (float)(copySign((double)magnitude, (double)sign)); + } + public static native double cos(double x) /*-{ return Math.cos(x); }-*/; + public static native double cosh(double x) /*-{ + return (Math.exp(x) + Math.exp(-x)) / 2.0; + }-*/; + public static native double exp(double x) /*-{ return Math.exp(x); }-*/; + public static double expm1 (double d) { + if (d == 0.0 || Double.isNaN(d)) { + return d; // "a zero with same sign as argument", arg is zero, so... + } else if (!Double.isInfinite(d)) { + if (d < 0.0d) { + return -1.0d; + } else { + return Double.POSITIVE_INFINITY; + } + } + return exp(d) + 1.0d; + } + public static native double floor(double x) /*-{ return Math.floor(x); }-*/; + /* NYI: Java 1.5 includes this, but JS doesn't give us the ingredients. + public static int getExponent (double d) { + } + + public static int getExponent (float f) { + } + */ + + public static double hypot(double x, double y) { + return sqrt(x * x + y * y); + } + + /* NYI: Java 1.5 includes this, but JS doesn't give us the ingredients. + public static double IEEEremainder(double f1, double f2) { + } */ + public static native double log(double x) /*-{ return Math.log(x); }-*/; + public static double log10 (double x) { + return Math.log(x) / Math.log(10); + } + + public static double log1p(double x) { + return Math.log(x + 1.0d); + }; + public static double max(double x, double y) { return x > y ? x : y; } @@ -106,6 +168,19 @@ return x < y ? x : y; } + /* NYI: Java 1.5 includes this, but JS doesn't give us the ingredients. + public static double nextAfter(double start, double direction) { + } + public static float nextAfter(float start, float direction) { + } + public static double nextUp(double start) { + return nextAfter(start, 1.0d); + } + public static float nextUp(float start) { + return nextAfter(start,1.0f); + } + */ + public static native double pow(double x, double exp) /*-{ return Math.pow(x, exp); }-*/; @@ -114,6 +189,18 @@ return Math.random(); }-*/; + public static double rint (double d) { + if (Double.isNaN(d)) { + return d; + } else if (Double.isInfinite(d)) { + return d; + } else if (d == 0.0d) { + return d; + } else { + return (double)(round(d)); + } + }; + public static native long round(double x) /*-{ return Math.round(x); }-*/; @@ -122,10 +209,53 @@ return Math.round(x); }-*/; + public static double scalb (double d, int scaleFactor) { + if (scaleFactor > 0) { + return d * (1 << scaleFactor); + } else if (scaleFactor == 0) { + return d; + } else { + return d * 1.0d / (1 << -scaleFactor); + } + } + + public static float scalb (float f, int scaleFactor) { + if (scaleFactor > 0) { + return f * (1 << scaleFactor); + } else if (scaleFactor == 0) { + return f; + } else { + return f * 1.0f / (1 << -scaleFactor); + } + } + + public static double signum (double d) { + if (d > 0.0d) { + return 1.0d; + } else if (d < 0.0d) { + return -1.0d; + } else { + return 0.0d; + } + } + + public static float signum (float f) { + if (f > 0.0f) { + return 1.0f; + } else if (f < 0.0f) { + return -1.0f; + } else { + return 0.0f; + } + } public static native double sin(double x) /*-{ return Math.sin(x); }-*/; + public static native double sinh(double x) /*-{ + return Math.sinh(x); + }-*/; + public static native double sqrt(double x) /*-{ return Math.sqrt(x); }-*/; @@ -134,6 +264,10 @@ return Math.tan(x); }-*/; + public static native double tanh(double x) /*-{ + return Math.tanh(x); + }-*/; + public static double toDegrees(double x) { return x * PI_UNDER_180; } @@ -141,4 +275,11 @@ public static double toRadians(double x) { return x * PI_OVER_180; } + + /* NYI: Java 1.5 includes this, but JS doesn't give us the ingredients. + public static double ulp (double x) { + }; + public static float ulp (float x) { + }; + */ }
diff --git a/user/super/com/google/gwt/emul/java/lang/Short.java b/user/super/com/google/gwt/emul/java/lang/Short.java index 20f7197..30fa5a4 100644 --- a/user/super/com/google/gwt/emul/java/lang/Short.java +++ b/user/super/com/google/gwt/emul/java/lang/Short.java
@@ -1,12 +1,12 @@ /* * Copyright 2007 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -22,6 +22,7 @@ public static final short MIN_VALUE = (short) 0x8000; public static final short MAX_VALUE = (short) 0x7fff; + public static final int SIZE = 16; // Box values according to JLS - between -128 and 127 private static Short[] boxedValues = new Short[256]; @@ -46,6 +47,10 @@ return (short) __parseAndValidateLong(s, radix, MIN_VALUE, MAX_VALUE); } + public static short reverseBytes (short s) { + return (short)(((s & 0xff) << 8) | ((s & 0xff00) >> 8)); + } + public static String toString(short b) { return String.valueOf(b); }
diff --git a/user/test/com/google/gwt/emultest/EmulSuite.java b/user/test/com/google/gwt/emultest/EmulSuite.java index 90e7e55..c757ea7 100644 --- a/user/test/com/google/gwt/emultest/EmulSuite.java +++ b/user/test/com/google/gwt/emultest/EmulSuite.java
@@ -1,12 +1,12 @@ /* * Copyright 2007 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -15,9 +15,14 @@ */ package com.google.gwt.emultest; +import com.google.gwt.emultest.java.lang.BooleanTest; +import com.google.gwt.emultest.java.lang.ByteTest; import com.google.gwt.emultest.java.lang.CharacterTest; +import com.google.gwt.emultest.java.lang.DoubleTest; import com.google.gwt.emultest.java.lang.IntegerTest; +import com.google.gwt.emultest.java.lang.LongTest; import com.google.gwt.emultest.java.lang.ObjectTest; +import com.google.gwt.emultest.java.lang.ShortTest; import com.google.gwt.emultest.java.lang.StringBufferTest; import com.google.gwt.emultest.java.lang.StringTest; import com.google.gwt.emultest.java.util.ArraysTest; @@ -30,24 +35,30 @@ import junit.framework.TestSuite; /** - * Tests all classes in GWT JRE emulation library. + * TODO: document me. */ public class EmulSuite { + /** Note: due to compiler error, only can use one Test Case at a time. */ public static Test suite() { TestSuite suite = new TestSuite("Tests for com.google.gwt.emul.java"); // $JUnit-BEGIN$ suite.addTestSuite(ArraysTest.class); + suite.addTestSuite(BooleanTest.class); + suite.addTestSuite(ByteTest.class); suite.addTestSuite(HashMapTest.class); suite.addTestSuite(StringBufferTest.class); suite.addTestSuite(StringTest.class); suite.addTestSuite(CharacterTest.class); suite.addTestSuite(StackTest.class); suite.addTestSuite(IntegerTest.class); + suite.addTestSuite(LongTest.class); + suite.addTestSuite(DoubleTest.class); suite.addTestSuite(DateTest.class); suite.addTestSuite(HashSetTest.class); suite.addTestSuite(ObjectTest.class); + suite.addTestSuite(ShortTest.class); // $JUnit-END$ return suite;
diff --git a/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java b/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java new file mode 100644 index 0000000..f99fbe3 --- /dev/null +++ b/user/test/com/google/gwt/emultest/java/lang/BooleanTest.java
@@ -0,0 +1,39 @@ +/* + * Copyright 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.emultest.java.lang; + +import com.google.gwt.junit.client.GWTTestCase; + +/** + * Tests for the JRE Boolean type. + */ +public class BooleanTest extends GWTTestCase { + + public String getModuleName() { + return "com.google.gwt.emultest.EmulSuite"; + } + + public void testStatics() { + // test the "new" 1.5 statics, for now assuming "old" rest works + assertEquals(true, Boolean.valueOf(true).booleanValue()); + assertEquals(false, Boolean.valueOf(false).booleanValue()); + assertEquals(true, Boolean.valueOf("true").booleanValue()); + assertEquals(true, Boolean.valueOf("tRuE").booleanValue()); + assertEquals(false, Boolean.valueOf(null).booleanValue()); + assertEquals(false, Boolean.valueOf("yes").booleanValue()); + assertEquals(false, Boolean.valueOf("").booleanValue()); + } +}
diff --git a/user/test/com/google/gwt/emultest/java/lang/ByteTest.java b/user/test/com/google/gwt/emultest/java/lang/ByteTest.java new file mode 100644 index 0000000..14361e0 --- /dev/null +++ b/user/test/com/google/gwt/emultest/java/lang/ByteTest.java
@@ -0,0 +1,42 @@ +/* + * Copyright 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.emultest.java.lang; + +import com.google.gwt.junit.client.GWTTestCase; + +/** + * Tests for the JRE Byte type. + */ +public class ByteTest extends GWTTestCase { + + public String getModuleName() { + return "com.google.gwt.emultest.EmulSuite"; + } + + public void testStatics() { + // test the new 1.5 statics... older stuff "assumed to work" + assertEquals(0, Byte.valueOf((byte) 0).intValue()); + assertEquals(127, Byte.valueOf((byte) 127).intValue()); + assertEquals(-128, Byte.valueOf((byte) -128).intValue()); + assertEquals(-1, Byte.valueOf((byte) 255).intValue()); + } + + public void testConstants() { + assertEquals(-128, Byte.MIN_VALUE); + assertEquals(127, Byte.MAX_VALUE); + assertEquals(8, Byte.SIZE); + } +}
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java index 4d6edaa..ff33ebe 100644 --- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -19,7 +19,7 @@ import com.google.gwt.junit.client.GWTTestCase; /** - * TODO: document me. + * Unit tests for the emulated-in-Javascript Double/double autoboxed types. */ public class DoubleTest extends GWTTestCase { @@ -57,6 +57,9 @@ assertTrue(Double.NEGATIVE_INFINITY < Double.POSITIVE_INFINITY); assertTrue(Double.MIN_VALUE < Double.MAX_VALUE); assertFalse(Double.NaN == Double.NaN); + assertEquals(64, Double.SIZE); + // jdk1.6 assertEquals(Math.getExponent(Double.MAX_VALUE), Double.MAX_EXPONENT); + // jdk1.6 assertEquals(Math.getExponent(Double.MIN_NORMAL), Double.MIN_EXPONENT); } public void testParse() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java index 5c145d2..4ddbc55 100644 --- a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
@@ -19,7 +19,8 @@ import com.google.gwt.junit.client.GWTTestCase; /** - * TODO: document me. + * Unit tests for the Javascript emulation of the Float/float autoboxed + * fundamental type. */ public class FloatTest extends GWTTestCase { @@ -57,6 +58,9 @@ assertTrue(Float.NEGATIVE_INFINITY < Float.POSITIVE_INFINITY); assertTrue(Float.MIN_VALUE < Float.MAX_VALUE); assertFalse(Float.NaN == Float.NaN); + assertEquals(Float.SIZE, 32); + // jdk1.6 assertEquals(Float.MIN_EXPONENT, Math.getExponent(Float.MIN_NORMAL)); + // jdk1.6 assertEquals(Float.MAX_EXPONENT, Math.getExponent(Float.MAX_VALUE)); } public void testParse() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java index a53c08a..1a43fbc 100644 --- a/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java +++ b/user/test/com/google/gwt/emultest/java/lang/IntegerTest.java
@@ -1,12 +1,12 @@ /* * Copyright 2007 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -18,7 +18,8 @@ import com.google.gwt.junit.client.GWTTestCase; /** - * TODO: document me. + * Unit tests for the Javascript emulation of the Integer/int autoboxed + * fundamental type. */ public class IntegerTest extends GWTTestCase { @@ -26,16 +27,6 @@ return "com.google.gwt.emultest.EmulSuite"; } - public void testConstructor() { - assertEquals(12345, new Integer(12345).intValue()); - assertEquals(12345, new Integer("12345").intValue()); - } - - public void testToString() { - assertEquals("12345", new Integer(12345).toString()); - assertEquals("-12345", new Integer("-12345").toString()); - } - public void testBadStrings() { try { new Integer("05abcd"); @@ -57,52 +48,73 @@ } catch (NumberFormatException e) { // Expected behavior } - + try { Integer.parseInt(String.valueOf(Long.MAX_VALUE)); fail("parseInt should reject numbers greater than the range of int"); } catch (NumberFormatException e) { // Expected behavior } - + try { Integer.parseInt(String.valueOf(Long.MIN_VALUE)); fail("parseInt should reject numbers less than the range of int"); } catch (NumberFormatException e) { // Expected behavior } - + try { - Integer.parseInt(String.valueOf((long)Integer.MAX_VALUE + 1)); + Integer.parseInt(String.valueOf((long) Integer.MAX_VALUE + 1)); fail("parseInt should reject numbers greater than the range of int"); } catch (NumberFormatException e) { // Expected behavior } - + try { - Integer.parseInt(String.valueOf((long)Integer.MIN_VALUE - 1)); + Integer.parseInt(String.valueOf((long) Integer.MIN_VALUE - 1)); fail("parseInt should reject numbers less than the range of int"); } catch (NumberFormatException e) { // Expected behavior } } + public void testBinaryString() { + assertEquals("11000000111001", Integer.toBinaryString(12345)); + assertEquals("0", Integer.toBinaryString(0)); + assertEquals("11111111111111111100111111000111", + Integer.toBinaryString(-12345)); + } + + public void testBitCount() { + assertEquals(0, Integer.bitCount(0)); + assertEquals(1, Integer.bitCount(1)); + assertEquals(32, Integer.bitCount(-1)); + assertEquals(31, Integer.bitCount(Integer.MAX_VALUE)); + assertEquals(1, Integer.bitCount(Integer.MIN_VALUE)); + } + public void testCompareTo() { assertEquals(-1, new Integer(12345).compareTo(new Integer(12346))); assertEquals(1, new Integer("12345").compareTo(new Integer(12344))); assertEquals(0, new Integer("12345").compareTo(new Integer(12345))); } - public void testEquals() { - assertFalse(new Integer(12345).equals(new Integer(12346))); - assertEquals(new Integer("12345"), new Integer(12345)); + public void testConstants() { + assertEquals(32, Integer.SIZE); + assertEquals(0x7fffffff, Integer.MAX_VALUE); + assertEquals(0x80000000, Integer.MIN_VALUE); + } + + public void testConstructor() { + assertEquals(12345, new Integer(12345).intValue()); + assertEquals(12345, new Integer("12345").intValue()); } public void testDecode() { - assertEquals(Integer.MAX_VALUE, - Integer.decode(String.valueOf(Integer.MAX_VALUE)).intValue()); - assertEquals(Integer.MIN_VALUE, - Integer.decode(String.valueOf(Integer.MIN_VALUE)).intValue()); + assertEquals(Integer.MAX_VALUE, Integer.decode( + String.valueOf(Integer.MAX_VALUE)).intValue()); + assertEquals(Integer.MIN_VALUE, Integer.decode( + String.valueOf(Integer.MIN_VALUE)).intValue()); assertEquals(12345, Integer.decode("12345").intValue()); assertEquals(31, Integer.decode("0x1f").intValue()); assertEquals(-31, Integer.decode("-0X1F").intValue()); @@ -116,10 +128,106 @@ } } + public void testEquals() { + assertFalse(new Integer(12345).equals(new Integer(12346))); + assertEquals(new Integer("12345"), new Integer(12345)); + } + public void testHashCode() { assertEquals(1234, new Integer(1234).hashCode()); } + public void testHexString() { + assertEquals("3039", Integer.toHexString(12345)); + assertEquals("0", Integer.toHexString(0)); + assertEquals("ffffcfc7", Integer.toHexString(-12345)); + } + + public void testHighestOneBit() { + assertEquals(0, Integer.highestOneBit(0)); + assertEquals(Integer.MIN_VALUE, Integer.highestOneBit(-1)); + assertEquals(Integer.MIN_VALUE, Integer.highestOneBit(-256)); + assertEquals(1, Integer.highestOneBit(1)); + assertEquals(0x80, Integer.highestOneBit(0x80)); + assertEquals(0x40000000, Integer.highestOneBit(Integer.MAX_VALUE)); + } + + public void testLowestOneBit() { + assertEquals(0, Integer.lowestOneBit(0)); + assertEquals(1, Integer.lowestOneBit(-1)); + assertEquals(0x100, Integer.lowestOneBit(-256)); + assertEquals(1, Integer.lowestOneBit(1)); + assertEquals(0x80, Integer.lowestOneBit(0x80)); + assertEquals(0x80000000, Integer.lowestOneBit(Integer.MIN_VALUE)); + } + + public void testNumberOfLeadingZeros() { + assertEquals(32, Integer.numberOfLeadingZeros(0)); + assertEquals(31, Integer.numberOfLeadingZeros(1)); + assertEquals(0, Integer.numberOfLeadingZeros(-1)); + assertEquals(16, Integer.numberOfLeadingZeros(0x8000)); + assertEquals(1, Integer.numberOfLeadingZeros(Integer.MAX_VALUE)); + assertEquals(0, Integer.numberOfLeadingZeros(Integer.MIN_VALUE)); + assertEquals(0, Integer.numberOfLeadingZeros(-0x8000)); + } + + public void testNumberOfTrailingZeros() { + assertEquals(32, Integer.numberOfTrailingZeros(0)); + assertEquals(0, Integer.numberOfTrailingZeros(1)); + assertEquals(0, Integer.numberOfTrailingZeros(-1)); + assertEquals(15, Integer.numberOfTrailingZeros(0x8000)); + assertEquals(0, Integer.numberOfTrailingZeros(Integer.MAX_VALUE)); + assertEquals(31, Integer.numberOfTrailingZeros(Integer.MIN_VALUE)); + assertEquals(4, Integer.numberOfTrailingZeros(-0x7ff0)); + } + + public void testReverse() { + assertEquals(0, Integer.reverse(0)); + assertEquals(-1, Integer.reverse(-1)); + assertEquals(Integer.MIN_VALUE, Integer.reverse(1)); + assertEquals(1, Integer.reverse(Integer.MIN_VALUE)); + assertEquals(0xaaaaaaaa, Integer.reverse(0x55555555)); + } + + public void testReverseBytes() { + } + + public void testRotateLeft() { + assertEquals(0, Integer.rotateLeft(0, 4)); + assertEquals(0x2, Integer.rotateLeft(1, 1)); + assertEquals(0x10, Integer.rotateLeft(1, 4)); + assertEquals(-1, Integer.rotateLeft(-1, 4)); + assertEquals(Integer.MIN_VALUE, Integer.rotateLeft(0x40000000, 1)); + assertEquals(1, Integer.rotateLeft(Integer.MIN_VALUE, 1)); + } + + public void testRotateRight() { + assertEquals(0, Integer.rotateRight(0, 4)); + assertEquals(Integer.MIN_VALUE, Integer.rotateRight(1, 1)); + assertEquals(0x10000000, Integer.rotateRight(1, 4)); + assertEquals(-1, Integer.rotateRight(-1, 4)); + } + + public void testSignum() { + assertEquals(0, Integer.signum(0)); + assertEquals(1, Integer.signum(1)); + assertEquals(-1, Integer.signum(-1)); + assertEquals(1, Integer.signum(Integer.MAX_VALUE)); + assertEquals(-1, Integer.signum(Integer.MIN_VALUE)); + } + + public void testStaticValueOf() { + assertEquals(Integer.MIN_VALUE, + Integer.valueOf(Integer.MIN_VALUE).intValue()); + assertEquals(Integer.MAX_VALUE, + Integer.valueOf(Integer.MAX_VALUE).intValue()); + } + + public void testToString() { + assertEquals("12345", new Integer(12345).toString()); + assertEquals("-12345", new Integer("-12345").toString()); + } + public void testValueOf() { assertEquals(new Integer(12345), Integer.valueOf("12345")); assertEquals(new Integer(1865), Integer.valueOf("12345", 6)); @@ -127,30 +235,20 @@ assertEquals(1865, Integer.parseInt("12345", 6)); } - public void testHexString() { - assertEquals("3039", Integer.toHexString(12345)); - assertEquals("0", Integer.toHexString(0)); - assertEquals("ffffcfc7", Integer.toHexString(-12345)); - } - - public void testBinaryString() { - assertEquals("11000000111001", Integer.toBinaryString(12345)); - assertEquals("0", Integer.toBinaryString(0)); - assertEquals("11111111111111111100111111000111", Integer.toBinaryString(-12345)); - } - public void testXValue() { - assertEquals("short",(short) 12345, new Integer(12345).shortValue()); + assertEquals("short", (short) 12345, new Integer(12345).shortValue()); assertEquals("long", 1234567890L, new Integer(1234567890).longValue()); - assertEquals("double", 12345d, new Integer(12345).doubleValue(),0.001); - assertEquals("float",12345f, new Integer(12345).floatValue(),0.01); + assertEquals("double", 12345d, new Integer(12345).doubleValue(), 0.001); + assertEquals("float", 12345f, new Integer(12345).floatValue(), 0.01); assertEquals("byte", (byte) 123, new Integer(123).byteValue()); - assertEquals("integer",123, new Integer(123).intValue()); - assertEquals("short overflow", (short) 10713, new Integer(1234512345).shortValue()); - assertEquals("double2", 1234512345d, new Integer(1234512345).doubleValue(), 0.001); + assertEquals("integer", 123, new Integer(123).intValue()); + assertEquals("short overflow", (short) 10713, + new Integer(1234512345).shortValue()); + assertEquals("double2", 1234512345d, new Integer(1234512345).doubleValue(), + 0.001); // Invalid test right now; we don't coerce to single precision - // assertEquals("float2",1234512345f, new Integer(1234512345).floatValue(),0.001); - assertEquals("byte overflow",(byte) -13, new Integer(123123).byteValue()); + // assertEquals("float2",1234512345f, new + // Integer(1234512345).floatValue(),0.001); + assertEquals("byte overflow", (byte) -13, new Integer(123123).byteValue()); } - }
diff --git a/user/test/com/google/gwt/emultest/java/lang/ShortTest.java b/user/test/com/google/gwt/emultest/java/lang/ShortTest.java new file mode 100644 index 0000000..d23d5cd --- /dev/null +++ b/user/test/com/google/gwt/emultest/java/lang/ShortTest.java
@@ -0,0 +1,44 @@ +/* + * Copyright 2007 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.emultest.java.lang; + +import com.google.gwt.junit.client.GWTTestCase; + +/** + * Tests for the JRE Short type. + */ +public class ShortTest extends GWTTestCase { + + public String getModuleName() { + return "com.google.gwt.emultest.EmulSuite"; + } + + public void testConstants() { + assertEquals(16, Short.SIZE); + assertEquals((short) 0x7fff, Short.MAX_VALUE); + assertEquals((short) 0x8000, Short.MIN_VALUE); + } + + public void testReverseBytes() { + assertEquals(0x1122, Short.reverseBytes((short) 0x2211)); + assertEquals(0, Short.reverseBytes((short) 0)); + } + + public void testStaticValueOf() { + assertEquals(Short.MIN_VALUE, Short.valueOf(Short.MIN_VALUE).shortValue()); + assertEquals(Short.MAX_VALUE, Short.valueOf(Short.MAX_VALUE).shortValue()); + } +}