57 lines
1.3 KiB
Python
57 lines
1.3 KiB
Python
from typing import Tuple, TypeVar
|
|
|
|
import pytest
|
|
|
|
Number = TypeVar("Number", int, float)
|
|
|
|
|
|
def accumulate(*numbers: Tuple[Number]) -> Number:
|
|
result = 0
|
|
for n in numbers:
|
|
if not isinstance(n, (int, float)):
|
|
raise ValueError(f"{n} isn't a valid number value")
|
|
|
|
result += n
|
|
|
|
return result
|
|
|
|
|
|
def test_accumulate_without_mark():
|
|
numbers = [
|
|
[1, 2, 3, 4],
|
|
[5, 6, 7, 8],
|
|
[-1, 0, 1, 0],
|
|
[10, 11, -11, -12],
|
|
]
|
|
expected = (10, 26, 0, 1)
|
|
|
|
for number, expect in zip(numbers, expected):
|
|
assert accumulate(*number) == expect
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
argnames="numbers,expected",
|
|
argvalues=[
|
|
([1, 2, 3, 4], 10),
|
|
([5, 6, 7, 8], 26),
|
|
([-1, 0, 1, 0], 0),
|
|
([10, 11, -11, -12], 1),
|
|
],
|
|
ids=list("abcd"),
|
|
)
|
|
def test_accumulate_with_parametrize_mark(numbers, expected):
|
|
assert accumulate(*numbers) == expected
|
|
|
|
|
|
@pytest.mark.parametrize(argnames="even_number", argvalues=[2, 4])
|
|
@pytest.mark.parametrize(argnames="odd_number", argvalues=[1, 3])
|
|
def test_accumulate_with_multiple_parametrize_mark(even_number, odd_number):
|
|
expected = {
|
|
"1+2": 3,
|
|
"1+4": 5,
|
|
"3+2": 5,
|
|
"3+4": 7,
|
|
}
|
|
expr = f"{odd_number}+{even_number}"
|
|
assert accumulate(odd_number, even_number) == expected[expr]
|