blob: 2556bbde03520e1d5a46458156a00bef100d5954 [file] [log] [blame]
darcy32db4492009-01-26 19:49:26 -08001/*
2 * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 * @test
26 * @bug 6325535
27 * @summary Test for the rounding behavior of negate(MathContext)
28 * @author Joseph D. Darcy
29 */
30
31import java.math.*;
32
33public class NegateTests {
34
35 static BigDecimal negateThenRound(BigDecimal bd, MathContext mc) {
36 return bd.negate().plus(mc);
37 }
38
39
40 static BigDecimal absThenRound(BigDecimal bd, MathContext mc) {
41 return bd.abs().plus(mc);
42 }
43
44
45 static int negateTest(BigDecimal[][] testCases, MathContext mc) {
46 int failures = 0;
47
48 for (BigDecimal [] testCase : testCases) {
49
50 BigDecimal bd = testCase[0];
51 BigDecimal neg1 = bd.negate(mc);
52 BigDecimal neg2 = negateThenRound(bd, mc);
53 BigDecimal expected = testCase[1];
54
55 if (! neg1.equals(expected) ) {
56 failures++;
57 System.err.println("(" + bd + ").negate(" + mc + ") => " +
58 neg1 + " != expected " + expected);
59 }
60
61 if (! neg1.equals(neg2) ) {
62 failures++;
63 System.err.println("(" + bd + ").negate(" + mc + ") => " +
64 neg1 + " != ntr " + neg2);
65 }
66
67 // Test abs consistency
68 BigDecimal abs = bd.abs(mc);
69 BigDecimal expectedAbs = absThenRound(bd,mc);
70 if (! abs.equals(expectedAbs) ) {
71 failures++;
72 System.err.println("(" + bd + ").abs(" + mc + ") => " +
73 abs + " != atr " + expectedAbs);
74 }
75
76 }
77
78 return failures;
79 }
80
81 static int negateTests() {
82 int failures = 0;
83 BigDecimal [][] testCasesCeiling = {
84 {new BigDecimal("1.3"), new BigDecimal("-1")},
85 {new BigDecimal("-1.3"), new BigDecimal("2")},
86 };
87
88 failures += negateTest(testCasesCeiling,
89 new MathContext(1, RoundingMode.CEILING));
90
91 BigDecimal [][] testCasesFloor = {
92 {new BigDecimal("1.3"), new BigDecimal("-2")},
93 {new BigDecimal("-1.3"), new BigDecimal("1")},
94 };
95
96 failures += negateTest(testCasesFloor,
97 new MathContext(1, RoundingMode.FLOOR));
98
99 return failures;
100 }
101
102 public static void main(String argv[]) {
103 int failures = 0;
104
105 failures += negateTests();
106
107 if (failures > 0 )
108 throw new RuntimeException("Incurred " + failures + " failures" +
109 " testing the negate and/or abs.");
110 }
111}