from combine import combine


def test_empty_list():
    assert combine([], lambda x, y: x + y) == []

def test_single_item():
    assert combine(["hello"], lambda x, y: x + y) == ["hello"]

def test_two_items():
    assert combine(["hello", "world"], lambda x, y: x + y) == ["helloworld"]

def test_sum():
    assert combine([1, 2, 3, 4], lambda x, y: x + y) == [10]


def test_add_if_even():
    def add_if_even(x: int, y: int) -> int | None:
        if (x + y) % 2 == 0:
            return x + y
        return None

    assert combine([1, 3, 1, 4], add_if_even) == [4, 1, 4]
    assert combine([1, 3, 2, 4], add_if_even) == [10]


def test_join_if_same_letter():
    def join_if_same_letter(x: str, y: str) -> str | None:
        if x[0] == y[0]:
            return x + y
        return None

    assert combine(["hello", "hi", "home", "world", "welcome"], join_if_same_letter) == ["hellohihome", "worldwelcome"]


def test_no_combinations():
    def never_combine(x: int, y: int) -> None:
        return None

    input_list = [1, 2, 3, 4]
    assert combine(input_list, never_combine) == input_list