Lets code the all tests in the to do list. (this should be done one by, for the tutorial i used it just to show how to do it)
The FibonacciTest.java file will be look like
Just run the tests and see before progress. :)
we added 4 tests, they will fail.
lets pass the 4th test.
Edit the Fibonacci.java like below to produce the first 4 Fibonacci number correctly
The result will be
Lets write in the typical way to pass all the test correctly.
Then all the tests will be passed. We can do this type of code for every other input as well. But we know that it cannot be done manually :) so we have to seek for a pattern in this input outputs.
And there is a pattern. The nth Fibonacci number is equal to the
(n-1)th Fibonacci number + (n-2)th Fibonacci number
Lets modify the code to produce every Fibonacci number correctly
Lets check the correctness of the program by some random test cases. :)
Lets add this test to check some other known Fibonacci numbers.
Looks like our code pass those random cases as well. ok now we can assume that our code is working :)
The FibonacciTest.java file will be look like
package tdd; import org.junit.Test; import static org.junit.Assert.*; public class FibonacciTest { @Test public void testGetFibonacci_0() { int x = 0; Fibonacci instance = new Fibonacci(); int expResult = 0; int result = instance.getFibonacci(x); assertEquals(expResult, result); } @Test public void testGetFibonacci_1() { int x = 1; Fibonacci instance = new Fibonacci(); int expResult = 1; int result = instance.getFibonacci(x); assertEquals(expResult, result); } @Test public void testGetFibonacci_2() { int x = 2; Fibonacci instance = new Fibonacci(); int expResult = 1; int result = instance.getFibonacci(x); assertEquals(expResult, result); } @Test public void testGetFibonacci_3() { int x = 3; Fibonacci instance = new Fibonacci(); int expResult = 2; int result = instance.getFibonacci(x); assertEquals(expResult, result); } @Test public void testGetFibonacci_4() { int x = 4; Fibonacci instance = new Fibonacci(); int expResult = 3; int result = instance.getFibonacci(x); assertEquals(expResult, result); } @Test public void testGetFibonacci_5() { int x = 5; Fibonacci instance = new Fibonacci(); int expResult = 5; int result = instance.getFibonacci(x); assertEquals(expResult, result); } @Test public void testGetFibonacci_6() { int x = 6; Fibonacci instance = new Fibonacci(); int expResult = 8; int result = instance.getFibonacci(x); assertEquals(expResult, result); } }
Just run the tests and see before progress. :)
we added 4 tests, they will fail.
lets pass the 4th test.
Edit the Fibonacci.java like below to produce the first 4 Fibonacci number correctly
package tdd; public class Fibonacci { public int getFibonacci(int x) { int result = 0; if (x == 1 || x == 2) { result = 1; } else if (x==3) { result = 2; } return result; } }
The result will be
Lets write in the typical way to pass all the test correctly.
package tdd; public class Fibonacci { public int getFibonacci(int x) { int result = 0; if (x == 1 || x == 2) { result = 1; } else if (x == 3) { result = 2; } else if (x == 4) { result = 3; } else if (x == 5) { result = 5; } else if (x == 6) { result = 8; } return result; } }
Then all the tests will be passed. We can do this type of code for every other input as well. But we know that it cannot be done manually :) so we have to seek for a pattern in this input outputs.
And there is a pattern. The nth Fibonacci number is equal to the
(n-1)th Fibonacci number + (n-2)th Fibonacci number
Lets modify the code to produce every Fibonacci number correctly
package tdd; public class Fibonacci { public int getFibonacci(int x) { int fibNumber = 1; if (x == 0) { fibNumber = 0; } else if (x <= 2) { fibNumber = 1; } else { fibNumber = getFibonacci(x - 1) + getFibonacci(x - 2); } return fibNumber; } }
Lets check the correctness of the program by some random test cases. :)
Lets add this test to check some other known Fibonacci numbers.
@Test public void testFibonacci() { Fibonacci fibonacci = new Fibonacci(); int cases[][] = {{7, 13}, {8, 21}, {9, 34}, {10, 55}, {11, 89}, {18, 2584}, {19, 4181}}; for (int i = 0; i < cases.length; i++) { assertEquals(cases[i][1], fibonacci.getFibonacci(cases[i][0])); } }
Looks like our code pass those random cases as well. ok now we can assume that our code is working :)