1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package libcore.java.math;
19
20import java.math.BigDecimal;
21import java.math.BigInteger;
22import java.math.RoundingMode;
23
24public class OldBigDecimalTest extends junit.framework.TestCase {
25    BigInteger value = new BigInteger("12345908");
26
27    /**
28     * java.math.BigDecimal#BigDecimal(double)
29     */
30    public void test_ConstructorD() {
31        //
32        // These numbers have an exact representation as doubles:
33        //
34        BigDecimal big = new BigDecimal(123E04);
35        assertTrue(
36                "the BigDecimal value taking a double argument is not initialized properly",
37                big.toString().equals("1230000"));
38        big = new BigDecimal(123.375);
39        assertTrue("init(D) failed for 123.375; became " + big,
40                big.toString().equals("123.375") );
41        big = new BigDecimal(Math.pow(2, -33));
42        assertTrue("init(D) failed for 2^(-33) = 1.16415321826934814453125E-10; became " + big,
43                big.toString().equals("1.16415321826934814453125E-10") );
44        big = new BigDecimal(123456 * Math.pow(2, -33));
45        assertTrue("init(D) failed for 123456 * 2^(-33) = 0.000014372169971466064453125; became " + big,
46                big.toString().equals("0.000014372169971466064453125") );
47        big = new BigDecimal(-123456 * Math.pow(2, -33));
48        assertTrue("init(D) failed for 123456 * 2^(-33) = -0.000014372169971466064453125; became " + big,
49                big.toString().equals("-0.000014372169971466064453125") );
50    }
51
52    /**
53     * java.math.BigDecimal#BigDecimal(java.lang.String)
54     */
55    public void test_constructor_String_plus_exp() {
56        /*
57         * BigDecimal does not support a + sign in the exponent when converting
58         * from a String.
59         *
60         * mc 081106: who says so?!?
61         */
62        BigDecimal bd;
63        bd = new BigDecimal("+23e-0");
64        assertEquals("incorrect value",  "23", bd.toString());
65        bd = new BigDecimal("-23e+0");
66        assertEquals("incorrect value",  "-23", bd.toString());
67    }
68
69    /**
70     * java.math.BigDecimal#setScale(int, java.math.RoundingMode)
71     */
72    public void test_setScaleILjava_math_RoundingMode() {
73        BigDecimal setScale1 = new BigDecimal(2.323E102);
74        BigDecimal setScale2 = setScale1.setScale(4);
75        assertTrue("the number 2.323E102 after setting scale is wrong",
76                setScale2.scale() == 4);
77        assertTrue("the representation of the number 2.323E102 is wrong",
78                setScale2.doubleValue() == 2.323E102);
79
80        setScale1 = new BigDecimal("-1.253E-12");
81        setScale2 = setScale1.setScale(17, RoundingMode.CEILING);
82        assertTrue("the scale of the number -1.253E-12 after setting scale is wrong",
83                setScale2.scale() == 17);
84        assertTrue(
85                "the representation of the number -1.253E-12 after setting scale is wrong, " + setScale2.toString(),
86                setScale2.toString().equals("-1.25300E-12"));
87
88        // testing rounding Mode RoundingMode.CEILING
89        setScale1 = new BigDecimal(value, 4);
90        setScale2 = setScale1.setScale(1, RoundingMode.CEILING);
91        assertTrue(
92                "the number 1234.5908 after setting scale to 1/RoundingMode.CEILING is wrong",
93                setScale2.toString().equals("1234.6") && setScale2.scale() == 1);
94        BigDecimal setNeg = new BigDecimal(value.negate(), 4);
95        setScale2 = setNeg.setScale(1, RoundingMode.CEILING);
96        assertTrue(
97                "the number -1234.5908 after setting scale to 1/RoundingMode.CEILING is wrong",
98                setScale2.toString().equals("-1234.5")
99                        && setScale2.scale() == 1);
100
101        // testing rounding Mode RoundingMode.DOWN
102        setScale2 = setNeg.setScale(1, RoundingMode.DOWN);
103        assertTrue(
104                "the number -1234.5908 after setting scale to 1/RoundingMode.DOWN is wrong",
105                setScale2.toString().equals("-1234.5")
106                        && setScale2.scale() == 1);
107        setScale1 = new BigDecimal(value, 4);
108        setScale2 = setScale1.setScale(1, RoundingMode.DOWN);
109        assertTrue(
110                "the number 1234.5908 after setting scale to 1/RoundingMode.DOWN is wrong",
111                setScale2.toString().equals("1234.5") && setScale2.scale() == 1);
112
113        // testing rounding Mode RoundingMode.FLOOR
114        setScale2 = setScale1.setScale(1, RoundingMode.FLOOR);
115        assertTrue(
116                "the number 1234.5908 after setting scale to 1/RoundingMode.FLOOR is wrong",
117                setScale2.toString().equals("1234.5") && setScale2.scale() == 1);
118        setScale2 = setNeg.setScale(1, RoundingMode.FLOOR);
119        assertTrue(
120                "the number -1234.5908 after setting scale to 1/RoundingMode.FLOOR is wrong",
121                setScale2.toString().equals("-1234.6")
122                        && setScale2.scale() == 1);
123
124        // testing rounding Mode RoundingMode.HALF_DOWN
125        setScale2 = setScale1.setScale(3, RoundingMode.HALF_DOWN);
126        assertTrue(
127                "the number 1234.5908 after setting scale to 3/RoundingMode.HALF_DOWN is wrong",
128                setScale2.toString().equals("1234.591")
129                        && setScale2.scale() == 3);
130        setScale1 = new BigDecimal(new BigInteger("12345000"), 5);
131        setScale2 = setScale1.setScale(1, RoundingMode.HALF_DOWN);
132        assertTrue(
133                "the number 123.45908 after setting scale to 1/RoundingMode.HALF_DOWN is wrong",
134                setScale2.toString().equals("123.4") && setScale2.scale() == 1);
135        setScale2 = new BigDecimal("-1234.5000").setScale(0,
136                RoundingMode.HALF_DOWN);
137        assertTrue(
138                "the number -1234.5908 after setting scale to 0/RoundingMode.HALF_DOWN is wrong",
139                setScale2.toString().equals("-1234") && setScale2.scale() == 0);
140
141        // testing rounding Mode RoundingMode.HALF_EVEN
142        setScale1 = new BigDecimal(1.2345789D);
143        setScale2 = setScale1.setScale(4, RoundingMode.HALF_EVEN);
144        assertTrue(
145                "the number 1.2345789 after setting scale to 4/RoundingMode.HALF_EVEN is wrong",
146                setScale2.doubleValue() == 1.2346D && setScale2.scale() == 4);
147        setNeg = new BigDecimal(-1.2335789D);
148        setScale2 = setNeg.setScale(2, RoundingMode.HALF_EVEN);
149        assertTrue(
150                "the number -1.2335789 after setting scale to 2/RoundingMode.HALF_EVEN is wrong",
151                setScale2.doubleValue() == -1.23D && setScale2.scale() == 2);
152        setScale2 = new BigDecimal("1.2345000").setScale(3,
153                RoundingMode.HALF_EVEN);
154        assertTrue(
155                "the number 1.2345789 after setting scale to 3/RoundingMode.HALF_EVEN is wrong",
156                setScale2.doubleValue() == 1.234D && setScale2.scale() == 3);
157        setScale2 = new BigDecimal("-1.2345000").setScale(3,
158                RoundingMode.HALF_EVEN);
159        assertTrue(
160                "the number -1.2335789 after setting scale to 3/RoundingMode.HALF_EVEN is wrong",
161                setScale2.doubleValue() == -1.234D && setScale2.scale() == 3);
162
163        // testing rounding Mode RoundingMode.HALF_UP
164        setScale1 = new BigDecimal("134567.34650");
165        setScale2 = setScale1.setScale(3, RoundingMode.HALF_UP);
166        assertTrue(
167                "the number 134567.34658 after setting scale to 3/RoundingMode.HALF_UP is wrong",
168                setScale2.toString().equals("134567.347")
169                        && setScale2.scale() == 3);
170        setNeg = new BigDecimal("-1234.4567");
171        setScale2 = setNeg.setScale(0, RoundingMode.HALF_UP);
172        assertTrue(
173                "the number -1234.4567 after setting scale to 0/RoundingMode.HALF_UP is wrong",
174                setScale2.toString().equals("-1234") && setScale2.scale() == 0);
175
176        // testing rounding Mode RoundingMode.UNNECESSARY
177        try {
178            setScale1.setScale(3, RoundingMode.UNNECESSARY);
179            fail("arithmetic Exception not caught for round unnecessary");
180        } catch (ArithmeticException e) {
181        }
182
183        // testing rounding Mode RoundingMode.UP
184        setScale1 = new BigDecimal("100000.374");
185        setScale2 = setScale1.setScale(2, RoundingMode.UP);
186        assertTrue(
187                "the number 100000.374 after setting scale to 2/RoundingMode.UP is wrong",
188                setScale2.toString().equals("100000.38")
189                        && setScale2.scale() == 2);
190        setNeg = new BigDecimal(-134.34589D);
191        setScale2 = setNeg.setScale(2, RoundingMode.UP);
192        assertTrue(
193                "the number -134.34589 after setting scale to 2/RoundingMode.UP is wrong",
194                setScale2.doubleValue() == -134.35D && setScale2.scale() == 2);
195
196        // testing invalid rounding modes
197        try {
198            setScale2 = setScale1.setScale(0, -123);
199            fail("IllegalArgumentException is not caught for wrong rounding mode");
200        } catch (IllegalArgumentException e) {
201        }
202    }
203}
204