
    |CiX                        d Z ddlZddlmc m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(  }|st	        j
                  d|fd||f      d	t        j                         v st	        j                  t              rt	        j                  t              nd	d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}|d   \  }}	d}|	|kD  }
|
st	        j
                  d|
fd|	|f      dt        j                         v st	        j                  |	      rt	        j                  |	      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}
}|d   \  }}|	|k\  }
|
st	        j
                  d|
fd|	|f      dt        j                         v st	        j                  |	      rt	        j                  |	      nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            d}
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   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenscores)py0py1py3py6zassert %(py8)spy8Nr   >)z%(py0)s > %(py3)s	top_scorer   r   assert %(py5)spy5)>=)z%(py0)s >= %(py2)s
last_score)r   py2zassert %(py4)spy4)r   fitscorer   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)bm25docsr   @py_assert2@py_assert5@py_assert4@py_format7@py_format9_r   @py_assert1@py_format4@py_format6r!   @py_format3@py_format5s                   6/home/jay/workspace/tools/design-search/test_search.pytest_bm25_basicr<      s   3$DD
 	HHTNZZ'F v;!;!;!33vv;! !9LAy9q=9q99q2JMAz
""""9
""""""9"""9""""""
"""
"""""""    c                     t               } | j                  g        | j                  d      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)	z'BM25 handles empty corpus without erroranythingr   z%(py0)s == %(py3)sr   r   r   r   N)r   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   )r.   r   r0   r6   r7   r8   s         r;   test_bm25_empty_corpusrA   ,   sz    6DHHRLZZ
#F6R<6R66Rr=   c                     t        dd      } d}|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd	|iz  }t        t        j                  |            d
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}}| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	y
)z9search('warm premium', 'color') returns at least 1 resultr   colorerrornot inz%(py1)s not in %(py3)sresultr   r   r   r   Ndomainr   z%(py1)s == %(py4)sr   r#   assert %(py6)sr   countr   r   z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)sintr   r"   r#   py7assert %(py9)spy9resultsr   r	   r&   r'   r+   r(   r)   r*   r,   r-   rP   r   rH   @py_assert0r0   r7   r8   @py_assert3r:   r3   r6   @py_assert6r1   @py_format8@py_format10s                r;   test_search_color_warm_premiumr]   7   s   NG,F 7&    7&   7      &   &       (&w&w&&&&w&&&&&&w&&&&&&&g#3#!#!####!######3###3#########!#######i %3 !%A%!A%%%%!A%%%%%%3%%%3%%% %%%!%%%A%%%%%%%r=   c                     t        dd      } d}|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd	|iz  }t        t        j                  |            d
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}}| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	y
)z<search('minimalism dark', 'style') returns at least 1 resultzminimalism darkstylerD   rE   rG   rH   rI   r   r   NrJ   r   rK   rL   rM   r   rN   r   r   rO   rP   rQ   rS   rT   rU   r   rV   rW   s                r;   test_search_styler`   @   s   %w/F 7&    7&   7      &   &       (&w&w&&&&w&&&&&&w&&&&&&&g#3#!#!####!######3###3#########!#######i %3 !%A%!A%%%%!A%%%%%%3%%%3%%% %%%!%%%A%%%%%%%r=   c                     t        dd      } d}|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd	|iz  }t        t        j                  |            d
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}}| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	y
)z>search('modern clean', 'typography') returns at least 1 resultzmodern clean
typographyrD   rE   rG   rH   rI   r   r   NrJ   r   rK   rL   rM   r   rN   r   r   rO   rP   rQ   rS   rT   rU   r   rV   rW   s                r;   test_search_typographyrc   I   s   NL1F 7&    7&   7      &   &       (+|+|++++|++++++|+++++++g#3#!#!####!######3###3#########!#######i %3 !%A%!A%%%%!A%%%%%%3%%%3%%% %%%!%%%A%%%%%%%r=   c                  d   t        d      } d}|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd|iz  }t        t        j                  |            d	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	)z;search('warm color palette') auto-detects domain as 'color'warm color paletterD   rE   rG   rH   rI   r   r   NrJ   rC   r   rK   rL   rM   r   )	r	   r&   r'   r+   r(   r)   r*   r,   r-   )rH   rX   r0   r7   r8   rY   r:   r3   s           r;   test_search_auto_detectrf   R   s    ()F 7&    7&   7      &   &       (&w&w&&&&w&&&&&&w&&&&&&&r=   c                     t        dd      } d}|| v}|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd	|iz  }t        t        j                  |            d
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}}| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	| d   }t        |      }d}	||	kD  }
|
st        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d
x}x}x}
}	y
)zEsearch_stack('server components', 'nextjs') returns at least 1 resultzserver componentsnextjsrD   rE   rG   rH   rI   r   r   Nstackr   rK   rL   rM   r   rN   r   r   rO   rP   rQ   rS   rT   rU   r   )r
   r&   r'   r+   r(   r)   r*   r,   r-   rP   r   rW   s                r;   test_search_stack_nextjsrj   \   s   -x8F 7&    7&   7      &   &       '?&h&?h&&&&?h&&&?&&&h&&&&&&&g#3#!#!####!######3###3#########!#######i %3 !%A%!A%%%%!A%%%%%%3%%%3%%% %%%!%%%A%%%%%%%r=   c                  f   t        dd      } d}|| v }|st        j                  d|fd|| f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)z1search_stack with unknown stack returns error keyz
test queryunknown_stackrD   )in)z%(py1)s in %(py3)srH   rI   r   r   N)	r
   r&   r'   r+   r(   r)   r*   r,   r-   )rH   rX   r0   r7   r8   s        r;   test_search_stack_unknownrn   e   sg    ,8F7f7f7ffr=   c                  f   t        d      } d}| |k(  }|st        j                  d|fd| |f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
z3detect_domain('warm color palette') returns 'color're   rC   r   r@   rJ   r   r   r   N	r   r&   r'   r(   r)   r*   r+   r,   r-   rJ   r0   r6   r7   r8   s        r;   test_detect_domain_colorrr   n   sf    /0F6W6W66Wr=   c                  f   t        d      } d}| |k(  }|st        j                  d|fd| |f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
z5detect_domain('minimalist design ui') returns 'style'zminimalist design uir_   r   r@   rJ   r   r   r   Nrp   rq   s        r;   test_detect_domain_stylert   t   sf    12F6W6W66Wr=   c                     ddl m}  t        d      } | |dgdgdd      }g }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}}y)z.search with missing CSV file returns error keyr   )_search_csvz&/tmp/definitely_does_not_exist_xyz.csvcolqueryr   r   r@   rU   r   r   r   N)corerv   r   r&   r'   r(   r)   r*   r+   r,   r-   )rv   nonexistentrU   r0   r6   r7   r8   s          r;   test_csv_file_missingr{   }   s    
 !?@K+w!DG7b=7b77br=   c                  $   g } t        j                         D ]8  \  }}t        |d   z  }|j                         r#| j	                  | d|        : g }| |k(  }|st        j                  d|fd| |f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|        dz   d	|iz  }t        t        j                  |            d
x}}y
)z;All CSV files listed in CSV_CONFIG exist in data/ directoryfile: r   r@   missingr   zMissing CSV files: 
>assert %(py5)sr   N)r   itemsr   existsappendr&   r'   r(   r)   r*   r+   _format_assertmsgr,   r-   )r   rJ   configfilepathr0   r6   r7   r8   s           r;   test_all_csv_existr      s    G$**, 4fVn, NNfXRz234 97b=9997b99999979997999b999/y9999999r=   c                  $   g } t        j                         D ]8  \  }}t        |d   z  }|j                         r#| j	                  | d|        : g }| |k(  }|st        j                  d|fd| |f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d|        dz   d	|iz  }t        t        j                  |            d
x}}y
)zDAll CSV files listed in STACK_CONFIG exist in data/stacks/ directoryr}   r~   r   r@   r   r   zMissing stack CSV files: r   r   N)r   r   r   r   r   r&   r'   r(   r)   r*   r+   r   r,   r-   )r   ri   r   r   r0   r6   r7   r8   s           r;   test_all_stack_csv_existr      s    G%++- 3vfVn, NNeWBxj123 ?7b=???7b??????7???7???b???5gY???????r=   )$__doc__builtinsr(   _pytest.assertion.rewrite	assertionrewriter&   syspathlibr   pathinsertstr__file__parentry   r   r   r   r   r   r	   r
   r<   rA   r]   r`   rc   rf   rj   rn   rr   rt   r{   r   r    r=   r;   <module>r      s    )   
  3tH~,,- .  #,&&&'&
:@r=   