/* * 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. */ import junit.framework.TestCase; import java.lang.Double; import java.lang.Float; import java.lang.Integer; import java.lang.Long; /** * Verify overflow conversions of floating point to ints and longs are * the same as with the JVM. This test should pass both with the JVM and * as a J2ObjC binary, to assure its assumptions are correct. */ public class MaxFloatingPointTest extends TestCase { private static final String MAX_LONG_AS_STRING = "9223372036854775806"; public void testDoubleConversions() { if (System.getProperty("os.arch").equals("armv7")) { return; } Double maxDouble = Double.MAX_VALUE; assertEquals(Integer.MAX_VALUE, maxDouble.intValue()); assertEquals(Long.MAX_VALUE, maxDouble.longValue()); } public void testFloatConversions() { if (System.getProperty("os.arch").equals("armv7")) { return; } Float maxFloat = Float.MAX_VALUE; assertEquals(Integer.MAX_VALUE, maxFloat.intValue()); assertEquals(Long.MAX_VALUE, maxFloat.longValue()); } public void testDoubleStringParsing() { Double.parseDouble("9223372036854775804"); Double.parseDouble("9223372036854775805"); Double.parseDouble("9223372036854775806"); Double.parseDouble("9223372036854775807"); assertEquals(Long.MAX_VALUE, (long) Double.parseDouble(MAX_LONG_AS_STRING)); } public void testFloatStringParsing() { assertEquals(Long.MAX_VALUE, (long) Float.parseFloat(MAX_LONG_AS_STRING)); } // Results are from the results of the Java Language Specification's // Example 5.1.3-1. Narrowing Primitive Conversion. public void testFloatNarrowing() { if (System.getProperty("os.arch").equals("armv7")) { return; } float fmin = Float.NEGATIVE_INFINITY; float fmax = Float.POSITIVE_INFINITY; assertEquals("fmin as long failed", Long.MIN_VALUE, (long) fmin); assertEquals("fmax as long failed", Long.MAX_VALUE, (long) fmax); assertEquals("fmin as int failed", Integer.MIN_VALUE, (int) fmin); assertEquals("fmax as int failed", Integer.MAX_VALUE, (int) fmax); assertEquals("fmin as char failed", Character.MIN_VALUE, (char) fmin); assertEquals("fmax as char failed", Character.MAX_VALUE, (char) fmax); // Surprising values for shorts and bytes, but that's what's specified. assertEquals("fmin as short failed", 0, (short) fmin); assertEquals("fmax as short failed", -1, (short) fmax); assertEquals("fmin as byte failed", 0, (byte) fmin); assertEquals("fmax as byte failed", -1, (byte) fmax); } public void testDoubleNarrowing() { if (System.getProperty("os.arch").equals("armv7")) { return; } double dmin = Double.NEGATIVE_INFINITY; double dmax = Double.POSITIVE_INFINITY; assertEquals("dmin as long failed", Long.MIN_VALUE, (long) dmin); assertEquals("dmax as long failed", Long.MAX_VALUE, (long) dmax); assertEquals("dmin as int failed", Integer.MIN_VALUE, (int) dmin); assertEquals("dmax as int failed", Integer.MAX_VALUE, (int) dmax); assertEquals("dmin as char failed", Character.MIN_VALUE, (char) dmin); assertEquals("dmax as char failed", Character.MAX_VALUE, (char) dmax); assertEquals("dmin as short failed", 0, (short) dmin); assertEquals("dmax as short failed", -1, (short) dmax); assertEquals("dmin as byte failed", 0, (byte) dmin); assertEquals("dmax as byte failed", -1, (byte) dmax); } public void testCompoundOperators() { int i = Integer.MAX_VALUE; i += 1.0; assertEquals(Integer.MAX_VALUE, i); i *= 1.5; assertEquals(Integer.MAX_VALUE, i); i -= -1.0; assertEquals(Integer.MAX_VALUE, i); i /= 0.5; assertEquals(Integer.MAX_VALUE, i); long l = Long.MAX_VALUE; l += 1.0; assertEquals(Long.MAX_VALUE, l); l *= 1.5; assertEquals(Long.MAX_VALUE, l); l -= -1.0; assertEquals(Long.MAX_VALUE, l); l /= 0.5; assertEquals(Long.MAX_VALUE, l); } public void testNaNConversions() { double d = Double.NaN; float f = Float.NaN; assertEquals(0L, (long) d); assertEquals(0, (int) d); assertEquals('\0', (char) d); assertEquals(0L, (long) f); assertEquals(0, (int) f); assertEquals('\0', (char) f); } }