Skip to content

Commit

Permalink
prime generator is ready
Browse files Browse the repository at this point in the history
  • Loading branch information
mohd-makki committed Jan 6, 2025
1 parent 2a0dc86 commit 50bec53
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 0 deletions.
73 changes: 73 additions & 0 deletions solutions/prime_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
"""
A module for generating prime numbers up to a given limit.
Module contents:
- generate_primes(limit): Generates a list of prime numbers up to a given limit.
- get_valid_input(prompt): Prompts the user for valid input and validates it as a positive number.
Prime number generation rules:
- A prime number is a natural number greater than 1 that is not divisible by any number other than 1 and itself.
"""

def generate_primes(limit):
"""
Generate a series of prime numbers up to a given limit.
Args:
limit (float): The upper limit up to which prime numbers are generated.
Returns:
list: A list of prime numbers up to the specified limit.
Raises:
AssertionError:
- If 'limit' is not a float or integer.
- If 'limit' is less than 2.
Example:
>>> generate_primes(10)
[2, 3, 5, 7]
"""
# Input validation
assert isinstance(limit, (int, float)), "Limit must be a float or an integer"
assert limit >= 2, "Limit must be greater than or equal to 2"

primes = []
for num in range(2, int(limit) + 1):
if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
primes.append(num)
return primes


def get_valid_input(prompt):
"""
Prompt the user for input and validate it as a positive number (integer or float).
Args:
prompt (str): The message displayed to the user.
Returns:
float: A valid positive number input.
Raises:
AssertionError: If the prompt is not a string.
Example:
>>> get_valid_input("Enter a number: ")
# User enters 10
10.0
"""
assert isinstance(prompt, str), "Prompt must be a string"

while True:
try:
value = float(input(prompt)) # Accept input as float
if value > 0: # Ensure the value is positive
return value
print("The number must be greater than 0.")
except ValueError:
print("Invalid input. Please enter a valid number.")

if __name__ == "__main__":
user_limit = get_valid_input("Enter the limit for prime numbers: ")
print(f"Prime numbers up to {int(user_limit)}: {generate_primes(user_limit)}")
44 changes: 44 additions & 0 deletions solutions/tests/test_prime_generator
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import unittest
from prime_generator import generate_primes, get_valid_input


class TestPrimeGenerator(unittest.TestCase):
"""Tests for the prime number generator and input validation functions."""

def test_generate_primes_valid(self):
"""Test valid prime number generation."""
self.assertEqual(generate_primes(10), [2, 3, 5, 7])
self.assertEqual(generate_primes(2), [2])
self.assertEqual(generate_primes(20), [2, 3, 5, 7, 11, 13, 17, 19])

def test_generate_primes_invalid_limit(self):
"""Test invalid limit for prime generation."""
with self.assertRaises(AssertionError):
generate_primes(1) # Below valid range
with self.assertRaises(AssertionError):
generate_primes("ten") # Non-numeric input
with self.assertRaises(AssertionError):
generate_primes(-5) # Negative number

def test_get_valid_input(self):
"""Test get_valid_input with valid and invalid inputs."""
# Since `input()` is used, this requires user simulation or mocking.
# Mocking would replace `input()` with predefined values for testing.
import builtins
original_input = builtins.input

# Test valid input
builtins.input = lambda _: "10"
self.assertEqual(get_valid_input("Enter a number: "), 10.0)

# Test invalid inputs (mocking a sequence of attempts)
attempts = iter(["-5", "abc", "2.5"])
builtins.input = lambda _: next(attempts)
self.assertEqual(get_valid_input("Enter a number: "), 2.5)

# Restore original input
builtins.input = original_input


if __name__ == "__main__":
unittest.main()

0 comments on commit 50bec53

Please sign in to comment.