001/*
002 * $Id: BigDecimalTest.java 5688 2017-01-03 08:45:09Z kredel $
003 */
004
005package edu.jas.arith;
006
007
008import java.math.MathContext;
009
010import junit.framework.Test;
011import junit.framework.TestCase;
012import junit.framework.TestSuite;
013
014
015/**
016 * BigDecimal tests with JUnit.
017 * @author Heinz Kredel
018 */
019
020public class BigDecimalTest extends TestCase {
021
022
023    /**
024     * main.
025     */
026    public static void main(String[] args) {
027        junit.textui.TestRunner.run(suite());
028    }
029
030
031    /**
032     * Constructs a <CODE>BigDecimalTest</CODE> object.
033     * @param name String.
034     */
035    public BigDecimalTest(String name) {
036        super(name);
037    }
038
039
040    /**
041     */
042    public static Test suite() {
043        TestSuite suite = new TestSuite(BigDecimalTest.class);
044        return suite;
045    }
046
047
048    BigDecimal a, b, c, d, e;
049
050
051    BigDecimal fac;
052
053
054    int precision = BigDecimal.DEFAULT_PRECISION; // 100; // must match default
055
056
057    MathContext mc = BigDecimal.DEFAULT_CONTEXT; // new MathContext( precision );
058
059
060    int kl = precision / 2;
061
062
063    @Override
064    protected void setUp() {
065        a = b = c = d = e = null;
066        fac = new BigDecimal(0L, mc);
067    }
068
069
070    @Override
071    protected void tearDown() {
072        a = b = c = d = e = null;
073        fac = null;
074    }
075
076
077    /**
078     * Test static initialization and constants.
079     */
080    public void testConstants() {
081        a = BigDecimal.ZERO;
082        b = BigDecimal.ONE;
083        c = b.subtract(b);
084
085        assertTrue("1-1 = 0", c.compareTo(a) == 0);
086        assertTrue("1-1 = 0", c.isZERO());
087        assertTrue("1 = 1", b.isONE());
088
089        a = BigDecimal.ZERO;
090        b = BigDecimal.ONE;
091        c = a.subtract(a);
092
093        assertTrue("1-1 = 0", c.compareTo(a) == 0);
094    }
095
096
097    /**
098     * Test bitLength.
099     */
100    public void testBitLength() {
101        a = BigDecimal.ZERO;
102        b = BigDecimal.ONE;
103        c = b.random(300, 100);
104        //System.out.println("c = " + c);
105        //System.out.println("unscale(c) = " + c.val.unscaledValue());
106        //System.out.println("scale(c) = " + c.val.scale());
107        //System.out.println("len(c) = " + c.bitLength());
108
109        assertEquals("len(0) = 1", 2, a.bitLength());
110        assertEquals("len(1) = 3", 3, b.bitLength());
111        assertEquals("len(-1) = 3", 3, b.negate().bitLength());
112        assertTrue("len(random) >= 2", 2 <= c.bitLength());
113    }
114
115
116    /**
117     * Test constructor and toString.
118     */
119    public void testConstructor() {
120        a = new BigDecimal("6.8");
121        b = new BigDecimal("3.4");
122        b = b.sum(b);
123
124        assertEquals("6.8 = 3.4", 0, a.compareTo(b));
125
126        String s = "6.1111111111111111111111111111111111111111111";
127        a = new BigDecimal(s);
128        String t = a.toString();
129
130        assertEquals("stringConstr = toString", s, t);
131
132        a = new BigDecimal(1);
133        b = new BigDecimal(-1);
134        c = b.sum(a);
135
136        assertTrue("1 = 1", a.isONE());
137        assertTrue("1+(-1) = 0", c.compareTo(BigDecimal.ZERO) == 0);
138        assertTrue("1+(-1) = 0", c.isZERO());
139    }
140
141
142    /**
143     * Test random rationals.
144     */
145    public void testRandom() {
146        a = fac.random(5 * kl);
147        //System.out.println("a = " + a);
148        b = new BigDecimal("" + a);
149        c = a.subtract(a);
150
151        //System.out.println("c = " + c);
152        //assertTrue("a-b = 0", c.compareTo(BigDecimal.ZERO)==0 );
153        assertTrue("a-b = 0", c.isZERO());
154
155        d = new BigDecimal("" + b);
156        //System.out.println("b = " + b);
157        //System.out.println("d = " + d);
158        assertTrue("sign(a-a) = 0", b.compareTo(d) == 0);
159    }
160
161
162    /**
163     * Test addition.
164     */
165    public void testAddition() {
166        a = fac.random(kl);
167        b = a.sum(a);
168        c = b.subtract(a);
169        //System.out.println("a = " + a);
170        //System.out.println("b = " + b);
171        //System.out.println("c = " + c);
172
173        //assertEquals("a+a-a = a", c, a);
174        assertEquals("a+a-a = a", 0, c.compareTo(a));
175
176        d = a.sum(BigDecimal.ZERO);
177        assertEquals("a+0 = a", 0, d.compareTo(a));
178        d = a.subtract(BigDecimal.ZERO);
179        assertEquals("a-0 = a", 0, d.compareTo(a));
180        d = a.subtract(a);
181        assertTrue("a-a = 0", d.compareTo(BigDecimal.ZERO) == 0);
182
183        b = fac.random(kl);
184        c = a.sum(b);
185        d = b.sum(a);
186        assertTrue("a+b = b+a", d.compareTo(c) == 0);
187
188        // addition is not associative
189    }
190
191
192    /**
193     * Test multiplication. Is not associative.
194     */
195    public void testMultiplication() {
196        a = fac.random(kl);
197        b = a.multiply(a);
198        c = b.divide(a);
199        //System.out.println("a = " + a);
200        //System.out.println("b = " + b);
201        //System.out.println("c = " + c);
202
203        //assertEquals("a*a/a = a",c,a);
204        assertTrue("a*a/a = a", c.compareTo(a) == 0);
205
206        d = a.multiply(BigDecimal.ONE);
207        assertEquals("a*1 = a", d, a);
208        d = a.divide(BigDecimal.ONE);
209        assertEquals("a/1 = a", 0, d.compareTo(a));
210
211        a = fac.random(kl);
212        b = a.inverse();
213        c = a.multiply(b);
214        //System.out.println("c = " + c);
215        assertTrue("a*1/a = 1: " + c, c.compareTo(fac.getONE()) == 0);
216
217        b = fac.random(kl);
218        c = a.multiply(b);
219        d = b.multiply(a);
220        //System.out.println("c = " + c);
221        //System.out.println("d = " + d);
222        assertTrue("ab = ba", d.compareTo(c) == 0);
223
224        c = fac.random(kl);
225        d = a.multiply(b.multiply(c));
226        e = a.multiply(b).multiply(c);
227        //System.out.println("d = " + d);
228        //System.out.println("e = " + e);
229        if (d.compareTo(e) == 0) {
230            assertTrue("a(bc) = (ab)c", d.compareTo(e) == 0);
231        }
232    }
233
234
235    /**
236     * Test distributive law. Does not hold.
237     */
238    public void testDistributive() {
239        a = fac.random(kl);
240        b = fac.random(kl);
241        c = fac.random(kl);
242
243        d = a.multiply(b.sum(c));
244        e = a.multiply(b).sum(a.multiply(c));
245        if (d.compareTo(e) == 0) {
246            assertTrue("a(b+c) = ab+ac", d.compareTo(e) == 0);
247        }
248    }
249
250}