ó
    6Þ©j5  ã                   óŽ   • S r SSKrSSKJs  Jr  SSKJr  SSK	r	SSK
JrJrJrJrJr  S rS rS rS rS	 rS
 rS rS rS rS rg)z9Tests for the LLMClient Protocol and its implementations.é    N)ÚPath)ÚFootnoteDefÚ	LLMClientÚLLMTableCorrectionÚMockLLMClientÚget_llm_clientc                  óÜ  • [        5       n [        U [        5      o(       GdH  SS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " [         5      (       a  [
        R                  " [         5      OS[
        R                  " U 5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S.-  n[        [
        R                  " U5      5      eS =pg )NzLassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s()
}, %(py4)s)
}Ú
isinstancer   r   )Úpy0Úpy1Úpy3Úpy4Úpy6)
r   r
   r   Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Ú@py_assert2Ú@py_assert5Ú@py_format7s      Ú6/home/mande/repo/quber/tests/agents/test_llm_client.pyÚ#test_mock_client_satisfies_protocolr      s¨   € Ü#“oÐ1Œ:�o¤yÓ1Ð1Ö1×1×1×1×1×1Ñ1Œ:×1×1×1Ñ1Œ:×1×1×1×1×1Ö1”m×1×1×1Ñ1”m×1×1Õ1�o×1×1×1×1×1Ô1¤y×1×1×1Ñ1¤y×1×1Õ1Ð1×1×1×1×1×1Ó1ó    c                  ó\  • [        5       o R                  nSn[        U5      o1" U5      nSoTU:H  of(       Gdi  [        R                  " SU4SXE45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n =n=n=n=n=peg )
Núnope.pngé   ©ú==)z�%(py11)s
{%(py11)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s()
}.count_tables_sync
}(%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
})
} == %(py14)sr   r   )r   Úpy2r   Úpy5Úpy7Úpy9Úpy11Úpy14zassert %(py16)sÚpy16©r   Úcount_tables_syncr   r   Ú_call_reprcomparer   r   r   r   r   r   )	Ú@py_assert1Ú@py_assert3Ú@py_assert6Ú@py_assert8Ú@py_assert10Ú@py_assert13Ú@py_assert12Ú@py_format15Ú@py_format17s	            r   Útest_mock_count_tables_defaultr5      sè   € Ü‹?ÐC×,Ñ,ÐC°*ÐC¬T°*Ó-=ÐCÐ,Ð-=Ó>ÐCÀ!ÐCÀ!ÑC×C×C×CÓCÐ>×C×C×C×C×CÕCŒ=×C×C×CÑCŒ=×C×CÕCˆ?×C×CÓCÐ,×C×C×C×C×CÔC¬T×C×C×CÑC¬T×C×CÕC°*×C×CÓCÐ-=×C×CÓCÐ>×C×CÓCÀ!×C×C×C×C×C×C×CÔCr   c                  óŒ  • Sn [        U S9oR                  nSn[        U5      oB" U5      nSoeU:H  ow(       Gd~  [        R                  " SU4SXV45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.	-  nS	S
U0-  n	[        [        R                  " U	5      5      eS =n =n=n=n=n=n=pvg )Né   )Útable_countr   r    )z¤%(py13)s
{%(py13)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(table_count=%(py2)s)
}.count_tables_sync
}(%(py11)s
{%(py11)s = %(py7)s(%(py9)s)
})
} == %(py16)sr   r   )	r   r"   r   r   r$   r%   r&   Úpy13r(   úassert %(py18)sÚpy18r)   )
r,   r-   r   r/   r0   r2   Ú@py_assert15Ú@py_assert14r4   Ú@py_format19s
             r   Ú#test_mock_count_tables_configurabler?      sü   € Ø%&ÐPŒ= QÑ'ÐP×9Ñ9ÐP¸zÐP¼$¸zÓ:JÐPÐ9Ð:JÓKÐPÈqÐPÈqÑP×P×P×PÓPÐK×P×P×P×P×PÕPŒ=×P×P×PÑPŒ=×P×PÕP Q×P×PÓPÐ'×P×PÓPÐ9×P×P×P×P×PÔP¼$×P×P×PÑP¼$×P×PÕP¸z×P×PÓPÐ:J×P×PÓPÐK×P×PÓPÈq×P×P×P×P×P×P×PÖPr   c                  ó.  • [        5       n U R                  [        S5      SS9n[        U[        5      o"(       Gd+  SS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS nUR                  nSoTU:H  o"(       dº  [        R                  " S	U4S
XE45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p%UR                  n/ oTU:H  o"(       dº  [        R                  " S	U4SXE45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p%g )Nr   z| a |
|---|
| 1 |©Úmarkdownz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r
   Úoutr   )r   r   r"   r   r    )z0%(py2)s
{%(py2)s = %(py0)s.markdown
} == %(py5)s©r   r"   r#   úassert %(py7)sr$   )z1%(py2)s
{%(py2)s = %(py0)s.footnotes
} == %(py5)s)r   Úcorrect_structure_syncr   r
   r   r   r   r   r   r   r   r   rB   r+   Ú	footnotes)ÚclientrC   r-   Ú@py_format5r,   Ú@py_assert4Ú@py_format6Ú@py_format8s           r   Ú/test_mock_correct_structure_default_passthroughrM      sœ  € Ü‹_€FØ
×
'Ñ
'¬¨ZÓ(8ÐCXÐ
'Ð
Y€CÜ�cÔ-Ó.Ð.Ö.×.×.×.×.×.Ñ.Œ:×.×.×.Ñ.Œ:×.×.×.×.×.Ö.�c×.×.×.Ñ.�c×.×.×.×.×.Ö.Ô-×.×.×.Ñ.Ô-×.×.Õ.Ð.×.×.×.×.×.Ñ.Ø�<‰<Ð0Ð0Ð0Ð0Ñ0×0×0×0Ò0ˆ<×0×0×0×0×0Õ0ˆ3×0×0×0Ñ0ˆ3×0×0Õ0ˆ<×0×0Ó0Ð0×0×0×0×0×0×0Ó0Ø�=‰=Ð˜BÐ˜BÑ×××Òˆ=×××××Õˆ3×××Ñˆ3××Õˆ=××Ó˜B××××××Ôr   c            	      ó>  • [        SSS[        SS9/SS9n [        U S9nUR                  [	        S	5      S
S9nX L o3(       dÛ  [
        R                  " SU4SX 45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OSS.-  nSSU0-  n[        [
        R                  " U5      5      eS ng )NÚTÚSÚMDÚfn©Útextr   )ÚtitleÚcaptionrB   rG   Úheader_rows)Ú
correctionr   ÚotherrA   )Úis)z%(py0)s is %(py2)srC   Úforced)r   r"   zassert %(py4)sr   )r   r   r   rF   r   r   r+   r   r   r   r   r   r   )r[   rH   rC   r,   Ú@py_format3rI   s         r   Ú$test_mock_correct_structure_injectedr]   $   s²   € ÜØ˜3¨¼+È4Ñ:PÐ9QÐ_`ñ€Fô  fÑ-€FØ
×
'Ñ
'¬¨ZÓ(8À7Ð
'Ð
K€CØˆ=×××Òˆ3×××××Õˆ3×××Ñˆ3×××××Ö�&×××Ñ�&××××××Ór   c            	      ó  • Sn [        U 5      n[        U[        5      o"(       Gd]  SS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " [         5      (       a  [
        R                  " [         5      OS[
        R                  " U 5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S.-  n[        [
        R                  " U5      5      eS =n =pg )NÚmockzSassert %(py8)s
{%(py8)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py6)s)
}r
   r   r   )r   r   r   r#   r   Úpy8)
r   r
   r   r   r   r   r   r   r   r   )r   rJ   Ú@py_assert7Ú@py_format9s       r   Útest_get_llm_client_mockrc   -   s½   € Ø%+Ð<”n VÓ,Ð<Œ:Ð,¬mÓ<Ð<Ö<×<×<×<×<×<Ñ<Œ:×<×<×<Ñ<Œ:×<×<×<×<×<Ö<”n×<×<×<Ñ<”n×<×<Õ< V×<×<Ó<Ð,×<×<×<×<×<Ô<¬m×<×<×<Ñ<¬m×<×<Õ<Ð<×<×<×<×<×<Õ<r   c                  ó‚   • [         R                  " [        5         [        S5        S S S 5        g ! , (       d  f       g = f)NÚbogus)ÚpytestÚraisesÚ
ValueErrorr   © r   r   Ú"test_get_llm_client_unknown_raisesrj   1   s"   € Ü	�Š”zÕ	"Ü�wÔ÷ 
#×	"Ö	"ús   ›0°
>c            	      óZ  • SSK Jn   [        S/ SQU " SSS9/SS	9nUR                  n/ S
Qo2U:H  oD(       dº  [        R
                  " SU4SX#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCUR                   Vs/ s H  owR                  UR                  4PM     nnSS/oHU:H  o™(       do  [        R
                  " SU	4SX„45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=p”g s  snf )Nr   )ÚFootnoteMarkz| a |)z	(b)(c)(d)ú(a)ú(84)z(b)(c)úNet write-off rate(b)(c))ÚmarkerÚ	cell_textr   )rB   Úfootnote_refsÚfootnote_marksrW   )ú(b)ú(c)z(d)rm   rn   r    )z5%(py2)s
{%(py2)s = %(py0)s.footnote_refs
} == %(py5)srC   rD   rE   r$   )rt   ro   )ru   ro   ©z%(py1)s == %(py4)s©r   r   úassert %(py6)sr   )Úquber.agents.llm_clientrl   r   rr   r   r+   r   r   r   r   r   r   rs   rp   rq   )rl   rC   r,   rJ   r-   rK   rL   ÚmÚ@py_assert0r   rI   r   s               r   Ú/test_compound_marker_stacks_split_at_the_schemar|   6   sU  € õ
 5ä
ØÚ2Ù$¨HÐ@ZÑ[Ð\Øñ	€Cð ×ÑÐDÒ DÐDÐ DÑD×D×D×DÒDÐ×D×D×D×D×DÕDˆ3×D×D×DÑDˆ3×D×DÕDÐ×D×DÓDÐ D×D×D×D×D×D×DÓDØ-0×-?Ò-?Ó@Ò-?¨�X‰X�q—{‘{Ó#Ñ-?ð Ð@Ø+Ø+ðEð ð Eñ ÷ ó ïé ôÐ@÷ ñ ïé ðÐ@÷ ð ïé ðð E÷ ÷ ÷ ñ ïé ÷÷ ð ùÒ@s   Ä!F(c                  óÌ  • [        SS9n U R                  U R                  4nSo!U:H  o3(       do  [        R                  " SU4SX45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2[        S	S
S9nUR                  UR                  4nSo!U:H  o3(       do  [        R                  " SU4SX45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2[        SS9nUR                  UR                  4nSo!U:H  o3(       do  [        R                  " SU4SX45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2g )Nz+# Denotes a variance of 100 percent or morerS   )Ú#z)Denotes a variance of 100 percent or morer    rv   rw   rx   r   rm   úRepresents net income.©rp   rT   )rm   r   ú.Amounts are presented on a consolidated basis.)Ú r�   )r   rp   rT   r   r+   r   r   r   )Úliftedr{   r-   r   rI   r   ÚkeptÚunmarkeds           r   Ú2test_footnote_def_leading_symbol_lifts_into_markerr†   J   s8  € ô ÐKÑL€FØ�M‰M˜6Ÿ;™;Ð'Ð]Ð+]Ð]Ð+]Ñ]×]×]×]Ò]Ð'×]×]Ô]Ð'×]×]Ó]Ð+]×]×]×]×]×]×]Ó]ä˜eÐ*BÑC€DØ�K‰K˜Ÿ™Ð#ÐHÐ'HÐHÐ'HÑH×H×H×HÒHÐ#×H×HÔHÐ#×H×HÓHÐ'H×H×H×H×H×H×HÓHäÐ PÑQ€HØ�O‰O˜XŸ]™]Ð+ÐeÐ/eÐeÐ/eÑe×e×e×eÒeÐ+×e×eÔeÐ+×e×eÓeÐ/e×e×e×e×e×e×eÔer   c            	      ó\	  • [        S[        SSS9[        SSS9/S/SS	9n U R                   Vs/ s H  oR                  PM     nnSS/o2U:H  oD(       do  [        R
                  " S
U4SX#45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCU R                  nS/o‡U:H  o3(       dº  [        R
                  " S
U4SXx45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS =n=p8/ nSo@R                  o´U;  oˆo((       a  S U R                   5       n[        U5      oÝnU(       Gd…  [        R
                  " SU4SXK45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  n
SSU
0-  oçR                  U5        U(       a“  SS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " W5      [        R                  " W5      S.-  o÷R                  U5        [        R                   " US5      0 -  nSS U0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=pÍS!nSn[        XsS"9nUR                  n/ nUU:H  nU(       Gd  [        R
                  " S
U4S#UU45      S$[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS$[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S%.-  nS&S'U0-  n[        [        R                  " U5      5      eS =n=n=n=n=nng s  snf )(Nz!| A | B |
| --- | --- |
| 1 | 2 |z(1)z,Includes the impact of interest rate floors.r€   r‚   r�   z?As of June 30, 2026, $2.5 billion, or 88.9%, of the outstandingr   )rB   rG   Ú	body_textrW   r    rv   rw   rx   r   )z1%(py2)s
{%(py2)s = %(py0)s.body_text
} == %(py5)srC   rD   rE   r$   ú88.9c              3   ó@   #   • U  H  nS UR                   ;  v •  M     g7f)r‰   NrS   )Ú.0Úfs     r   Ú	<genexpr>ÚHtest_correction_separates_running_text_from_footnotes.<locals>.<genexpr>g   s   é € Ð-ZÊMÀq¨f¸A¿F¹FÖ.BÊMùs   ‚)únot in)z4%(py3)s not in %(py7)s
{%(py7)s = %(py5)s.markdown
})r   r#   r$   z%(py9)sr%   z)%(py15)s
{%(py15)s = %(py11)s(%(py13)s)
}Úall)r&   r9   Úpy15r   r:   r;   z| A |
| --- |
| 1 |)rB   rW   )zn%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py0)s(markdown=%(py2)s, header_rows=%(py4)s)
}.body_text
} == %(py11)sr   )r   r"   r   r   r`   r&   zassert %(py13)sr9   )r   r   rG   rp   r   r+   r   r   r   rˆ   r   r   r   rB   r�   ÚappendÚ_format_boolop)rC   rŒ   r{   r-   r   rI   r   r,   rJ   rK   rL   r.   r2   r=   Ú@py_format10Ú@py_format16r4   r>   r   ra   r0   Ú@py_assert9Ú@py_format12Ú@py_format14s                           r   Ú5test_correction_separates_running_text_from_footnotesr™   X   s·  € ô Ø6ä˜uÐ+YÑZÜ˜rÐ(XÑYð
ð UÐUØñ€Cð "ŸmšmÓ,šm˜�HŒH™mÐ;Ð,°¸°Ð;°Ñ;×;×;×;Ò;Ð,×;×;Ô;Ð,×;×;Ó;°×;×;×;×;×;×;Ó;Ø�=‰=Ð_Ð^Ð_Ð_Ð_Ñ_×_×_×_Ò_ˆ=×_×_×_×_×_Õ_ˆ3×_×_×_Ñ_ˆ3×_×_Õ_ˆ=×_×_Ó_Ð_×_×_×_×_×_×_Ó_ÙZˆ6ÐZŸ™ÐZ˜Ñ%×ZÑ-ZÈCÏMÊMÓ-ZÐZ¬#Ð-ZÓ*Z×Z×Z×ZÕZˆ6×Z×ZÔZˆ6×Z×Z×Z×Z×ZÔZ˜×Z×Z×ZÑZ˜×Z×ZÕZ˜×Z×Z×Z×Z×Z×Z×Z×Z×Z×ZÐZ¬#×Z×Z×ZÑZ¬#×Z×ZÕZÐ-Z×Z×ZÓZÐ*Z×Z×Z×Z×Z×Z×Z×Z×Z×Z×Z×Z×ZÕZà'>Ð^ÈAÐ^ÔÐ'>ÑNÐ^ÐN×XÑXÐ^Ð\^Ð^ÐXÐ\^Ñ^×^×^×^Ô^ÐXÐ\^×^×^×^×^×^Õ^Ô×^×^×^Ñ^Ô×^×^Õ^Ð'>×^×^Ó^ÈA×^×^Ó^ÐN×^×^Ó^ÐX×^×^Ó^Ð\^×^×^×^×^×^×^×^Ó^ùò	 -s   ®R))Ú__doc__Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   Úpathlibr   rf   ry   r   r   r   r   r   r   r5   r?   rM   r]   rc   rj   r|   r†   r™   ri   r   r   Ú<module>r       sS   ðÙ ?ç  „ Õ ã ÷õ ò2òDòQòòò=ò ò
ò(fó_r   