001 /* 002 * $Id: BigRationalTest.java 3281 2010-08-22 12:12:47Z kredel $ 003 */ 004 005 package edu.jas.arith; 006 007 008 import java.util.Iterator; 009 010 import junit.framework.Test; 011 import junit.framework.TestCase; 012 import junit.framework.TestSuite; 013 014 /** 015 * BigRational tests with JUnit. 016 * @author Heinz Kredel. 017 */ 018 019 public class BigRationalTest extends TestCase { 020 021 /** 022 * main. 023 */ 024 public static void main (String[] args) { 025 junit.textui.TestRunner.run( suite() ); 026 } 027 028 /** 029 * Constructs a <CODE>BigRationalTest</CODE> object. 030 * @param name String. 031 */ 032 public BigRationalTest(String name) { 033 super(name); 034 } 035 036 /** 037 */ 038 public static Test suite() { 039 TestSuite suite= new TestSuite(BigRationalTest.class); 040 return suite; 041 } 042 043 BigRational a; 044 BigRational b; 045 BigRational c; 046 BigRational d; 047 BigRational e; 048 049 protected void setUp() { 050 a = b = c = d = e = null; 051 } 052 053 protected void tearDown() { 054 a = b = c = d = e = null; 055 } 056 057 058 /** 059 * Test static initialization and constants. 060 * 061 */ 062 public void testConstants() { 063 a = BigRational.ZERO; 064 b = BigRational.ONE; 065 c = BigRational.RNDIF(b,b); 066 067 assertEquals("1-1 = 0",c,a); 068 assertTrue("1-1 = 0",c.isZERO()); 069 assertTrue("1 = 1", b.isONE() ); 070 071 a = BigRational.ZERO; 072 b = BigRational.ONE; 073 c = BigRational.RNDIF(b,b); 074 075 assertEquals("1-1 = 0",c,a); 076 } 077 078 079 /** 080 * Test constructor and toString. 081 * 082 */ 083 public void testConstructor() { 084 a = new BigRational( "6/8" ); 085 b = new BigRational( "3/4" ); 086 087 assertEquals("6/8 = 3/4",a,b); 088 089 a = new BigRational( "3/-4" ); 090 b = new BigRational( "-3/4" ); 091 092 assertEquals("3/-4 = -3/4",a,b); 093 094 String s = "6/1111111111111111111111111111111111111111111"; 095 a = new BigRational( s ); 096 String t = a.toString(); 097 098 assertEquals("stringConstr = toString",s,t); 099 100 a = new BigRational( 1 ); 101 b = new BigRational( -1 ); 102 c = BigRational.RNSUM(b,a); 103 104 assertTrue("1 = 1", a.isONE() ); 105 assertEquals("1+(-1) = 0",c,BigRational.ZERO); 106 107 s = "1.500000000"; 108 a = new BigRational( s ); 109 b = new BigRational( "3/2" ); 110 assertEquals("decimalConstr = b ",a,b); 111 112 s = "-1.500000000"; 113 a = new BigRational( s ); 114 b = new BigRational( "-3/2" ); 115 assertEquals("decimalConstr = b ",a,b); 116 117 s = "0.750000000"; 118 a = new BigRational( s ); 119 b = new BigRational( "3/4" ); 120 assertEquals("decimalConstr = b ",a,b); 121 122 s = "0.333333333"; 123 a = new BigRational( s ); 124 t = a.toString(9); 125 assertEquals("decimalConstr = b " + t,s,t); 126 127 s = "-0.000033333"; 128 a = new BigRational( s ); 129 t = a.toString(9); 130 assertEquals("decimalConstr = b " + t,s,t); 131 //System.out.println("a = " + a); 132 } 133 134 135 /** 136 * Test random rationals. 137 * 138 */ 139 public void testRandom() { 140 a = BigRational.RNRAND( 500 ); 141 b = new BigRational( "" + a ); 142 c = BigRational.RNDIF(b,a); 143 144 assertEquals("a-b = 0",c,BigRational.ZERO); 145 146 d = new BigRational( b.numerator(), b.denominator() ); 147 assertEquals("sign(a-a) = 0", 0, b.compareTo(d) ); 148 } 149 150 151 /** 152 * Test addition. 153 * 154 */ 155 public void testAddition() { 156 a = BigRational.RNRAND( 100 ); 157 b = BigRational.RNSUM( a, a ); 158 c = BigRational.RNDIF( b, a ); 159 160 assertEquals("a+a-a = a",c,a); 161 assertEquals("a+a-a = a",0,BigRational.RNCOMP(c,a)); 162 163 d = BigRational.RNSUM( a, BigRational.ZERO ); 164 assertEquals("a+0 = a",d,a); 165 d = BigRational.RNDIF( a, BigRational.ZERO ); 166 assertEquals("a-0 = a",d,a); 167 d = BigRational.RNDIF( a, a ); 168 assertEquals("a-a = 0",d,BigRational.ZERO); 169 170 } 171 172 173 /** 174 * Test multiplication. 175 * 176 */ 177 public void testMultiplication() { 178 a = BigRational.RNRAND( 100 ); 179 b = BigRational.RNPROD( a, a ); 180 c = BigRational.RNQ( b, a ); 181 182 assertEquals("a*a/a = a",c,a); 183 assertEquals("a*a/a = a",0,BigRational.RNCOMP(c,a)); 184 185 d = BigRational.RNPROD( a, BigRational.ONE ); 186 assertEquals("a*1 = a",d,a); 187 d = BigRational.RNQ( a, BigRational.ONE ); 188 assertEquals("a/1 = a",d,a); 189 190 a = BigRational.RNRAND( 100 ); 191 b = BigRational.RNINV( a ); 192 c = BigRational.RNPROD( a, b ); 193 194 assertTrue("a*1/a = 1", c.isONE() ); 195 } 196 197 198 /** 199 * Test distributive law. 200 * 201 */ 202 public void testDistributive() { 203 BigRational fac = new BigRational(); 204 205 a = fac.random( 500 ); 206 b = fac.random( 500 ); 207 c = fac.random( 500 ); 208 209 d = a.multiply( b.sum(c) ); 210 e = a.multiply( b ).sum( a.multiply(c) ); 211 212 assertEquals("a(b+c) = ab+ac",d,e); 213 } 214 215 216 /** 217 * Test iterator. 218 */ 219 public void testIterator() { 220 int t = 0; 221 BigRational bi = new BigRational(); 222 bi.setAllIterator(); 223 BigRational j = null, elem = null; 224 for ( BigRational i : bi ) { 225 t++; 226 //System.out.println("i = " + i); 227 if ( t >= 20 ) { 228 j = i; 229 break; 230 } 231 } 232 elem = new BigRational(-2,3); 233 assertTrue("j == 10 ", j.equals(elem) ); 234 } 235 236 237 /** 238 * Test non-negative iterator. 239 */ 240 public void testNNIterator() { 241 int t = 0; 242 BigRational bi = new BigRational(); 243 bi.setNonNegativeIterator(); 244 BigRational j = null, elem = null; 245 Iterator<BigRational> iter = bi.iterator(); 246 while ( iter.hasNext() ) { 247 BigRational i = iter.next(); 248 t++; 249 //System.out.println("i = " + i); 250 if ( t >= 20 ) { 251 j = i; 252 break; 253 } 254 } 255 elem = new BigRational(4,3); 256 assertTrue("j == 10 ", j.equals(elem) ); 257 } 258 259 260 /** 261 * Test non-negative unique iterator. 262 */ 263 public void testUniqueNNIterator() { 264 int t = 0; 265 BigRational bi = new BigRational(); 266 bi.setNonNegativeIterator(); 267 //bi.setAllIterator(); 268 BigRational j = null, elem = null; 269 Iterator<BigRational> iter = bi.uniqueIterator(); 270 while ( iter.hasNext() ) { 271 BigRational i = iter.next(); 272 t++; 273 //System.out.println("i = " + i); 274 if ( t >= 20 ) { 275 j = i; 276 break; 277 } 278 } 279 elem = new BigRational(5,3); 280 assertTrue("j == 10 ", j.equals(elem) ); 281 } 282 283 }