diff --git a/src/prime_checker.py b/src/prime_checker.py new file mode 100644 index 0000000..05a7491 --- /dev/null +++ b/src/prime_checker.py @@ -0,0 +1,35 @@ +def is_prime(number: int) -> bool: + """ + Check if a given number is prime. + + Args: + number (int): The number to check for primality. + + Returns: + bool: True if the number is prime, False otherwise. + + Raises: + ValueError: If the input is not an integer. + """ + # Check for invalid input + if not isinstance(number, int): + raise ValueError("Input must be an integer") + + # Handle edge cases + if number < 2: + return False + + # Optimization for small numbers + if number == 2: + return True + + # Even numbers greater than 2 are not prime + if number % 2 == 0: + return False + + # Check odd divisors up to the square root of the number + for divisor in range(3, int(number**0.5) + 1, 2): + if number % divisor == 0: + return False + + return True \ No newline at end of file diff --git a/tests/test_prime_checker.py b/tests/test_prime_checker.py new file mode 100644 index 0000000..ab90258 --- /dev/null +++ b/tests/test_prime_checker.py @@ -0,0 +1,50 @@ +import pytest +from src.prime_checker import is_prime + +def test_is_prime_small_primes(): + """Test small known prime numbers.""" + assert is_prime(2) == True + assert is_prime(3) == True + assert is_prime(5) == True + assert is_prime(7) == True + assert is_prime(11) == True + assert is_prime(13) == True + +def test_is_prime_small_composites(): + """Test small known composite numbers.""" + assert is_prime(1) == False + assert is_prime(4) == False + assert is_prime(6) == False + assert is_prime(8) == False + assert is_prime(9) == False + assert is_prime(10) == False + assert is_prime(12) == False + +def test_is_prime_larger_numbers(): + """Test larger prime and composite numbers.""" + assert is_prime(17) == True + assert is_prime(19) == True + assert is_prime(23) == True + assert is_prime(29) == True + + assert is_prime(15) == False + assert is_prime(21) == False + assert is_prime(25) == False + assert is_prime(27) == False + +def test_is_prime_edge_cases(): + """Test edge cases.""" + assert is_prime(0) == False + assert is_prime(1) == False + assert is_prime(-1) == False + assert is_prime(-2) == False + assert is_prime(-17) == False + +def test_is_prime_invalid_input(): + """Test handling of invalid input types.""" + with pytest.raises(ValueError): + is_prime(3.14) + with pytest.raises(ValueError): + is_prime("17") + with pytest.raises(ValueError): + is_prime(None) \ No newline at end of file