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    }