"""상태 보존을 확인 못 한 변형은 **채택하지 않는다** (2026-09-19).

## 무엇이 났나 — 실측 (앰버 10세, severely_injured, 유료 세 판)

안전 필터가 「다친 아이」를 세 번 다 거부했다. 거부될 때마다 사니타이저가
프롬프트를 다시 썼고, 세 판 모두 **안 다친 그림**이 나왔다. 두 판에는 어른이
옆에 같이 그려졌다. 그런데도 `severely_injured` 참조로 저장되고 단계는
**성공으로** 셌다 — 그 틀린 그림이 씬에 붙는다.

## 판정 문구를 정직하게

`sanitization_info` 가 있다 = 「상태가 지워졌다」가 **아니다.**
「상태가 보존됐는지 **확인 못 했다**」가 맞다(Codex 지적). 수정 없이도 상태를
잘못 그릴 수 있으므로, 이것으로 상태 정확성 검증을 닫았다고 말할 수 없다.

## 파일은 지우지 않는다

공통 생성기가 이미 PNG 를 썼다. 지우는 대신 **표식을 달리** 해서
재사용·씬 선택에서 빠지게 한다 — 「파일이 없다」와 「유효한 상태 참조로 안
쓴다」는 다른 말이다.
"""
from __future__ import annotations

import inspect

from app.core.steps.image_steps import CharacterStateVariantStep


def _src() -> str:
    return inspect.getsource(CharacterStateVariantStep)


def test_a_sanitized_variant_gets_a_different_marker():
    s = _src()
    assert 'state_variant_unadopted' in s
    assert 'pipe_result.get("sanitization_info")' in s


def test_the_unadopted_marker_cannot_match_the_reuse_query():
    """★핵심 — 표식을 달리한 것이 **정말로 안 걸려야** 한다.

    재사용 조회와 씬 선택은 둘 다 `%state_variant:%` 로 찾는다.
    `state_variant_unadopted:` 에는 그 문자열이 없어야 빠진다.
    """
    bad = "[state_variant_unadopted:UUID:severely_injured] 앰버"
    good = "[state_variant:UUID:severely_injured] 앰버"
    # 재사용(image_steps) · 씬 선택(scene_reference_service) 이 쓰는 패턴
    assert "state_variant:" not in bad, (
        "비채택 표식이 재사용 조회에 걸린다 — 빼려던 것이 그대로 쓰인다")
    assert "state_variant:" in good
    # 옛 판을 물러 둔 표식도 마찬가지로 안 걸려야 한다
    assert "state_variant:" not in "[state_variant_old:UUID:dead] 찰리"


def test_it_is_counted_as_a_failure_not_a_success():
    """성공으로 위장하면 하류가 「그 상태 참조가 있다」고 읽는다."""
    s = _src()
    assert "failed + len(unadopted)" in s


def test_the_unadopted_list_reaches_the_step_result():
    """「만든 적 없다」와 「만들었는데 못 쓴다」는 다른 칸이다."""
    s = _src()
    assert '"unadopted_state_variants": unadopted' in s
    assert '"unadopted_count"' in s


def test_the_reason_says_unverified_not_erased():
    """★Codex 지적 — 확인 못 한 것을 「지워졌다」고 적으면 증거보다 세다."""
    s = _src()
    assert "상태 보존 미확인" in s
    assert "판정은 \n" not in s  # 문장이 잘리지 않았는지
    assert "rejected" in s
