001/*
002 * $Id$
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, eps;
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        eps = new BigDecimal(new BigRational(1, 10));
068        eps = eps.power(precision-1);
069    }
070
071
072    @Override
073    protected void tearDown() {
074        a = b = c = d = e = null;
075        fac = null;
076        eps = null;
077    }
078
079
080    /**
081     * Test static initialization and constants.
082     */
083    public void testConstants() {
084        a = fac.getZERO();
085        b = fac.getONE();
086        c = b.subtract(b);
087
088        assertTrue("1-1 == 0: " + c + a, c.compareTo(a) == 0);
089        assertTrue("1-1 == 0", c.isZERO());
090        assertTrue("1 == 1", b.isONE());
091
092        a = fac.getZERO();
093        b = fac.getONE();
094        c = b.subtract(a);
095
096        assertTrue("1-0 == 1: " + c + b, c.compareTo(b) == 0);
097    }
098
099
100    /**
101     * Test bitLength.
102     */
103    public void testBitLength() {
104        a = fac.getZERO();
105        b = fac.getONE();
106        c = b.random(300, 100);
107        //System.out.println("c = " + c);
108        //System.out.println("unscale(c) = " + c.val.unscaledValue());
109        //System.out.println("scale(c) = " + c.val.scale());
110        //System.out.println("len(c) = " + c.bitLength());
111
112        assertEquals("len(0) == 1", 2, a.bitLength());
113        assertEquals("len(1) == 3", 3, b.bitLength());
114        assertEquals("len(-1) == 3", 3, b.negate().bitLength());
115        assertTrue("len(random) >= 2", 2 <= c.bitLength());
116    }
117
118
119    /**
120     * Test constructor and toString.
121     */
122    public void testConstructor() {
123        a = new BigDecimal("6.8");
124        b = new BigDecimal("3.4");
125        b = b.sum(b);
126
127        assertEquals("6.8 = 3.4", 0, a.compareTo(b));
128
129        String s = "6.1111111111111111111111111111111111111111111";
130        a = new BigDecimal(s);
131        String t = a.toString();
132
133        assertEquals("stringConstr == toString", s, t);
134
135        a = new BigDecimal(1);
136        b = new BigDecimal(-1);
137        c = b.sum(a);
138
139        assertTrue("1 == 1", a.isONE());
140        assertTrue("1+(-1) == 0", c.compareTo(fac.getZERO()) == 0);
141        assertTrue("1+(-1) == 0", c.isZERO());
142    }
143
144
145    /**
146     * Test random rationals.
147     */
148    public void testRandom() {
149        a = fac.random(5 * kl);
150        //System.out.println("a = " + a);
151        b = new BigDecimal("" + a);
152        c = a.subtract(a);
153
154        //System.out.println("c = " + c);
155        //assertTrue("a-b == 0", c.compareTo(BigDecimal.ZERO)==0 );
156        assertTrue("a-b == 0", c.isZERO());
157
158        d = new BigDecimal("" + b);
159        //System.out.println("b = " + b);
160        //System.out.println("d = " + d);
161        assertTrue("sign(a-a) == 0", b.compareTo(d) == 0);
162    }
163
164
165    /**
166     * Test addition.
167     */
168    public void testAddition() {
169        a = fac.random(kl);
170        b = a.sum(a);
171        c = b.subtract(a);
172        //System.out.println("a = " + a);
173        //System.out.println("b = " + b);
174        //System.out.println("c = " + c);
175
176        //assertEquals("a+a-a = a", c, a);
177        assertEquals("a+a-a == a", 0, c.compareTo(a));
178
179        d = a.sum(fac.getZERO());
180        assertEquals("a+0 == a", 0, d.compareTo(a));
181        d = a.subtract(fac.getZERO());
182        assertEquals("a-0 == a", 0, d.compareTo(a));
183        d = a.subtract(a);
184        assertTrue("a-a == 0", d.compareTo(fac.getZERO()) == 0);
185
186        b = fac.random(kl);
187        c = a.sum(b);
188        d = b.sum(a);
189        assertTrue("a+b == b+a", d.compareTo(c) == 0);
190
191        // addition is not associative
192    }
193
194
195    /**
196     * Test multiplication. Is not associative.
197     */
198    public void testMultiplication() {
199        a = fac.random(kl);
200        b = a.multiply(a);
201        if (a.isZERO()) {
202            c = a;
203        } else {
204            c = b.divide(a);
205        }
206        //System.out.println("a = " + a);
207        //System.out.println("b = " + b);
208        //System.out.println("c = " + c);
209
210        //assertEquals("a*a/a = a",c,a);
211        assertTrue("a*a/a = a", c.compareTo(a) == 0);
212
213        d = a.multiply(fac.getONE());
214        assertEquals("a*1 == a", d, a);
215        d = a.divide(fac.getONE());
216        assertEquals("a/1 = a", 0, d.compareTo(a));
217
218        a = fac.random(kl);
219        b = a.inverse();
220        c = a.multiply(b);
221        //System.out.println("c = " + c);
222        d = c.subtract(fac.getONE()).abs();
223        //System.out.println("d = " + d);
224        assertTrue("a*1/a == 1: " + c, d.compareTo(eps) <= 0);
225
226        b = fac.random(kl);
227        c = a.multiply(b);
228        d = b.multiply(a);
229        //System.out.println("c = " + c);
230        //System.out.println("d = " + d);
231        assertTrue("ab == ba", d.compareTo(c) == 0);
232
233        c = fac.random(kl);
234        d = a.multiply(b.multiply(c));
235        e = a.multiply(b).multiply(c);
236        //System.out.println("d = " + d);
237        //System.out.println("e = " + e);
238        if (d.compareTo(e) == 0) {
239            assertTrue("a(bc) == (ab)c", d.compareTo(e) == 0);
240        }
241    }
242
243
244    /**
245     * Test distributive law. Does not hold.
246     */
247    public void testDistributive() {
248        a = fac.random(kl);
249        b = fac.random(kl);
250        c = fac.random(kl);
251
252        d = a.multiply(b.sum(c));
253        e = a.multiply(b).sum(a.multiply(c));
254        if (d.compareTo(e) == 0) {
255            assertTrue("a(b+c) == ab+ac", d.compareTo(e) == 0);
256        }
257    }
258
259}