001/*
002 * $Id: BigRationalTest.java 4014 2012-07-22 07:00:47Z kredel $
003 */
004
005package edu.jas.arith;
006
007
008import java.util.Iterator;
009
010import junit.framework.Test;
011import junit.framework.TestCase;
012import junit.framework.TestSuite;
013
014/**
015 * BigRational tests with JUnit. 
016 * @author Heinz Kredel.
017 */
018
019public 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        assertFalse("j == null ", j == null);
233        elem = new BigRational(-2,3);
234        assertTrue("j == 10 ", j.equals(elem) );
235    }
236
237
238    /**
239     * Test non-negative iterator.
240     */
241    public void testNNIterator() {
242        int t = 0;
243        BigRational bi = new BigRational();
244        bi.setNonNegativeIterator();
245        BigRational j = null, elem = null;
246        Iterator<BigRational> iter = bi.iterator();
247        while ( iter.hasNext() ) {
248            BigRational i = iter.next();
249            t++;
250            //System.out.println("i = " + i);
251            if ( t >= 20 ) {
252                j = i;
253                break;
254            }
255        }
256        assertFalse("j == null ", j == null);
257        elem = new BigRational(4,3);
258        assertTrue("j == 10 ", j.equals(elem) );
259    }
260
261
262    /**
263     * Test non-negative unique iterator.
264     */
265    public void testUniqueNNIterator() {
266        int t = 0;
267        BigRational bi = new BigRational();
268        bi.setNonNegativeIterator();
269        //bi.setAllIterator();
270        BigRational j = null, elem = null;
271        Iterator<BigRational> iter = bi.uniqueIterator();
272        while ( iter.hasNext() ) {
273            BigRational i = iter.next();
274            t++;
275            //System.out.println("i = " + i);
276            if ( t >= 20 ) {
277                j = i;
278                break;
279            }
280        }
281        assertFalse("j == null ", j == null);
282        elem = new BigRational(5,3);
283        assertTrue("j == 10 ", j.equals(elem) );
284    }
285
286}