from __future__ import annotations

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))

import pytest

from update import compare_semver, parse_semver


def test_prerelease_ordering_within_same_identifier():
    assert compare_semver("1.2.0-beta.1", "1.2.0-beta.2") < 0
    assert compare_semver("1.2.0-beta.2", "1.2.0-beta.1") > 0


def test_prerelease_identifier_ordering():
    assert compare_semver("1.2.0-beta.2", "1.2.0-rc.1") < 0


def test_prerelease_below_release():
    assert compare_semver("1.2.0-rc.1", "1.2.0") < 0


def test_patch_ordering():
    assert compare_semver("1.2.0", "1.2.1") < 0


def test_equal_versions_compare_zero():
    assert compare_semver("1.2.3", "1.2.3") == 0
    assert compare_semver("1.2.3-beta.1", "1.2.3-beta.1") == 0


def test_major_minor_ordering():
    assert compare_semver("2.0.0", "1.9.9") > 0
    assert compare_semver("1.3.0", "1.2.9") > 0


def test_full_channel_progression_chain():
    import functools

    versions = ["1.2.0", "1.2.0-beta.1", "1.2.0-beta.2", "1.2.0-rc.1"]
    ordered = sorted(versions, key=functools.cmp_to_key(compare_semver))
    assert ordered == ["1.2.0-beta.1", "1.2.0-beta.2", "1.2.0-rc.1", "1.2.0"]


def test_invalid_version_strings_raise():
    with pytest.raises(ValueError):
        parse_semver("not-a-version")
    with pytest.raises(ValueError):
        parse_semver("")
    with pytest.raises(ValueError):
        parse_semver("1.2")
