ó
    ˜!dj`  ã                   ó~   • S r SSKrSSKJs  Jr  SSKJr  SSK	J
r
  SSKJrJrJr  S rS rS rS	 rS
 rS rS rS rg)z?Tests for the TableExtractor Protocol and ExtractedTable model.é    N)ÚPath)ÚFootnoteDef)ÚExtractedTableÚMockTableExtractorÚTableExtractorc                  ó   • [        5       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g )Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstanceÚmer   )Úpy0Úpy1Úpy2Úpy4)
r   r	   r   Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r
   Ú@py_assert3Ú@py_format5s      Ú4/home/mande/repo/quber/tests/core/test_extractors.pyÚ,test_extractor_protocol_isinstance_with_mockr      s    € ô ,Ó-€BÜ�bœ.Ó)Ð)Ö)×)×)×)×)×)Ñ)Œ:×)×)×)Ñ)Œ:×)×)×)×)×)Ö)�b×)×)×)Ñ)�b×)×)×)×)×)Ö)œ.×)×)×)Ñ)œ.×)×)Õ)Ð)×)×)×)×)×)Ò)ó    c                  ó2  • [        SSS9n U R                  nSo!U:H  o3(       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=p2U R                  nSo!U:H  o3(       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=p2U R                  n/ o!U:H  o3(       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=p2U R                  nSo!U:H  o3(       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=p2U R                  nS o!UL o3(       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=p2U R                  nSo!U:H  o3(       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=p2U R                  nS o!UL o3(       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=p2U R                   nSo!U:H  o3(       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=p2U R"                  nSo!U:H  o3(       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=p2g )Nú| a |é   ©ÚmarkdownÚpageÚ ©ú==)z-%(py2)s
{%(py2)s = %(py0)s.title
} == %(py5)sÚt©r   r   Úpy5úassert %(py7)sÚpy7)z0%(py2)s
{%(py2)s = %(py0)s.subtitle
} == %(py5)s©z1%(py2)s
{%(py2)s = %(py0)s.footnotes
} == %(py5)s)z,%(py2)s
{%(py2)s = %(py0)s.page
} == %(py5)s)Úis)z,%(py2)s
{%(py2)s = %(py0)s.bbox
} is %(py5)sÚunknown©z.%(py2)s
{%(py2)s = %(py0)s.flavor
} == %(py5)s)z.%(py2)s
{%(py2)s = %(py0)s.source
} is %(py5)s)z0%(py2)s
{%(py2)s = %(py0)s.table_id
} == %(py5)s)z;%(py2)s
{%(py2)s = %(py0)s.content_fingerprint
} == %(py5)s)r   Útitler   Ú_call_reprcomparer   r   r   r   r   r   ÚsubtitleÚ	footnotesr    ÚbboxÚflavorÚsourceÚtable_idÚcontent_fingerprint©r$   Ú@py_assert1Ú@py_assert4r   Ú@py_format6Ú@py_format8s         r   Útest_extracted_table_defaultsr;      sö  € Ü ¨aÑ0€AØ�7‰7Ð�bÐ�b‰=×××Òˆ7×××××Õˆ1×××Ñˆ1××Õˆ7××Ó�b××××××ÓØ�:‰:Ð˜Ð˜Ñ×××Òˆ:×××××Õˆ1×××Ñˆ1××Õˆ:××Ó˜××××××ÓØ�;‰;Ð˜"Ð˜"Ñ×××Òˆ;×××××Õˆ1×××Ñˆ1××Õˆ;××Ó˜"××××××ÓØ�6‰6Ð�QÐ�Q‰;×××Òˆ6×××××Õˆ1×××Ñˆ1××Õˆ6××Ó�Q××××××ÓØ�6‰6Ð�TÐ�Tˆ>×××Òˆ6×××××Õˆ1×××Ñˆ1××Õˆ6××Ó�T××××××ÓØ�8‰8Ð �yÐ �yÑ × × × Ò ˆ8× × × × × Õ ˆ1× × × Ñ ˆ1× × Õ ˆ8× × Ó �y× × × × × × Ó Ø�8‰8Ð�tÐ�tÐ×××Òˆ8×××××Õˆ1×××Ñˆ1××Õˆ8××Ó�t××××××ÓØ�:‰:Ð˜Ð˜Ñ×××Òˆ:×××××Õˆ1×××Ñˆ1××Õˆ:××Ó˜××××××ÓØ× Ñ Ð& BÐ& BÑ&×&×&×&Ò&Ð ×&×&×&×&×&Õ&ˆ1×&×&×&Ñ&ˆ1×&×&Õ&Ð ×&×&Ó& B×&×&×&×&×&×&Ô&r   c                  ót  • SSK Jn   SnSnSo0" XU5      nSoTU:H  of(       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      [        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=peSn	[        U	5      n
SnSoÀ" X«U5      nSoÕU:H  oî(       Gda  [        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                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U	5      [        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=píg )Nr   )Útable_addressz/data/67609452.pdfé   r   z67609452-p14-t2r"   )zC%(py8)s
{%(py8)s = %(py0)s(%(py2)s, %(py4)s, %(py6)s)
} == %(py11)sr=   )r   r   r   Úpy6Úpy8Úpy11zassert %(py13)sÚpy13zelsewhere/67609452.pdf)zc%(py11)s
{%(py11)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
}, %(py7)s, %(py9)s)
} == %(py14)sr   )r   r   Úpy3r&   r(   Úpy9rA   Úpy14zassert %(py16)sÚpy16)Úquber.core.extractors.baser=   r   r.   r   r   r   r   r   r   r   )r=   r7   r   Ú@py_assert5Ú@py_assert7Ú@py_assert10Ú@py_assert9Ú@py_format12Ú@py_format14Ú@py_assert2r8   Ú@py_assert6Ú@py_assert8Ú@py_assert13Ú@py_assert12Ú@py_format15Ú@py_format17s                    r   Ú2test_table_address_is_deterministic_and_positionalrU   !   s–  € Ý8à-ÐJ¨rÐJ°1ÐJˆ=Ð-°1Ó5ÐJÐ9JÐJÐ9JÑJ×J×J×JÒJÐ5×J×J×J×J×JÕJˆ=×J×J×JÑJˆ=×J×JÕJÐ-×J×JÓJ¨r×J×JÓJ°1×J×JÓJÐ5×J×JÓJÐ9J×J×J×J×J×J×J×JÑJà6ÐTœÐ6Ó7ÐT¸ÐT¸QÐTˆ=Ð7¸QÓ?ÐTÐCTÐTÐCTÑT×T×T×TÓTÐ?×T×T×T×T×TÕTˆ=×T×T×TÑTˆ=×T×T×T×T×TÖTœ×T×T×TÑTœ×T×TÕTÐ6×T×TÓTÐ7×T×TÓT¸×T×TÓT¸Q×T×TÓTÐ?×T×TÓTÐCT×T×T×T×T×T×T×TÔTr   c                  ó`	  • SSK Jn   SS/SS//nU " U5      n/ n[        U5      nSoTU:H  ofov(       a  SS/SS//o€" U5      o’U	:H  oªnU(       Gd<  [        R                  " SU4S	XE45      S
[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
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-  oÃR                  U5        U(       a÷  [        R                  " SW
4SUW	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[        R                  " W5      [        R                  " U	5      S.-  nSSU0-  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=n
=p‰SS/SS//nU " U5      nUU:g  o3(       Gd  [        R                  " SU4SUU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[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=nn/ o0" U5      nSnUU:H  nU(       dÐ  [        R                  " SU4SUU45      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        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g )!Nr   )Úgrid_fingerprintÚRegionÚ2025ÚUSz1,637é   r"   )z0%(py5)s
{%(py5)s = %(py2)s(%(py3)s)
} == %(py8)sÚlenÚa)r   rC   r&   r@   z%(py10)sÚpy10)z5%(py12)s == %(py18)s
{%(py18)s = %(py14)s(%(py16)s)
}rW   )Úpy12rE   rF   Úpy18z%(py20)sÚpy20zassert %(py23)sÚpy23z1,638)ú!=)z0%(py0)s != %(py6)s
{%(py6)s = %(py2)s(%(py4)s)
})r   r   r   r?   úassert %(py8)sr@   r!   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)s)r   r   r   r(   zassert %(py9)srD   )rG   rW   r\   r   r.   r   r   r   r   ÚappendÚ_format_boolopr   r   )rW   Úcellsr]   r7   r8   rI   rO   Ú@py_assert0Ú@py_assert15Ú@py_assert17rQ   Ú@py_format9Ú@py_format11Ú@py_format19Ú@py_format21Ú@py_format22Ú@py_format24r   rH   Ú@py_format7r:   Ú@py_format10s                         r   Ú#test_grid_fingerprint_tracks_valuesrs   )   s¢  € Ý;à˜Ð $¨ Ð1€EÙ˜Ó€AÙWŒ3ˆq‹6ÐW�QÐW�Q‰;×W°8¸VÐ2DÀtÈWÀoÐ1VÐWÐ 0Ð1VÓ WÐWÐ WÑW×W×W×WÕWˆ6×W×W×W×W×WÕWŒ3×W×W×WÑWŒ3×W×W×W×W×WÖWˆq×W×W×WÑWˆq×W×WÕWˆ6×W×WÓW�Q×W×W×W×W×W×W×WÒW˜1Ð W×W×W×W×W×WÕW˜1×W×W×WÑW˜1×W×W×W×W×WÖWÐ 0×W×W×WÑWÐ 0×W×WÕWÐ1V×W×WÓWÐ W×W×W×W×W×W×W×W×W×W×W×W×W×WÖWà#+¨VÐ"4°t¸W°oÐ!FÐGÑ Ð!FÓGÐGˆ1ÐGÑG×G×G×GÓGˆ1ÐG×G×G×G×G×GÕGˆ1×G×G×GÑGˆ1×G×G×G×G×GÖGÐ ×G×G×GÑGÐ ×G×GÕGÐ!F×G×GÓGÐG×G×G×G×G×G×GÔGØÐ%Ð˜BÓÐ% 2Ð%Ð 2Ñ%×%×%×%Ó%Ð 2×%×%×%×%×%Õ%Ð×%×%×%Ñ%Ð×%×%Õ%˜B×%×%Ó%Ð×%×%Ó% 2×%×%×%×%×%×%×%r   c                  ó’  • [        SSS[        SSS9/SSS	S
S9n U R                  nS	o!U:H  o3(       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=p2U R                  nSo!U:H  o3(       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=p2g )NzBranded Volumez#For the 3 Months Ended Sep 30, 2025z| a |
|---|
| 1 |z(1)ÚNote©ÚmarkerÚtexté   )g      $@g      4@g      >@g      D@Úlatticez
/tmp/x.pdf)r-   r/   r   r0   r    r1   r2   r3   r"   r,   r$   r%   r'   r(   )z,%(py2)s
{%(py2)s = %(py0)s.bbox
} == %(py5)s)r   r   r2   r   r.   r   r   r   r   r   r   r1   r6   s         r   Útest_extracted_table_fullr{   4   s  € ÜØØ6Ø&Ü e°&Ñ9Ð:ØØ%ØØñ		€Að �8‰8Ð �yÐ �yÑ × × × Ò ˆ8× × × × × Õ ˆ1× × × Ñ ˆ1× × Õ ˆ8× × Ó �y× × × × × × Ó Ø�6‰6Ð-Ð-Ð-Ð-Ñ-×-×-×-Ò-ˆ6×-×-×-×-×-Õ-ˆ1×-×-×-Ñ-ˆ1×-×-Õ-ˆ6×-×-Ó-Ð-×-×-×-×-×-×-Ô-r   c                  óú  • [         R                  " SSS/S.5      n U R                  n[        SSS9/o!U:H  o3(       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=p2g )Nr   é   z(1) Restated for FX.)r   r    r0   r!   rv   r"   r)   r$   r%   r'   r(   )r   Úmodel_validater0   r   r   r.   r   r   r   r   r   r   r6   s         r   Ú8test_legacy_bare_string_footnotes_load_as_unmarked_notesr   C   s›   € ô 	×%Ò%°7ÀAÐUkÐTlÑ&mÓn€AØ�;‰;ÐOœ;¨bÐ7MÑNÐOÐOÐOÑO×O×O×OÒOˆ;×O×O×O×O×OÕOˆ1×O×O×OÑOˆ1×O×OÕOˆ;×O×OÓOÐO×O×O×O×O×O×OÔOr   c                  ó  • [        SSS9/n [        U S9nUR                  [        S5      5      n[	        U5      nSoCU:H  oU(       Gd  [
        R                  " SU4SX445      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS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=pTUS   oˆR                  nSoCU:H  oU(       d„  [
        R                  " SU4SX44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=pTg )Nr   r}   r   )Útablesúx.pdfr"   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr\   Úout)r   r   rC   r?   rd   r@   r   )z0%(py3)s
{%(py3)s = %(py1)s.markdown
} == %(py6)s)r   rC   r?   )r   r   Úextract_tables_syncr   r\   r   r.   r   r   r   r   r   r   r   )	Úrowsr
   rƒ   rN   rH   r8   rq   rk   rh   s	            r   Ú)test_mock_extractor_returns_injected_listr†   J   s  € Ü G°!Ñ4Ð5€DÜ	 4Ñ	(€BØ
×
 Ñ
 ¤ g£Ó
/€CÜˆs‹8Ð�qÐ�q‰=×××Óˆ8×××××ÕŒ3×××ÑŒ3×××××Öˆs×××Ñˆs××Õˆ8××Ó�q××××××ÓØˆq‰6Ð%�?‰?Ð%˜gÐ%˜gÑ%×%×%×%Ò%ˆ?×%×%Ô%ˆ6×%×%Ó%ˆ?×%×%Ó%˜g×%×%×%×%×%×%Ö%r   c            
      ó   • [        5       n U R                  nSn[        U5      o1" U5      n/ oTU:H  of(       GdL  [        R                  " SU4SXE45      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        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=peg )	Nr‚   r"   )zx%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.extract_tables_sync
}(%(py7)s
{%(py7)s = %(py3)s(%(py5)s)
})
} == %(py12)sr
   r   )r   r   rC   r&   r(   rD   r_   zassert %(py14)srE   )r   r„   r   r   r.   r   r   r   r   r   r   )	r
   r7   r8   rO   rP   Ú@py_assert11rJ   Ú@py_format13rS   s	            r   Ú!test_mock_extractor_empty_defaultrŠ   R   sÝ   € Ü	Ó	€BØ×!Ñ!Ð6 wÐ6¤$ w£-Ð6Ð! -Ó0Ð6°BÐ6°BÑ6×6×6×6Ó6Ð0×6×6×6×6×6Õ6ˆ2×6×6×6Ñ6ˆ2×6×6Õ6Ð!×6×6×6×6×6Ô6¤$×6×6×6Ñ6¤$×6×6Õ6 w×6×6Ó6 -×6×6Ó6Ð0×6×6Ó6°B×6×6×6×6×6×6×6Ò6r   )Ú__doc__Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   Úpathlibr   Úquber.agents.llm_clientr   Úquber.core.extractorsr   r   r   r   r;   rU   rs   r{   r   r†   rŠ   © r   r   Ú<module>r”      sG   ðÙ Eç  „ Õ å /÷ñ ò*ò
'òUò&ò.òPò&ó7r   