def test_length_when_window_size_lte_list(l: List[float],
                                          window_size: int) -> None:
    assume(window_size <= len(l))
    assert len(moving_average(l, window_size)) == len(l) - window_size + 1
def test_length_when_window_size_gt_list(l: List[float],
                                         window_size: int) -> None:
    assert len(moving_average(l, window_size)) == 1
def test_constant_list_returns_constant_ma(value: float,
                                           list_size: int,
                                           window_size: int) -> None:
    ma = moving_average([value] * list_size, window_size)
    assert all([e == value for e in ma])
def test_empty_list_returns_empty_list(window_size: int) -> None:
    assert moving_average([], window_size) == []
def test_non_positive_window_size_raises(l: List[float]) -> None:
    with pytest.raises(ValueError):
        assert moving_average(l, 0) == l

    with pytest.raises(ValueError):
        assert moving_average(l, -2) == l
def test_window_size_one_is_identity(l: List[float]) -> None:
    assert moving_average(l, 1) == l
def test_simple_case() -> None:
    assert moving_average([1, 2, 3, 4], 2) == [1.5, 2.5, 3.5]