Skip to content

Commit ce9f420

Browse files
authored
Add tests, remove main, add negativity test in Fibonacci.java (#5645)
1 parent 4a0e46d commit ce9f420

File tree

3 files changed

+109
-15
lines changed

3 files changed

+109
-15
lines changed

DIRECTORY.md

+1
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,7 @@
791791
* [DPTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/DPTest.java)
792792
* [EditDistanceTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/EditDistanceTest.java)
793793
* [EggDroppingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/EggDroppingTest.java)
794+
* [FibonacciTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/FibonacciTest.java)
794795
* [KnapsackMemoizationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackMemoizationTest.java)
795796
* [KnapsackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/KnapsackTest.java)
796797
* [LevenshteinDistanceTests](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/LevenshteinDistanceTests.java)

src/main/java/com/thealgorithms/dynamicprogramming/Fibonacci.java

+19-15
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.HashMap;
44
import java.util.Map;
5-
import java.util.Scanner;
65

76
/**
87
* @author Varun Upadhyay (https://github.com/varunu28)
@@ -11,27 +10,19 @@ public final class Fibonacci {
1110
private Fibonacci() {
1211
}
1312

14-
private static final Map<Integer, Integer> CACHE = new HashMap<>();
15-
16-
public static void main(String[] args) {
17-
// Methods all returning [0, 1, 1, 2, 3, 5, ...] for n = [0, 1, 2, 3, 4, 5, ...]
18-
Scanner sc = new Scanner(System.in);
19-
int n = sc.nextInt();
20-
21-
System.out.println(fibMemo(n));
22-
System.out.println(fibBotUp(n));
23-
System.out.println(fibOptimized(n));
24-
System.out.println(fibBinet(n));
25-
sc.close();
26-
}
13+
static final Map<Integer, Integer> CACHE = new HashMap<>();
2714

2815
/**
2916
* This method finds the nth fibonacci number using memoization technique
3017
*
3118
* @param n The input n for which we have to determine the fibonacci number
3219
* Outputs the nth fibonacci number
20+
* @throws IllegalArgumentException if n is negative
3321
*/
3422
public static int fibMemo(int n) {
23+
if (n < 0) {
24+
throw new IllegalArgumentException("Input n must be non-negative");
25+
}
3526
if (CACHE.containsKey(n)) {
3627
return CACHE.get(n);
3728
}
@@ -52,8 +43,12 @@ public static int fibMemo(int n) {
5243
*
5344
* @param n The input n for which we have to determine the fibonacci number
5445
* Outputs the nth fibonacci number
46+
* @throws IllegalArgumentException if n is negative
5547
*/
5648
public static int fibBotUp(int n) {
49+
if (n < 0) {
50+
throw new IllegalArgumentException("Input n must be non-negative");
51+
}
5752
Map<Integer, Integer> fib = new HashMap<>();
5853

5954
for (int i = 0; i <= n; i++) {
@@ -80,9 +75,13 @@ public static int fibBotUp(int n) {
8075
* Time Complexity will be O(n)
8176
* <p>
8277
* Whereas , the above functions will take O(n) Space.
78+
* @throws IllegalArgumentException if n is negative
8379
* @author Shoaib Rayeen (https://github.com/shoaibrayeen)
8480
*/
8581
public static int fibOptimized(int n) {
82+
if (n < 0) {
83+
throw new IllegalArgumentException("Input n must be non-negative");
84+
}
8685
if (n == 0) {
8786
return 0;
8887
}
@@ -105,9 +104,14 @@ public static int fibOptimized(int n) {
105104
* = 1.6180339887... Now, let's look at Binet's formula: Sn = Φⁿ–(– Φ⁻ⁿ)/√5 We first calculate
106105
* the squareRootof5 and phi and store them in variables. Later, we apply Binet's formula to get
107106
* the required term. Time Complexity will be O(1)
107+
* @param n The input n for which we have to determine the fibonacci number
108+
* Outputs the nth fibonacci number
109+
* @throws IllegalArgumentException if n is negative
108110
*/
109-
110111
public static int fibBinet(int n) {
112+
if (n < 0) {
113+
throw new IllegalArgumentException("Input n must be non-negative");
114+
}
111115
double squareRootOf5 = Math.sqrt(5);
112116
double phi = (1 + squareRootOf5) / 2;
113117
return (int) ((Math.pow(phi, n) - Math.pow(-phi, -n)) / squareRootOf5);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.thealgorithms.dynamicprogramming;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class FibonacciTest {
10+
11+
@BeforeEach
12+
void setUp() {
13+
// Clear the cache before each test to avoid interference
14+
Fibonacci.CACHE.clear();
15+
}
16+
17+
@Test
18+
void testFibMemo() {
19+
// Test memoization method
20+
assertEquals(0, Fibonacci.fibMemo(0));
21+
assertEquals(1, Fibonacci.fibMemo(1));
22+
assertEquals(1, Fibonacci.fibMemo(2));
23+
assertEquals(2, Fibonacci.fibMemo(3));
24+
assertEquals(3, Fibonacci.fibMemo(4));
25+
assertEquals(5, Fibonacci.fibMemo(5));
26+
assertEquals(8, Fibonacci.fibMemo(6));
27+
assertEquals(13, Fibonacci.fibMemo(7));
28+
assertEquals(21, Fibonacci.fibMemo(8));
29+
assertEquals(34, Fibonacci.fibMemo(9));
30+
assertEquals(55, Fibonacci.fibMemo(10));
31+
}
32+
33+
@Test
34+
void testFibBotUp() {
35+
// Test bottom-up method
36+
assertEquals(0, Fibonacci.fibBotUp(0));
37+
assertEquals(1, Fibonacci.fibBotUp(1));
38+
assertEquals(1, Fibonacci.fibBotUp(2));
39+
assertEquals(2, Fibonacci.fibBotUp(3));
40+
assertEquals(3, Fibonacci.fibBotUp(4));
41+
assertEquals(5, Fibonacci.fibBotUp(5));
42+
assertEquals(8, Fibonacci.fibBotUp(6));
43+
assertEquals(13, Fibonacci.fibBotUp(7));
44+
assertEquals(21, Fibonacci.fibBotUp(8));
45+
assertEquals(34, Fibonacci.fibBotUp(9));
46+
assertEquals(55, Fibonacci.fibBotUp(10));
47+
}
48+
49+
@Test
50+
void testFibOptimized() {
51+
// Test optimized Fibonacci method
52+
assertEquals(0, Fibonacci.fibOptimized(0));
53+
assertEquals(1, Fibonacci.fibOptimized(1));
54+
assertEquals(1, Fibonacci.fibOptimized(2));
55+
assertEquals(2, Fibonacci.fibOptimized(3));
56+
assertEquals(3, Fibonacci.fibOptimized(4));
57+
assertEquals(5, Fibonacci.fibOptimized(5));
58+
assertEquals(8, Fibonacci.fibOptimized(6));
59+
assertEquals(13, Fibonacci.fibOptimized(7));
60+
assertEquals(21, Fibonacci.fibOptimized(8));
61+
assertEquals(34, Fibonacci.fibOptimized(9));
62+
assertEquals(55, Fibonacci.fibOptimized(10));
63+
}
64+
65+
@Test
66+
void testFibBinet() {
67+
// Test Binet's formula method
68+
assertEquals(0, Fibonacci.fibBinet(0));
69+
assertEquals(1, Fibonacci.fibBinet(1));
70+
assertEquals(1, Fibonacci.fibBinet(2));
71+
assertEquals(2, Fibonacci.fibBinet(3));
72+
assertEquals(3, Fibonacci.fibBinet(4));
73+
assertEquals(5, Fibonacci.fibBinet(5));
74+
assertEquals(8, Fibonacci.fibBinet(6));
75+
assertEquals(13, Fibonacci.fibBinet(7));
76+
assertEquals(21, Fibonacci.fibBinet(8));
77+
assertEquals(34, Fibonacci.fibBinet(9));
78+
assertEquals(55, Fibonacci.fibBinet(10));
79+
}
80+
81+
@Test
82+
void testNegativeInput() {
83+
// Test negative input; Fibonacci is not defined for negative numbers
84+
assertThrows(IllegalArgumentException.class, () -> { Fibonacci.fibMemo(-1); });
85+
assertThrows(IllegalArgumentException.class, () -> { Fibonacci.fibBotUp(-1); });
86+
assertThrows(IllegalArgumentException.class, () -> { Fibonacci.fibOptimized(-1); });
87+
assertThrows(IllegalArgumentException.class, () -> { Fibonacci.fibBinet(-1); });
88+
}
89+
}

0 commit comments

Comments
 (0)