forked from MIT-Emerging-Talent/ET6-practice-code-review
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2a0dc86
commit 50bec53
Showing
2 changed files
with
117 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)}") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |