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