import pytest

from bumpversion.functions import NumericFunction, ValuesFunction

# NumericFunction


def test_numeric_init_wo_first_value():
    func = NumericFunction()
    assert func.first_value == "0"


def test_numeric_init_w_first_value():
    func = NumericFunction(first_value="5")
    assert func.first_value == "5"


def test_numeric_init_non_numeric_first_value():
    with pytest.raises(ValueError):
        NumericFunction(first_value="a")


def test_numeric_bump_simple_number():
    func = NumericFunction()
    assert func.bump("0") == "1"


def test_numeric_bump_prefix_and_suffix():
    func = NumericFunction()
    assert func.bump("v0b") == "v1b"


# ValuesFunction


def test_values_init():
    func = ValuesFunction(["0", "1", "2"])
    assert func.optional_value == "0"
    assert func.first_value == "0"


def test_values_init_w_correct_optional_value():
    func = ValuesFunction(["0", "1", "2"], optional_value="1")
    assert func.optional_value == "1"
    assert func.first_value == "0"


def test_values_init_w_correct_first_value():
    func = ValuesFunction(["0", "1", "2"], first_value="1")
    assert func.optional_value == "0"
    assert func.first_value == "1"


def test_values_init_w_correct_optional_and_first_value():
    func = ValuesFunction(["0", "1", "2"], optional_value="0", first_value="1")
    assert func.optional_value == "0"
    assert func.first_value == "1"


def test_values_init_w_empty_values():
    with pytest.raises(ValueError):
        ValuesFunction([])


def test_values_init_w_incorrect_optional_value():
    with pytest.raises(ValueError):
        ValuesFunction(["0", "1", "2"], optional_value="3")


def test_values_init_w_incorrect_first_value():
    with pytest.raises(ValueError):
        ValuesFunction(["0", "1", "2"], first_value="3")


def test_values_bump():
    func = ValuesFunction(["0", "5", "10"])
    assert func.bump("0") == "5"


def test_values_bump_max():
    func = ValuesFunction(["0", "5", "10"])
    with pytest.raises(ValueError):
        func.bump("10")
