#!/usr/bin/env python3
"""
Strictness invariant tests for ``version_utils.compute_next_version``.

Split from ``test_compute_next_version`` (round 2 codex review) so the
rollover-policy file stays under the project's 10-functions-per-file
cap. ``compute_next_version`` MUST return a value STRICTLY greater
than BOTH ``current`` and ``floor`` -- never equal. Equality would
re-collide with the row that triggered auto-bump (e.g. the
READY_FOR_SALE row that started the auto-roll), defeating the whole
purpose of the bump. This file iterates the invariant across a small
grid for every supported policy ('patch', 'minor', 'rollover').
"""

from __future__ import annotations

import sys
import unittest
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent))

import version_utils  # noqa: E402


class ComputeNextVersionStrictnessTests(unittest.TestCase):
    """Round-6 regression guard: result is STRICTLY > both inputs."""

    def test_compute_next_version_equal_to_floor_patch(self):
        result = version_utils.compute_next_version("1.0.5", "1.0.5", "patch")
        self.assertEqual(result, "1.0.6")

    def test_compute_next_version_equal_to_floor_minor(self):
        result = version_utils.compute_next_version("1.0.5", "1.0.5", "minor")
        self.assertEqual(result, "1.1.0")

    def test_compute_next_version_two_component_equal(self):
        # 2-component MARKETING_VERSION ("1.0") must auto-roll cleanly.
        result = version_utils.compute_next_version("1.0", "1.0", "patch")
        self.assertEqual(result, "1.0.1")

    def test_compute_next_version_strictly_greater_invariant(self):
        """Property check across a small grid: result > both inputs."""
        cases = [
            ("1.0.5", "1.0.5"), ("1.0.0", "1.0.5"),
            ("1.0.5", "1.0.0"), ("0.0", "0.0"),
            ("99.99.99", "99.99.99"), ("2.0.0", "1.0.5"),
            ("1.0.5", "2.0.0"),
        ]
        for current, floor in cases:
            for policy in ("patch", "minor", "rollover"):
                result = version_utils.compute_next_version(
                    current, floor, policy,
                )
                rt = version_utils._parse(result)
                self.assertGreater(
                    rt, version_utils._parse(current),
                    msg=f"{policy}: {result} not > current={current}",
                )
                self.assertGreater(
                    rt, version_utils._parse(floor),
                    msg=f"{policy}: {result} not > floor={floor}",
                )


if __name__ == "__main__":
    unittest.main()
