import statistics
import pytest
from util.number_interval_generator import (NumberInterval, NumberIntervalGenerator, POSITIVE_INFINITY)
NUMBER_OF_RANDOM_INTERVALS = 1_000
[docs]
def test_equal_method():
number_interval_1 = NumberInterval(10, 20)
number_interval_2 = NumberInterval(10, 20)
assert number_interval_1 == number_interval_2
number_interval_3 = NumberInterval(10, 20)
number_interval_4 = NumberInterval(10, 21)
assert number_interval_3 != number_interval_4
[docs]
def get_random_intervals(
mean: int, standard_deviation: int, _lower_number_min_value: int = 0
) -> list[NumberInterval]:
lower_number_bounds: NumberInterval = NumberInterval(
lower_bound=_lower_number_min_value, upper_bound=POSITIVE_INFINITY
)
number_interval_generator = NumberIntervalGenerator(
mean=mean,
standard_deviation=standard_deviation,
lower_number_bounds=lower_number_bounds,
)
return [
number_interval_generator.generate_interval()
for _ in range(NUMBER_OF_RANDOM_INTERVALS)
]
[docs]
def get_random_numbers(
mean: int, standard_deviation: int, _lower_number_min_value: int = 0
) -> list[int]:
return [
text_length.lower_bound
for text_length in get_random_intervals(
mean=mean,
standard_deviation=standard_deviation,
_lower_number_min_value=_lower_number_min_value,
)
]
[docs]
@pytest.mark.parametrize(
"text_length_mean,text_length_standard_deviation",
[
(1_000, 100),
(100, 50),
(200, 10),
],
)
def test_random_interval_distribution(text_length_mean, text_length_standard_deviation):
random_numbers = get_random_numbers(
mean=text_length_mean, standard_deviation=text_length_standard_deviation
)
actual_mean = statistics.mean(random_numbers)
actual_standard_deviation = statistics.stdev(random_numbers)
assert abs(text_length_mean - actual_mean) < text_length_mean / 2
assert (
abs(text_length_standard_deviation - actual_standard_deviation)
< text_length_standard_deviation / 2
)
[docs]
@pytest.mark.parametrize("lower_number_min_value", [10, 100])
def test_random_numbers_intervals_are_in_bound(lower_number_min_value):
mean = 200
stddev = 1_000
random_numbers = get_random_numbers(
mean, stddev, _lower_number_min_value=lower_number_min_value
)
assert min(random_numbers) >= lower_number_min_value
[docs]
def test_text_length_upper_bound():
mean = 100
standard_deviation = 100
random_text_lengths = get_random_intervals(mean, standard_deviation)
for random_text_length in random_text_lengths:
if random_text_length.lower_bound >= 40:
assert random_text_length.upper_bound - random_text_length.lower_bound >= 10
if random_text_length.lower_bound >= 200:
assert random_text_length.upper_bound - random_text_length.lower_bound >= 20
assert (
random_text_length.upper_bound - random_text_length.lower_bound <= 200
)