001    /**
002     * This is part of HW2: Environment Setup and Java Introduction for CSE 331.
003     */
004    package hw2.test;
005    import hw2.*;
006    
007    import org.junit.Test;
008    import org.junit.BeforeClass;
009    import static org.junit.Assert.*;
010    
011    /**
012     * FibonacciTest is a glassbox test of the Fibonacci class.
013     *
014     * Recall that the Fibonacci sequence is a recursive
015     * sequence where the first two terms of the sequence are 1 and all subsequent
016     * terms are the sum of the previous two terms.
017     *
018     * Thus, the Fibonacci sequence starts out as 1, 1, 2, 3, 5, 8, 13...
019     * The first 1 in the sequence is considered the "0th" term,
020     * so the indices that <code>hw2.Fibonacci</code> uses are 0-based.
021     *
022     * @see hw2.Fibonacci
023     *
024     * @author mbolin
025     */
026    public class FibonacciTest {
027    
028        private static Fibonacci fib = null;
029    
030        @BeforeClass
031        public static void setupBeforeTests() throws Exception {
032            fib = new Fibonacci();
033        }
034    
035        /**
036         * Tests that Fibonacci throws an IllegalArgumentException
037         * for a negative number.
038         */
039        @Test(expected=IllegalArgumentException.class)
040        public void expectedIllegalArgumentException() {
041            fib.getFibTerm(-1);
042        }
043    
044    
045        /**
046         * Tests that Fibonacci throws no IllegalArgumentException
047         * for zero or for a positive number.
048         */
049        @Test
050        public void testThrowsIllegalArgumentException() {
051    
052            // test 0
053            try {
054                fib.getFibTerm(0);
055            } catch (IllegalArgumentException ex) {
056                fail("Threw IllegalArgumentException for 0 but 0 is nonnegative: "
057                        + ex);
058            }
059    
060            // test 1
061            try {
062                fib.getFibTerm(1);
063            } catch (IllegalArgumentException ex) {
064                fail("Threw IllegalArgumentException for 1 but 1 is nonnegative: "
065                        + ex);
066            }
067        }
068    
069        /** Tests to see that Fibonacci returns the correct value for the base cases, n=0 and n=1 */
070        @Test
071        public void testBaseCase() {
072            assertEquals("getFibTerm(0)", 1, fib.getFibTerm(0));
073            assertEquals("getFibTerm(1)", 1, fib.getFibTerm(1));
074        }
075    
076        /** Tests inductive cases of the Fibonacci sequence */
077        @Test
078        public void testInductiveCase() {
079            int[][] cases = new int[][] {
080                    { 2, 2 },
081                    { 3, 3 },
082                    { 4, 5 },
083                    { 5, 8 },
084                    { 6, 13 },
085                    { 7, 21 }
086                };
087            for (int i = 0; i < cases.length; i++) {
088                assertEquals("getFibTerm(" + cases[i][0] + ")",
089                             cases[i][1], fib.getFibTerm(cases[i][0]));
090            }
091        }
092    
093    }