
    9jO                       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
mZ ddlZ ee      j                         j                  d   Zedz  ZdZddZej(                  j+                  e	      d
        Zej(                  j+                  e	      d        Zej(                  j+                  e	      d        Zej(                  j+                  e	      d        Zej(                  j+                  e	      d        Zd Zd Zy)u  tests/regression/test_scripts_hardening_2487.py — task-2487 회귀 (Group B, task-2547 corrected).

scripts/* 의 V2 + legacy dot-phase 호환 hardening 검증.

검증 대상:
- scripts/auto_merge.py        : _extract_all_task_ids V2+legacy 추출
- scripts/done-watcher.py      : _is_valid_task_id SSOT 위임
- scripts/notify-completion.py : _is_valid_task_id_with_legacy 검증
- scripts/pattern-detector.py  : extract_task_id_from_filename SSOT 위임
- scripts/report_utils.py      : extract_report_metadata title regex
- scripts/start_task_guard.py  : commit prefix V2 regex
- scripts/token-tracker.py     : TASK_RE V2+legacy loose pattern
    )annotationsN)Path   scriptsu   main에 scripts SSOT 위임 미적용 (PR #97 corrected scope 4 files만 머지). task-2487 chain 후속 PR에서 scripts 계층 SSOT 확장 후 활성화 (회장 §명시 task-2551).c                4    t         | z  j                  d      S )Nzutf-8)encoding)SCRIPTS	read_text)rels    C/home/jay/workspace/tests/regression/test_scripts_hardening_2487.py_readr      s    cM$$g$66    )reasonc                    t        d      } 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z   d	|iz  }t        t        j                  |            d x}}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z   d	|iz  }t        t        j                  |            d x}}y )Nzauto_merge.py_extract_all_task_idsinz%(py1)s in %(py3)ssrcpy1py3z2auto_merge.py missing _extract_all_task_ids helper
>assert %(py5)spy5is_valid_task_id_with_legacyz!auto_merge.py missing SSOT import
r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_name_format_assertmsgAssertionError_format_explanationr   @py_assert0@py_assert2@py_format4@py_format6s        r   "test_auto_merge_extracts_v2_legacyr+   "   s    

 C"_"c)___"c___"______c___c____+_______)U)S0UUU)SUUU)UUUUUUSUUUSUUUU2UUUUUUUr   c                    t        d      } 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z   d	|iz  }t        t        j                  |            d x}}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z   d	|iz  }t        t        j                  |            d x}}y )Nzdone-watcher.pyr   r   r   r   r   z#done-watcher.py missing SSOT importr   r   z_is_valid_task_id(task_id)z.done-watcher.py missing _is_valid_task_id callr   r&   s        r   %test_done_watcher_uses_ssot_validatorr-   )   s    
!
"C)W)S0WWW)SWWW)WWWWWWSWWWSWWWW2WWWWWWW'`'3.```'3```'``````3```3````0```````r   c                 |   t        d      } 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z   d	|iz  }t        t        j                  |            d x}}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z   d	|iz  }t        t        j                  |            d x}}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z   d	|iz  }t        t        j                  |            d x}}y )Nznotify-completion.pyr   r   r   r   r   z(notify-completion.py missing SSOT importr   r   z_is_valid_task_id(next_task_id)z3notify-completion.py missing _is_valid_task_id callz_RE_TASK_ID = re.compilenot in)z%(py1)s not in %(py3)suT   notify-completion.py에 _RE_TASK_ID 인라인 패턴이 남아있음 — SSOT 위반r   r&   s        r   *test_notify_completion_uses_ssot_validatorr1   0   sx   
&
'C)\)S0\\\)S\\\)\\\\\\S\\\S\\\\2\\\\\\\,j,3jjj,jjj,jjjjjjjjjjjjj5jjjjjjj% %S0  %S    &      .1    .1    	_    r   c                    t        d      } 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z   d	|iz  }t        t        j                  |            d x}}d
}|| v }|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd	|iz  }t        t        j                  |            d x}}y )Nzpattern-detector.py#_ssot_extract_task_id_from_filenamer   r   r   r   z+pattern-detector.py missing SSOT delegationr   r   z>from utils.task_id_parser import extract_task_id_from_filenamezassert %(py5)sr   r&   s        r   'test_pattern_detector_delegates_to_ssotr4   ;   s   
%
&C0 0C7  0C    1      58    58    	6     LRKsRRRRKsRRRKRRRRRRsRRRsRRRRRRRr   c                    t        d      } 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z   d	|iz  }t        t        j                  |            d
x}}y
)uY   extract_report_metadata 의 title 패턴이 V2 retry suffix를 인식하여 제거한다.zreport_utils.pyz
(?:\+\d+)?r   r   r   r   z0report_utils.py title regex missing +retry tokenr   r   Nr   r&   s        r   )test_report_utils_title_regex_supports_v2r6   D   st     !
"CT>S TTT>STTT>TTTTTTSTTTSTTTT"TTTTTTTr   c                    t        d      } t        j                  d|       }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |j                  d      }g }d}||v}|}|sd	}||v }	|	}|sXt        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       |st        j                  d	fd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	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z   d|iz  }
t        t        j                  |
            d x}}y )Nzstart_task_guard.pyz'pattern\s*=\s*re\.compile\(r\"(.+?)\"\)u,   start_task_guard.py에 pattern 정의 없음
>assert %(py0)spy0m   _az_[a-z]r/   )z%(py3)s not in %(py5)spatr   r   %(py7)spy7r   z%(py10)s in %(py12)spy10py12%(py14)spy14zassert %(py17)spy17+r   r   u    pattern V2 retry suffix 누락: r   r   r   researchr   r#   r    r!   r"   r   r$   r%   groupr   append_format_boolop)r   r:   @py_format1r=   @py_assert1r(   @py_assert4r'   @py_assert9@py_assert11r*   @py_format8@py_format13@py_format15@py_format16@py_format18r)   s                    r   %test_start_task_guard_prefix_v2_regexrY   L   s   
%
&C
		<cBA<<<<<<<<<1<<<1<<<<<
''!*C-4-4s?-h-h#o----4s---4------s---s-------h#---h------#---#--------------?3#:???3#???3??????#???#????9#???????r   c                    t        d      } t        j                  d|       }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |j                  d      }g }d}||v }|}|sd	}||v }	|	}|sqt        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       |st        j                  d
	fd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}x}x}x}}	y)ud   token-tracker.py TASK_RE 가 V2 retry/_phase suffix 를 포함하도록 loose pattern 으로 확장.ztoken-tracker.pyz'TASK_RE\s*=\s*re\.compile\(r\"(.+?)\"\)u&   token-tracker.py TASK_RE 정의 없음r8   r9   r:   r;   rH   z\wr   )z%(py3)s in %(py5)sr=   r>   r?   r@   rA   rB   rE   rF   u$   TASK_RE V2 suffix tolerance 누락: z
>assert %(py17)srG   NrI   )r   r:   rO   r=   rP   r(   rQ   r'   rR   rS   r*   rT   rU   rV   rW   rX   s                   r   &test_token_tracker_task_re_supports_v2r[   V   s;   
"
#C
		<cBA6666666661666166666
''!*CS3S3#:SS#SSSS3#SSS3SSSSSS#SSS#SSSSSSS#SSSSSSSSS#SSS#SSSSSSSSSS)McU'SSSSSSSSr   )r   strreturnr\   )__doc__
__future__r   builtinsr    _pytest.assertion.rewrite	assertionrewriter   rJ   pathlibr   pytest__file__resolveparents	WORKSPACEr	   _SCRIPTS_SSOT_PENDINGr   markskipr+   r-   r1   r4   r6   rY   r[    r   r   <module>rn      s*   #   	  N""$,,Q/	
i
l 7 ./V 0V ./a 0a ./ 0 ./S 0S ./U 0U@Tr   