
    Ri\                     N   d Z ddlZddlZddlZddlmZ ddlZ ee      j                  j                  Z
e
dz  Zej                  j                  de      Zeej                  J ej                  j!                  e      Zeej$                  d<   ej                  j'                  e       dZdZdZd	Zd
ZdZdZdZ ee      dk  sJ d ee               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) u0   Tests for skill-judge.py — TDD (RED → GREEN)    N)Pathzskill-judge.pyskill_judgeaB  # MySkill

## Description
This skill does something very useful. It can help users accomplish tasks
efficiently by providing structured guidance. The skill is designed for
developers who need to perform complex operations quickly.

## When to Use
Use this skill when the user asks about automated tasks or when you need
to perform repetitive operations. Trigger on keywords like "automate" or
"batch process". This applies broadly to workflow automation scenarios.

## Instructions
Follow these steps:
1. First, analyze the input carefully
2. Then, prepare the execution environment
3. Execute the main logic with proper error handling
4. Validate the output against expected criteria
5. Report results clearly

```python
def example():
    return "done"
```

- Step A: Do the first thing
- Step B: Do the second thing
- Step C: Finalize and clean up

## Output Format
The output should be structured as follows:
- Summary section with key metrics
- Detailed breakdown by category
- Recommendations for next steps

```json
{
  "status": "success",
  "result": "value"
}
```

## Examples
Here is a usage example:

```bash
python3 my_script.py --input file.txt --output result.json
```

Example 1: Basic usage
  Input: simple text file
  Output: processed JSON

Example 2: Advanced usage
  Input: complex dataset
  Output: detailed analysis report
z## Description
Short description.

## When to Use
Trigger condition here.

## Instructions
Do something.

## Output Format
Some output.

## Examples
An example.
aG  ## Overview
This is an overview section with sufficient content to pass the minimum
length requirement. It describes what the skill does in detail.

## Trigger
When this happens, use the skill. Multiple trigger conditions apply here
and should be considered carefully before invoking.

## Workflow
Step 1: Do this
Step 2: Do that
Step 3: Complete
- bullet item one
- bullet item two

## Output
The result will be formatted like this with proper structure and details
about the expected output format for this skill.

## Example
Here is one example of how to use this skill properly.
ue  ## 개요
이 스킬은 매우 유용한 작업을 수행합니다. 사용자가 복잡한 작업을
효율적으로 완료할 수 있도록 구조화된 지침을 제공합니다.

## 사용 시점
자동화 작업이 필요할 때 이 스킬을 사용하세요. 반복 작업이나
배치 처리가 필요한 상황에서 활성화됩니다.

## 지침
다음 단계를 따르세요:
1. 입력을 신중하게 분석합니다
2. 실행 환경을 준비합니다
3. 적절한 오류 처리와 함께 주요 로직을 실행합니다

```python
def 예시():
    return "완료"
```

## 출력 형식
출력은 다음과 같이 구조화됩니다:
- 주요 지표가 있는 요약 섹션
- 카테고리별 세부 분류
- 다음 단계에 대한 권장 사항

## 예시
사용 예시는 다음과 같습니다:

```bash
python3 스크립트.py --입력 파일.txt
```
a  ## Description
This skill has description and instructions but is missing other sections.
The description is detailed enough to pass the minimum length requirement.

## Instructions
Here are the steps:
1. Do the first thing
2. Do the second thing
3. Finish up
 z## Description
Short.
z## Description
A description.

## When to Use
Some trigger.

## Instructions
Do something with steps.

## Output Format
Some format.

## Examples
An example.
i  zPENALTY_CONTENT too long: c                   Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)TestParseSkillSectionsc                     t         j                  t              }|d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ y NdescriptionfoundTwhen_to_useinstructionsoutput_formatexamplessjparse_skill_sectionsFULL_SKILL_MDselfresults     O/home/jay/workspace/.worktrees/task-2117-dev1/scripts/tests/test_skill_judge.py)test_parses_all_english_standard_sectionsz@TestParseSkillSections.test_parses_all_english_standard_sections   s    ((7m$W-555m$W-555n%g.$666o&w/4777j!'*d222    c                     t         j                  t              }|d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ y r	   )r   r   ENGLISH_ALTERNATE_TITLESr   s     r   $test_parses_alternate_english_titlesz;TestParseSkillSections.test_parses_alternate_english_titles   s    (()ABm$W-555m$W-555n%g.$666o&w/4777j!'*d222r   c                     t         j                  t              }|d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ y r	   )r   r   KOREAN_TITLES_MDr   s     r   test_parses_korean_titlesz0TestParseSkillSections.test_parses_korean_titles   s    (()9:m$W-555m$W-555n%g.$666o&w/4777j!'*d222r   c                     t         j                  t              }|d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ |d   d   du sJ y )	Nr
   r   Tr   r   Fr   r   r   r   MISSING_SECTIONS_MDr   s     r   &test_missing_sections_marked_not_foundz=TestParseSkillSections.test_missing_sections_marked_not_found   s    (()<=m$W-555n%g.$666m$W-666o&w/5888j!'*e333r   c                 \    t         j                  t              }dD ]  }||   d   du rJ  y )Nr
   r   r   r   r   r   F)r   r   EMPTY_CONTENT)r   r   sections      r   'test_empty_content_all_sections_missingz>TestParseSkillSections.test_empty_content_all_sections_missing   s8    ((7b 	5G'?7+u444	5r   c                 j    t         j                  t              }|d   d   dkD  sJ |d   d   dkD  sJ y )Nr
   length2   r      r   r   s     r   $test_section_content_length_capturedz;TestParseSkillSections.test_section_content_length_captured   sB    ((7m$X.333n%h/#555r   c                 v    t         j                  t              }t        |j	                               h dk(  sJ y )N>   r   r
   r   r   r   )r   r   r   setkeysr   s     r   $test_returns_dict_with_all_five_keysz;TestParseSkillSections.test_returns_dict_with_all_five_keys   s4    ((76;;=! &
 
 	
 
r   c                     t         j                  t              }|j                         D ]/  \  }}d|v s
J d|        d|v s
J d|        d|v r'J d|         y )Nr   zMissing 'found' in r*   zMissing 'length' in contentzMissing 'content' in )r   r   r   items)r   r   keyvals       r   2test_each_section_has_found_and_length_and_contentzITestParseSkillSections.test_each_section_has_found_and_length_and_content   sz    ((7 	CHCc>>%8#>>>s?@&:3%$@@?#B'<SE%BB#	Cr   c                     t         j                  t              }|d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y )Nr   r*   r   r   r   r!   r   s     r   &test_not_found_section_has_zero_lengthz=TestParseSkillSections.test_not_found_section_has_zero_length  s[    (()<=m$X.!333o&x0A555j!(+q000r   c                 J    d}t         j                  |      }|d   d   du sJ y )Na  ## Rules
Do this and that with careful consideration.
## Rules
Do this and that with careful consideration.
## Rules
Do this and that with careful consideration.
## Rules
Do this and that with careful consideration.
## Rules
Do this and that with careful consideration.
r   r   Tr   r   r   r3   r   s      r   %test_rules_title_maps_to_instructionsz<TestParseSkillSections.test_rules_title_maps_to_instructions  s/    P((1n%g.$666r   c                 J    d}t         j                  |      }|d   d   du sJ y )Nu  ## 설명
이것은 설명입니다.
설명 내용이 충분히 길어야 합니다.설명 내용이 충분히 길어야 합니다.설명 내용이 충분히 길어야 합니다.설명 내용이 충분히 길어야 합니다.설명 내용이 충분히 길어야 합니다.r
   r   Tr;   r<   s      r   %   test_설명_title_maps_to_descriptionu<   TestParseSkillSections.test_설명_title_maps_to_description  s/    s((1m$W-555r   c                 J    d}t         j                  |      }|d   d   du sJ y )Nu   ## 트리거
이 조건에서 사용하세요.
트리거 조건 설명.트리거 조건 설명.트리거 조건 설명.트리거 조건 설명.트리거 조건 설명.r   r   Tr;   r<   s      r   (   test_트리거_title_maps_to_when_to_useu?   TestParseSkillSections.test_트리거_title_maps_to_when_to_use  s/    f((1m$W-555r   c                 J    d}t         j                  |      }|d   d   du sJ y )Nu   ## 결과물
결과는 이렇게 나옵니다.
결과 형식 설명.결과 형식 설명.결과 형식 설명.결과 형식 설명.결과 형식 설명.r   r   Tr;   r<   s      r   *   test_결과물_title_maps_to_output_formatuA   TestParseSkillSections.test_결과물_title_maps_to_output_format  s/    c((1o&w/4777r   N)__name__
__module____qualname__r   r   r   r#   r(   r-   r1   r7   r9   r=   r?   rA   rC    r   r   r   r      sD    33345
6

C17
6
6
8r   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestScoreSectionc                 r    t         j                  dd      }|j                  dk(  sJ |j                  du sJ y )Nr
   r   r   Fr   score_sectionscorer   r   rM   s     r   test_empty_content_scores_zeroz/TestScoreSection.test_empty_content_scores_zero%  s8      3{{a{{e###r   c                 r    t         j                  dd      }|j                  dk(  sJ |j                  du sJ y )Nr
   zShort text.   TrK   rN   s     r   test_short_content_scores_fivez/TestScoreSection.test_short_content_scores_five*  s8      >{{a{{d"""r   c                 V    d}t         j                  d|      }|j                  dk(  sJ y )NzOThis is a description that is definitely longer than fifty characters in total.r
   
   r   rL   rM   r   r3   rM   s      r   %test_content_over_50_chars_scores_tenz6TestScoreSection.test_content_over_50_chars_scores_ten0  s+    c  8{{b   r   c                 V    d}t         j                  d|      }|j                  dk\  sJ y )NzCDescription.
```python
code here
```
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr
      rU   rV   s      r   -test_content_with_code_block_adds_specificityz>TestScoreSection.test_content_with_code_block_adds_specificity5  s+    H  8{{b   r   c                 V    d}t         j                  d|      }|j                  dk\  sJ y )NzoSome content with a list.
- item one
- item two
- item three
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr
   rY   rU   rV   s      r   'test_content_with_list_adds_specificityz8TestScoreSection.test_content_with_list_adds_specificity:  s+    `  8{{b   r   c                 V    d}t         j                  d|      }|j                  dk(  sJ y )Na  A very detailed description of the skill.
- Point one
- Point two
- Point three
```python
code example
```
A very detailed description of the skill.
- Point one
- Point two
- Point three
```python
code example
```
A very detailed description of the skill.
- Point one
- Point two
- Point three
```python
code example
```
A very detailed description of the skill.
- Point one
- Point two
- Point three
```python
code example
```
A very detailed description of the skill.
- Point one
- Point two
- Point three
```python
code example
```
r
      rU   rV   s      r   )test_full_marks_for_comprehensive_sectionz:TestScoreSection.test_full_marks_for_comprehensive_section?  s/    
   8{{b   r   c                     t         j                  dd      }t        |d      sJ t        |d      sJ t        |d      sJ y )Nr
   zSome content here.rM   r   r*   )r   rL   hasattrrN   s     r   #test_score_is_sectioncore_dataclassz4TestScoreSection.test_score_is_sectioncore_dataclassH  sE      0DEug&&&ug&&&uh'''r   c                 V    d}t         j                  d|      }|j                  dk  sJ y )Na"  Extremely detailed content.
- item
```code```
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   r^   rU   rV   s      r   $test_max_score_per_section_is_twentyz5TestScoreSection.test_max_score_per_section_is_twentyN  s+    Q  9{{b   r   c                 h    d}t         j                  d|      }|j                  t        |      k(  sJ y )NzHello, world!r
   )r   rL   r*   lenrV   s      r   *test_length_reflects_actual_content_lengthz;TestScoreSection.test_length_reflects_actual_content_lengthS  s/    !  8||s7|+++r   N)rD   rE   rF   rO   rR   rW   rZ   r\   r_   rb   rd   rg   rG   r   r   rI   rI   $  s/    $
#!
!
!
!(!
,r   rI   c                   `    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)TestEvaluateSkillc                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk\  sJ y NSKILL.mdK   )
write_textr   r   evaluate_skillstrtotal_scorer   tmp_path
skill_filer   s       r   test_full_skill_gets_high_scorez1TestEvaluateSkill.test_full_skill_gets_high_score]  sB    
*
m,""3z?3!!R'''r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk  sJ y rk   )rn   MINIMAL_SKILL_MDr   ro   rp   rq   rr   s       r   #test_minimal_skill_gets_lower_scorez5TestEvaluateSkill.test_minimal_skill_gets_lower_scorec  sC    
*
./""3z?3!!B&&&r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk  sJ y Nrl   r   )rn   r&   r   ro   rp   rq   rr   s       r   (test_empty_file_scores_zero_or_near_zeroz:TestEvaluateSkill.test_empty_file_scores_zero_or_near_zeroi  sB    
*
m,""3z?3!!Q&&&r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk(  sJ y )Nrl   )rn   PENALTY_CONTENTr   ro   rp   	penaltiesrr   s       r   #test_penalty_applied_for_short_filez5TestEvaluateSkill.test_penalty_applied_for_short_fileo  sB    
*
o.""3z?33&&&r   c                     |dz  }t         dz   ddz  z   }t        |      dk\  sJ dt        |              |j                  |       t        j	                  t        |            }|j                  dk(  sJ y )Nrl   
zAdditional content.
iX  '  zContent too short: rQ   )r   rf   rn   r   ro   rp   bonuses)r   rs   rt   long_contentr   s        r    test_bonus_applied_for_long_filez2TestEvaluateSkill.test_bonus_applied_for_long_fileu  s{    
*
$t+.E.KK< E)T-@\AR@S+TT)l+""3z?3~~"""r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk(  sJ y rz   )rn   r   r   ro   rp   r   rr   s       r   test_no_bonus_for_medium_lengthz1TestEvaluateSkill.test_no_bonus_for_medium_length}  s@    
*
m,""3z?3~~"""r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  t	        |      k(  sJ y Nrl   )rn   r   r   ro   rp   
skill_pathrr   s       r   test_result_has_skill_pathz,TestEvaluateSkill.test_result_has_skill_path  sF    
*
m,""3z?3  C
O333r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dv sJ y )Nrl   )ABCDF)rn   r   r   ro   rp   graderr   s       r   test_result_has_gradez'TestEvaluateSkill.test_result_has_grade  sA    
*
m,""3z?3||8888r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk(  sJ y )Nrl   z
rule-based)rn   r   r   ro   rp   moderr   s       r   test_result_mode_is_rule_basedz0TestEvaluateSkill.test_result_mode_is_rule_based  s@    
*
m,""3z?3{{l***r   c                     |dz  }|j                  t               t        j                  t	        |            }t        |d      sJ t        |j                  t              sJ y )Nrl   sections)	rn   r   r   ro   rp   ra   
isinstancer   dictrr   s       r   test_result_has_sections_dictz/TestEvaluateSkill.test_result_has_sections_dict  sR    
*
m,""3z?3vz***&//4000r   c                     t        j                  t              5  t        j	                  d       d d d        y # 1 sw Y   y xY w)Nz/nonexistent/path/SKILL.md)pytestraisesFileNotFoundErrorr   ro   r   s    r   'test_missing_file_raises_file_not_foundz9TestEvaluateSkill.test_missing_file_raises_file_not_found  s3    ]],- 	<:;	< 	< 	<s	   9Ac                     |dz  }t         dz   dz   }|j                  |       t        j                  t	        |            }|j
                  dk\  r|j                  dk(  sJ y y )Nrl   r   a  More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
More content.
Z   r   )r   rn   r   ro   rp   rq   r   )r   rs   rt   high_qualityr   s        r   test_grade_a_for_score_90_plusz0TestEvaluateSkill.test_grade_a_for_score_90_plus  sc    
*
$t+.DDl+""3z?3#<<3&&& $r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk  r|j                  dk(  sJ y y )Nrl   ,   r   )rn   r&   r   ro   rp   rq   r   rr   s       r   !test_grade_f_for_score_44_or_lessz3TestEvaluateSkill.test_grade_f_for_score_44_or_less  sS    
*
m,""3z?3#<<3&&& $r   c                     |dz  }|j                  t               t        j                  t	        |            }t        |j                  t              sJ y r   )rn   r   r   ro   rp   r   rq   intrr   s       r   test_total_score_is_intz)TestEvaluateSkill.test_total_score_is_int  sD    
*
m,""3z?3&,,c222r   N)rD   rE   rF   ru   rx   r{   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   ri   ri   \  sH    ('''##49+1<''3r   ri   c                   Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)TestGradeBoundariesc                 j    |dz  }|j                  |       t        j                  t        |            S r   rn   r   ro   rp   )r   rs   r3   rt   s       r   _make_skill_with_scorez*TestGradeBoundaries._make_skill_with_score  s/    
*
g&  Z11r   c                 P    | j                  |t              }|j                  dv sJ y )N)r   r   r   )r   rw   r   r   rs   r   s      r   test_grade_d_boundaryz)TestGradeBoundaries.test_grade_d_boundary  s'    ,,X7GH||...r   c                 8    t         j                  d      dk(  sJ y )Nr   r   r   compute_grader   s    r   test_compute_grade_directly_90z2TestGradeBoundaries.test_compute_grade_directly_90      #s***r   c                 8    t         j                  d      dk(  sJ y )Nd   r   r   r   s    r   test_compute_grade_directly_100z3TestGradeBoundaries.test_compute_grade_directly_100      $+++r   c                 8    t         j                  d      dk(  sJ y )NY   r   r   r   s    r   test_compute_grade_directly_89z2TestGradeBoundaries.test_compute_grade_directly_89  r   r   c                 8    t         j                  d      dk(  sJ y )Nrm   r   r   r   s    r   test_compute_grade_directly_75z2TestGradeBoundaries.test_compute_grade_directly_75  r   r   c                 8    t         j                  d      dk(  sJ y )NJ   r   r   r   s    r   test_compute_grade_directly_74z2TestGradeBoundaries.test_compute_grade_directly_74  r   r   c                 8    t         j                  d      dk(  sJ y )N<   r   r   r   s    r   test_compute_grade_directly_60z2TestGradeBoundaries.test_compute_grade_directly_60  r   r   c                 8    t         j                  d      dk(  sJ y )N;   r   r   r   s    r   test_compute_grade_directly_59z2TestGradeBoundaries.test_compute_grade_directly_59  r   r   c                 8    t         j                  d      dk(  sJ y )N-   r   r   r   s    r   test_compute_grade_directly_45z2TestGradeBoundaries.test_compute_grade_directly_45  r   r   c                 8    t         j                  d      dk(  sJ y )Nr   r   r   r   s    r   test_compute_grade_directly_44z2TestGradeBoundaries.test_compute_grade_directly_44  r   r   c                 8    t         j                  d      dk(  sJ y )Nr   r   r   r   s    r   test_compute_grade_directly_0z1TestGradeBoundaries.test_compute_grade_directly_0  s    "c)))r   c                 8    t         j                  d      dk(  sJ y )Nr}   r   r   r   s    r   test_compute_grade_negativez/TestGradeBoundaries.test_compute_grade_negative  r   r   N)rD   rE   rF   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r     sC    2
/
+,+++++++*,r   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestEvaluateDirectoryc                 N    t         j                  t        |            }|g k(  sJ y )N)r   evaluate_directoryrp   r   s      r   'test_empty_directory_returns_empty_listz=TestEvaluateDirectory.test_empty_directory_returns_empty_list  s"    &&s8}5||r   c                     |dz  }|j                          |dz  j                  t               t        j	                  t        |            }t        |      dk(  sJ y )Nmyskillrl      )mkdirrn   r   r   r   rp   rf   )r   rs   	skill_dirr   s       r   test_single_skill_in_directoryz4TestEvaluateDirectory.test_single_skill_in_directory  sO    y(		Z	++M:&&s8}56{ar   c                     t        d      D ]2  }|d| z  }|j                          |dz  j                  t               4 t        j                  t        |            }t        |      dk(  sJ y )N   skillrl   )ranger   rn   r   r   r   rp   rf   )r   rs   ir   r   s        r   !test_multiple_skills_in_directoryz7TestEvaluateDirectory.test_multiple_skills_in_directory  sj    q 	?A U1#;.IOO#//>	? &&s8}56{ar   c                     |dz  j                  d       |dz  j                  d       t        j                  t        |            }|g k(  sJ y )Nzother.mdznot a skillz	script.pyz# code)rn   r   r   rp   r   s      r   test_directory_with_no_skill_mdz5TestEvaluateDirectory.test_directory_with_no_skill_md  sH    	J	**=9	K	++H5&&s8}5||r   c                     t        j                  t        t        f      5  t        j                  d       d d d        y # 1 sw Y   y xY w)Nz/nonexistent/directory/path)r   r   r   NotADirectoryErrorr   r   r   s    r   'test_nonexistent_directory_raises_errorz=TestEvaluateDirectory.test_nonexistent_directory_raises_error  s=    ]]-/ABC 	A!!"?@	A 	A 	As	   ?Ac                    |dz  }|j                          |dz  j                  t               t        j	                  t        |            }t        |      dk(  sJ |d   }t        |d      sJ t        |d      sJ t        |d      sJ y )Nskill1rl   r   r   rq   r   r   )r   rn   r   r   r   rp   rf   ra   )r   rs   r   resultsr   s        r   'test_results_are_skill_result_instancesz=TestEvaluateDirectory.test_results_are_skill_result_instances	  s    x'		Z	++M:''H67|q   v}---vw'''v|,,,r   c                     |dz  j                  t               t        j                  t	        |            }t        |      dk(  sJ y )Nrl   r   )rn   r   r   r   rp   rf   r   s      r   test_direct_skill_md_in_rootz2TestEvaluateDirectory.test_direct_skill_md_in_root  s;    	J	**=9&&s8}56{ar   N)
rD   rE   rF   r   r   r   r   r   r   r   rG   r   r   r   r     s&      A	- r   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestLLMStubc                     |dz  }|j                  t               t        j                  t	        |            }|j
                  dk(  sJ y )Nrl   zllm-stub)rn   r   r   llm_evaluaterp   r   rr   s       r   3test_llm_evaluate_returns_result_with_llm_stub_modez?TestLLMStub.test_llm_evaluate_returns_result_with_llm_stub_mode  s>    
*
m,Z1{{j(((r   c                    |dz  }|j                  t               t        j                  t	        |            }t        |d      sJ d|j                  j                         v sd|j                  j                         v sJ y y )Nrl   messagezapi-keyapi_key)rn   r   r   r   rp   ra   r   lowerrr   s       r   +test_llm_evaluate_has_message_about_api_keyz7TestLLMStub.test_llm_evaluate_has_message_about_api_key%  sq    
*
m,Z1vy)))FNN0022i6>>CWCWCY6YYY6Y2r   c                 |    |dz  }|j                  t               t        j                  t	        |            }|J y r   )rn   r   r   r   rp   rr   s       r    test_llm_evaluate_does_not_raisez,TestLLMStub.test_llm_evaluate_does_not_raise,  s8    
*
m,Z1!!!r   c                     |dz  }|j                  t               t        j                  t	        |            }|j
                  t	        |      k(  sJ y r   )rn   r   r   r   rp   r   rr   s       r    test_llm_evaluate_skill_path_setz,TestLLMStub.test_llm_evaluate_skill_path_set3  sD    
*
m,Z1  C
O333r   N)rD   rE   rF   r   r   r   r   rG   r   r   r   r     s    )Z"4r   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestJSONOutputc                     |dz  }|j                  t               t        j                  t	        |            }t        j                  |      }d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ y )	Nrl   r   rq   r   r   r   r   r   rn   r   r   ro   rp   result_to_dict)r   rs   rt   r   ds        r   *test_result_to_json_dict_has_required_keysz9TestJSONOutput.test_result_to_json_dict_has_required_keys>  s    
*
m,""3z?3f%q   !!!!||QaA~~{{r   c                     |dz  }|j                  t               t        j                  t	        |            }t        j                  |      }t        j                  |      }t        |t              sJ y r   )	rn   r   r   ro   rp   r  jsondumpsr   )r   rs   rt   r   r  json_strs         r   #test_result_to_json_is_serializablez2TestJSONOutput.test_result_to_json_is_serializableK  s[    
*
m,""3z?3f%::a=(C(((r   c                     |dz  }|j                  t               t        j                  t	        |            }t        j                  |      }|d   }dD ]  }||v rJ  y )Nrl   r   r%   r  )r   rs   rt   r   r  r   r5   s          r   $test_sections_dict_contains_all_fivez3TestJSONOutput.test_sections_dict_contains_all_fiveT  sb    
*
m,""3z?3f%Z=^ 	#C(?"?	#r   c                 (   |dz  }|j                  t               t        j                  t	        |            }t        j                  |      }|d   j                         D ]/  \  }}d|v s
J d|        d|v s
J d|        d|v r'J d|         y )	Nrl   r   r   zMissing 'found' in section rM   zMissing 'score' in section r*   zMissing 'length' in section )rn   r   r   ro   rp   r  r4   )r   rs   rt   r   r  r5   r6   s          r   0test_each_section_in_dict_has_found_score_lengthz?TestJSONOutput.test_each_section_in_dict_has_found_score_length]  s    
*
m,""3z?3f%*++- 	IHCc>F%@#FF>c>F%@#FF>s?H&B3%$HH?	Ir   N)rD   rE   rF   r  r
  r  r  rG   r   r   r   r   =  s    )#Ir   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestEdgeCasesc                     |dz  }|j                  d       t        j                  t        |            }|j                  dk  sJ y )Nrl   z# Just a Title
rT   )rn   r   ro   rp   rq   rr   s       r   test_skill_with_only_h1_headingz-TestEdgeCases.test_skill_with_only_h1_headingl  sC    
*
01""3z?3!!R'''r   c                 t    |dz  }|j                  d       t        j                  t        |            }|J y )Nrl   z/##NoSpace
Content
#AnotherNoSpace
More content
r   rr   s       r   "test_skill_with_malformed_markdownz0TestEdgeCases.test_skill_with_malformed_markdownr  s;    
*
ST""3z?3!!!r   c                     |dz  }t         dz   ddz  z   }t        |      dk\  sJ |j                  |       t        j	                  t        |            }|j                  dk(  sJ |j                  dkD  sJ y )Nrl   r   xi N  r   rQ   r   )r   rf   rn   r   ro   rp   r   rq   )r   rs   rt   large_contentr   s        r   test_very_large_filez"TestEdgeCases.test_very_large_filex  sz    
*
%,sU{:=!U***m,""3z?3~~"""!!A%%%r   c                 |    |dz  }|j                  t               t        j                  t	        |            }|J y r   )rn   r   r   ro   rp   rr   s       r   test_unicode_contentz"TestEdgeCases.test_unicode_content  s;    
*
./""3z?3!!!r   c                     |dz  }t         j                  dd      }|j                  |j                  d             t        j                  t        |            }|J |j                  dkD  sJ y )Nrl   r   z
zutf-8r   )r   replacewrite_bytesencoder   ro   rp   rq   )r   rs   rt   r3   r   s        r   test_windows_line_endingsz'TestEdgeCases.test_windows_line_endings  si    
*
''f5w~~g67""3z?3!!!!!A%%%r   N)rD   rE   rF   r  r  r  r  r  rG   r   r   r  r  k  s    ("&"&r   r  )%__doc__importlib.util	importlibr  syspathlibr   r   __file__parent_SCRIPTS_DIR_MODULE_PATHutilspec_from_file_locationspecloadermodule_from_specr   modulesexec_moduler   rw   r   r   r"   r&   SHORT_CONTENTr~   rf   r   rI   ri   r   r   r   r   r  rG   r   r   <module>r1     sZ   6   
   H~$$++..~~--m\JDKK3 33^^$$T*M     9v " 0  D
  $ ?c! V%?O@T?U#V V!T8 T8t2, 2,pX3 X3|*, *,`.  . h4 4>(I (I\"& "&r   