809N/A/*
2362N/A * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
809N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
809N/A *
809N/A * This code is free software; you can redistribute it and/or modify it
809N/A * under the terms of the GNU General Public License version 2 only, as
809N/A * published by the Free Software Foundation.
809N/A *
809N/A * This code is distributed in the hope that it will be useful, but WITHOUT
809N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
809N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
809N/A * version 2 for more details (a copy is included in the LICENSE file that
809N/A * accompanied this code).
809N/A *
809N/A * You should have received a copy of the GNU General Public License version
809N/A * 2 along with this work; if not, write to the Free Software Foundation,
809N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
809N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
809N/A */
809N/A
809N/A/*
809N/A * @test
809N/A * @bug 6325535
809N/A * @summary Test for the rounding behavior of negate(MathContext)
809N/A * @author Joseph D. Darcy
809N/A */
809N/A
809N/Aimport java.math.*;
809N/A
809N/Apublic class NegateTests {
809N/A
809N/A static BigDecimal negateThenRound(BigDecimal bd, MathContext mc) {
809N/A return bd.negate().plus(mc);
809N/A }
809N/A
809N/A
809N/A static BigDecimal absThenRound(BigDecimal bd, MathContext mc) {
809N/A return bd.abs().plus(mc);
809N/A }
809N/A
809N/A
809N/A static int negateTest(BigDecimal[][] testCases, MathContext mc) {
809N/A int failures = 0;
809N/A
809N/A for (BigDecimal [] testCase : testCases) {
809N/A
809N/A BigDecimal bd = testCase[0];
809N/A BigDecimal neg1 = bd.negate(mc);
809N/A BigDecimal neg2 = negateThenRound(bd, mc);
809N/A BigDecimal expected = testCase[1];
809N/A
809N/A if (! neg1.equals(expected) ) {
809N/A failures++;
809N/A System.err.println("(" + bd + ").negate(" + mc + ") => " +
809N/A neg1 + " != expected " + expected);
809N/A }
809N/A
809N/A if (! neg1.equals(neg2) ) {
809N/A failures++;
809N/A System.err.println("(" + bd + ").negate(" + mc + ") => " +
809N/A neg1 + " != ntr " + neg2);
809N/A }
809N/A
809N/A // Test abs consistency
809N/A BigDecimal abs = bd.abs(mc);
809N/A BigDecimal expectedAbs = absThenRound(bd,mc);
809N/A if (! abs.equals(expectedAbs) ) {
809N/A failures++;
809N/A System.err.println("(" + bd + ").abs(" + mc + ") => " +
809N/A abs + " != atr " + expectedAbs);
809N/A }
809N/A
809N/A }
809N/A
809N/A return failures;
809N/A }
809N/A
809N/A static int negateTests() {
809N/A int failures = 0;
809N/A BigDecimal [][] testCasesCeiling = {
809N/A {new BigDecimal("1.3"), new BigDecimal("-1")},
809N/A {new BigDecimal("-1.3"), new BigDecimal("2")},
809N/A };
809N/A
809N/A failures += negateTest(testCasesCeiling,
809N/A new MathContext(1, RoundingMode.CEILING));
809N/A
809N/A BigDecimal [][] testCasesFloor = {
809N/A {new BigDecimal("1.3"), new BigDecimal("-2")},
809N/A {new BigDecimal("-1.3"), new BigDecimal("1")},
809N/A };
809N/A
809N/A failures += negateTest(testCasesFloor,
809N/A new MathContext(1, RoundingMode.FLOOR));
809N/A
809N/A return failures;
809N/A }
809N/A
809N/A public static void main(String argv[]) {
809N/A int failures = 0;
809N/A
809N/A failures += negateTests();
809N/A
809N/A if (failures > 0 )
809N/A throw new RuntimeException("Incurred " + failures + " failures" +
809N/A " testing the negate and/or abs.");
809N/A }
809N/A}