
    Nic#                     X   d Z ddlZddlmc mZ ddlZddlm	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mZmZ g dZdZdZd Zd	 Zd
 Zd Zd Zd Zd Zy)u   task-2503 회귀 테스트 파일 1 — schema YAML 형식 + 7 metadata 검증.

회장 §6 회귀 테스트 (파일 1/3):
  - schema YAML 로드 / 7 필드 정의 / parse_topology_metadata / validate_metadata
    N)Path)SCHEMA_PATHparse_topology_metadatavalidate_metadataexpected_files	risk_area
dependencyparallel_policymerge_queue_positionstale_recheck_requiredcherry_pick_alloweda  # task-2503 self-reference spec

```yaml
expected_files:
  - "utils/merge_topology_gate.py"
  - "memory/specs/merge-topology-gate-schema.yml"
  - "tests/regression/test_merge_topology_gate_schema_2503.py"
  - "tests/regression/test_merge_topology_gate_classifier_2503.py"
risk_area: "dispatch_layer"
dependency: "none"
parallel_policy: "serial_only"
merge_queue_position: 1
stale_recheck_required: true
cherry_pick_allowed: false
```
z# Minimal spec

```yaml
expected_files:
  - "foo/bar.py"
risk_area: "verifier_layer"
dependency: "none"
parallel_policy: "parallel_safe"
merge_queue_position: "n/a"
stale_recheck_required: false
cherry_pick_allowed: false
```
c                     ddl } t        j                  } |       }|st        j                  dt               dz   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}}t        t        dd	      5 }| j                  |      }ddd       d}|u}|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}t        |t              }|s!t        j                  d      dz   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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y# 1 sw Y   xY w)u2   SCHEMA_PATH가 존재하고 yaml.safe_load 성공.r   NzSCHEMA_PATH not found: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   )py0py2py4rutf-8encoding)is not)z%(py0)s is not %(py3)sdatar   py3zassert %(py5)spy5z schema YAML must parse to a dict7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancedictr   py1r   r   )yamlr   exists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationopen	safe_load_call_reprcomparer   r   )	r!   @py_assert1@py_assert3@py_format5fr   @py_assert2@py_format4@py_format6s	            L/home/jay/workspace/tests/regression/test_merge_topology_gate_schema_2503.pytest_schema_yaml_loadsr6   D   s   HHHH#:;-!HHHHHHH;HHH;HHHHHHHHHHHH	k3	1 !Q~~a !4t4t44tdD!E!EE#EEEEEEE:EEE:EEEEEEdEEEdEEEEEEDEEEDEEE!EEEEEE! !s   &KK&c                  v   ddl } t        t        dd      5 }| j                  |      }dd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}}t        |d   j                               }t        D ]  }||v }	|	st	        j
                  d|	fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nd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}	 t!        |      }d}||k\  }|st	        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                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t	        j                  dt!        |             dz   d|iz  }t        t	        j                  |            dx}x}}y# 1 sw Y   xY w)u;   schema의 fields 키에 7개 필수 metadata 모두 정의.r   Nr   r   r   fieldsin)z%(py1)s in %(py3)sr   )r    r   zschema must have 'fields' key
>assert %(py5)sr   z%(py0)s in %(py2)skeydefined_keysr   r   zschema missing field: 
>assert %(py4)sr      )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slen)r   r    r   py6z*schema must define at least 7 fields, got z
>assert %(py8)spy8)r!   r+   r   r,   r#   r-   r(   r%   r&   r'   r$   r)   r*   setkeys_SEVEN_REQUIRED_KEYSrC   )r!   r1   r   @py_assert0r2   r3   r4   r>   r=   r.   @py_format3r0   @py_assert5@py_assert4@py_format7@py_format9s                   r5   %test_schema_has_seven_required_fieldsrO   R   s   	k3	1 !Q~~a ! <8t<<<8t<<<8<<<<<<t<<<t<<<<<<<<<<<tH~**,-L# Cl"BBBslBBBBBBsBBBsBBBBBBlBBBlBBBB&<SE$BBBBBBBC |cc!ccccccccc3ccc3cccccc|ccc|ccccccccc%OPST`PaOb#cccccccc! !s   L..L8c                  r   t        t              } t        | t              }|s!t	        j
                  d      dz   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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t        t	        j                  |            d}t        D ]  }|| v }|st	        j                  d|fd	|| f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
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} y)u>   task-2503.md spec을 파싱하면 7 키 모두 dict에 추출.z*parse_topology_metadata must return a dictr   r   metadatar   r   Nr9   r<   r=   r?   z%parse_topology_metadata missing key: r@   r   )r   TASK_2503_YAML_BLOCKr   r   r#   r$   r%   r&   r'   r(   r)   r*   rH   r-   )rQ   r/   r0   r=   r.   rJ   s         r5   0test_parse_topology_metadata_extracts_seven_keysrS   e   s,   &';<Hh%S%SS'SSSSSSS:SSS:SSSSSShSSShSSSSSSSSSSSS%SSSSSS# NhMMMshMMMMMMsMMMsMMMMMMhMMMhMMMM"Gu MMMMMMMN    c                     t        t              } t        |       }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}}y)	uF   task-2503.md spec의 metadata는 validate_metadata 통과 (errors=[]).)==)z%(py0)s == %(py3)serrorsr   z,validate_metadata should return [] but got: r;   r   N)r   rR   r   r#   r-   r%   r&   r'   r(   r$   r)   r*   )rQ   rW   r2   r.   r3   r4   s         r5   /test_validate_metadata_passes_for_complete_specrX   q   s    &';<Hx(FP6R<PPP6RPPPPPP6PPP6PPPRPPPGxPPPPPPPrT   c                  0   t        i       } | s{t        j                  d      dz   ddt        j                         v st        j
                  |       rt        j                  |       ndiz  }t        t        j                  |            dgdd}t        |      }|s{t        j                  d      dz   dd	t        j                         v st        j
                  |      rt        j                  |      nd	iz  }t        t        j                  |            y
)uD   빈 dict 또는 일부 키 누락 시 errors가 비어있지 않음.z"empty metadata must produce errors
>assert %(py0)sr   errors_empty
foo/bar.pyverifier_layer)r   r	   z$partial metadata must produce errorserrors_partialN	r   r#   r$   r%   r&   r'   r(   r)   r*   )r[   @py_format1partial_metar^   s       r5   -test_validate_metadata_fails_for_missing_keysrb   {   s     %R(L=========<===<===== (.%L
 '|4NAAAAAAAAA>AAA>AAAAA>rT   c                  0   dgddddddd} t        |       }|s~t        j                  d|       d	z   d
dt        j                         v st        j
                  |      rt        j                  |      ndiz  }t        t        j                  |            y)u8   parallel_policy='unknown'이면 errors에 항목 존재.r\   r]   noneunknown_policyzn/aFr   z2invalid parallel_policy must produce errors, got: rZ   r   rW   Nr_   rQ   rW   r`   s      r5   >test_validate_metadata_fails_for_invalid_parallel_policy_valuerg      sq     (.%+ %"'$H x(FPPGxPPPPPPP6PPP6PPPPP6rT   c                  0   dgddddddd} t        |       }|s~t        j                  d|       d	z   d
dt        j                         v st        j
                  |      rt        j                  |      ndiz  }t        t        j                  |            y)u8   parallel_safe인데 merge_queue_position=1이면 errors.r\   r]   rd   parallel_safe   Fr   zJparallel_safe with integer merge_queue_position must produce errors, got: rZ   r   rW   Nr_   rf   s      r5   Ktest_validate_metadata_fails_when_parallel_safe_with_integer_queue_positionrk      s     (.%* !"'$H x(F  	x	              6rT   )__doc__builtinsr%   _pytest.assertion.rewrite	assertionrewriter#   syspathlibr   __file__resolveparent	WORKSPACEstrpathinsertutils.merge_topology_gater   r   r   rH   rR   MINIMAL_PARALLEL_SAFE_SPECr6   rO   rS   rX   rb   rg   rk    rT   r5   <module>r}      s   
  
  N""$++2299	y>!HHOOAs9~&   $ $Fd&NQB&Q$rT   