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); 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 = 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 bitLength. 102 */ 103 public void testBitLength() { 104 a = BigDecimal.ZERO; 105 b = BigDecimal.ONE; 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(BigDecimal.ZERO) == 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(BigDecimal.ZERO); 180 assertEquals("a+0 = a", 0, d.compareTo(a)); 181 d = a.subtract(BigDecimal.ZERO); 182 assertEquals("a-0 = a", 0, d.compareTo(a)); 183 d = a.subtract(a); 184 assertTrue("a-a = 0", d.compareTo(BigDecimal.ZERO) == 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 c = b.divide(a); 202 //System.out.println("a = " + a); 203 //System.out.println("b = " + b); 204 //System.out.println("c = " + c); 205 206 //assertEquals("a*a/a = a",c,a); 207 assertTrue("a*a/a = a", c.compareTo(a) == 0); 208 209 d = a.multiply(BigDecimal.ONE); 210 assertEquals("a*1 = a", d, a); 211 d = a.divide(BigDecimal.ONE); 212 assertEquals("a/1 = a", 0, d.compareTo(a)); 213 214 a = fac.random(kl); 215 b = a.inverse(); 216 c = a.multiply(b); 217 //System.out.println("c = " + c); 218 d = c.subtract(fac.getONE()).abs(); 219 assertTrue("a*1/a = 1: " + c, d.compareTo(eps) <= 0); 220 221 b = fac.random(kl); 222 c = a.multiply(b); 223 d = b.multiply(a); 224 //System.out.println("c = " + c); 225 //System.out.println("d = " + d); 226 assertTrue("ab = ba", d.compareTo(c) == 0); 227 228 c = fac.random(kl); 229 d = a.multiply(b.multiply(c)); 230 e = a.multiply(b).multiply(c); 231 //System.out.println("d = " + d); 232 //System.out.println("e = " + e); 233 if (d.compareTo(e) == 0) { 234 assertTrue("a(bc) = (ab)c", d.compareTo(e) == 0); 235 } 236 } 237 238 239 /** 240 * Test distributive law. Does not hold. 241 */ 242 public void testDistributive() { 243 a = fac.random(kl); 244 b = fac.random(kl); 245 c = fac.random(kl); 246 247 d = a.multiply(b.sum(c)); 248 e = a.multiply(b).sum(a.multiply(c)); 249 if (d.compareTo(e) == 0) { 250 assertTrue("a(b+c) = ab+ac", d.compareTo(e) == 0); 251 } 252 } 253 254}