001/*
002 * $Id: BigDecimalTest.java 3789 2011-10-01 18:54:43Z kredel $
003 */
004
005package edu.jas.arith;
006
007import java.math.MathContext;
008
009import junit.framework.Test;
010import junit.framework.TestCase;
011import junit.framework.TestSuite;
012
013//import edu.jas.arith.BigDecimal;
014
015
016/**
017 * BigDecimal tests with JUnit. 
018 * @author Heinz Kredel.
019 */
020
021public 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}