
    RiF.                     8   d Z ddlZddlZddlZddlm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       g dZ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 G d d      Z  G d d      Z!y)u3   Tests for gen-skill-docs.py — TDD (RED → GREEN)    N)Path)patchzgen-skill-docs.pygen_skill_docs)z# ## Description
## Trigger## Usage## Examples## Filesz# MySkill

## Description
Does something useful.

## Trigger
When user asks.

## Usage
Call it like this.

## Examples
Example 1.

## Files
- skill.py
c                       e Zd Zd Zd Zy)TestEmptySkillsDirc                     t         j                  t        |            }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   g k(  sJ y )N
skills_dirskills_checkedr   	compliantnon_compliantdetails)gsdverify_skillsstrselftmp_pathresults      R/home/jay/workspace/.worktrees/task-2117-dev1/scripts/tests/test_gen_skill_docs.py"test_empty_dir_returns_zero_skillsz5TestEmptySkillsDir.test_empty_dir_returns_zero_skills/   sf    ""c(m"<&'1,,,k"a'''o&!+++i B&&&    c                     t         j                  t        |            }t        |j	                               h dk(  sJ y )Nr   >   r   r   r   r   )r   r   r   setkeysr   s      r   !test_empty_dir_has_correct_schemaz4TestEmptySkillsDir.test_empty_dir_has_correct_schema6   s3    ""c(m"<6;;=!%````r   N)__name__
__module____qualname__r   r!    r   r   r   r   .   s    'ar   r   c                       e Zd Zd Zd Zy)TestCompliantSkillc                     |dz  }|j                          |dz  j                  t               t        j	                  t        |            }|d   dk(  sJ |d   dk(  sJ y )NmyskillSKILL.mdr   r      r   r   mkdir
write_textCOMPLIANT_SKILL_MDr   r   r   r   r   	skill_dirr   s       r   "test_compliant_skill_passes_verifyz5TestCompliantSkill.test_compliant_skill_passes_verify?   sg    y(		Z	++,>?""c(m"<k"a'''o&!+++r   c                     |dz  }|j                          |dz  j                  t               t        j	                  t        |            }|d   d   }|d   dk(  sJ |d   g k(  sJ y )	Nr)   r*   r   r   r   statusr   missing_sectionsr,   r   r   r1   r   details        r   "test_compliant_skill_detail_statusz5TestCompliantSkill.test_compliant_skill_detail_statusH   sw    y(		Z	++,>?""c(m"<	"1%h;...()R///r   N)r"   r#   r$   r2   r8   r%   r   r   r'   r'   >   s    ,0r   r'   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestMissingSectionsc                     |dz  }|j                          t        j                  dd      }|dz  j                  |       t        j                  t        |            }|d   d   }d|d	   v sJ y )
Nr)   z## Examples
Example 1.

 r*   r   r   r   Examplesr5   r-   r/   replacer.   r   r   r   r   r   r1   contentr   r7   s         r   test_missing_examples_detectedz2TestMissingSections.test_missing_examples_detectedW   sv    y(	$,,-JBO	Z	++G4""c(m"<	"1%V$67777r   c                     |dz  }|j                          t        j                  dd      }|dz  j                  |       t        j                  t        |            }|d   d   }d|d	   v sJ y )
Nr)   z## Files
- skill.py
r<   r*   r   r   r   Filesr5   r>   r@   s         r   test_missing_files_detectedz/TestMissingSections.test_missing_files_detecteda   sv    y(	$,,-ErJ	Z	++G4""c(m"<	"1%&!34444r   c                     |dz  }|j                          |dz  j                  d       t        j                  t	        |            }|d   d   }|d   }d|v sJ d	|v sJ d
|v sJ d|v sJ y )Nr)   r*   z%# MySkill

## Description
Only this.
r   r   r   r5   TriggerUsager=   rD   r-   r.   r   r   r   )r   r   r1   r   r7   missings         r   test_multiple_missing_sectionsz2TestMissingSections.test_multiple_missing_sectionsk   s    y(		Z	++,WX""c(m"<	"1%+,G###'!!!W$$$'!!!r   c                     |dz  }|j                          t        j                  t        |            }|d   dk(  sJ |d   d   }t	        |d         dkD  sJ y )Nr)   r   r   r+   r   r   r5   )r-   r   r   r   lenr6   s        r   %test_no_skill_md_all_sections_missingz9TestMissingSections.test_no_skill_md_all_sections_missingx   sj    y(	 ""c(m"<o&!+++	"1%6,-.222r   c                     dD ]+  }||z  }|j                          |dz  j                  d       - t        j                  t	        |            }|d   dk(  sJ |d   dk(  sJ y )	N)skill_askill_br*   z# Title
r   r      r   r   rI   r   r   namedr   s        r    test_non_compliant_count_correctz4TestMissingSections.test_non_compliant_count_correct   st    * 	5D4AGGI^''4	5
 ""c(m"<o&!+++k"a'''r   N)r"   r#   r$   rB   rE   rK   rN   rV   r%   r   r   r:   r:   V   s    85"3(r   r:   c                   $    e Zd Zd Zd Zd Zd Zy)TestGenerateSkillMdc                     |dz  }|j                          t        j                  t        |      d       |dz  j	                         sJ y )Nnewskillr1   
skill_namer*   r-   r   generate_skill_mdr   existsr   r   r1   s      r   test_generate_creates_skill_mdz2TestGenerateSkillMd.test_generate_creates_skill_md   sD    z)	I:NJ&..000r   c                     |dz  }|j                          t        j                  t        |      d       t        j	                  t        |            }|d   dk(  sJ y )NrZ   r[   r   r   r+   )r-   r   r^   r   r   r0   s       r   %test_generated_skill_md_passes_verifyz9TestGenerateSkillMd.test_generated_skill_md_passes_verify   sW    z)	I:N""c(m"<k"a'''r   c                     |dz  }|j                          t        j                  t        |      d       |dz  j	                         }dD ]  }||v rJ  y )Nsr[   r*   )r   r   r   r	   r
   r-   r   r^   r   	read_text)r   r   r1   rA   sections        r   #test_generate_includes_all_sectionsz7TestGenerateSkillMd.test_generate_includes_all_sections   s\    sN	I3Gz)446^ 	&Gg%%%	&r   c                     |dz  }|j                          t        j                  t        |      d       |dz  j	                         }d|v sJ y )Nawesomer[   r*   rf   r   r   r1   rA   s       r   test_generate_fills_skill_namez2TestGenerateSkillMd.test_generate_fills_skill_name   sN    y(	I9Mz)446G###r   N)r"   r#   r$   ra   rc   ri   rm   r%   r   r   rX   rX      s    1(&$r   rX   c                       e Zd Zd Zd Zd Zy)
TestDryRunc                     |dz  }|j                          t        j                  t        |      dd       |dz  j	                         rJ y )NdryskillTr1   r\   dry_runr*   r]   r`   s      r   !test_dry_run_does_not_create_filez,TestDryRun.test_dry_run_does_not_create_file   sJ    z)	I:W[\
*224444r   c                     |dz  }|j                          t        j                  t        |      dd      }|J d|v sJ y )Nrq   Trr   r   )r-   r   r^   r   )r   r   r1   previews       r   $test_dry_run_returns_preview_contentz/TestDryRun.test_dry_run_returns_preview_content   sL    z)	''#i.Zae'f"""7***r   c                     |dz  }|j                          d}|dz  j                  |       t        j                  t	        |      dd       |dz  j                         |k(  sJ y )Nexistingz# Original
r*   Trr   )r-   r.   r   r^   r   rg   )r   r   r1   originals       r   (test_dry_run_does_not_overwrite_existingz3TestDryRun.test_dry_run_does_not_overwrite_existing   sd    z)	!	Z	++H5I:W[\J&113x???r   N)r"   r#   r$   rt   rw   r{   r%   r   r   ro   ro      s    5+@r   ro   c                       e Zd Zd Zd Zy)TestSpecificSkillc                     dD ]/  }||z  }|j                          |dz  j                  t               1 t        j	                  t        |      d      }|d   dk(  sJ |d   d   d	   dk(  sJ y )
N)alphabetagammar*   r   r   r\   r   r+   r   r   skillr,   rS   s        r   test_verify_specific_skill_onlyz1TestSpecificSkill.test_verify_specific_skill_only   s    . 	<D4AGGI^''(:;	<
 ""c(m"P&'1,,,i #G,777r   c                     dD ]  }||z  j                           t        j                  t        |dz        d       |dz  dz  j	                         sJ |dz  dz  j	                         rJ y )N)r   r   r   r[   r*   r   r]   r   r   rT   s      r   !test_generate_specific_skill_onlyz3TestSpecificSkill.test_generate_specific_skill_only   s{    % 	&D_##%	& 	Hw,>(?GT7"Z/77999v%
2::<<<<r   N)r"   r#   r$   r   r   r%   r   r   r}   r}      s    8=r   r}   c                       e Zd Zd Zd Zd Zy)TestNonExistentSkillc                     t        j                  t        j                        5  t        j	                  d       d d d        y # 1 sw Y   y xY w)Nz/no/such/path/skillsr   )pytestraisesr   SkillsErrorr   r   s    r   )test_verify_nonexistent_skills_dir_raisesz>TestNonExistentSkill.test_verify_nonexistent_skills_dir_raises   s=    ]]3??+ 	A)?@	A 	A 	As   AAc                     t        j                  t        j                        5  t        j	                  t        |      d       d d d        y # 1 sw Y   y xY w)Nghostr   )r   r   r   r   r   r   )r   r   s     r   )test_verify_specific_missing_skill_raisesz>TestNonExistentSkill.test_verify_specific_missing_skill_raises   sB    ]]3??+ 	LX7K	L 	L 	Ls   !AAc                     t        j                  t        j                        5  t        j	                  dd       d d d        y # 1 sw Y   y xY w)Nz/no/such/skillr   r[   )r   r   r   r   r^   r   s    r   $test_generate_nonexistent_dir_raisesz9TestNonExistentSkill.test_generate_nonexistent_dir_raises   s?    ]]3??+ 	R!!,<!Q	R 	R 	Rs   AAN)r"   r#   r$   r   r   r   r%   r   r   r   r      s    ALRr   r   c                       e Zd Zd Zd Zy)TestJsonSerializablec                 
   |dz  }|j                          |dz  j                  t               t        j	                  t        |            }t        j                  |      }t        j                  |      }|d   |d   k(  sJ y )Nr)   r*   r   r   )	r-   r.   r/   r   r   r   jsondumpsloads)r   r   r1   r   dumpedreloadeds         r   'test_verify_result_is_json_serializablez<TestJsonSerializable.test_verify_result_is_json_serializable   sw    y(		Z	++,>?""c(m"<F#::f%()V4D-EEEEr   c                     |dz  }|j                          |dz  j                  t               t        j	                  t        |            }|d   d   }d|v sJ d|v sJ d|v sJ y )	Nr)   r*   r   r   r   r   r5   r4   r,   r6   s        r   )test_verify_details_contain_required_keysz>TestJsonSerializable.test_verify_details_contain_required_keys  sz    y(		Z	++,>?""c(m"<	"1%&   !V+++6!!!r   N)r"   r#   r$   r   r   r%   r   r   r   r      s    F	"r   r   c                       e Zd Zd Zd Zy)TestGenerateAllSkillsc                     dD ]  }||z  j                           t        j                  t        |             dD ]  }||z  dz  j	                         rJ  y )N)abcr   r*   )r-   r   generate_all_skillsr   r_   r   s      r   +test_generate_all_creates_missing_skill_mdszATestGenerateAllSkills.test_generate_all_creates_missing_skill_mds  sb    # 	&D_##%	& 	3x=9# 	;DtOj088:::	;r   c                     |dz  }|j                          |dz  j                  t               t        j	                  t        |             |dz  j                         }|t        k(  sJ y )Nry   r*   r   )r-   r.   r/   r   r   r   rg   rl   s       r   .test_generate_all_preserves_compliant_existingzDTestGenerateAllSkills.test_generate_all_preserves_compliant_existing!  sa    z)		Z	++,>?3x=9z)446,,,,r   N)r"   r#   r$   r   r   r%   r   r   r   r     s    ;-r   r   c                       e Zd Zd Zd Zd Zy)TestCheckSectionc                 <    d}t         j                  |d      du sJ y )N# Title

## Description
Hello
DescriptionTr   check_sectionr   rA   s     r   test_section_presentz%TestCheckSection.test_section_present0  s"    6  -8D@@@r   c                 <    d}t         j                  |d      du sJ y )Nr   rH   Fr   r   s     r   test_section_absentz$TestCheckSection.test_section_absent4  s"    6  '2e;;;r   c                 F    dD ]  }t         j                  d|      du rJ  y )N)r   rG   rH   r=   rD   r<   Fr   )r   rh   s     r   test_empty_content_all_absentz.TestCheckSection.test_empty_content_all_absent8  s,    O 	;G$$R1U:::	;r   N)r"   r#   r$   r   r   r   r%   r   r   r   r   /  s    A<;r   r   )"__doc__importlib.util	importlibr   syspathlibr   unittest.mockr   r   __file__parent_SCRIPTS_DIR_MODULE_PATHutilspec_from_file_locationspecloadermodule_from_specr   modulesexec_moduleREQUIRED_SECTIONSr/   r   r'   r:   rX   ro   r}   r   r   r   r   r%   r   r   <module>r      s   9   
    H~$$++11~~--.>MDKK3 33nn%%d+ #     a  .
a 
a 0 004( 4(t$ $H@ @@= =0R R"" "4- -0; ;r   