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