test_binomial.py

import binomial


def test_pmf_at_zero_for_fair_coin():
    assert abs(binomial.pmf(0, 10, 0.5) - 1 / 1024) < 1e-12


def test_pmf_at_mode_for_fair_coin():
    assert abs(binomial.pmf(5, 10, 0.5) - 252 / 1024) < 1e-12


def test_pmf_sums_to_one_over_all_outcomes():
    total = sum(binomial.pmf(value, 10, 0.3) for value in range(11))
    assert abs(total - 1) < 1e-12


def test_cdf_at_largest_outcome_is_one():
    assert abs(binomial.cdf(10, 10, 0.3) - 1) < 1e-12


def test_cdf_is_monotone():
    values = [binomial.cdf(value, 10, 0.3) for value in range(11)]
    assert all(values[index] <= values[index + 1] for index in range(len(values) - 1))


def test_mean_of_fair_coin_is_half_trials():
    assert binomial.mean(10, 0.5) == 5.0


def test_variance_of_fair_coin():
    assert binomial.variance(10, 0.5) == 2.5


def test_simulate_returns_correct_length():
    samples = binomial.simulate(10, 0.5, 100, seed=0)
    assert len(samples) == 100


def test_simulate_values_are_in_range():
    samples = binomial.simulate(10, 0.5, 100, seed=1)
    assert all(0 <= value <= 10 for value in samples)


def test_simulated_mean_is_close_to_theoretical():
    samples = binomial.simulate(20, 0.5, 5000, seed=42)
    empirical_mean = sum(samples) / len(samples)
    assert abs(empirical_mean - 10) < 0.3


test_pmf_at_zero_for_fair_coin()
test_pmf_at_mode_for_fair_coin()
test_pmf_sums_to_one_over_all_outcomes()
test_cdf_at_largest_outcome_is_one()
test_cdf_is_monotone()
test_mean_of_fair_coin_is_half_trials()
test_variance_of_fair_coin()
test_simulate_returns_correct_length()
test_simulate_values_are_in_range()
test_simulated_mean_is_close_to_theoretical()