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
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 :)

0 comments:
Post a Comment