001/* 002 * $Id: BigDecimalTest.java 5688 2017-01-03 08:45:09Z 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/** 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; 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 } 068 069 070 @Override 071 protected void tearDown() { 072 a = b = c = d = e = null; 073 fac = null; 074 } 075 076 077 /** 078 * Test static initialization and constants. 079 */ 080 public void testConstants() { 081 a = BigDecimal.ZERO; 082 b = BigDecimal.ONE; 083 c = b.subtract(b); 084 085 assertTrue("1-1 = 0", c.compareTo(a) == 0); 086 assertTrue("1-1 = 0", c.isZERO()); 087 assertTrue("1 = 1", b.isONE()); 088 089 a = BigDecimal.ZERO; 090 b = BigDecimal.ONE; 091 c = a.subtract(a); 092 093 assertTrue("1-1 = 0", c.compareTo(a) == 0); 094 } 095 096 097 /** 098 * Test bitLength. 099 */ 100 public void testBitLength() { 101 a = BigDecimal.ZERO; 102 b = BigDecimal.ONE; 103 c = b.random(300, 100); 104 //System.out.println("c = " + c); 105 //System.out.println("unscale(c) = " + c.val.unscaledValue()); 106 //System.out.println("scale(c) = " + c.val.scale()); 107 //System.out.println("len(c) = " + c.bitLength()); 108 109 assertEquals("len(0) = 1", 2, a.bitLength()); 110 assertEquals("len(1) = 3", 3, b.bitLength()); 111 assertEquals("len(-1) = 3", 3, b.negate().bitLength()); 112 assertTrue("len(random) >= 2", 2 <= c.bitLength()); 113 } 114 115 116 /** 117 * Test constructor and toString. 118 */ 119 public void testConstructor() { 120 a = new BigDecimal("6.8"); 121 b = new BigDecimal("3.4"); 122 b = b.sum(b); 123 124 assertEquals("6.8 = 3.4", 0, a.compareTo(b)); 125 126 String s = "6.1111111111111111111111111111111111111111111"; 127 a = new BigDecimal(s); 128 String t = a.toString(); 129 130 assertEquals("stringConstr = toString", s, t); 131 132 a = new BigDecimal(1); 133 b = new BigDecimal(-1); 134 c = b.sum(a); 135 136 assertTrue("1 = 1", a.isONE()); 137 assertTrue("1+(-1) = 0", c.compareTo(BigDecimal.ZERO) == 0); 138 assertTrue("1+(-1) = 0", c.isZERO()); 139 } 140 141 142 /** 143 * Test random rationals. 144 */ 145 public void testRandom() { 146 a = fac.random(5 * kl); 147 //System.out.println("a = " + a); 148 b = new BigDecimal("" + a); 149 c = a.subtract(a); 150 151 //System.out.println("c = " + c); 152 //assertTrue("a-b = 0", c.compareTo(BigDecimal.ZERO)==0 ); 153 assertTrue("a-b = 0", c.isZERO()); 154 155 d = new BigDecimal("" + b); 156 //System.out.println("b = " + b); 157 //System.out.println("d = " + d); 158 assertTrue("sign(a-a) = 0", b.compareTo(d) == 0); 159 } 160 161 162 /** 163 * Test addition. 164 */ 165 public void testAddition() { 166 a = fac.random(kl); 167 b = a.sum(a); 168 c = b.subtract(a); 169 //System.out.println("a = " + a); 170 //System.out.println("b = " + b); 171 //System.out.println("c = " + c); 172 173 //assertEquals("a+a-a = a", c, a); 174 assertEquals("a+a-a = a", 0, c.compareTo(a)); 175 176 d = a.sum(BigDecimal.ZERO); 177 assertEquals("a+0 = a", 0, d.compareTo(a)); 178 d = a.subtract(BigDecimal.ZERO); 179 assertEquals("a-0 = a", 0, d.compareTo(a)); 180 d = a.subtract(a); 181 assertTrue("a-a = 0", d.compareTo(BigDecimal.ZERO) == 0); 182 183 b = fac.random(kl); 184 c = a.sum(b); 185 d = b.sum(a); 186 assertTrue("a+b = b+a", d.compareTo(c) == 0); 187 188 // addition is not associative 189 } 190 191 192 /** 193 * Test multiplication. Is not associative. 194 */ 195 public void testMultiplication() { 196 a = fac.random(kl); 197 b = a.multiply(a); 198 c = b.divide(a); 199 //System.out.println("a = " + a); 200 //System.out.println("b = " + b); 201 //System.out.println("c = " + c); 202 203 //assertEquals("a*a/a = a",c,a); 204 assertTrue("a*a/a = a", c.compareTo(a) == 0); 205 206 d = a.multiply(BigDecimal.ONE); 207 assertEquals("a*1 = a", d, a); 208 d = a.divide(BigDecimal.ONE); 209 assertEquals("a/1 = a", 0, d.compareTo(a)); 210 211 a = fac.random(kl); 212 b = a.inverse(); 213 c = a.multiply(b); 214 //System.out.println("c = " + c); 215 assertTrue("a*1/a = 1: " + c, c.compareTo(fac.getONE()) == 0); 216 217 b = fac.random(kl); 218 c = a.multiply(b); 219 d = b.multiply(a); 220 //System.out.println("c = " + c); 221 //System.out.println("d = " + d); 222 assertTrue("ab = ba", d.compareTo(c) == 0); 223 224 c = fac.random(kl); 225 d = a.multiply(b.multiply(c)); 226 e = a.multiply(b).multiply(c); 227 //System.out.println("d = " + d); 228 //System.out.println("e = " + e); 229 if (d.compareTo(e) == 0) { 230 assertTrue("a(bc) = (ab)c", d.compareTo(e) == 0); 231 } 232 } 233 234 235 /** 236 * Test distributive law. Does not hold. 237 */ 238 public void testDistributive() { 239 a = fac.random(kl); 240 b = fac.random(kl); 241 c = fac.random(kl); 242 243 d = a.multiply(b.sum(c)); 244 e = a.multiply(b).sum(a.multiply(c)); 245 if (d.compareTo(e) == 0) { 246 assertTrue("a(b+c) = ab+ac", d.compareTo(e) == 0); 247 } 248 } 249 250}