from __future__ import annotations import asyncio import pytest from gap_pipeline.clients import ScriptedClient from gap_pipeline.store import RunStore from gap_pipeline.surface import SurfacePipeline, validate_surface_variant def test_surface_pipeline_uses_full_original_contract(tmp_path, item) -> None: response = { "map": {"a": "positivequantity"}, "question": r"Let \(positivequantity>0\). Prove the renamed inequality.", "solution": r"Apply the same proof to \(positivequantity\).", } client = ScriptedClient( {f"{item.item_id}.surface.descriptive_long": response} ) variant = asyncio.run( SurfacePipeline( client, RunStore(tmp_path, item.item_id), ).run_family(item, "descriptive_long") ) assert variant.rename_map == {"a": "positivequantity"} assert variant.question == response["question"] assert variant.solution == response["solution"] def test_missing_symbol_and_nonbijection_are_rejected(item) -> None: with pytest.raises(ValueError, match="every var and param"): validate_surface_variant( item, rename_map={}, question="question", solution="solution", ) item.variables.append("b") with pytest.raises(ValueError, match="one-to-one"): validate_surface_variant( item, rename_map={"a": "sharedname", "b": "sharedname"}, question="question", solution="solution", ) def test_original_identifier_contract_is_enforced(item) -> None: with pytest.raises(ValueError, match="original prompt contract"): validate_surface_variant( item, rename_map={"a": "TooShort"}, question="question", solution="solution", )