
    Vi                        d Z ddlZddlmc mZ ddlZddl	Z	ddl
Z
ddlZddlmZ ddlZdZej                   j#                  de	j$                  j'                  ed            Zej                   j+                  e      Zee
j.                  d<   ej0                  j3                  e       ej4                  Zdedefd	Z G d
 d      Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z%y)u   
tests/dev7/test_meta_task_validator.py

dispatch.py의 _parse_task_metadata() 검증 (task-2374 옵션 D)

카마소츠(개발7팀 테스터) 작성
    N)patchz-/home/jay/workspace/.worktrees/task-2374-dev7dispatch_wtzdispatch.pytextreturnc                     t        |       S )N)_parse_task_metadata)r   s    T/home/jay/workspace/.worktrees/task-2374-dev7/tests/dev7/test_meta_task_validator.py_parser
   (   s    %%    c                       e Zd Zd Zd Zy)TestParseLegacyTaskNoMetadatac                    t        d      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)u&   빈 문자열 → 기본값 code/True. kindcode==z%(py1)s == %(py4)spy1py4assert %(py6)spy6Nmerge_requiredTisz%(py1)s is %(py4)ssourcedefaultr
   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationselfresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s          r	   !test_empty_string_returns_defaultz?TestParseLegacyTaskNoMetadata.test_empty_string_returns_default1   s    f~''~''''~'''~''''''''''&'/4/'4////'4///'///4///////h,9,9,,,,9,,,,,,9,,,,,,,r   c                    t        d      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)u4   frontmatter도 fenced도 없으면 기본 code/True.u7   단순 작업 설명입니다.
버그 수정 합니다.r   r   r   r   r   r   r   Nr   Tr   r   r   r   r    r&   s          r	   .test_plain_text_no_frontmatter_returns_defaultzLTestParseLegacyTaskNoMetadata.test_plain_text_no_frontmatter_returns_default8   s    RSf~''~''''~'''~''''''''''&'/4/'4////'4///'///4///////h,9,9,,,,9,,,,,,9,,,,,,,r   N)__name__
__module____qualname__r.   r0    r   r	   r   r   0   s    --r   r   c                       e Zd Zd Zd Zy)TestParseFrontmatterKindMetac                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)u@   frontmatter kind: meta → meta + merge_required=False (자동).u!   ---
kind: meta
---

작업 설명r   metar   r   r   r   r   Nr   Fr   r   r   frontmatterr    r'   r   r(   r)   r*   r+   r,   r-   s           r	   1test_kind_meta_sets_meta_and_merge_required_falsezNTestParseFrontmatterKindMeta.test_kind_meta_sets_meta_and_merge_required_falseA   s   6f~''~''''~'''~''''''''''&'050'50000'5000'00050000000h0=0=0000=000000=0000000r   c                    d}t        |      }|d   }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	)
u1   frontmatter 공백 포함 → meta 정상 파싱.u   ---
kind: meta

---

작업r   r8   r   r   r   r   r   Nr    r:   s           r	   test_kind_meta_with_whitespacez;TestParseFrontmatterKindMeta.test_kind_meta_with_whitespaceI   s^    1f~''~''''~'''~''''''''''r   N)r1   r2   r3   r;   r=   r4   r   r	   r6   r6   @   s    1(r   r6   c                       e Zd Zd Zd Zy)$TestParseFrontmatterKindCodeExplicitc                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)u;   frontmatter kind: code, merge_required: true → code/True.u6   ---
kind: code
merge_required: true
---

작업 설명r   r   r   r   r   r   r   Nr   Tr   r   r   r9   r    r:   s           r	   "test_kind_code_merge_required_truezGTestParseFrontmatterKindCodeExplicit.test_kind_code_merge_required_trueQ   s   Lf~''~''''~'''~''''''''''&'/4/'4////'4///'///4///////h0=0=0000=000000=0000000r   c                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)u=   frontmatter kind: code, merge_required: false → code/False.u0   ---
kind: code
merge_required: false
---

작업r   r   r   r   r   r   r   Nr   Fr   r   r   r9   r    r:   s           r	   #test_kind_code_merge_required_falsezHTestParseFrontmatterKindCodeExplicit.test_kind_code_merge_required_falseY   s   Ff~''~''''~'''~''''''''''&'050'50000'5000'00050000000h0=0=0000=000000=0000000r   N)r1   r2   r3   rA   rC   r4   r   r	   r?   r?   P   s    11r   r?   c                       e Zd Zd Zy)1TestParseFrontmatterMetaWithExplicitMergeRequiredc                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)uL   kind: meta + merge_required: true (명시) → meta but merge_required=True.u/   ---
kind: meta
merge_required: true
---

작업r   r8   r   r   r   r   r   Nr   Tr   r   r   r9   r    r:   s           r	   +test_kind_meta_merge_required_true_explicitz]TestParseFrontmatterMetaWithExplicitMergeRequired.test_kind_meta_merge_required_true_explicitc   s   Ef~''~''''~'''~''''''''''&'/4/'4////'4///'///4///////h0=0=0000=000000=0000000r   N)r1   r2   r3   rG   r4   r   r	   rE   rE   b   s    1r   rE   c                       e Zd Zd Zd Zd Zy)TestParseFencedYamlBlockc                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)uA   fenced ```yaml 안에 kind: meta → meta + merge_required=False.u4   작업 설명

```yaml
kind: meta
```

추가 내용r   r8   r   r   r   r   r   Nr   Fr   r   r   fencedr    r:   s           r	   test_fenced_yaml_kind_metaz3TestParseFencedYamlBlock.test_fenced_yaml_kind_metam   s   Kf~''~''''~'''~''''''''''&'050'50000'5000'00050000000h+8+8++++8++++++8+++++++r   c                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)u>   fenced yaml kind: code + merge_required: false → code/False.z,```yaml
kind: code
merge_required: false
```r   r   r   r   r   r   r   Nr   Fr   r   r   rK   r    r:   s           r	   .test_fenced_yaml_kind_code_with_merge_requiredzGTestParseFencedYamlBlock.test_fenced_yaml_kind_code_with_merge_requiredu   s   @f~''~''''~'''~''''''''''&'050'50000'5000'00050000000h+8+8++++8++++++8+++++++r   c                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|d
   }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	)u;   frontmatter와 fenced 둘 다 있으면 frontmatter 우선.z*---
kind: code
---

```yaml
kind: meta
```r   r   r   r   r   r   r   Nr   r9   r    r:   s           r	   +test_frontmatter_takes_priority_over_fencedzDTestParseFencedYamlBlock.test_frontmatter_takes_priority_over_fenced}   s    Af~''~''''~'''~''''''''''h0=0=0000=000000=0000000r   N)r1   r2   r3   rL   rN   rP   r4   r   r	   rI   rI   l   s    ,,1r   rI   c                       e Zd Zd Zd Zy)$TestParseInvalidKindFallsBackDefaultc                    d}t        |      }|d   }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	)
u'   kind: invalid_value → code (default).u#   ---
kind: invalid_value
---

작업r   r   r   r   r   r   r   Nr    r:   s           r	   $test_invalid_kind_falls_back_to_codezITestParseInvalidKindFallsBackDefault.test_invalid_kind_falls_back_to_code   s^    8f~''~''''~'''~''''''''''r   c                    d}t        |      }|d   }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	)
uA   유효하지 않은 kind는 merge_required=True 기본값 유지.z+---
kind: unknown
merge_required: false
---r   r   r   r   r   r   r   Nr    r:   s           r	   2test_unknown_kind_preserves_default_merge_requiredzWTestParseInvalidKindFallsBackDefault.test_unknown_kind_preserves_default_merge_required   s^    ?f~''~''''~'''~''''''''''r   N)r1   r2   r3   rT   rV   r4   r   r	   rR   rR      s    ((r   rR   c                       e Zd Zd Zd Zy)%TestParseYamlUnavailableRegexFallbackc                 p   ddl }|j                  fd}|j                  |d|       d}t        |      }|d   }d}||k(  }|slt	        j
                  d|fd	||f      t	        j                  |      t	        j                  |      d
z  }	dd|	iz  }
t        t	        j                  |
            dx}x}}|d   }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)uK   yaml import 실패 시 정규식 fallback으로 kind/merge_required 파싱.r   Nc                 <    | dk(  rt        d       | g|i |S Nyamlzyaml not availableImportErrornameargskwargsreal_imports      r	   mock_importzbTestParseYamlUnavailableRegexFallback.test_yaml_import_failure_regex_fallback.<locals>.mock_import   +    v~!"677t5d5f55r   
__import__u0   ---
kind: meta
merge_required: false
---

작업r   r8   r   r   r   r   r   r   r9   	builtinsrf   setattrr
   r!   r"   r#   r$   r%   r'   monkeypatchrh   rd   r   r(   r)   r*   r+   r,   r-   rc   s              @r	   'test_yaml_import_failure_regex_fallbackzMTestParseYamlUnavailableRegexFallback.test_yaml_import_failure_regex_fallback   s    ))	6
 	HlK@Ff~''~''''~'''~''''''''''h0=0=0000=000000=0000000r   c                 n   ddl }|j                  fd}|j                  |d|       d}t        |      }|d   }d}||k(  }|slt	        j
                  d|fd	||f      t	        j                  |      t	        j                  |      d
z  }	dd|	iz  }
t        t	        j                  |
            dx}x}}|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)uC   yaml 없을 때 kind: code + merge_required: true 정규식 파싱.r   Nc                 <    | dk(  rt        d       | g|i |S r[   r]   r_   s      r	   rd   zcTestParseYamlUnavailableRegexFallback.test_yaml_import_failure_code_kind_regex.<locals>.mock_import   re   r   rf   u/   ---
kind: code
merge_required: true
---

작업r   r   r   r   r   r   r   r   Tr   r   rg   rj   s              @r	   (test_yaml_import_failure_code_kind_regexzNTestParseYamlUnavailableRegexFallback.test_yaml_import_failure_code_kind_regex   s    ))	6
 	HlK@Ef~''~''''~'''~''''''''''&'/4/'4////'4///'///4///////r   N)r1   r2   r3   rl   ro   r4   r   r	   rX   rX      s    1$0r   rX   c                       e Zd Zd Zd Zy)TestParseEdgeCasesc                    t        d      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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	)u!   None 입력 시 기본값 반환.r   r   r   r   r   r   r   r   Nr   Tr   r   )r   r!   r"   r#   r$   r%   r&   s          r	   test_none_inputz"TestParseEdgeCases.test_none_input   s     &b)f~''~''''~'''~''''''''''&'/4/'4////'4///'///4///////r   c                    d}t        |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}|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}}|d   }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	)uB   frontmatter에 merge_required만 있고 kind 없음 → kind=code.u%   ---
merge_required: false
---

작업r   r   r   r   r   r   r   Nr   Fr   r   r   r9   r    r:   s           r	   ,test_frontmatter_only_merge_required_no_kindz?TestParseEdgeCases.test_frontmatter_only_merge_required_no_kind   s   :f~''~''''~'''~''''''''''&'050'50000'5000'00050000000h0=0=0000=000000=0000000r   N)r1   r2   r3   rs   ru   r4   r   r	   rq   rq      s    01r   rq   )&__doc__rh   @py_builtins_pytest.assertion.rewrite	assertionrewriter!   importlib.util	importlibossystypesunittest.mockr   pytestWORKTREEutilspec_from_file_locationpathjoin_dp_specmodule_from_spec_dispatch_modmodulesloaderexec_moduler   strdictr
   r   r6   r?   rE   rI   rR   rX   rq   r4   r   r	   <module>r      s       	 
    ; >>11GGLL=) //9*M    M *$99 & & &- - ( ( 1 1$1 11 12( ( "0 "0J1 1r   