diff --git a/src/math_utils.py b/src/math_utils.py index e52f339..d05e908 100644 --- a/src/math_utils.py +++ b/src/math_utils.py @@ -9,3 +9,28 @@ def add(a, b): def multiply(a, b): """Multiply two numbers""" return a * b + + +def fibonacci(n): + """Calculate the nth Fibonacci number (0-indexed). + + Args: + n: Non-negative integer + + Returns: + The nth Fibonacci number + + Raises: + ValueError: If n is negative + """ + if n < 0: + raise ValueError("n must be non-negative") + if n == 0: + return 0 + if n == 1: + return 1 + + a, b = 0, 1 + for _ in range(2, n + 1): + a, b = b, a + b + return b diff --git a/tests/test_math_utils.py b/tests/test_math_utils.py index 516f210..7055426 100644 --- a/tests/test_math_utils.py +++ b/tests/test_math_utils.py @@ -2,7 +2,7 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent / 'src')) -from math_utils import add, multiply +from math_utils import add, multiply, fibonacci def test_add(): assert add(2, 3) == 5 @@ -13,3 +13,24 @@ def test_multiply(): assert multiply(2, 3) == 6 assert multiply(-1, 5) == -5 assert multiply(0, 10) == 0 + + +def test_fibonacci_normal(): + assert fibonacci(0) == 0 + assert fibonacci(1) == 1 + assert fibonacci(5) == 5 + assert fibonacci(10) == 55 + + +def test_fibonacci_edge_cases(): + assert fibonacci(2) == 1 + assert fibonacci(3) == 2 + assert fibonacci(4) == 3 + + +def test_fibonacci_negative(): + try: + fibonacci(-1) + assert False, "Should have raised ValueError" + except ValueError as e: + assert str(e) == "n must be non-negative"