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}