
    4j%                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ ddlZ ee      j                         j                   j                   j                   Z ee      e
j&                  vr"e
j&                  j)                  d ee             ddlmZ ddlmZmZmZmZmZ edz  dz  ZdZdd
Zej@                  jC                  d	e      dd       Z"ddZ#ddZ$ddZ%ddZ&ddZ'y)u  tests/regression/test_batch_hold_adjudication.py

task-2614 Track E — 실제 이번 batch 사례(2604/2605/2608/2609)를 fixture 로
박제하고 Track A ``anu_v3.batch_hold_adjudicator`` 를 **read-only import**
하여 올바른 consolidated 분류가 산출되는지 검증한다(재발 방지).

문서-only/mock-only 금지: 본 regression 은 실 모듈 + 실 entrypoint
(``adjudicate_from_payload``)를 실행한다. 상수 분류기(항상 동일 verdict)는
케이스별 verdict 불일치로 반드시 FAIL 한다(§11 meta-가드).
    )annotationsN)Path)AUTHORITATIVE_PASSAUTO_REMEDIATION_HOLD
CHAIR_HOLDWAITING_FOR_DEPENDENCYadjudicate_from_payloadmemoryfixtures)2604260526082609casec                b    t        j                  t        d|  dz  j                  d            S )Nztask-2614.case-z.jsonzutf-8)encoding)jsonloadsFIXTURES	read_text)r   s    D/home/jay/workspace/tests/regression/test_batch_hold_adjudication.py_loadr   $   s2    ::	odV51	1<<g<N     c                   t        |       }|d   }t        d|d   gi      }|j                  d   }|j                  }|d   }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      d	z  }t	        j                  | |j                  |j                  f      d
z   d|iz  }	t        t	        j                  |	            d x}x}}|j                  }|d   }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      d	z  }dd|iz  }	t        t	        j                  |	            d x}x}}|j                  }|d   }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      d	z  }dd|iz  }	t        t	        j                  |	            d x}x}}y )Nexpectedtrackstrack_a_inputr   track_a_classification==)z6%(py2)s
{%(py2)s = %(py0)s.classification
} == %(py5)stapy0py2py5z
>assert %(py7)spy7track_a_chair_escalation)z8%(py2)s
{%(py2)s = %(py0)s.chair_escalation
} == %(py5)sassert %(py7)strack_a_auto_remediation)z8%(py2)s
{%(py2)s = %(py0)s.auto_remediation
} == %(py5)s)r   r	   r   classification
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgreasonsAssertionError_format_explanationchair_escalationauto_remediation)
r   fxexpoutr!   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s
             r   test_real_case_classificationr?   *   s   	tB
Z.C
!8b.A-B"C
DC	AB $< =  ==  	 =   	  	    	    	    	 !>    	



@    	 
 A#&@"AA"AAAAA"AAAAAAA2AAA2AAAAAA"AAAAAAAAA#&@"AA"AAAAA"AAAAAAA2AAA2AAAAAA"AAAAAAAAr   c                 T
   t         D  cg c]  } t        |       d    }} t        d|i      }|j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|j                  }d}||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|j                   }|t"           }	d}|	|k(  }
|
slt	        j
                  d|
fd|	|f      t	        j                  |	      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d
x}	x}
}|t$           }	d}|	|k(  }
|
slt	        j
                  d|
fd|	|f      t	        j                  |	      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d
x}	x}
}y
c c} w )u8  4 사례를 하나의 batch 로 모아 consolidated adjudication 검증.

    2604/2605/2609 = AUTO_REMEDIATION_HOLD(non-Critical 자동 수렴),
    2608 = WAITING_FOR_DEPENDENCY. Critical7/shared-invariant 0 →
    chair 보고 0, auto_remediation 수렴, all-settled=False(미정착이나 보고
    불요).r   r   FiszA%(py2)s
{%(py2)s = %(py0)s.chair_escalation_required
} is %(py5)sr9   r"   r(   r&   N)z9%(py2)s
{%(py2)s = %(py0)s.critical7_present
} is %(py5)s)z?%(py2)s
{%(py2)s = %(py0)s.shared_invariant_breach
} is %(py5)sT)zA%(py2)s
{%(py2)s = %(py0)s.auto_remediation_required
} is %(py5)s)z3%(py2)s
{%(py2)s = %(py0)s.all_settled
} is %(py5)s   r   )z%(py1)s == %(py4)s)py1py4zassert %(py6)spy6   )CASESr   r	   chair_escalation_requiredr+   r,   r-   r.   r/   r0   r3   r4   critical7_presentshared_invariant_breachauto_remediation_requiredall_settledclassification_countsr   r   )cr   r9   r:   r;   r<   r=   r>   counts@py_assert0@py_assert2@py_format5@py_format7s                r   +test_consolidated_batch_over_all_four_casesrV   9   s    277AeAh'7F7
!8V"4
5C((1E1(E1111(E11111131113111(111E1111111  )E) E)))) E))))))3)))3))) )))E)))))))&&/%/&%////&%//////3///3///&///%///////((0D0(D0000(D00000030003000(000D0000000??#e#?e####?e######3###3###?###e#######&&F'(-A-(A----(A---(---A-------().Q.)Q....)Q...)...Q....... 8s   T%c                 J   t        t        d      d         } d| d<   d| d<   t        d| gi      }|j                  d   }|j                  }|t
        k(  }|st        j                  d	|fd
|t
        f      t        j                  |      t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nddz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d	|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uJ   Critical7 분류가 입력되면 전체 CHAIR_HOLD 로 격상(회장 §6).r   r   Tclassifier_is_critical7forbidden_pathclassifier_categoryr   r   r   z6%(py3)s
{%(py3)s = %(py1)s.classification
} == %(py5)sr   rE   py3r%   r(   r&   NrA   rC   r9   r"   HOLD_FOR_CHAIR)z/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py5)s)dictr   r	   r   r*   r   r+   r,   r0   r-   r.   r/   r3   r4   rJ   verdict)	critr9   rR   rS   r;   r=   r>   r:   r<   s	            r   $test_critical7_track_escalates_chairrb   L   s   fo./D&*D	"#"2D	
!8dV"4
5C::a=5=''5':5555':555=555'555555:555:5555555((0D0(D0000(D00000030003000(000D0000000;;***;*****;*******3***3***;***********r   c            
         dddddddddd	gi} t        |       }|j                  d
   }|j                  }|t        k(  }|st	        j
                  d|fd|t        f      t	        j                  |      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              nddz  }dd|iz  }t        t	        j                  |            dx}x}}y)uD   provable independent-ANU PASS → AUTHORITATIVE_PASS (회장 §5.D).r   zt-passz	task-2604TPASSc119085addb0f8b7fedf78d1d09509f5ANUtrack_idtask_iddispatch_receivedauthoritative_verdict authoritative_is_independent_anucollector_keyexecutor_keycollector_roler   r   r[   r   r\   r(   r&   Nr	   r   r*   r   r+   r,   r0   r-   r.   r/   r3   r4   payloadr9   rR   rS   r;   r=   r>   s          r   /test_independent_anu_pass_is_authoritative_passrt   W        	$&%))/48!3 2"'	
G "'
*C::a===''='+====='+========'======+====+========r   c            
         ddddddddddgi} t        |       }|j                  d	   }|j                  }|t        k7  }|st	        j
                  d
|fd|t        f      t	        j                  |      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              nddz  }dd|iz  }t        t	        j                  |            dx}x}}y)uD   independent 증명 없는 self-chain PASS 자칭 → HOLD_CANDIDATE.r   zt-selfz	task-2605Trd   1e41a2324a3ccdd0rg   rh   r   )!=)z6%(py3)s
{%(py3)s = %(py1)s.classification
} != %(py5)sr   r\   r(   r&   Nrq   rr   s          r   3test_self_chain_pass_fails_closed_not_authoritativery   k   ru   r   c                    t         D  ci c]4  } | t        dt        |       d   gi      j                  d   j                  6 }} |j
                  } |       }t        |      }t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d
z  }t        j                  |      dz   d|iz  }	t        t        j                   |	            dx}x}x}x}x}}t"        j                  }
t%        |
      }|sddt        j                         v st        j                  t$              rt        j                  t$              nddt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |
      t        j                  |      dz  }t        t        j                   |            dx}
}d}t'        t"              }|j(                  }||v}
|
st        j                  d|
fd||f      t        j                  |      dt        j                         v st        j                  t&              rt        j                  t&              nddt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}x}
x}}yc c} w )u   실 모듈/실 entrypoint 입증 — 상수 분류기는 케이스별 verdict 불일치로
    반드시 FAIL 한다(mock-only FAIL).r   r   r      )>=)z%(py10)s
{%(py10)s = %(py0)s(%(py8)s
{%(py8)s = %(py1)s(%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.values
}()
})
})
} >= %(py13)slensetverdicts)r#   rE   r$   rF   rG   py8py10py13z
>assert %(py15)spy15NzYassert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.adjudicate_from_payload
})
}callableBHA)r#   rE   r]   r%   	MagicMock)not in)zR%(py1)s not in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}.__name__
}type)rE   r]   rF   rG   r   zassert %(py10)sr   )rI   r	   r   r   r*   valuesr~   r}   r+   r,   r-   r.   r/   r0   r1   r3   r4   r   r   r   __name__)rP   r   r<   @py_assert5@py_assert7@py_assert9@py_assert12@py_assert11@py_format14@py_format16rS   r;   r=   rR   @py_format9@py_format11s                   r   $test_mock_only_would_fail_meta_guardr      sz    	  	
"a123

&"N	#H  ??5?$5s$%53%&5!5&!+555&!55555535553555555s555s55555585558555?555$555%555&555!555X5555555//08/0000000080008000000C000C000/00000000000d3i0i000;00000;0000;000000d000d00000030003000i00000000000s   9Q)r   strreturnr_   )r   r   r   None)r   r   )(__doc__
__future__r   builtinsr-   _pytest.assertion.rewrite	assertionrewriter+   r   syspathlibr   pytest__file__resolveparent	WORKSPACEr   pathinsertanu_v3.batch_hold_adjudicatorbatch_hold_adjudicatorr   r   r   r   r   r	   r   rI   r   markparametrizer?   rV   rb   rt   ry   r    r   r   <module>r      s   	 #    
  N""$++2299	y>!HHOOAs9~& +  x*,( 'B (B/&+>(>(1r   