| |
| |
| |
| |
|
|
| """Tests for version comparison utilities.""" |
|
|
| """Launch Isaac Sim Simulator first.""" |
|
|
| from isaaclab.app import AppLauncher |
|
|
| |
| simulation_app = AppLauncher(headless=True).app |
|
|
| """Rest everything follows.""" |
|
|
| import pytest |
| from packaging.version import Version |
|
|
| from isaaclab.utils.version import compare_versions, get_isaac_sim_version |
|
|
|
|
| def test_get_isaac_sim_version(): |
| """Test that get_isaac_sim_version returns cached Version object.""" |
| |
| version1 = get_isaac_sim_version() |
| version2 = get_isaac_sim_version() |
|
|
| |
| assert version1 is version2 |
|
|
| |
| assert isinstance(version1, Version) |
|
|
| |
| assert version1.major >= 4 |
|
|
| |
| assert version1.minor >= 0 |
| assert version1.micro >= 0 |
|
|
|
|
| def test_get_isaac_sim_version_format(): |
| """Test that get_isaac_sim_version returns correct format.""" |
| isaac_version = get_isaac_sim_version() |
|
|
| |
| version_str = str(isaac_version) |
| assert isinstance(version_str, str) |
|
|
| |
| parts = version_str.split(".") |
| assert len(parts) >= 3 |
|
|
| |
| assert hasattr(isaac_version, "major") |
| assert hasattr(isaac_version, "minor") |
| assert hasattr(isaac_version, "micro") |
|
|
|
|
| def test_version_caching_performance(): |
| """Test that caching improves performance for version checks.""" |
| |
| version1 = get_isaac_sim_version() |
|
|
| |
| for _ in range(100): |
| version = get_isaac_sim_version() |
| assert version == version1 |
| assert version is version1 |
|
|
|
|
| def test_version_comparison_operators(): |
| """Test that Version objects support natural comparisons.""" |
| isaac_version = get_isaac_sim_version() |
|
|
| |
| assert isaac_version >= Version("4.0.0") |
| assert isaac_version == isaac_version |
|
|
| |
| if isaac_version.major >= 5: |
| assert isaac_version > Version("4.5.0") |
| assert isaac_version >= Version("5.0.0") |
|
|
| |
| assert isaac_version != Version("0.0.1") |
|
|
|
|
| @pytest.mark.parametrize( |
| "v1,v2,expected", |
| [ |
| |
| ("1.0.0", "1.0.0", 0), |
| ("2.5.3", "2.5.3", 0), |
| |
| ("1.0", "1.0.0", 0), |
| ("1", "1.0.0.0", 0), |
| ("2.5", "2.5.0.0", 0), |
| |
| ("2.0.0", "1.0.0", 1), |
| ("1.0.0", "2.0.0", -1), |
| ("2.0.0", "1.99.99", 1), |
| |
| ("1.5.0", "1.4.0", 1), |
| ("1.4.0", "1.5.0", -1), |
| ("1.10.0", "1.9.99", 1), |
| |
| ("1.0.5", "1.0.4", 1), |
| ("1.0.4", "1.0.5", -1), |
| ("2.5.10", "2.5.9", 1), |
| |
| ("2", "1", 1), |
| ("1", "2", -1), |
| ("1.5", "1.4", 1), |
| |
| ("1.0.0.1", "1.0.0.0", 1), |
| ("1.2.3.4.5", "1.2.3.4", 1), |
| |
| ("0.0.1", "0.0.0", 1), |
| ("0.1.0", "0.0.9", 1), |
| ("0", "0.0.0", 0), |
| |
| ("100.200.300", "100.200.299", 1), |
| ("999.999.999", "1000.0.0", -1), |
| ], |
| ) |
| def test_version_comparisons(v1, v2, expected): |
| """Test version comparisons with various scenarios.""" |
| assert compare_versions(v1, v2) == expected |
|
|
|
|
| def test_symmetry(): |
| """Test anti-symmetric property: if v1 < v2, then v2 > v1.""" |
| test_pairs = [("1.0.0", "2.0.0"), ("1.5.3", "1.4.9"), ("1.0.0", "1.0.0")] |
|
|
| for v1, v2 in test_pairs: |
| result1 = compare_versions(v1, v2) |
| result2 = compare_versions(v2, v1) |
|
|
| if result1 == 0: |
| assert result2 == 0 |
| else: |
| assert result1 == -result2 |
|
|
|
|
| def test_transitivity(): |
| """Test transitive property: if v1 < v2 < v3, then v1 < v3.""" |
| v1, v2, v3 = "1.0.0", "2.0.0", "3.0.0" |
| assert compare_versions(v1, v2) == -1 |
| assert compare_versions(v2, v3) == -1 |
| assert compare_versions(v1, v3) == -1 |
|
|