
    8i                       d Z ddlmZ ddlZddlmZ ddlmZ ddlZ ed      Z	e	dz  Z
e	dz  Zg d	Zg d
Z ej                  d      Zh dZddZddZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zedk(  r ej<                  edg       yy)uY   
IDS Phase 4 (task-2390) — design-md 라이브러리 60→130+ 확장 회귀 테스트
    )annotationsN)SequenceMatcher)Pathz'/home/jay/workspace/resources/design-mdzINDEX.mdzCONTRIBUTING.md)zVisual ThemezColor Palette
Typography	ComponentLayout)Depth	ElevationShadow)zDo'szDon'tsDoszDon't)zAgent PromptzPrompt GuidezAgent Guide)zinsurance/financeb2bb2cluxurytechminimalkoreanz#[0-9A-Fa-f]{6}>:   x.ai
linear.app
mistral.aiopencode.aitogether.aibmwcalibmclayexpomirouberwarpwiseapplefigmateslaairbnbclaudecoherecursorframerkrakennotionnvidiaollamaresendsanitysentryspacexstripevercelzapierferrarilovableminimaxmongodbposthograycastrenaultrevolutspotifywebflowairtablecoinbasecomposiointercommintlifyrunwaymlsupabase	hashicorp	pinterest	replicate	voltagent
clickhouse
elevenlabs
superhumanlamborghinic                 J    t        d t        j                         D              S )Nc              3  f   K   | ])  }|j                         r|d z  j                         r| + yw)	DESIGN.mdN)is_direxists).0ps     I/home/jay/workspace/tests/design-team/test_ids_phase4_design_md_expand.py	<genexpr>z#_list_brand_dirs.<locals>.<genexpr>5   s0      88:1{?224 	
s   /1)sortedDESIGN_MD_DIRiterdir     rT   _list_brand_dirsr[   4   s%      ((*  rZ   c                ,    | dz  j                  d      S )NrO   utf-8encoding)	read_text)	brand_dirs    rT   _read_design_mdrb   ;   s    #...@@rZ   c                     t        |t              r |j                          j                         v S t         fd|D              S )Nc              3  ^   K   | ]$  }|j                         j                         v  & y wN)lower)rR   mcontents     rT   rU   z_has_section.<locals>.<genexpr>B   s"     <qwwyGMMO+<s   *-)
isinstancestrrf   any)rh   markers   ` rT   _has_sectionrm   ?   s5    &#||~00<V<<<rZ   c                 \    t               } t        |       dk\  sJ dt        |        d       y )N   zFAIL: brand count = , expected >= 130)r[   len)
brand_dirss    rT   (test_scenario_1_brand_count_at_least_130rs   F   s5    !#Jz?c! 
s://@A!rZ   c                    t               } | D cg c]  }|j                  t        vs| }}g }|D ]m  }t        |      }t        D cg c].  }t        ||      s t        |t              rt        |      n|d   0 }}|sN|j                  |j                   d|        o |r)J dt        |       ddj                  |d d       z          y c c}w c c}w )Nr   z
: missing FAIL: z new brands missing sections.


   )r[   nameEXISTING_60_BRANDSrb   REQUIRED_SECTIONSrm   ri   rj   appendrq   join)rr   d
new_brandsfailuresrh   rg   missings          rT   -test_scenario_2_new_design_md_have_8_sectionsr   O   s    !#J'L1669K+K!LJLH <!!$ '
+ "!S)SVqt3
 

 OOqvvhj	:;<  
X>?
))HSbM
"	#<x M
s   CC3Cc                     t         j                         sJ d       t         j                  d      } t        D cg c]	  }|| vs| }}|r
J d|        y c c}w )NzFAIL: INDEX.md missingr]   r^   z$FAIL: INDEX.md missing categories = )
INDEX_PATHrQ   r`   REQUIRED_CATEGORIES)rh   cmissing_catss      rT   )test_scenario_3_index_md_has_7_categoriesr   c   se    8 88""G"4G2G!aw6FAGLGRCL>RR| Hs   	AAc                     t         j                  d      } t        j                  d|       }|sJ d       t	        |j                  d            }|dk\  sJ d| d       y )	Nr]   r^   u   (\d{3})\s*개z"FAIL: INDEX.md missing brand count   ro   zFAIL: INDEX.md displays rp   )r   r`   researchintgroup)rh   count_matchcounts      rT   %test_scenario_3b_index_md_brand_countr   j   se    ""G"4G)),g6K<<<;!!!$%EC<L3E7:KLL<rZ   c                    t               } | D cg c],  }dt        |      v rdt        |      j                         v r|. }}|D cg c]"  }|dz  j                         r|j                  $ }}|r
J d|        y c c}w c c}w )Nz
Apache-2.0zopen-designLICENSEz,FAIL: open-design extracts missing LICENSE: )r[   rb   rf   rQ   rx   )rr   r}   open_design_extractsr   s       rT   $test_scenario_4_license_preservationr   s   s    !#J?1--_Q/5577 	
 
 !5U1Q]<R<R<TUHURGzRR<x
 Vs   1A<BBc                    t         j                         sJ d       t         j                  d      t        fddD              sJ d       d} d}t	        d | |      j                         }|d	k\  sJ d
|d       |d	k\  sJ d       y )NFAIL: CONTRIBUTING.md missingr]   r^   c              3  &   K   | ]  }|v  
 y wre   rY   )rR   trh   s     rT   rU   z7test_scenario_5_copyright_block_mock.<locals>.<genexpr>   s     <qG|<s   )z70%z0.70z0.7z"FAIL: 70% threshold policy missingz>The quick brown fox jumps over the lazy dog with golden shadowz=The quick brown fox jumps over the lazy dog with silver lightgffffff?u   FAIL: mock 비정상 ratio=z.2fzFAIL: 80% case not blocked)CONTRIBUTING_PATHrQ   r`   rk   r   ratio)originalcopiedr   rh   s      @rT   $test_scenario_5_copyright_block_mockr      s    ##%F'FF%))7);G<%;<< ,< PHLFD(F399;ED=C7c{CC=D=666=rZ   c                 2   t               } g }| D ][  }t        |      }t        j                  |      }t	        |      dk  s2|j                  |j                   dt	        |       d       ] |r)J dt	        |       ddj                  |d d       z          y )N   z: only z HEXru   z brands not satori-compatible.
rv   rw   )r[   rb   HEX_REfindallrq   r{   rx   r|   )rr   r   r}   rh   
hex_colorss        rT   /test_scenario_6_all_design_md_satori_compatibler      s    !#JH E!!$^^G,
z?QOOqvvhgc*o->dCD	E
  
X?@
))HSbM
"	#<xrZ   c                 z    t               D  ch c]  } | j                   }} t        |z
  }|r
J d|        y c c} w )Nu   FAIL: 기존 브랜드 누락: )r[   rx   ry   )r}   rr   r   s      rT   test_existing_brands_preservedr      sB    "2"45Q!&&5J5 :-GC9'CC;w 6s   8c                 :    t         j                         sJ d       y )Nr   )r   rQ   rY   rZ   rT   test_contributing_md_existsr      s    ##%F'FF%rZ   __main__z-v)returnz
list[Path])ra   r   r   rj   )rh   rj   r   bool) __doc__
__future__r   r   difflibr   pathlibr   pytestrW   r   r   rz   r   compiler   ry   r[   rb   rm   rs   r   r   r   r   r   r   r   r   __name__main__file__rY   rZ   rT   <module>r      s    # 	 #  >?Z'
!$55 	   
&	'
 A=(SMS7DG zFKK4 ! rZ   