001    package hw3.test;
002    
003    import hw3.*;
004    import org.junit.Test;
005    import org.junit.BeforeClass;
006    import static org.junit.Assert.*;
007    import static org.hamcrest.CoreMatchers.*;
008    
009    /**
010     * This class contains a set of test cases that can be used to test the
011     * implementation of the RatPoly class.
012     */
013    public final class RatTermTest {
014    
015        // Get a RatNum for in an integer
016        private static RatNum num(int i) {
017            return new RatNum(i);
018        }
019    
020        private static RatNum num(int i, int j) {
021            return new RatNum(i, j);
022        }
023    
024        private static final RatNum nanNum = (num(1)).div(num(0));
025        private static final RatTerm nanTerm = new RatTerm(nanNum, 3);
026        private static final RatTerm zeroTerm = RatTerm.ZERO;
027        private static final RatTerm one = new RatTerm(new RatNum(1),0);
028        
029        // Convenient way to make a RatTerm equals to coeff*x^expt.
030        private static RatTerm term(int coeff, int expt) {
031            return new RatTerm(num(coeff), expt);
032        }
033    
034        // Convenient way to make a RatTerm equals to num/denom*x^expt.
035        private static RatTerm term(int numer, int denom, int expt) {
036            return new RatTerm(num(numer, denom), expt);
037        }
038    
039            ///////////////////////////////////////////////////////////////////////////////////////
040            ////    Constructor
041            ///////////////////////////////////////////////////////////////////////////////////////             
042        
043        // Is it good style to include these constructor tests? Explicit constructor
044        // tests are often not needed. Generally we advise you to have at
045        // least one assertion in every test unless testing that an exception IS
046        // thrown (via the "expected" test parameter). The constructor tests below
047        // violate this rule, but we chose to include them in this assignment in
048        // case they help you isolate constructor errors as you write your code.
049        @Test
050        public void testCtor() {
051            assertEquals(RatTerm.valueOf("1"), term(1, 0));
052            assertEquals(RatTerm.valueOf("2*x^3"), term(2, 3));
053            assertEquals(RatTerm.valueOf("4/3*x^6"), term(4, 3, 6));
054            assertEquals(RatTerm.valueOf("-2/7*x^3"), term(-2, 7, 3));
055        }
056    
057        @Test
058        public void testCtorZeroCoeff() {
059            assertEquals(RatTerm.ZERO, term(0, 0));
060            assertEquals(RatTerm.ZERO, term(0, 1));
061        }
062    
063        @Test
064        public void testCtorNaN() {
065            assertEquals(RatTerm.NaN, term(3, 0, 0));
066        }
067    
068            ///////////////////////////////////////////////////////////////////////////////////////
069            ////    Get Coefficient
070            ///////////////////////////////////////////////////////////////////////////////////////             
071        
072        @Test
073        public void testGetCoeffRegular() {
074            // Simple cases
075            assertEquals(num(3), term(3, 1).getCoeff());
076            assertEquals(num(2, 5), term(2, 5, 2).getCoeff());
077        }
078        
079        @Test
080        public void testGetCoeffZero() {
081            // Check zero
082            assertEquals(num(0), term(0, 0).getCoeff());
083        }
084    
085        @Test
086        public void testGetCoeffNegative() {
087            // Check negative coeff
088            assertEquals(num(-2, 3), term(-2, 3, 2).getCoeff());
089        }
090        
091        @Test
092        public void testGetCoeffNaN() {
093            // Check NaN
094            assertEquals(nanNum, term(3, 0, 4).getCoeff());
095        }
096    
097        ///////////////////////////////////////////////////////////////////////////////////////
098        ////        Get Coefficient
099        /////////////////////////////////////////////////////////////////////////////////////// 
100        
101        @Test
102        public void testGetExptRegular() {
103            // Simple
104            assertEquals(4, term(2, 4).getExpt());
105        }
106        
107        @Test
108        public void testGetExptZero() {
109            // Zero always have zero expt
110            assertEquals(0, term(0, 0).getExpt());
111            assertEquals(0, term(0, 1).getExpt());
112        }
113    
114        ///////////////////////////////////////////////////////////////////////////////////////
115        ////        isNaN Test
116        /////////////////////////////////////////////////////////////////////////////////////// 
117        
118        @Test
119        public void testIsNaNZeroDenomRegNumer() {
120            // Check that 5/0*x^0 isNaN instead of zero
121            assertTrue(term(5, 0, 0).isNaN());
122        }
123        
124        @Test
125        public void testIsNaNZeroDenomZeroNumer() {
126             // Check that 0/0*x^4 isNaN instead of zero
127            assertTrue(term(0, 0, 4).isNaN());
128        }
129        
130        @Test
131        public void testIsNaNFalse() {
132            // Check for false positives
133            assertFalse(term(2, 3, 2).isNaN());     
134        }
135    
136        ///////////////////////////////////////////////////////////////////////////////////////
137        ////        isZero Test
138        ///////////////////////////////////////////////////////////////////////////////////////     
139        
140        @Test
141        public void testIsZeroNumAndDen() {
142            assertTrue(term(0, 0).isZero());      
143        }
144        
145        @Test
146        public void testIsZeroNum() {
147            assertTrue(term(0, 1).isZero());
148            assertTrue(term(0, 4, 3).isZero());
149            assertTrue(term(0, -2, 2).isZero());
150        }
151        
152        @Test
153        public void testIsZeroFalsoPos() {
154            // Check for false positives
155            assertFalse(term(1, 3, 0).isZero());
156        }
157        
158        @Test
159        public void testIsNaNNotTerm() {
160            // Check that 0/0*x^4 is not zero
161            assertFalse(term(0, 0, 4).isZero());
162        }
163    
164        ///////////////////////////////////////////////////////////////////////////////////////
165        ////        eval Test
166        ///////////////////////////////////////////////////////////////////////////////////////  
167    
168        @Test
169        public void testEvalZero() {
170            assertEquals(0.0, term(0, 0).eval(5.0), 0.0000001);
171            assertEquals(0.0, term(0, 5).eval(1.2), 0.0000001);
172        }
173        
174        @Test
175        public void testEvalSmallFrac() {
176            assertEquals(.125, term(1, 2, 2).eval(.5), 0.0000001);          
177        }
178        
179        @Test
180        public void testEvalSmallWhole() {
181            assertEquals(2.0, term(2, 0).eval(3.1), 0.0000001);
182            assertEquals(1.0, term(1, 0).eval(100.0), 0.0000001);
183            assertEquals(1.0, term(-1, 1).eval(-1.0), 0.0000001);
184            assertEquals(2.0, term(1, 2, 2).eval(2.0), 0.0000001);
185        }
186        
187        @Test
188        public void testEvalLarge() {
189            assertEquals(35.0, term(5, 1).eval(7.0), 0.0000001);
190            assertEquals(12.0, term(3, 2).eval(2.0), 0.0000001);
191        }
192        
193        @Test
194        public void testEvalNegative() {
195            assertEquals(-16.0, term(-2, 3).eval(2.0), 0.0000001);
196            assertEquals(-3.0, term(3, 3).eval(-1.0), 0.0000001);
197        }
198    
199        @Test
200        public void testEvalNaN() {
201            // To understand the use of "new Double(Double.NaN)" instead of
202            // "Double.NaN", see the Javadoc for Double.equals().
203            assertEquals(new Double(Double.NaN),
204                         new Double(term(3, 0, 2).eval(1.0)));
205        }
206        
207        ///////////////////////////////////////////////////////////////////////////////////////
208        ////        Equals Test
209        ///////////////////////////////////////////////////////////////////////////////////////     
210        
211        @Test
212        public void testEquals() {
213            assertEquals(term(3, 5), term(3, 5));
214            assertEquals(term(1, 2, 4), term(1, 2, 4));
215            assertEquals(term(-2, 4, 2), term(1, -2, 2));        
216        }
217        @Test
218        public void testNotEqualsReg() {
219            assertThat(term(4, 6), not(term(7, 8)));
220        }
221    
222        @Test
223        public void testEqualsZeroCoeff() {
224            assertEquals(term(0, 0), term(0, 0));
225            assertEquals(term(0, 1), term(0, 0));
226        }
227        
228        @Test
229        public void testEqualsNotZeroCoeff() {
230            assertThat(term(0, 0), not(term(3, 5)));
231        }
232    
233        @Test
234        public void testEqualsNaNCoeff() {
235            assertEquals(nanTerm, term(19, 0, 0));
236            assertEquals(nanTerm, term(0, 0, 0));
237        }
238        
239        @Test
240        public void testEqualsNotNaNCoeff() {
241            assertThat(nanTerm, not(term(3, 5)));
242            assertThat(term(0, 3), not(nanTerm));           
243        }
244    
245        ///////////////////////////////////////////////////////////////////////////////////////
246        ////        ValueOf Test
247        ///////////////////////////////////////////////////////////////////////////////////////  
248        
249        // All tests below depend on constructor and equals.
250        
251        private void testValueOf(String actual, RatTerm target) {
252            assertEquals(target, RatTerm.valueOf(actual));
253        }
254    
255        @Test
256        public void testValueOfSimple() {
257            testValueOf("x", term(1, 1));
258            testValueOf("-x", term(-1, 1));
259        }
260    
261        @Test
262        public void testValueOfConst() {
263            testValueOf("2", term(2, 0));
264            testValueOf("3/4", term(3, 4, 0));
265            testValueOf("-4", term(-4, 0));
266            testValueOf("-7/5", term(-7, 5, 0));
267        }
268    
269        @Test
270        public void testValueOfLeadingCoeff() {
271            testValueOf("2*x", term(2, 1));
272            testValueOf("3/7*x", term(3, 7, 1));
273            testValueOf("-4/3*x", term(-4, 3, 1));
274        }
275    
276        @Test
277        public void testValueOfPow() {
278            testValueOf("x^3", term(1, 3));
279            testValueOf("-x^4", term(-1, 4));
280        }
281    
282        @Test
283        public void testValueOfFull() {
284            testValueOf("4*x^2", term(4, 2));
285            testValueOf("2/5*x^6", term(2, 5, 6));
286            testValueOf("-3/2*x^2", term(-3, 2, 2));
287        }
288    
289        @Test
290        public void testValueOfNaN() {
291            testValueOf("NaN", term(1, 0, 0));
292        }
293    
294        @Test
295        public void testValueOfZero() {
296            testValueOf("0", term(0, 0));
297        }
298    
299        ///////////////////////////////////////////////////////////////////////////////////////
300        ////        toString Test
301        ///////////////////////////////////////////////////////////////////////////////////////  
302    
303        private void testToString(String target, RatTerm actual) {
304            assertEquals(target, actual.toString());
305        }
306    
307        @Test
308        public void testToStringSimple() {
309            testToString("x", term(1, 1));
310            testToString("-x", term(-1, 1));
311        }
312    
313        @Test
314        public void testToStringConst() {
315            testToString("2", term(2, 0));
316            testToString("3/4", term(3, 4, 0));
317            testToString("-4", term(-4, 0));
318            testToString("-7/5", term(-7, 5, 0));
319        }
320    
321        @Test
322        public void testToStringLeadingCoeff() {
323            testToString("2*x", term(2, 1));
324            testToString("3/7*x", term(3, 7, 1));
325            testToString("-4/3*x", term(-4, 3, 1));
326        }
327    
328        @Test
329        public void testToStringPow() {
330            testToString("x^3", term(1, 3));
331            testToString("-x^4", term(-1, 4));
332        }
333    
334        @Test
335        public void testToStringFull() {
336            testToString("4*x^2", term(4, 2));
337            testToString("2/5*x^6", term(2, 5, 6));
338            testToString("-3/2*x^2", term(-3, 2, 2));
339        }
340    
341        @Test
342        public void testToStringNaN() {
343            testToString("NaN", term(1, 0, 0));
344        }
345    
346        @Test
347        public void testToStringZero() {
348            testToString("0", term(0, 0));
349        }
350    
351        ///////////////////////////////////////////////////////////////////////////////////////
352        ////        Add Test
353        /////////////////////////////////////////////////////////////////////////////////////// 
354        //Relies on RatTerm equals method and RatNum add method is correct
355        
356        @Test // Addition with Whole Number Coefficient
357        public void testAddWholeNumCoeff() {
358            assertEquals(term(3, 0), term(1, 0).add(term(2, 0))); //Zero Exponent Value
359            assertEquals(term(4, 2), term(3, 2).add(term(1, 2))); //Non Zero Exponent 
360        }
361    
362        @Test // Addition with Fractional Number Coefficient
363        public void testAddFracNumCoeff() {
364            assertEquals(term(1, 2, 3), term(1, 6, 3).add(term(1, 3, 3)));
365            assertEquals(term(1, 8, 1), term(1, 4, 1).add(term(-1, 8, 1)));
366            assertEquals(term(-1, 8, 1), term(-1, 4, 1).add(term(1, 8, 1)));
367        }
368        
369        @Test // Addition Associativity
370        public void testAddAssociativity() {
371            //Whole Number Coefficient
372            assertEquals(term(6, 0), term(1, 0).add(term(2, 0)).add(term(3,0)));
373            assertEquals(term(6, 0), term(3, 0).add(term(2, 0)).add(term(1,0)));
374            
375            //Fractional Number Coefficient
376            assertEquals(term(7, 8, 3), term(1, 8, 3).add(term(1, 4, 3)).add(term(1, 2, 3)));
377            assertEquals(term(7, 8, 3), term(1, 2, 3).add(term(1, 4, 3)).add(term(1, 8, 3)));
378        }
379        
380        @Test // Addition Commutative
381        public void testAddCommutativity() {
382            assertEquals(term(1, 2, 3), term(1, 3, 3).add(term(1, 6, 3)));
383            assertEquals(term(3, 0), term(2, 0).add(term(1, 0)));
384        }
385        
386        @Test // Zero Term + Zero Term == Zero Term
387        public void testAddZeroToZero() {
388            assertEquals(zeroTerm, zeroTerm.add(zeroTerm));
389        }
390        
391        @Test // t + Zero Term == t && Zero Term + t == t
392        public void testAddZeroToNonZero() {
393            RatTerm t = term(-2, 3);
394            assertEquals(t, zeroTerm.add(t));
395            assertEquals(t, t.add(zeroTerm));
396        }
397        
398        @Test // NaN + NaN == NaN
399        public void testAddNaNtoNaN() {
400            assertEquals(nanTerm, nanTerm.add(nanTerm));
401        }
402        
403        @Test // t + NaN == NaN
404        public void testAddNaNtoNonNaN() {
405            assertEquals(nanTerm, nanTerm.add(term(3, 4)));
406            assertEquals(nanTerm, term(3, 4).add(nanTerm));
407        }
408        
409        ///////////////////////////////////////////////////////////////////////////////////////
410        ////        Subtract Test
411        /////////////////////////////////////////////////////////////////////////////////////// 
412        
413        //Also Tests Addition inverse property
414        
415        @Test // Subtraction with Whole Number Coefficient
416        public void testSubtractWholeNumCoeff() {
417            assertEquals(term(1, 0), term(2, 0).sub(term(1, 0)));
418            assertEquals(term(-1, 0), term(1, 0).sub(term(2, 0)));
419            assertEquals(term(2, 2), term(3, 2).sub(term(1, 2)));
420        }
421        
422        @Test // Subtraction with Fractional Number Coefficient
423        public void testSubtractFractionalNumCoeff() {
424            assertEquals(term(-1, 6, 3), term(1, 6, 3).sub(term(1, 3, 3)));
425            assertEquals(term(3, 8, 1), term(1, 4, 1).sub(term(-1, 8, 1)));
426            assertEquals(term(-3, 8, 1), term(-1, 4, 1).sub(term(1, 8, 1)));
427        }
428        
429        @Test // Zero Term - Zero Term == Zero Term
430        public void testSubtractZeroFromZero() {
431            assertEquals(zeroTerm, zeroTerm.sub(zeroTerm));
432        }
433        
434        //Following test method depends on correctness of negate
435        @Test // t - Zero Term == t && Zero Term - t == -t
436        public void testSubtractZeroAndNonZero() {
437            RatTerm t = term(-2, 3);
438            assertEquals(t.negate(), zeroTerm.sub(t));
439            assertEquals(t, t.sub(zeroTerm));
440        }
441        
442        @Test // NaN - NaN == NaN
443        public void testSubtractNaNtoNaN() {
444            assertEquals(nanTerm, nanTerm.sub(nanTerm));
445        }
446        
447        @Test // t - NaN == NaN && NaN - t == NaN
448        public void testSubtractNaNtoNonNaN() {
449            assertEquals(nanTerm, nanTerm.sub(term(3, 4)));
450            assertEquals(nanTerm, term(3, 4).sub(nanTerm));
451        }
452        
453        ///////////////////////////////////////////////////////////////////////////////////////
454        ////        Multiplication Test
455        /////////////////////////////////////////////////////////////////////////////////////// 
456    
457        @Test // Multiplication with Whole Number Coefficient
458        public void testMultiplicationWholeNumCoeff() {
459            assertEquals(term(2, 0), term(1, 0).mul(term(2, 0))); //Zero Exponent Value
460            assertEquals(term(30, 4), term(3, 2).mul(term(10, 2))); //Non Zero Exponent 
461        }
462    
463        @Test // Multiplication with Fractional Number Coefficient
464        public void testMultiplicationFracNumCoeff() {
465            assertEquals(term(1, 18, 6), term(1, 6, 3).mul(term(1, 3, 3)));
466            assertEquals(term(-1, 32, 2), term(1, 4, 1).mul(term(-1, 8, 1)));
467        }
468        
469        @Test // Multiplication with different Exponent Values
470        public void testMultiplicationDifferentExpVal() {
471            assertEquals(term(3*2, 6*3, 9+3), term(3, 6, 9).mul(term(2, 3, 3)));
472            assertEquals(term(1*-1, 8*4, -1+1), term(1, 4, -1).mul(term(-1, 8, 1)));
473            assertEquals(term(-1*1, 4*8, 100+10), term(-1, 4, 100).mul(term(1, 8, 10)));
474        }
475        
476        @Test // Multiplication Associativity
477        public void testMultiplicationAssociativity() {
478            //Whole Number Coefficient
479            assertEquals(term(12,5).mul(term(11, 4)).mul(term(10, 3)), 
480                            term(10, 3).mul(term(11, 4)).mul(term(12,5)));
481            
482            //Fractional Number Coefficient
483            assertEquals(term(4, 9, 3).mul(term(2, 9, 2)).mul(term(1, 3, 1)), 
484                            term(1, 3, 1).mul(term(2, 9, 2)).mul(term(4, 9, 3)));
485        }
486        
487        @Test // Multiplication Commutative
488        public void testMultiplicationCommutativity() {
489            //Whole Number Coefficient
490            assertEquals(term(7, 1).mul(term(3, 9)), term(3, 9).mul(term(7, 1)));
491            
492            //Fractional Number Coefficient
493            assertEquals(term(1, 6, 3).mul(term(1, 3, 3)), term(1, 3, 3).mul(term(1, 6, 3)));       
494        }
495        
496        @Test // Zero Term * Zero Term == Zero Term
497        public void testMultiplicationZeroToZero() {
498            assertEquals(zeroTerm, zeroTerm.mul(zeroTerm));
499        }
500        
501        @Test // t * Zero Term == Zero Term && Zero Term * t == Zero Term
502        public void testMultiplicationZeroToNonZero() {
503            RatTerm t = term(-2, 3);
504            assertEquals(zeroTerm, zeroTerm.mul(t));
505            assertEquals(zeroTerm, t.mul(zeroTerm));
506        }
507        
508        @Test // NaN * NaN == NaN
509        public void testMultiplicationNaNtoNaN() {
510            assertEquals(nanTerm, nanTerm.mul(nanTerm));
511        }
512        
513        @Test // t * NaN == NaN
514        public void testMultiplicationNaNtoNonNaN() {
515            assertEquals(nanTerm, nanTerm.mul(term(3, 4)));
516            assertEquals(nanTerm, term(3, 4).mul(nanTerm));
517        }
518        
519        @Test // a * 1 == a
520        public void testMultiplicationIdentity() {
521            assertEquals(term(4, 3), term(4, 3).mul(one));
522        }
523        
524        ///////////////////////////////////////////////////////////////////////////////////////
525        ////        Division Test
526        ///////////////////////////////////////////////////////////////////////////////////////     
527        
528        @Test // Division with Whole Number Coefficient
529        public void testDivisionWholeNumCoeff() {
530             assertEquals(term(3, 0), term(3, 2).div(term(1, 2)));
531             assertEquals(term(2, 1), term(2, 1).div(term(1, 0)));
532             assertEquals(term(8, 3), term(-16, 5).div(term(-2, 2)));
533        }
534        
535        @Test // Division with Fractional Number Coefficient
536        public void testDivisionFractionalNumCoeff() {
537            assertEquals(term(1, 2, 0), term(1, 0).div(term(2, 0)));
538            assertEquals(term(1, 2, 0), term(1, 6, 3).div(term(1, 3, 3)));
539            assertEquals(term(-2, 0), term(1, 4, 1).div(term(-1, 8, 1)));
540        }
541        
542        @Test // Zero Term / Zero Term == NaN
543        public void testDivisionZeroFromZero() {
544            assertEquals(nanTerm, zeroTerm.div(zeroTerm));
545        }
546        
547        //Following test method depends on correctness of negate
548        @Test // t / Zero Term == NaN && Zero Term / t == 0
549        public void testDivisionZeroAndNonZero() {
550            RatTerm t = term(-2, 3);
551            assertEquals(zeroTerm, zeroTerm.div(t));
552            assertEquals(nanTerm, t.div(zeroTerm));
553        }
554        
555        @Test // NaN / NaN == NaN
556        public void testDivisionNaNtoNaN() {
557            assertEquals(nanTerm, nanTerm.div(nanTerm));
558        }
559        
560        @Test // t / NaN == NaN && NaN / t == NaN
561        public void testDivisionNaNtoNonNaN() {
562            assertEquals(nanTerm, nanTerm.div(term(3, 4)));
563            assertEquals(nanTerm, term(3, 4).div(nanTerm));
564        }
565        
566        @Test // a / 1 == a
567        public void testDivisionByOne() {
568            assertEquals(term(4, 3), term(4, 3).div(one));
569        }
570    
571        ///////////////////////////////////////////////////////////////////////////////////////
572        ////        Differentiation Test
573        /////////////////////////////////////////////////////////////////////////////////////// 
574        //As stated in specification for any term b is assumed >= 0
575        //Note : Derivative of f = f'
576        
577        // (NaN)' = NaN
578        @Test
579        public void testDifferentiateNaN(){
580            assertEquals(nanTerm, nanTerm.differentiate());
581            assertEquals(nanTerm, (new RatTerm(RatNum.NaN, 0)).differentiate());
582        }
583        
584        // (RatTerm.ZERO)' = RatTerm.ZERO
585        @Test
586        public void testDifferentiateZero(){
587            assertEquals(term(0, 0), term(0, 0).differentiate());
588        }
589        
590        // constant a => (a)' = 0
591        @Test
592        public void testDifferentiateConstantNonZero(){
593            assertEquals(term(0, 0), term(99, 0).differentiate());
594            assertEquals(term(0, 0), term(1, 0).differentiate());
595        }
596        
597        // Constant Multiple Rule (af)' = af'
598        @Test
599        public void testDifferentiateMultiplicationRule(){
600            // Whole Number Coefficient
601            assertEquals(term(5, 0).mul(term(1,3).differentiate()), 
602                            (term(5, 0).mul(term(1,3))).differentiate());
603            
604            // Fractional Number Coefficient
605            assertEquals(term(2,3,0).mul(term(1,4,3).differentiate()), 
606                            (term(2,3,0).mul(term(1,4,3))).differentiate());
607        }
608        
609        // Polynomial Power Rule (ax^b) = (a*b)*x^(b-1) 
610        @Test
611        public void testDifferentiatePowerRule(){
612            assertEquals(term(1, 0), term(1, 1).differentiate());
613            assertEquals(term(5, 0), term(5, 1).differentiate());
614            assertEquals(term(14, 1), term(7, 2).differentiate());
615            assertEquals(term(-2, 3), term(-1, 2, 4).differentiate());
616        }
617        
618        // Sum rule (f + g)' = f' + g'
619        @Test
620        public void testDifferentiateSumRule(){
621            // Whole Number Coefficient
622            assertEquals(((term(5, 2)).add(term(1,2))).differentiate(), 
623                            (term(5, 2).differentiate()).add(term(1,2).differentiate()));
624            
625            // Fractional Number Coefficient
626            assertEquals(((term(5, 2, 7)).add(term(1,3, 7))).differentiate(), 
627                            (term(5, 2, 7).differentiate()).add(term(1,3, 7).differentiate()));
628        }
629        
630        // Subtraction rule (f - g)' = f' - g'
631        @Test
632        public void testDifferentiateSubtractionRule(){
633            // Whole Number Coefficient
634            assertEquals(((term(5, 2)).sub(term(1,2))).differentiate(), 
635                            (term(5, 2).differentiate()).sub(term(1,2).differentiate()));
636            
637            // Fractional Number Coefficient
638            assertEquals(((term(5, 2, 7)).sub(term(1,3, 7))).differentiate(), 
639                            (term(5, 2, 7).differentiate()).sub(term(1,3, 7).differentiate()));
640        }
641        
642        // Product Rule h(x) = f(x)*g(x) => h'(x) = f'(x)g(x) + f(x)g'(x)
643        @Test
644        public void testDifferentiateProductRule(){
645            // Whole Number Coefficient
646            RatTerm init_product = term(12, 4).mul(term(5,4));
647            RatTerm deriv_pt1 = (term(12, 4).differentiate()).mul(term(5,4));
648            RatTerm deriv_pt2 = term(12, 4).mul(term(5,4).differentiate());
649            
650            assertEquals(init_product.differentiate() , deriv_pt1.add(deriv_pt2));
651            
652            // Fractional Number Coefficient
653            init_product = term(1,2, 4).mul(term(2,3,4));
654            deriv_pt1 = (term(1,2, 4).differentiate()).mul(term(2,3,4));
655            deriv_pt2 = term(1,2, 4).mul(term(2,3,4).differentiate());
656            
657            assertEquals(init_product.differentiate() , deriv_pt1.add(deriv_pt2));
658        }
659    
660        ///////////////////////////////////////////////////////////////////////////////////////
661        ////        AntiDifferentiation Test
662        ///////////////////////////////////////////////////////////////////////////////////////
663        //As stated in specification for any term b is assumed >= 0 and Integration Constant is Zero
664        //Note : AntiDerivative of f(x) = F(x) , f = F
665        //Note : c = Arbitrary Constant
666        
667        // Constant Rule f(x) = c => F = c*x
668        @Test
669        public void testAntiDifferentiateConstantRule() {
670            // Zero
671            assertEquals(zeroTerm, zeroTerm.antiDifferentiate());
672            
673            // Non Zero constant
674            assertEquals(term(3,1), term(3,0).antiDifferentiate());
675        }
676        
677        // Constant Multiple Rule f(x) = c*g(x) => F = c*G(x)
678        @Test
679        public void testAntiDifferentiateConstantMultipleRule() {
680            // Whole Number Coefficient
681            assertEquals(((term(5, 0)).mul(term(1,2))).antiDifferentiate(), 
682                            term(5, 0).mul(term(1,2).antiDifferentiate()));
683            
684            // Fraction Coefficient
685            assertEquals(((term(1,500, 0)).mul(term(1,2,3))).antiDifferentiate(), 
686                            term(1,500, 0).mul(term(1,2,3).antiDifferentiate()));
687        }
688        
689        // Power Rule f(x) = x^a => F = (x^(a+1))/(a+1)
690        @Test
691        public void testAntiDifferentiatePowerRule() {
692            assertEquals(term(1, 2), term(2, 1).antiDifferentiate());
693            assertEquals(term(4, 3, 3), term(4, 2).antiDifferentiate());
694        }
695        
696        // Sum Rule if h(x) = f(x) + g(x) => H(x) = F(x) + G(x)
697        @Test
698        public void testAntiDifferentiateSumRule() {
699            // Whole Number Coefficient
700            assertEquals((term(1, 2).add(term(3,2))).antiDifferentiate(), 
701                            term(1, 2).antiDifferentiate().add(term(3,2).antiDifferentiate()));
702            
703            // Fraction Coefficient
704            assertEquals((term(3,4,5).add(term(1,2,5))).antiDifferentiate(), 
705                            term(3,4,5).antiDifferentiate().add(term(1,2,5).antiDifferentiate()));
706        }
707        
708        // Difference Rule if h(x) = f(x) - g(x) => H(x) = F(x) - G(x)
709        @Test
710        public void testAntiDifferentiateDifferenceRule() {
711            // Whole Number Coefficient
712            assertEquals((term(1, 2).sub(term(3,2))).antiDifferentiate(), 
713                            term(1, 2).antiDifferentiate().sub(term(3,2).antiDifferentiate()));
714            
715            // Fraction Coefficient
716            assertEquals((term(3,4,5).sub(term(1,2,5))).antiDifferentiate(), 
717                            term(3,4,5).antiDifferentiate().sub(term(1,2,5).antiDifferentiate()));
718        }
719    
720        ///////////////////////////////////////////////////////////////////////////////////////
721        ////        HashCode Test
722        /////////////////////////////////////////////////////////////////////////////////////// 
723        
724        // Same Object same hashcode after multiple queries
725        @Test
726        public void testHashCodeSameObject() {
727            RatTerm t = term(23,45);
728            for (int i = 0; i < 25 ; i++){ //Verify Non random Hascode
729                    assertEquals(t.hashCode(), t.hashCode());
730            }
731        }
732        
733        // Equals Objects same hashcode
734        @Test
735        public void testHashCodeEqualDiffObjects() {
736            RatTerm t = term(23,45);
737            RatTerm t2 = term(23,45);
738            assertEquals(t.hashCode(), t2.hashCode());
739        }
740        
741        // Non Equal Object different hashcode
742        @Test
743        public void testHashCodeNonEqualObjects() {
744            RatTerm t = term(1,2);
745            RatTerm t2 = term(3,2);
746            RatTerm t3 = term(1,3);
747            assertFalse(t.hashCode() == t2.hashCode());
748            assertFalse(t.hashCode() == t3.hashCode());
749        }
750    }