jdk/test/java/lang/Math/ExactArithTests.java
author sherman
Thu, 16 Feb 2012 11:43:20 -0800
changeset 11905 646e7e50c2d7
child 19406 10093962bbf3
permissions -rw-r--r--
6708398: Support integer overflow Summary: Added add/sub/multiply/toIntExact methods to j.l.Math and StrictMath classes Reviewed-by: emcmanus Contributed-by: roger.riggs@oracle.com
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
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   135
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   136
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   137
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   138
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   139
     * Test Math.addExact, multiplyExact, subtractExact, toIntExact methods
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   140
     * with {@code long} arguments.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   141
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   142
    static void testLongExact() {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   143
        testLongExactTwice(0, 0);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   144
        testLongExactTwice(1, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   145
        testLongExactTwice(1, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   146
        testLongExactTwice(1000, 2000);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   147
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   148
        testLongExactTwice(Long.MIN_VALUE, Long.MIN_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   149
        testLongExactTwice(Long.MAX_VALUE, Long.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   150
        testLongExactTwice(Long.MIN_VALUE, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   151
        testLongExactTwice(Long.MAX_VALUE, 1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   152
        testLongExactTwice(Long.MIN_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   153
        testLongExactTwice(Long.MAX_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   154
        testLongExactTwice(Long.MIN_VALUE, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   155
        testLongExactTwice(Long.MAX_VALUE, -1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   156
        testLongExactTwice(Long.MIN_VALUE, -2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   157
        testLongExactTwice(Long.MAX_VALUE, -2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   158
        testLongExactTwice(Long.MIN_VALUE/2, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   159
        testLongExactTwice(Long.MAX_VALUE, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   160
        testLongExactTwice(Integer.MAX_VALUE, Integer.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   161
        testLongExactTwice(Integer.MAX_VALUE, -Integer.MAX_VALUE);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   162
        testLongExactTwice(Integer.MAX_VALUE+1, Integer.MAX_VALUE+1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   163
        testLongExactTwice(Integer.MAX_VALUE+1, -Integer.MAX_VALUE+1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   164
        testLongExactTwice(Integer.MIN_VALUE-1, Integer.MIN_VALUE-1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   165
        testLongExactTwice(Integer.MIN_VALUE-1, -Integer.MIN_VALUE-1);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   166
        testLongExactTwice(Integer.MIN_VALUE/2, 2);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   167
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   168
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   169
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   170
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   171
     * Test each of the exact operations with the arguments and
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   172
     * with the arguments reversed.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   173
     * @param x
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   174
     * @param y
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   175
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   176
    static void testLongExactTwice(long x, long y) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   177
        testLongExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   178
        testLongExact(y, x);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   179
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   180
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   181
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   182
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   183
     * Test long exact arithmetic by comparing with the same operations using BigInteger
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   184
     * and checking that the result is the same as the long truncation.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   185
     * Errors are reported with {@link fail}.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   186
     *
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   187
     * @param x first parameter
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   188
     * @param y second parameter
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   189
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   190
    static void testLongExact(long x, long y) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   191
        BigInteger resultBig = null;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   192
        final BigInteger xBig = BigInteger.valueOf(x);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   193
        final BigInteger yBig = BigInteger.valueOf(y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   194
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   195
            // Test addExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   196
            resultBig = xBig.add(yBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   197
            long sum = Math.addExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   198
            checkResult("long Math.addExact", x, y, sum, resultBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   199
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   200
            if (inLongRange(resultBig)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   201
                fail("FAIL: long Math.addExact(" + x + " + " + y + "); Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   202
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   203
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   204
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   205
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   206
            // Test subtractExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   207
            resultBig = xBig.subtract(yBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   208
            long diff = Math.subtractExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   209
            checkResult("long Math.subtractExact", x, y, diff, resultBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   210
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   211
            if (inLongRange(resultBig)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   212
                fail("FAIL: long Math.subtractExact(" + x + " - " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   213
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   214
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   215
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   216
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   217
            // Test multiplyExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   218
            resultBig = xBig.multiply(yBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   219
            long product = Math.multiplyExact(x, y);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   220
            checkResult("long Math.multiplyExact", x, y, product, resultBig);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   221
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   222
            if (inLongRange(resultBig)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   223
                fail("FAIL: long Math.multiplyExact(" + x + " * " + y + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   224
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   225
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   226
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   227
        try {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   228
            // Test toIntExact
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   229
            int value = Math.toIntExact(x);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   230
            if ((long)value != x) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   231
                fail("FAIL: " + "long Math.toIntExact" + "(" + x + ") = " + value + "; expected an arithmetic exception: ");
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   232
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   233
        } catch (ArithmeticException ex) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   234
            if (resultBig.bitLength() <= 32) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   235
                fail("FAIL: long Math.toIntExact(" + x + ")" + "; Unexpected exception: " + ex);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   236
            }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   237
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   238
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   239
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   240
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   241
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   242
     * Compare the expected and actual results.
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   243
     * @param message message for the error
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   244
     * @param x first argument
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   245
     * @param y second argument
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   246
     * @param result actual result value
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   247
     * @param expected expected result value
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   248
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   249
    static void checkResult(String message, long x, long y, long result, BigInteger expected) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   250
        BigInteger resultBig = BigInteger.valueOf(result);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   251
        if (!inLongRange(expected)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   252
            fail("FAIL: " + message + "(" + x + ", " + y + ") = " + result + "; expected an arithmetic exception: ");
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   253
        } else if (!resultBig.equals(expected)) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   254
            fail("FAIL: " + message + "(" + x + ", " + y + ") = " + result + "; expected " + expected);
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   255
        }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   256
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   257
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   258
    /**
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   259
     * Check if the value fits in 64 bits (a long).
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   260
     * @param value
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   261
     * @return true if the value fits in 64 bits (including the sign).
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   262
     */
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   263
    static boolean inLongRange(BigInteger value) {
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   264
        return value.bitLength() <= 63;
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   265
    }
646e7e50c2d7 6708398: Support integer overflow
sherman
parents:
diff changeset
   266
}