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