1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
"""Tests for version comparison."""
from __future__ import annotations
import operator
import typing as t
from contextlib import nullcontext as does_not_raise
import pytest
from libtmux._compat import LooseVersion
if t.TYPE_CHECKING:
from collections.abc import Callable
from typing import TypeAlias
try:
from _pytest.raises import RaisesExc
except ImportError:
from _pytest.python_api import RaisesContext # type: ignore[attr-defined]
RaisesExc: TypeAlias = RaisesContext[Exception] # type: ignore[no-redef]
VersionCompareOp: TypeAlias = Callable[
[t.Any, t.Any],
bool,
]
@pytest.mark.parametrize(
"version",
[
"1",
"1.0",
"1.0.0",
"1.0.0b",
"1.0.0b1",
"1.0.0b-openbsd",
"1.0.0-next",
"1.0.0-next.1",
],
)
def test_version(version: str) -> None:
"""Assert LooseVersion constructor against various version strings."""
assert LooseVersion(version)
class VersionCompareFixture(t.NamedTuple):
"""Test fixture for version comparison."""
a: object
op: VersionCompareOp
b: object
raises: type[Exception] | bool
@pytest.mark.parametrize(
VersionCompareFixture._fields,
[
VersionCompareFixture(a="1", op=operator.eq, b="1", raises=False),
VersionCompareFixture(a="1", op=operator.eq, b="1.0", raises=False),
VersionCompareFixture(a="1", op=operator.eq, b="1.0.0", raises=False),
VersionCompareFixture(a="1", op=operator.gt, b="1.0.0a", raises=False),
VersionCompareFixture(a="1", op=operator.gt, b="1.0.0b", raises=False),
VersionCompareFixture(a="1", op=operator.lt, b="1.0.0p1", raises=False),
VersionCompareFixture(a="1", op=operator.lt, b="1.0.0-openbsd", raises=False),
VersionCompareFixture(a="1", op=operator.lt, b="1", raises=AssertionError),
VersionCompareFixture(a="1.0.0c", op=operator.gt, b="1.0.0b", raises=False),
],
)
def test_version_compare(
a: str,
op: VersionCompareOp,
b: str,
raises: type[Exception] | bool,
) -> None:
"""Assert version comparisons."""
raises_ctx: RaisesExc = (
pytest.raises(t.cast("type[Exception]", raises))
if raises
else t.cast("RaisesExc", does_not_raise())
)
with raises_ctx:
assert op(LooseVersion(a), LooseVersion(b))
|