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