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