
    SiX                         d Z ddlZddlmZ ej                  j                  d e ee      j                               ddl	m
Z
mZmZmZmZmZm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)z#Tests for design-search BM25 engine    N)Path)BM25
CSV_CONFIGDATA_DIRSTACK_CONFIGdetect_domainsearchsearch_stackc                      t        dd      } g d}| j                  |       | j                  d      }t        |      dk(  sJ |d   \  }}|dkD  sJ |d   \  }}||k\  sJ y	)
z8BM25 basic operation: fit + score returns ranked resultsg      ?g      ?)k1b)zwarm red premium color palettezcold blue minimal designzwarm golden luxury premiumwarm premium   r   N)r   fitscorelen)bm25docsscores_	top_score
last_scores         P/home/jay/workspace/.worktrees/task-2117-dev1/tools/design-search/test_search.pytest_bm25_basicr      sz    3$DD
 	HHTNZZ'F v;! !9LAyq==2JMAz
"""    c                  j    t               } | j                  g        | j                  d      }|g k(  sJ y)z'BM25 handles empty corpus without erroranythingN)r   r   r   )r   r   s     r   test_bm25_empty_corpusr   ,   s.    6DHHRLZZ
#FR<<r   c                      t        dd      } d| vsJ | d   dk(  sJ t        | d         dkD  sJ t        | d         dkD  sJ y)	z9search('warm premium', 'color') returns at least 1 resultr   colorerrordomaincountr   resultsNr	   intr   results    r   test_search_color_warm_premiumr*   7   s^    NG,F&   (w&&&vg!###vi !A%%%r   c                      t        dd      } d| vsJ | d   dk(  sJ t        | d         dkD  sJ t        | d         dkD  sJ y)	z<search('minimalism dark', 'style') returns at least 1 resultzminimalism darkstyler"   r#   r$   r   r%   Nr&   r(   s    r   test_search_styler-   @   s_    %w/F&   (w&&&vg!###vi !A%%%r   c                      t        dd      } d| vsJ | d   dk(  sJ t        | d         dkD  sJ t        | d         dkD  sJ y)	z>search('modern clean', 'typography') returns at least 1 resultzmodern clean
typographyr"   r#   r$   r   r%   Nr&   r(   s    r   test_search_typographyr0   I   s^    NL1F&   (|+++vg!###vi !A%%%r   c                  :    t        d      } d| vsJ | d   dk(  sJ y)z;search('warm color palette') auto-detects domain as 'color'warm color paletter"   r#   r!   N)r	   r(   s    r   test_search_auto_detectr3   R   s.    ()F&   (w&&&r   c                      t        dd      } d| vsJ | d   dk(  sJ t        | d         dkD  sJ t        | d         dkD  sJ y)	zEsearch_stack('server components', 'nextjs') returns at least 1 resultzserver componentsnextjsr"   stackr$   r   r%   N)r
   r'   r   r(   s    r   test_search_stack_nextjsr7   \   s^    -x8F&   '?h&&&vg!###vi !A%%%r   c                  (    t        dd      } d| v sJ y)z1search_stack with unknown stack returns error keyz
test queryunknown_stackr"   N)r
   r(   s    r   test_search_stack_unknownr:   e   s    ,8Ffr   c                  (    t        d      } | dk(  sJ y)z3detect_domain('warm color palette') returns 'color'r2   r!   Nr   r#   s    r   test_detect_domain_colorr>   n   s    /0FWr   c                  (    t        d      } | dk(  sJ y)z5detect_domain('minimalist design ui') returns 'style'zminimalist design uir,   Nr<   r=   s    r   test_detect_domain_styler@   t   s    12FWr   c                  P    ddl m}  t        d      } | |dgdgdd      }|g k(  sJ y)z.search with missing CSV file returns error keyr   )_search_csvz&/tmp/definitely_does_not_exist_xyz.csvcolqueryr   N)corerB   r   )rB   nonexistentr%   s      r   test_csv_file_missingrG   }   s4    
 !?@K+w!DGb==r   c                      g } t        j                         D ]8  \  }}t        |d   z  }|j                         r#| j	                  | d|        : | g k(  s
J d|         y)z;All CSV files listed in CSV_CONFIG exist in data/ directoryfile: zMissing CSV files: N)r   itemsr   existsappend)missingr#   configfilepaths       r   test_all_csv_existrQ      sm    G$**, 4fVn, NNfXRz234 b=9/y99=r   c                      g } t        j                         D ]8  \  }}t        |d   z  }|j                         r#| j	                  | d|        : | g k(  s
J d|         y)zDAll CSV files listed in STACK_CONFIG exist in data/stacks/ directoryrI   rJ   zMissing stack CSV files: N)r   rK   r   rL   rM   )rN   r6   rO   rP   s       r   test_all_stack_csv_existrS      sm    G%++- 3vfVn, NNeWBxj123 b=?5gY??=r   )__doc__syspathlibr   pathinsertstr__file__parentrE   r   r   r   r   r   r	   r
   r   r   r*   r-   r0   r3   r7   r:   r>   r@   rG   rQ   rS    r   r   <module>r]      s    ) 
  3tH~,,- .  #,&&&'&
:@r   