Path: blob/master/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java
41152 views
/*1* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/22/*23* @test24* @bug 4904082 4917089 6337226 637850325* @summary Tests that integral division and related methods return the proper result and scale.26* @author Joseph D. Darcy27*/28import java.math.*;29public class IntegralDivisionTests {3031static int dividetoIntegralValueTests() {32int failures = 0;3334// Exact integer quotient should have the same results from35// the exact divide and dividetoIntegralValue363738// Rounded results39BigDecimal [][] moreTestCases = {40{new BigDecimal("11003"), new BigDecimal("10"), new BigDecimal("1100")},41{new BigDecimal("11003"), new BigDecimal("1e1"), new BigDecimal("1100.0")},42{new BigDecimal("1e9"), new BigDecimal("1"), new BigDecimal("1e9")},43{new BigDecimal("1e9"), new BigDecimal("1.00"), new BigDecimal("1e9")},44{new BigDecimal("1e9"), new BigDecimal("0.1"), new BigDecimal("1e10")},45{new BigDecimal("10e8"), new BigDecimal("0.1"), new BigDecimal("10e9")},46{new BigDecimal("400e1"), new BigDecimal("5"), new BigDecimal("80e1")},47{new BigDecimal("400e1"), new BigDecimal("4.999999999"), new BigDecimal("8e2")},48{new BigDecimal("40e2"), new BigDecimal("5"), new BigDecimal("8e2")},49{BigDecimal.valueOf(1, Integer.MIN_VALUE),50BigDecimal.valueOf(1, -(Integer.MAX_VALUE & 0x7fffff00)),51BigDecimal.valueOf(1, -256)},52};5354for(BigDecimal [] testCase: moreTestCases) {55BigDecimal quotient;56if (! (quotient=testCase[0].divideToIntegralValue(testCase[1])).equals(testCase[2]) ){57failures++;58// BigDecimal exact = testCase[0].divide(testCase[1]);59System.err.println();60System.err.println("dividend = " + testCase[0] + " scale = " + testCase[0].scale());61System.err.println("divisor = " + testCase[1] + " scale = " + testCase[1].scale());62System.err.println("quotient = " + quotient + " scale = " + quotient.scale());63System.err.println("expected = " + testCase[2] + " scale = " + testCase[2].scale());64// System.err.println("exact = " + exact + " scale = " + exact.scale());65}66}6768return failures;69}7071static int dividetoIntegralValueRoundedTests() {72int failures = 0;7374BigDecimal dividend = new BigDecimal("11003");75BigDecimal divisor = new BigDecimal("10");76BigDecimal [] quotients = { // Expected results with precision =77new BigDecimal("1100"), // 078null, // 179new BigDecimal("11e2"), // 280new BigDecimal("110e1"), // 381new BigDecimal("1100"), // 482};83failures += divideContextTestPrecs(dividend, divisor, quotients);8485dividend = new BigDecimal("11003");86divisor = new BigDecimal("1e1");87BigDecimal [] quotients2 = { // Expected results with precision =88new BigDecimal("1100.0"), // 089null, // 190new BigDecimal("11e2"), // 291new BigDecimal("110e1"), // 392new BigDecimal("1100"), // 493new BigDecimal("1100.0"), // 594};95failures += divideContextTestPrecs(dividend, divisor, quotients2);9697dividend = new BigDecimal("1230000");98divisor = new BigDecimal("100");99BigDecimal [] quotients3 = { // Expected results with precision =100new BigDecimal("12300"), // 0101null, // 1102null, // 2103new BigDecimal("123e2"), // 3104new BigDecimal("1230e1"), // 4105new BigDecimal("12300"), // 5106};107failures += divideContextTestPrecs(dividend, divisor, quotients3);108109dividend = new BigDecimal("33");110divisor = new BigDecimal("3");111BigDecimal [] quotients4 = { // Expected results with precision =112new BigDecimal("11"), // 0113null, // 1114new BigDecimal("11"), // 2115new BigDecimal("11"), // 3116};117failures += divideContextTestPrecs(dividend, divisor, quotients4);118119dividend = new BigDecimal("34");120divisor = new BigDecimal("3");121BigDecimal [] quotients5 = { // Expected results with precision =122new BigDecimal("11"), // 0123null, // 1124new BigDecimal("11"), // 2125new BigDecimal("11"), // 3126};127failures += divideContextTestPrecs(dividend, divisor, quotients5);128129return failures;130}131132static int divideContextTestPrecs(BigDecimal dividend,133BigDecimal divisor,134BigDecimal[] quotients)135{136int failures = 0;137for(int i = 0; i < quotients.length; i++) {138BigDecimal result = null;139BigDecimal quotient = quotients[i];140141try {142result = dividend.divideToIntegralValue(divisor,143new MathContext(i, RoundingMode.DOWN));144} catch (ArithmeticException e) {145if (quotient != null) {146failures++;147System.err.println();148System.err.println("Unexpected exception:");149System.err.println("dividend = " + dividend + " scale = " + dividend.scale());150System.err.println("divisor = " + divisor + " scale = " + divisor.scale());151System.err.println("expected = " + quotient + " scale = " + quotient.scale());152}153}154155if (quotient != null) {156if (! result.equals(quotient)) {157failures++;158System.err.println();159System.err.println("Unexpected result:");160System.err.println("dividend = " + dividend + " scale = " + dividend.scale());161System.err.println("divisor = " + divisor + " scale = " + divisor.scale());162System.err.println("quotient = " + result + " scale = " + result.scale());163System.err.println("expected = " + quotient + " scale = " + quotient.scale());164System.err.println("precision = " + i);165}166} else {167if (result != null) {168failures++;169System.err.println();170System.err.println("Unexpected unexceptional result:");171System.err.println("dividend = " + dividend + " scale = " + dividend.scale());172System.err.println("divisor = " + divisor + " scale = " + divisor.scale());173System.err.println("quotient = " + result + " scale = " + result.scale());174System.err.println("precision = " + i);175}176}177178}179return failures;180}181182183static int divideContextTests(BigDecimal dividend,184BigDecimal divisor,185BigDecimal expected,186MathContext mc) {187int failures = 0;188189failures += divideContextTest(dividend, divisor, expected, mc);190failures += divideContextTest(dividend.negate(), divisor.negate(), expected, mc);191192if (expected != null) {193failures += divideContextTest(dividend.negate(), divisor, expected.negate(), mc);194failures += divideContextTest(dividend, divisor.negate(), expected.negate(), mc);195}196197return failures;198}199200201static int divideContextTest(BigDecimal dividend,202BigDecimal divisor,203BigDecimal expected,204MathContext mc)205{206int failures = 0;207208BigDecimal result = null;209210try {211result = dividend.divideToIntegralValue(divisor, mc);212} catch (ArithmeticException e) {213if (expected != null) {214failures++;215System.err.println();216System.err.println("Unexpected exception:");217System.err.println("dividend = " + dividend + " scale = " + dividend.scale());218System.err.println("divisor = " + divisor + " scale = " + divisor.scale());219System.err.println("expected = " + expected + " scale = " + expected.scale());220System.err.println("MathContext = " + mc);221}222}223224if (expected != null) {225if (! result.equals(expected)) {226failures++;227System.err.println();228System.err.println("Unexpected result:");229System.err.println("dividend = " + dividend + " scale = " + dividend.scale());230System.err.println("divisor = " + divisor + " scale = " + divisor.scale());231System.err.println("expected = " + expected + " scale = " + expected.scale());232System.err.println("result = " + result + " scale = " + result.scale());233System.err.println("MathContext = " + mc);234}235} else {236if (result != null) {237failures++;238System.err.println();239System.err.println("Unexpected unexceptional result:");240System.err.println("dividend = " + dividend + " scale = " + dividend.scale());241System.err.println("divisor = " + divisor + " scale = " + divisor.scale());242System.err.println("quotient = " + result + " scale = " + result.scale());243System.err.println("MathConext = " + mc);244}245}246247return failures;248}249250static int dividetoIntegralValueScalingTests() {251int failures = 0;252253BigDecimal dividend = new BigDecimal("123456789000");254BigDecimal divisor = BigDecimal.ONE;255BigDecimal expected = new BigDecimal("123456789e3");256MathContext mc = new MathContext(9,RoundingMode.DOWN);257failures += divideContextTests(dividend, divisor, expected, mc);258259260// 100/3 = 33 remainder 1261int [] precisions = {0, 2, 3, 4};262dividend = new BigDecimal(100);263divisor = new BigDecimal(3);264expected = new BigDecimal(33);265266for(RoundingMode rm: RoundingMode.values())267for(int precision: precisions) {268failures += divideContextTests(dividend, divisor, expected,269new MathContext(precision, rm));270}271272// 123000/10 = 12300 remainder 0273dividend = new BigDecimal(123000);274divisor = new BigDecimal(10);275int[] precisions1 = {0, 1, 2, 3, 4, 5};276BigDecimal[] expected1 = {277new BigDecimal("12300"),278null,279null,280new BigDecimal("123e2"),281new BigDecimal("1230e1"),282new BigDecimal("12300"),283};284285for(RoundingMode rm: RoundingMode.values())286for(int i = 0; i < precisions1.length; i++) {287failures += divideContextTests(dividend, divisor,288expected1[i],289new MathContext(precisions1[i], rm));290}291292// 123e3/10 = 123e2 remainder 0293dividend = new BigDecimal("123e3");294divisor = new BigDecimal(10);295int[] precisions2 = {0, 1, 2, 3, 4, 5};296BigDecimal[] expected2 = {297new BigDecimal("123e2"),298null,299null,300new BigDecimal("123e2"),301new BigDecimal("123e2"),302new BigDecimal("123e2"),303};304305for(RoundingMode rm: RoundingMode.values())306for(int i = 0; i < precisions2.length; i++) {307failures += divideContextTests(dividend, divisor,308expected2[i],309new MathContext(precisions2[i], rm));310}311312313// 123000/1e1 = 12300.0 remainder 0314dividend = new BigDecimal("123000");315divisor = new BigDecimal("1e1");316int[] precisions3 = {0, 1, 2, 3, 4, 5, 6};317BigDecimal[] expected3 = {318new BigDecimal("12300.0"),319null,320null,321new BigDecimal("123e2"),322new BigDecimal("1230e1"),323new BigDecimal("12300"),324new BigDecimal("12300.0"),325};326327for(RoundingMode rm: RoundingMode.values())328for(int i = 0; i < precisions3.length; i++) {329failures += divideContextTests(dividend, divisor,330expected3[i],331new MathContext(precisions3[i], rm));332}333334335336return failures;337}338339public static void main(String argv[]) {340int failures = 0;341342failures += dividetoIntegralValueTests();343failures += dividetoIntegralValueRoundedTests();344failures += dividetoIntegralValueScalingTests();345346if (failures > 0) {347System.err.println("Encountered " + failures +348" failures while testing integral division.");349throw new RuntimeException();350}351}352}353354355