jdk/test/java/lang/Math/ExactArithTests.java
author jrose
Sat, 05 Oct 2013 05:30:38 -0700
changeset 20528 0b1e2130d3f7
parent 19406 10093962bbf3
child 23010 6dadb192ad81
permissions -rw-r--r--
8001105: findVirtual of Object[].clone produces internal error Summary: Replicate JVM logic for access control that makes Object.clone appear public when applied to an array type. Reviewed-by: twisti
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11905
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     1
/*
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     4
 *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     8
 *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    13
 * accompanied this code).
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    14
 *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    18
 *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    21
 * questions.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    22
 */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    23
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    24
import java.math.BigInteger;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    25
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    26
/**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    27
 * @test Test for Math.*Exact integer and long methods.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    28
 * @bug 6708398
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    29
 * @summary Basic tests for Math exact arithmetic operations.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    30
 *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    31
 * @author Roger Riggs
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    32
 */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    33
public class ExactArithTests {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    34
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    35
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    36
     * The count of test errors.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    37
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    38
    private static int errors = 0;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    39
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    40
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    41
     * @param args the command line arguments
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    42
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    43
    public static void main(String[] args) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    44
        testIntegerExact();
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    45
        testLongExact();
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    46
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    47
        if (errors > 0) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    48
            throw new RuntimeException(errors + " errors found in ExactArithTests.");
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    49
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    50
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    51
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    52
    static void fail(String message) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    53
        errors++;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    54
        System.err.println(message);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    55
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    56
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    57
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    58
     * Test Math.addExact, multiplyExact, subtractExact, toIntValue methods
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    59
     * with {@code int} arguments.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    60
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    61
    static void testIntegerExact() {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    62
        testIntegerExact(0, 0);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    63
        testIntegerExact(1, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    64
        testIntegerExact(1, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    65
        testIntegerExact(-1, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    66
        testIntegerExact(1000, 2000);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    67
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    68
        testIntegerExact(Integer.MIN_VALUE, Integer.MIN_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    69
        testIntegerExact(Integer.MAX_VALUE, Integer.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    70
        testIntegerExact(Integer.MIN_VALUE, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    71
        testIntegerExact(Integer.MAX_VALUE, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    72
        testIntegerExact(Integer.MIN_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    73
        testIntegerExact(Integer.MAX_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    74
        testIntegerExact(Integer.MIN_VALUE, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    75
        testIntegerExact(Integer.MAX_VALUE, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    76
        testIntegerExact(Integer.MIN_VALUE, -2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    77
        testIntegerExact(Integer.MAX_VALUE, -2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    78
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    79
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    80
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    81
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    82
     * Test exact arithmetic by comparing with the same operations using long
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    83
     * and checking that the result is the same as the integer truncation.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    84
     * Errors are reported with {@link fail}.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    85
     *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    86
     * @param x first parameter
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    87
     * @param y second parameter
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    88
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    89
    static void testIntegerExact(int x, int y) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    90
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    91
            // Test addExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    92
            int sum = Math.addExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    93
            long sum2 = (long) x + (long) y;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    94
            if ((int) sum2 != sum2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    95
                fail("FAIL: int Math.addExact(" + x + " + " + y + ") = " + sum + "; expected Arithmetic exception");
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    96
            } else if (sum != sum2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    97
                fail("FAIL: long Math.addExact(" + x + " + " + y + ") = " + sum + "; expected: " + sum2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    98
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
    99
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   100
            long sum2 = (long) x + (long) y;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   101
            if ((int) sum2 == sum2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   102
                fail("FAIL: int Math.addExact(" + x + " + " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   103
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   104
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   105
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   106
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   107
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   108
            // Test subtractExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   109
            int diff = Math.subtractExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   110
            long diff2 = (long) x - (long) y;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   111
            if ((int) diff2 != diff2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   112
                fail("FAIL: int Math.subtractExact(" + x + " - " + y + ") = " + diff + "; expected: " + diff2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   113
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   114
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   115
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   116
            long diff2 = (long) x - (long) y;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   117
            if ((int) diff2 == diff2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   118
                fail("FAIL: int Math.subtractExact(" + x + " - " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   119
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   120
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   121
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   122
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   123
            // Test multiplyExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   124
            int product = Math.multiplyExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   125
            long m2 = (long) x * (long) y;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   126
            if ((int) m2 != m2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   127
                fail("FAIL: int Math.multiplyExact(" + x + " * " + y + ") = " + product + "; expected: " + m2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   128
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   129
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   130
            long m2 = (long) x * (long) y;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   131
            if ((int) m2 == m2) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   132
                fail("FAIL: int Math.multiplyExact(" + x + " * " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   133
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   134
        }
19406
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   135
        try {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   136
            // Test incrementExact
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   137
            int inc = Math.incrementExact(x);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   138
            long inc2 = (long) x + 1L;
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   139
            if ((int) inc2 != inc2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   140
                fail("FAIL: int Math.incrementExact(" + x + ") = " + inc + "; expected Arithmetic exception");
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   141
            } else if (inc != inc2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   142
                fail("FAIL: long Math.incrementExact(" + x + ") = " + inc + "; expected: " + inc2);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   143
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   144
        } catch (ArithmeticException ex) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   145
            long inc2 = (long) x + 1L;
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   146
            if ((int) inc2 == inc2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   147
                fail("FAIL: int Math.incrementExact(" + x + ")" + "; Unexpected exception: " + ex);
11905
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   148
19406
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   149
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   150
        }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   151
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   152
        try {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   153
            // Test decrementExact
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   154
            int dec = Math.decrementExact(x);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   155
            long dec2 = (long) x - 1L;
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   156
            if ((int) dec2 != dec2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   157
                fail("FAIL: int Math.decrementExact(" + x + ") = " + dec + "; expected Arithmetic exception");
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   158
            } else if (dec != dec2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   159
                fail("FAIL: long Math.decrementExact(" + x + ") = " + dec + "; expected: " + dec2);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   160
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   161
        } catch (ArithmeticException ex) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   162
            long dec2 = (long) x - 1L;
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   163
            if ((int) dec2 == dec2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   164
                fail("FAIL: int Math.decrementExact(" + x + ")" + "; Unexpected exception: " + ex);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   165
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   166
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   167
        }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   168
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   169
        try {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   170
            // Test negateExact
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   171
            int neg = Math.negateExact(x);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   172
            long neg2 = -((long)x) ;
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   173
            if ((int) neg2 != neg2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   174
                fail("FAIL: int Math.negateExact(" + x + ") = " + neg + "; expected Arithmetic exception");
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   175
            } else if (neg != neg2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   176
                fail("FAIL: long Math.negateExact(" + x + ") = " + neg + "; expected: " + neg2);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   177
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   178
        } catch (ArithmeticException ex) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   179
            long neg2 = (long) x - 1L;
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   180
            if ((int) neg2 == neg2) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   181
                fail("FAIL: int Math.negateExact(" + x + ")" + "; Unexpected exception: " + ex);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   182
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   183
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   184
        }
11905
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   185
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   186
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   187
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   188
     * Test Math.addExact, multiplyExact, subtractExact, toIntExact methods
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   189
     * with {@code long} arguments.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   190
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   191
    static void testLongExact() {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   192
        testLongExactTwice(0, 0);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   193
        testLongExactTwice(1, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   194
        testLongExactTwice(1, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   195
        testLongExactTwice(1000, 2000);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   196
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   197
        testLongExactTwice(Long.MIN_VALUE, Long.MIN_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   198
        testLongExactTwice(Long.MAX_VALUE, Long.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   199
        testLongExactTwice(Long.MIN_VALUE, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   200
        testLongExactTwice(Long.MAX_VALUE, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   201
        testLongExactTwice(Long.MIN_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   202
        testLongExactTwice(Long.MAX_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   203
        testLongExactTwice(Long.MIN_VALUE, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   204
        testLongExactTwice(Long.MAX_VALUE, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   205
        testLongExactTwice(Long.MIN_VALUE, -2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   206
        testLongExactTwice(Long.MAX_VALUE, -2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   207
        testLongExactTwice(Long.MIN_VALUE/2, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   208
        testLongExactTwice(Long.MAX_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   209
        testLongExactTwice(Integer.MAX_VALUE, Integer.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   210
        testLongExactTwice(Integer.MAX_VALUE, -Integer.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   211
        testLongExactTwice(Integer.MAX_VALUE+1, Integer.MAX_VALUE+1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   212
        testLongExactTwice(Integer.MAX_VALUE+1, -Integer.MAX_VALUE+1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   213
        testLongExactTwice(Integer.MIN_VALUE-1, Integer.MIN_VALUE-1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   214
        testLongExactTwice(Integer.MIN_VALUE-1, -Integer.MIN_VALUE-1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   215
        testLongExactTwice(Integer.MIN_VALUE/2, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   216
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   217
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   218
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   219
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   220
     * Test each of the exact operations with the arguments and
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   221
     * with the arguments reversed.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   222
     * @param x
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   223
     * @param y
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   224
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   225
    static void testLongExactTwice(long x, long y) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   226
        testLongExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   227
        testLongExact(y, x);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   228
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   229
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   230
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   231
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   232
     * Test long exact arithmetic by comparing with the same operations using BigInteger
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   233
     * and checking that the result is the same as the long truncation.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   234
     * Errors are reported with {@link fail}.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   235
     *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   236
     * @param x first parameter
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   237
     * @param y second parameter
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   238
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   239
    static void testLongExact(long x, long y) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   240
        BigInteger resultBig = null;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   241
        final BigInteger xBig = BigInteger.valueOf(x);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   242
        final BigInteger yBig = BigInteger.valueOf(y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   243
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   244
            // Test addExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   245
            resultBig = xBig.add(yBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   246
            long sum = Math.addExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   247
            checkResult("long Math.addExact", x, y, sum, resultBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   248
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   249
            if (inLongRange(resultBig)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   250
                fail("FAIL: long Math.addExact(" + x + " + " + y + "); Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   251
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   252
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   253
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   254
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   255
            // Test subtractExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   256
            resultBig = xBig.subtract(yBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   257
            long diff = Math.subtractExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   258
            checkResult("long Math.subtractExact", x, y, diff, resultBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   259
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   260
            if (inLongRange(resultBig)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   261
                fail("FAIL: long Math.subtractExact(" + x + " - " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   262
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   263
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   264
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   265
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   266
            // Test multiplyExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   267
            resultBig = xBig.multiply(yBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   268
            long product = Math.multiplyExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   269
            checkResult("long Math.multiplyExact", x, y, product, resultBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   270
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   271
            if (inLongRange(resultBig)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   272
                fail("FAIL: long Math.multiplyExact(" + x + " * " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   273
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   274
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   275
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   276
        try {
19406
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   277
            // Test incrementExact
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   278
            resultBig = xBig.add(BigInteger.ONE);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   279
            long inc = Math.incrementExact(x);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   280
            checkResult("long Math.incrementExact", x, 1L, inc, resultBig);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   281
        } catch (ArithmeticException ex) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   282
            if (inLongRange(resultBig)) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   283
                fail("FAIL: long Math.incrementExact(" + x + "); Unexpected exception: " + ex);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   284
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   285
        }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   286
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   287
        try {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   288
            // Test decrementExact
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   289
            resultBig = xBig.subtract(BigInteger.ONE);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   290
            long dec = Math.decrementExact(x);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   291
            checkResult("long Math.decrementExact", x, 1L, dec, resultBig);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   292
        } catch (ArithmeticException ex) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   293
            if (inLongRange(resultBig)) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   294
                fail("FAIL: long Math.decrementExact(" + x + "); Unexpected exception: " + ex);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   295
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   296
        }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   297
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   298
        try {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   299
            // Test negateExact
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   300
            resultBig = xBig.negate();
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   301
            long dec = Math.negateExact(x);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   302
            checkResult("long Math.negateExact", x, 0L, dec, resultBig);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   303
        } catch (ArithmeticException ex) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   304
            if (inLongRange(resultBig)) {
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   305
                fail("FAIL: long Math.negateExact(" + x + "); Unexpected exception: " + ex);
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   306
            }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   307
        }
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   308
10093962bbf3 8022109: Evaluate adding incrementExact, decrementExact, negateExact to java.lang.Math
bpb
parents: 11905
diff changeset
   309
        try {
11905
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   310
            // Test toIntExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   311
            int value = Math.toIntExact(x);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   312
            if ((long)value != x) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   313
                fail("FAIL: " + "long Math.toIntExact" + "(" + x + ") = " + value + "; expected an arithmetic exception: ");
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   314
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   315
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   316
            if (resultBig.bitLength() <= 32) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   317
                fail("FAIL: long Math.toIntExact(" + x + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   318
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   319
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   320
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   321
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   322
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   323
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   324
     * Compare the expected and actual results.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   325
     * @param message message for the error
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   326
     * @param x first argument
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   327
     * @param y second argument
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   328
     * @param result actual result value
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   329
     * @param expected expected result value
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   330
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   331
    static void checkResult(String message, long x, long y, long result, BigInteger expected) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   332
        BigInteger resultBig = BigInteger.valueOf(result);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   333
        if (!inLongRange(expected)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   334
            fail("FAIL: " + message + "(" + x + ", " + y + ") = " + result + "; expected an arithmetic exception: ");
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   335
        } else if (!resultBig.equals(expected)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   336
            fail("FAIL: " + message + "(" + x + ", " + y + ") = " + result + "; expected " + expected);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   337
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   338
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   339
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   340
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   341
     * Check if the value fits in 64 bits (a long).
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   342
     * @param value
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   343
     * @return true if the value fits in 64 bits (including the sign).
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   344
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   345
    static boolean inLongRange(BigInteger value) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   346
        return value.bitLength() <= 63;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   347
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   348
}