"""Test the release semver computation logic (D-057).""" import pytest def compute_next_version(latest_tag, is_milestone_complete): """Compute the next semver tag from the latest tag + milestone flag.""" parts = latest_tag.lstrip("v").split(".") major, minor, patch = int(parts[0]), int(parts[1]), int(parts[2]) if is_milestone_complete: minor += 1 patch = 0 else: patch += 1 new_tag = f"v{major}.{minor}.{patch}" major_minor_tag = f"v{major}.{minor}" major_tag = f"v{major}" return new_tag, major_minor_tag, major_tag class TestComputeNextVersion: def test_regular_phase_bumps_patch(self): assert compute_next_version("v1.6.0", False) == ("v1.6.1", "v1.6", "v1") def test_milestone_complete_bumps_minor(self): assert compute_next_version("v1.6.5", True) == ("v1.7.0", "v1.7", "v1") def test_milestone_complete_resets_patch(self): assert compute_next_version("v1.6.0", True) == ("v1.7.0", "v1.7", "v1") def test_major_bump(self): # Not implemented yet (major milestones are manual), but test the tag format tag, mj, m = compute_next_version("v2.3.4", True) assert tag == "v2.4.0" assert mj == "v2.4" assert m == "v2" def test_floating_tags_match_major_minor(self): tag, mj, m = compute_next_version("v1.7.3", False) assert mj == "v1.7" assert m == "v1" assert tag == "v1.7.4" def test_v1_tag_advances_with_minor(self): # When minor bumps, v1 tag still points at the latest (force-moved) tag, mj, m = compute_next_version("v1.6.5", True) assert m == "v1" assert tag == "v1.7.0"