From 70b25a48654f6ea6146126b9a2698959732c45e0 Mon Sep 17 00:00:00 2001 From: Dickson Date: Tue, 1 Sep 2026 02:04:16 +0000 Subject: [PATCH] fix: preserve explicit proof version zero --- src/kontrol/foundry.py | 2 +- src/tests/unit/test_latest_proof_version.py | 41 +++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index c81c1092f..3ddbb6640 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -962,7 +962,7 @@ def resolve_proof_version( method_status = method.up_to_date(self.digest_file) - if user_specified_version: + if user_specified_version is not None: _LOGGER.info(f'Using user-specified version {user_specified_version} for test {test}') if not Proof.proof_data_exists(f'{test}:{user_specified_version}', self.proofs_dir): raise ValueError(f'The specified version {user_specified_version} of proof {test} does not exist.') diff --git a/src/tests/unit/test_latest_proof_version.py b/src/tests/unit/test_latest_proof_version.py index e10dc7585..53a8569e8 100644 --- a/src/tests/unit/test_latest_proof_version.py +++ b/src/tests/unit/test_latest_proof_version.py @@ -1,9 +1,13 @@ from __future__ import annotations +from pathlib import Path +from types import SimpleNamespace from typing import TYPE_CHECKING import pytest +from pyk.proof.proof import Proof +import kontrol.foundry as foundry_module from kontrol.foundry import Foundry if TYPE_CHECKING: @@ -63,3 +67,40 @@ def test_foundry_latest_proof_version( # Then assert latest_version == expected_version + + +RESOLVE_PROOF_VERSION_DATA: list[tuple[str, int | None, int]] = [ + ('explicit_zero', 0, 0), + ('explicit_nonzero', 2, 2), + ('omitted', None, 3), +] + + +@pytest.mark.parametrize( + 'test_id,user_specified_version,expected_version', + RESOLVE_PROOF_VERSION_DATA, + ids=[test_id for test_id, *_ in RESOLVE_PROOF_VERSION_DATA], +) +def test_foundry_resolve_proof_version( + monkeypatch: MonkeyPatch, test_id: str, user_specified_version: int | None, expected_version: int +) -> None: + # Given + test = 'long%path%to%test%DeeplyNestedTest.testWithMultipleVersions()' + method = SimpleNamespace(up_to_date=lambda _digest_file: True) + + monkeypatch.setattr(Foundry, '__init__', lambda _: None) + monkeypatch.setattr(Foundry, 'digest_file', Path('digest')) + monkeypatch.setattr(Foundry, 'proofs_dir', Path('proofs')) + monkeypatch.setattr(Foundry, 'list_proof_dir', mock_listdir) + monkeypatch.setattr(Foundry, 'get_contract_and_method', lambda _self, _test: (None, method)) + monkeypatch.setattr(foundry_module, 'kontrol_up_to_date', lambda _digest_file: True) + + foundry = Foundry() # type: ignore + existing_proofs = mock_listdir(foundry) + monkeypatch.setattr(Proof, 'proof_data_exists', lambda proof_id, _proofs_dir: proof_id in existing_proofs) + + # When + version = foundry.resolve_proof_version(test, reinit=False, user_specified_version=user_specified_version) + + # Then + assert version == expected_version