
    Ej                        d 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                  d   Z ee      ej"                  vr"ej"                  j%                  d ee             ddlmZmZmZ edz  dz  dz  Zd	efd
Zej2                  j5                  dddg      d        Zd Zd Zd Zd Zd Z d Z!d Z"y)u   Closeout grade auto-classifier regression — task-2643 Track D.

4 enum 분류 정합 + fixture parametrized + 우선순위 doctrine 검증.
    N)Path   )CloseoutGradeGradeDecisionclassify_closeout_gradetestsfixturescloseout_gradenamec                     t         | z  }t        j                  |dz  j                  d            }t        j                  |dz  j                  d            }||fS )Nzevidence.jsonzutf-8)encodingzexpected.json)FIXTURE_ROOTjsonloads	read_text)r   baseevidenceexpecteds       e/home/jay/workspace/.worktrees/task-2643-dev6/tests/regression/test_closeout_grade_auto_classifier.py_loadr      sY    $Dzz4/1<<g<NOHzz4/1<<g<NOHX    fixture_namedocumented_onlyharness_enforcedc                 p   t        |       \  }}t        |d   |j                  d      |j                  d      |j                  dd      |j                  dd            }|j                  }|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                  |      t        j                  |      dz  }t        j                  d|  d|j                   d|d          dz   d|iz  }	t        t        j                  |	            d x}x}x}}d|v rdj                  |j                        }
|d   }||
v }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }t        j                  d|  d|d   d|j                         dz   d|iz  }t        t        j                  |            d x}}|d   j!                         D ]  \  }}|j"                  }|j                  } ||      }||k(  }|s~t        j                  d	|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd z  }	t        j                  d|  d!|d"|j"                  j                  |       d|       d#z   d$|	iz  }t        t        j                  |            d x}x}x}} y )%Nchanged_filesevidence_filesdry_run_reportrollback_plan_presentFlive_settings_applied)r   r   r   r   r    grade==)zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.grade
}.value
} == %(py7)sdecision)py0py2py4py7[z] grade mismatch: got=z, want=z
>assert %(py9)spy9rationale_substring )in)z%(py1)s in %(py3)sjoined)py1py3z] rationale missing z: z
>assert %(py5)spy5signals_assertions)zf%(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.signals
}.get
}(%(py5)s)
} == %(py9)skeywant)r%   r&   r'   r1   r(   r*   z	] signal z mismatch: got=z
>assert %(py11)spy11)r   r   getr!   value
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationjoin	rationaleitemssignals)r   evexpr$   @py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10r.   @py_assert0@py_assert2@py_format4@py_format6r3   r4   @py_assert8@py_format12s                      r   test_fixture_grade_matchesrS       s    L!GB5)vv./vv./ ff%<eD ff%<eDH >> > 3w< </  <                       $0    L>//?ws7|nU      #(,,-() 	
)V3 	
 	
)V 	
 	
 		 * 	
 	
	6	
 	
  .4 	
 	
 		 .4 	
 	
  ~1#6K2L1OrRZRdRdQef	
 	
 	
 	
 	
 -.446 
	T 	
## 	
#C( 	
(D0 	
 	
 	
(D 	
 	
	6	
 	
   	
 	
 		  	
 	
 		   	
 	
 		 $ 	
 	
	6	
 	
  %( 	
 	
 		 %( 	
 	
 		 ) 	
 	
	6	
 	
  -1 	
 	
 		 -1 	
 	
  ~Ysg_X=M=M=Q=QRU=V<WW^_c^de	
 	
 	
 	
 	
 	

r   c                  B   t         D  ch c]  } | j                   }} h 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 )u   4 enum 누락 없음.>   DOCUMENTED_ONLYRUNTIME_GUARDEDHARNESS_ENFORCEDREGRESSION_GUARDEDr"   )z%(py1)s == %(py4)sr/   r'   assert %(py6)spy6N)r   r7   r8   r9   r=   r?   r@   )grM   rH   rN   @py_format5@py_format7s         r   test_4_enum_values_completer_   >   s    *+AGG+ + 0 + 0  
 + 0  
  ,  
 0    
   +s   Bc                  n   t        g dddddidd      } | j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      d	t        j                         v st	        j                  |       rt	        j                  |       nd	t	        j                  |      d
t        j                         v st	        j                  t              rt	        j                  t              nd
t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)uP   RUNTIME signal 모두 있어도 live_settings_applied=True 면 HARNESS_ENFORCED.
hooks/h.py,memory/specs/staged_settings_template_x.jsonz#memory/events/x_dry_run_report.jsoncase_summary   
deny_countallow_countT)r   r   r   r    r"   )zS%(py2)s
{%(py2)s = %(py0)s.grade
} == %(py6)s
{%(py6)s = %(py4)s.HARNESS_ENFORCED
}dr   r%   r&   r'   r[   assert %(py8)spy8Nr   r!   r   rW   r8   r9   r:   r;   r<   r=   r?   r@   ri   rG   rJ   rH   r^   @py_format9s         r   4test_runtime_guarded_priority_below_harness_enforcedrp   H   s    

 'q(KL""		A 774m44474444474444444144414447444444m444m44444444444r   c                  `   t        ddgd      } | j                  }t        j                  }||k7  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      d	z  }d
d|iz  }t        t	        j                  |            dx}x}}y)ur   staged hook 있지만 rollback plan 없으면 RUNTIME_GUARDED 미달 → REGRESSION (if regression) or DOCUMENTED.rb   rc   Fr   r   !=zR%(py2)s
{%(py2)s = %(py0)s.grade
} != %(py6)s
{%(py6)s = %(py4)s.RUNTIME_GUARDED
}ri   r   rj   rk   rl   Nr   r!   r   rV   r8   r9   r:   r;   r<   r=   r?   r@   rn   s         r   /test_runtime_guarded_requires_all_three_signalsrw   W   s     	 #%ST#	A 773m33373333373333333133313337333333m333m33333333333r   c                  ^   t        dgd      } | j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            d x}x}}y )Nztests/regression/test_x.pyFrr   r"   )zU%(py2)s
{%(py2)s = %(py0)s.grade
} == %(py6)s
{%(py6)s = %(py4)s.REGRESSION_GUARDED
}ri   r   rj   rk   rl   )r   r!   r   rX   r8   r9   r:   r;   r<   r=   r?   r@   rn   s         r   8test_regression_guarded_when_only_regression_tests_addedry   a   s    34#	A 776m66676666676666666166616667666666m666m66666666666r   c                  p   t        g d      } | j                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}| j                  d
   }d}||u }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}y )N)zmemory/feedback_x.mdzmemory/specs/spec_y.mdzmemory/events/event_z.json)r   r"   )zR%(py2)s
{%(py2)s = %(py0)s.grade
} == %(py6)s
{%(py6)s = %(py4)s.DOCUMENTED_ONLY
}ri   r   rj   rk   rl   doc_only_pathsT)is)z%(py1)s is %(py4)srY   rZ   r[   )r   r!   r   rU   r8   r9   r:   r;   r<   r=   r?   r@   rD   )	ri   rG   rJ   rH   r^   ro   rM   rN   r]   s	            r   +test_documented_only_when_only_docs_changedr}   i   s    
	A 773m33373333373333333133313337333333m333m3333333333399%&.$.&$....&$...&...$.......r   c                  ^   t        dgd      } | j                  }t        j                  }||k7  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}y)u   사람이 'HARNESS_ENFORCED' 라고 수동 선언해도 입력 signal 만으로 산정한다.

    e.g. live_settings_applied=False 인 한 절대 HARNESS_ENFORCED 안 됨.
    rb   F)r   r    rs   )zS%(py2)s
{%(py2)s = %(py0)s.grade
} != %(py6)s
{%(py6)s = %(py4)s.HARNESS_ENFORCED
}ri   r   rj   rk   rl   Nrm   rn   s         r   =test_classifier_doctrine_manual_declaration_not_authoritativer   u   s    
 	 #n#	A 774m44474444474444444144414447444444m444m44444444444r   c                  l   t        g dddddid      } | j                  }t        j                  }||k7  }|st	        j
                  d|fd	||f      d
t        j                         v st	        j                  |       rt	        j                  |       nd
t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)uM   dry-run report 가 deny_count or allow_count 0 이면 RUNTIME_GUARDED 미달.ra   rd   r      rf   T)r   r   r   rs   ru   ri   r   rj   rk   rl   Nrv   rn   s         r   8test_dry_run_report_must_have_both_deny_and_allow_countsr      s    

 'q(KL"	A 773m33373333373333333133313337333333m333m33333333333r   )#__doc__builtinsr:   _pytest.assertion.rewrite	assertionrewriter8   r   syspathlibr   pytest__file__resolveparents_WTstrpathinsert$utils.closeout_grade_auto_classifierr   r   r   r   r   markparametrizerS   r_   rp   rw   ry   r}   r   r    r   r   <module>r      s   
   
  
8n&&q)s8388HHOOAs3x   W}z),<<  

.547	/	54r   