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 }