ó
    6Þ©jL(  ã                   óØ  • % S r SSKrSSKJs  Jr  SSKrSSKJ	r	  SSK
JrJrJr  SSKrSSKJr  SSKJrJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  \\ \ \ \ 4   r!Sr"\!\#S'   Sr$\!\#S'   Sr%\!\#S'   S\4S jr&S r'S'S jr(S'S jr)S'S jr*S'S jr+S'S jr,S'S jr-S'S jr.S'S jr/S'S jr0S\SS4S jr1SS .S\S!\\2   SS4S" jjr3S\SS4S# jr4S\SS4S$ jr5S\SS4S% jr6S\SS4S& jr7g)(a«  Tests for the over-merged Set-of-Mark region split post-pass.

`split_table` refines one captured table into the separate tables it fused,
gated on agreement between a supplied count and an internal vision count probe.
These tests exercise the geometry (`subdivide`) directly and drive `split_table`
with a mock LLM and monkeypatched render / Camelot / correction I/O, so no real
PDF, rendering, Camelot, or network is needed.
é    N)ÚPath)ÚListÚOptionalÚTuple)ÚMonkeyPatch)ÚFootnoteDefÚMockLLMClient)ÚExtractedTable©ÚCamelotCandidate©ÚStructureCorrection)Úsplit)Úsplit_tableÚ	subdivide)çš™™™™™¹?çš™™™™™É?çÍÌÌÌÌÌì?çš™™™™™é?ÚREGION)r   g      Ð?r   çš™™™™™Ù?ÚBOX_TOP)r   çš™™™™™á?r   gffffffæ?Ú
BOX_BOTTOMÚreturnc                  ó,   • [        SSSSSSS[        SS	9	$ )
NzVISA_991_Q126-p11-t3ÚFusedz| a | b |
|---|---|
| 1 | 2 |é   )ç      R@ç      Y@ç     à€@g     à…@zdocuments/VISA_991_Q126.pdfÚstreamg     @X@)	Útable_idÚtitleÚmarkdownÚpageÚbboxÚsourceÚflavorÚ
som_regionÚcamelot_accuracy)r
   r   © ó    Ú;/home/mande/repo/quber/tests/core/test_set_of_mark_split.pyÚfused_tabler/   "   s*   € ÜØ'ØØ2ØØ(Ø,ØÜØñ
ð 
r-   c                 ó.   • [         R                  " U 5      $ )N)ÚasyncioÚrun)Úcoros    r.   r2   r2   0   s   € Ü�;Š;�tÓÐr-   c                  ó  • [        [        [        [        /5      n S oULo"(       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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p![        U 5      nSoQU:H  of(       Gd  [        R
                  " SU4S	X4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=peU  H‰  u  pšp¼X›4nSoíU: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M‹     g )N©úis not©z%(py0)s is not %(py3)sÚsubs©Úpy0Úpy3úassert %(py5)sÚpy5é   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlen©r:   Úpy1r;   Úpy6úassert %(py8)sÚpy8)r   r   )z%(py1)s == %(py4)s)rD   Úpy4zassert %(py6)srE   )r   r   r   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationrB   )r8   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Úx1Ú_y1Úx2Ú_y2Ú@py_assert0Ú@py_assert3Ú@py_format5s                   r.   Ú1test_subdivide_tiles_region_into_full_width_bandsr`   7   sX  € Ü”Vœg¤zÐ2Ó3€DØÐ�tÐ×××Òˆ4×××××Õˆ4×××Ñˆ4××Õ�t××××××ÑÜˆt‹9Ð˜Ð˜‰>×××Óˆ9×××××ÕŒ3×××ÑŒ3×××××Öˆt×××Ñˆt××Õˆ9××Ó˜××××××Óã Ñˆ�ØˆxÐ%˜:Ð%˜:Ñ%×%×%×%Ò%ˆx×%×%Ô%ˆx×%×%Ó%˜:×%×%×%×%×%×%Õ%ò !r-   c                  óh  • [        [        [        [        /5      n S oULo"(       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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p!U S   S   n[        R                  nS	ov" U5      o…U:H  o(       dì  [        R
                  " S
U4SXX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        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=pxU S   S   n[        R                  nSov" U5      o…U:H  o(       dì  [        R
                  " S
U4SXX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        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=pxU S   S   n[        R                  o`S   S   ov" U5      o…U:H  o(       dì  [        R
                  " S
U4SXX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        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=pxg )Nr5   r7   r8   r9   r<   r=   r   é   r   r?   ©zL%(py1)s == %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py7)s)
}Úpytest©rD   r;   r=   Úpy7Úpy9úassert %(py11)sÚpy11éÿÿÿÿé   r   ©r   r   r   r   rI   rJ   rK   rL   rM   rN   rO   rP   rd   Úapprox©r8   rQ   rR   rS   rT   r]   rV   Ú@py_assert6Ú@py_assert8Ú@py_format10Ú@py_format12s              r.   Ú+test_subdivide_union_equals_original_regionrs   @   sQ  € Ü”Vœg¤zÐ2Ó3€DØÐ�tÐ×××Òˆ4×××××Õˆ4×××Ñˆ4××Õ�t××××××Ñà�‰7�1‰:Ð+œŸ™Ð+ sÐ+˜ sÓ+Ð+Ð+Ñ+×+×+×+Ò+ˆ:×+×+Ô+ˆ:×+×+×+×+×+Ô+œ×+×+×+Ñ+œ×+×+Õ+˜×+×+Ó+ s×+×+Ó+Ð+×+×+×+×+×+×+×+Ø�‰8�A‰;Ð,œ&Ÿ-™-Ð,¨Ð,˜-¨Ó,Ð,Ð,Ñ,×,×,×,Ò,ˆ;×,×,Ô,ˆ;×,×,×,×,×,Ô,œ&×,×,×,Ñ,œ&×,×,Õ,˜-×,×,Ó,¨×,×,Ó,Ð,×,×,×,×,×,×,×,Ø�‰7�1‰:Ð2œŸ™Ð2¨A¡w¨q¡zÐ2˜ zÓ2Ð2Ð2Ñ2×2×2×2Ò2ˆ:×2×2Ô2ˆ:×2×2×2×2×2Ô2œ×2×2×2Ñ2œ×2×2Õ2˜×2×2Ó2 z×2×2Ó2Ð2×2×2×2×2×2×2×2Ð2r-   c                  óþ  • [        [        [        [        /5      n S oULo"(       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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p!U S   S   nS	ofU:  nS
ouU:  o�(       a  U(       d»  [        R
                  " SX4SXeU4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-  n
[        [        R                  " U
5      5      eS =n=n=p‡[        R                  nSox" U5      oµU:H  o"(       G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                  " [        5      (       a  [        R                  " [        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=p{g )Nr5   r7   r8   r9   r<   r=   r   rk   r   r   )Ú<ru   )z%(py1)s < %(py4)sz%(py4)s < %(py6)sÚseam)rD   rH   rE   rF   rG   çffffffÞ?r?   )zL%(py0)s == %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.approx
}(%(py6)s)
}rd   )r:   Úpy2rH   rE   rG   úassert %(py10)sÚpy10rl   )r8   rQ   rR   rS   rT   rv   r]   rU   r^   rW   rX   Ú@py_assert7Ú@py_format11s                r.   Ú8test_subdivide_seam_lands_in_the_blank_gap_between_boxesr}   I   s�  € Ü”Vœg¤zÐ2Ó3€DØÐ�tÐ×××Òˆ4×××××Õˆ4×××Ñˆ4××Õ�t××××××ÑØ�‰7�1‰:€Dð Ð�$ÑÐ˜Ð˜Ñ××××Ñˆ4˜××Ôˆ4×××××Ô�$×××Ñ�$××Õ˜××××××ÕÜ—=‘=Ð' Ð'�= Ó'Ð'Ð'Ñ'×'×'×'Ó'ˆ4×'×'×'×'×'Õ'ˆ4×'×'×'Ñ'ˆ4×'×'×'×'×'Ö'”6×'×'×'Ñ'”6×'×'Õ'�=×'×'Ó' ×'×'Ó'Ð'×'×'×'×'×'×'Ö'r-   c                  óÞ  • [        [        [        [        /5      n S oULo"(       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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p!U S   S   n[        R                  nS	ov" U5      o…U:H  o(       dì  [        R
                  " S
U4SXX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        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=pxg )Nr5   r7   r8   r9   r<   r=   r   rk   rw   r?   rc   rd   re   rh   ri   )r   r   r   r   rI   rJ   rK   rL   rM   rN   rO   rP   rd   rm   rn   s              r.   Ú7test_subdivide_orders_unsorted_boundaries_top_to_bottomr   S   s  € Ü”Vœj¬'Ð2Ó3€DØÐ�tÐ×××Òˆ4×××××Õˆ4×××Ñˆ4××Õ�t××××××ÑØ�‰7�1‰:Ð-œŸ™Ð- uÐ-˜ uÓ-Ð-Ð-Ñ-×-×-×-Ò-ˆ:×-×-Ô-ˆ:×-×-×-×-×-Ô-œ×-×-×-Ñ-œ×-×-Õ-˜×-×-Ó- u×-×-Ó-Ð-×-×-×-×-×-×-×-Ð-r-   c                  ó²  • Sn [         U /n[        [        U5      nS o2UL oD(       Gd*  [        R                  " SU4SX#45      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      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCg )	N)r   g333333ë?r   gffffffî?)Úis)z9%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} is %(py8)sr   r   )r:   rD   r;   r=   rG   ry   rz   )r   r   r   rI   rJ   rK   rL   rM   rN   rO   rP   )ÚoutsiderQ   rV   r{   ro   rX   r|   s          r.   Ú7test_subdivide_rejects_boundary_centered_outside_regionrƒ   Y   s´   € Ø$€GÜ% wÐ/Ð8Œ9”VÐ/Ó0Ð8°DÐ8°DÐ8×8×8×8Ó8Ð0×8×8×8×8×8Õ8Œ9×8×8×8Ñ8Œ9×8×8×8×8×8Ö8”V×8×8×8Ñ8”V×8×8Õ8Ð/×8×8Ó8Ð0×8×8Ó8°D×8×8×8×8×8×8Ö8r-   c            	      óÆ  • [        5       n [        [        U S[        /[	        5       S95      nU /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      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =p2g )	Nrb   ©ÚcountÚ
boundariesÚllmr?   ©z%(py0)s == %(py3)sÚoutr9   r<   r=   ©r/   r2   r   r   r	   rI   rJ   rK   rL   rM   rN   rO   rP   ©ÚtablerŠ   rQ   rR   rS   rT   s         r.   Ú&test_single_table_count_is_passthroughrŽ   a   ó~   € Ü‹M€EÜ
Œk˜% q´g°YÄMÃOÑTÓ
U€CØ�'Ð�'‰>×××Òˆ3×××××Õˆ3×××Ñˆ3××Õ�'××××××Òr-   c            	      óÆ  • [        5       n [        [        U S[        /[	        5       S95      nU /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      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =p2g ©	Nr>   r…   r?   r‰   rŠ   r9   r<   r=   r‹   rŒ   s         r.   Ú5test_count_without_matching_boundaries_is_passthroughr’   g   r�   r-   c            	      óÞ  • [        5       n S U l        [        [        U S[        [
        /[        5       S95      nU /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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p2g r‘   )r/   r(   r2   r   r   r   r	   rI   rJ   rK   rL   rM   rN   rO   rP   rŒ   s         r.   Ú"test_missing_source_is_passthroughr”   m   sŠ   € Ü‹M€EØ€E„LÜ
Œk˜% q´g¼zÐ5JÔP]ÓP_Ñ`Ó
a€CØ�'Ð�'‰>×××Òˆ3×××××Õˆ3×××Ñˆ3××Õ�'××××××Òr-   c            	      óÞ  • [        5       n S U l        [        [        U S[        [
        /[        5       S95      nU /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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p2g r‘   )r/   r*   r2   r   r   r   r	   rI   rJ   rK   rL   rM   rN   rO   rP   rŒ   s         r.   Ú"test_missing_region_is_passthroughr–   t   s‹   € Ü‹M€EØ€EÔÜ
Œk˜% q´g¼zÐ5JÔP]ÓP_Ñ`Ó
a€CØ�'Ð�'‰>×××Òˆ3×××××Õˆ3×××Ñˆ3××Õ�'××××××Òr-   Úmonkeypatchc                 óÌ   • S[         S[        S[        S[         S[        [         [        [        4   4
S jnU R	                  [
        SU5        U R	                  [
        SS	 5        g
)zFStub page render and region crop so the split path runs without a PDF.r(   r&   ÚdpiÚout_dirr   c                 óB   • USUS S3-  nUR                  S5        USS4$ )Nzpage-Ú04dz.pngó   ‰PNGg      ƒ@g     Àˆ@)Úwrite_bytes)r(   r&   r™   rš   Úimgs        r.   Úfake_renderÚ*patch_render_and_crop.<locals>.fake_render�   s0   € Ø˜%  S˜z¨Ð.Ñ.ˆØ�‰˜
Ô#Ø�E˜5Ð Ð r-   Úrender_pageÚcrop_region_pngc                 ó   • g)Nr�   r,   )Ú
page_imageÚregionr™   s      r.   Ú<lambda>Ú'patch_render_and_crop.<locals>.<lambda>‡   s   € ÐYcr-   N)r   Úintr   ÚfloatÚsetattrÚsplit_module)r—   r    s     r.   Úpatch_render_and_cropr­   ~   s`   € ð!œDð !¬ð !´#ð !Äð !ÌÌtÔUZÔ\aÐOaÑIbô !ð
 ×Ñœ m°[ÔAØ×ÑœÐ&7Ñ9cÕdr-   ©Úfail_ordinalr¯   c                óÒ   ^• S[         S[        S[         S[        S[        [           4
U4S jjnS[        4S jnU R                  [        SU5        U R                  [        S	U5        g
)zºStub Camelot replay and structure correction per sub-region.

`fail_ordinal` makes that sub-region's Camelot replay find no grid, so the
split is abandoned and the fused region is kept.
Ú
source_strr&   ÚareaÚordinalr   c           
      óH   >• Tb  UT:X  a  g [        SU 3SUSSSS/SS//S	S
9$ )Núr-r"   )r   r    r!   g     Àr@ç     €X@ÚRegionÚ2025ÚUSú1,637ú*| Region | 2025 |
|---|---|
| US | 1,637 |©Úcandidate_idr)   r&   r'   ÚaccuracyÚcellsr%   r   )r±   r&   r²   r³   r¯   s       €r.   Úfake_camelotÚ%patch_reextract.<locals>.fake_camelot‘   sI   ø€ ØÑ#¨°<Ó(?ØÜØ˜g˜Y˜ØØØ,ØØ˜fÐ%¨¨g Ð7ØCñ
ð 	
r-   c           	   “   óL   #   • [        SU SUS   S 3S[        SSS9/S	S
SS9$ 7f)NúReconciliation Ú-rb   ú.0fú$Three Months Ended December 31, 2025ú(1)ú	See note.©ÚmarkerÚtextr»   T)r$   ÚcaptionÚ	footnotesr%   Úllm_correctedÚheader_rows)r   r   )r¿   r¥   r'   r(   r&   rˆ   Úsemr™   s           r.   Úfake_correctÚ%patch_reextract.<locals>.fake_correctž   sA   é € Ü"Ø# D 6¨¨4°©7°3¨-Ð8Ø:Ü"¨%°kÑBÐCØCØØñ
ð 	
ùs   ‚"$Úcamelot_targetedÚcorrect_structureN)Ústrr©   r   r   r   r«   r¬   )r—   r¯   rÀ   rÑ   s    `  r.   Úpatch_reextractrÖ   Š   sf   ø€ ð
¤ð 
¬Cð 
´sð 
ÄSð 
ÌXÔVfÑMg÷ 
ð
ÔTgô 
ð ×ÑœÐ&8¸,ÔGØ×ÑœÐ&9¸<ÕHr-   c                 óú  • [        U 5        [        U 5        [        5       n[        [	        US[
        [        /[        SS9S95      nU/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      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =pCg )Nr>   rb   ©Útable_countr…   r?   r‰   rŠ   r9   r<   r=   ©r­   rÖ   r/   r2   r   r   r   r	   rI   rJ   rK   rL   rM   rN   rO   rP   ©r—   r�   rŠ   rQ   rR   rS   rT   s          r.   Ú&test_vision_disagreement_keeps_camelotrÜ   ¬   s–   € Ü˜+Ô&Ü�KÔ Ü‹M€Eä
Œk˜% q´g¼zÐ5JÔP]ÐjkÑPlÑmÓ
n€CØ�'Ð�'‰>×××Òˆ3×××××Õˆ3×××Ñˆ3××Õ�'××××××Òr-   c                 ó*  • [        U 5        [        U 5        [        5       n[        [	        US[
        [        /[        SS9S9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[$        R&                  n	So©" U
5      o³U:H  oU(       Gd  [        R                  " SU4SX;4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      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=n=n=n	=p«US   oˆR"                  n[$        R&                  n	So©" U
5      o³U:H  oU(       Gd  [        R                  " SU4SX;4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      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=n=n=n	=p«U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=pTUS   oˆR*                  n[-        SSS9/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=pTS U 5       n[/        U5      oÿ(       d¢  SS[        R                  " 5       ;   d  [        R                  " [.        5      (       a  [        R                  " [.        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                   " U5      5      eS =pïUS   oˆR0                  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=pTUS   oˆR0                  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=pTS" U 5       n[/        U5      oÿ(       d¢  SS[        R                  " 5       ;   d  [        R                  " [.        5      (       a  [        R                  " [.        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                   " U5      5      eS =pïg )#Nr>   rØ   r…   r?   rA   rB   rŠ   rC   rF   rG   r   )r   r   r   rw   )zn%(py3)s
{%(py3)s = %(py1)s.som_region
} == %(py11)s
{%(py11)s = %(py7)s
{%(py7)s = %(py5)s.approx
}(%(py9)s)
}rd   )rD   r;   r=   rf   rg   ri   zassert %(py13)sÚpy13rb   )r   rw   r   r   rÆ   )z/%(py3)s
{%(py3)s = %(py1)s.caption
} == %(py6)s)rD   r;   rE   rÇ   rÈ   rÉ   )z1%(py3)s
{%(py3)s = %(py1)s.footnotes
} == %(py6)sc              3   ó@   #   • U  H  nS UR                   ;   v •  M     g7f)rº   N)r%   ©Ú.0Úts     r.   Ú	<genexpr>ÚCtest_agreement_on_two_splits_into_two_subregions.<locals>.<genexpr>Ã   s   é € Ð2ªc¨ˆw˜!Ÿ*™*Ö$ªcùs   ‚z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall)r:   rx   rH   zVISA_991_Q126-p11-t3-s1)z0%(py3)s
{%(py3)s = %(py1)s.table_id
} == %(py6)szVISA_991_Q126-p11-t3-s2c              3   óR   #   • U  H  n[        UR                  5      S :H  v •  M     g7f)é   N)rB   Úcontent_fingerprintrà   s     r.   rã   rä   È   s    é € Ð<º°1Œs�1×(Ñ(Ó)¨QÖ.ºùs   ‚%')r­   rÖ   r/   r2   r   r   r   r	   rB   rI   rJ   rK   rL   rM   rN   rO   rP   r*   rd   rm   rÌ   rÍ   r   rå   r#   )r—   r�   rŠ   rQ   rU   rV   rW   rX   r]   ro   rp   Ú@py_assert10rr   Ú@py_format14rR   r^   r_   s                    r.   Ú0test_agreement_on_two_splits_into_two_subregionsrë   µ   s›  € Ü˜+Ô&Ü�KÔ Ü‹M€EÜ #Ü�E ´¼Ð/DÌ-ÐdeÑJfÑgó!€Cô ˆs‹8Ð�qÐ�q‰=×××Óˆ8×××××ÕŒ3×××ÑŒ3×××××Öˆs×××Ñˆs××Õˆ8××Ó�q××××××Óàˆq‰6ÐE×ÑÐE¤§¡ÐEÐ.DÐE Ð.DÓ EÐEÐ EÑE×E×E×EÓEÐ×E×EÔEˆ6×E×EÓEÐ×E×E×E×E×EÔE¤×E×E×EÑE¤×E×EÕE ×E×EÓEÐ.D×E×EÓEÐ E×E×E×E×E×E×E×EÑEØˆq‰6ÐE×ÑÐE¤§¡ÐEÐ.DÐE Ð.DÓ EÐEÐ EÑE×E×E×EÓEÐ×E×EÔEˆ6×E×EÓEÐ×E×E×E×E×EÔE¤×E×E×EÑE¤×E×EÕE ×E×EÓEÐ.D×E×EÓEÐ E×E×E×E×E×E×E×EÑEàˆq‰6ÐC�>‰>ÐCÐCÐCÐCÑC×C×C×CÒCˆ>×C×CÔCˆ6×C×CÓCˆ>×C×CÓCÐC×C×C×C×C×C×CÕCØˆq‰6ÐL×ÑÐL¤°5¸{Ñ KÐLÐLÐLÑL×L×L×LÒLÐ×L×LÔLˆ6×L×LÓLÐ×L×LÓLÐL×L×L×L×L×L×LÕLÙ2©cÓ2Ð2Œ3Ð2Ó2Ð2Õ2×2×2×2×2×2Ñ2Œ3×2×2×2Ñ2Œ3×2×2Õ2Ð2×2×2Ó2Ð2×2×2×2×2×2Ò2ð ˆq‰6Ð7�?‰?Ð7Ð7Ð7Ð7Ñ7×7×7×7Ò7ˆ?×7×7Ô7ˆ6×7×7Ó7ˆ?×7×7Ó7Ð7×7×7×7×7×7×7Õ7Øˆq‰6Ð7�?‰?Ð7Ð7Ð7Ð7Ñ7×7×7×7Ò7ˆ?×7×7Ô7ˆ6×7×7Ó7ˆ?×7×7Ó7Ð7×7×7×7×7×7×7Õ7Ù<¹Ó<Ð<Œ3Ð<Ó<Ð<Õ<×<×<×<×<×<Ñ<Œ3×<×<×<Ñ<Œ3×<×<Õ<Ð<×<×<Ó<Ð<×<×<×<×<×<Ó<r-   c                 óø  • [        U 5        S[        S[        S[        S[        S[        [           4
S jnS[
        4S jnU R                  [        SU5        U R                  [        S	U5        [        [        [        5       S
[        [        /[        S
S9S95      n[        U5      nS
oTU:H  of(       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-  n[+        [        R,                  " U5      5      eS =n=peSn	US   oªR.                  oDU	:H  of(       dº  [        R                   " SU4SXI45      [        R(                  " U
5      [        R(                  " U5      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
=pFUS   oªR.                  oDU	:H  of(       dº  [        R                   " SU4SXI45      [        R(                  " U
5      [        R(                  " U5      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
=pFg )Nr±   r&   r²   r³   r   c           
      óT   • US:X  a  SOSn[        SU 3SUSUSUS-   4S	S
S/SS//SS9$ )Nrb   r    g      y@rµ   r"   r   r!   g      i@r¶   r·   r¸   r¹   rº   r»   r¼   r   )r±   r&   r²   r³   Úys        r.   rÀ   ÚCtest_units_forward_fill_across_split_siblings.<locals>.fake_camelotÐ   sR   € à “\‰E uˆÜØ˜g˜Y˜ØØØ˜˜5 ! e¡)Ð,ØØ˜fÐ%¨¨g Ð7ØCñ
ð 	
r-   c           
   “   óP   #   • US   S:X  a  SOSn[        SUS   S 3S/ SSUSS	9$ 7f)
Nrb   r    ú4(in millions, except percentages and per share data)Ú rÃ   rÅ   r»   T)r$   rÌ   rÍ   r%   rÎ   ÚunitsrÏ   r   )	r¿   r¥   r'   r(   r&   rˆ   rÐ   r™   ró   s	            r.   rÑ   ÚCtest_units_forward_fill_across_split_siblings.<locals>.fake_correctÝ   sI   é € àJNÈqÉ'ÐUZÓJZÑFÐ`bˆÜ"Ø# D¨¡G¨C =Ð1ØØØCØØØñ
ð 	
ùs   ‚$&rÓ   rÔ   r>   rØ   r…   r?   rA   rB   rŠ   rC   rF   rG   rñ   r   )z-%(py3)s
{%(py3)s = %(py1)s.units
} == %(py5)srÌ   )rD   r;   r=   zassert %(py7)srf   rb   )r­   rÕ   r©   r   r   r   r«   r¬   r2   r   r/   r   r   r	   rB   rI   rJ   rK   rL   rM   rN   rO   rP   ró   )r—   rÀ   rÑ   rŠ   rQ   rU   rV   rW   rX   rÌ   r]   rT   Ú@py_format8s                r.   Ú-test_units_forward_fill_across_split_siblingsrö   Ë   s  € ô ˜+Ô&ð
¤ð 
¬Cð 
´sð 
ÄSð 
ÌXÔVfÑMgô 
ð
ÔTgô 
ð ×ÑœÐ&8¸,ÔGØ×ÑœÐ&9¸<ÔHä
ÜÜ‹M ´¼Ð/DÌ-ÐdeÑJfñ	
ó€Cô
 ˆs‹8Ð�qÐ�q‰=×××Óˆ8×××××ÕŒ3×××ÑŒ3×××××Öˆs×××Ñˆs××Õˆ8××Ó�q××××××ÓØD€Gàˆq‰6Ð"�<‰<Ð"˜7Ñ"×"×"×"Ò"ˆ<×"×"Ô"ˆ6×"×"Ó"ˆ<×"×"×"×"×"Ô"˜7×"×"×"Ñ"˜7×"×"×"×"×"×"Õ"Øˆq‰6Ð"�<‰<Ð"˜7Ñ"×"×"×"Ò"ˆ<×"×"Ô"ˆ6×"×"Ó"ˆ<×"×"×"×"×"Ô"˜7×"×"×"Ñ"˜7×"×"×"×"×"×"Ö"r-   c                 óø  • [        U 5        [        U SS9  [        5       n[        [	        US[
        [        /[        SS9S95      nU/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      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =pCg )Nr>   r®   rØ   r…   r?   r‰   rŠ   r9   r<   r=   rÚ   rÛ   s          r.   Ú5test_failed_subregion_reextraction_keeps_fused_regionrø   ù   sš   € Ü˜+Ô&Ü�K¨aÒ0Ü‹M€Eô Œk˜% q´g¼zÐ5JÔP]ÐjkÑPlÑmÓ
n€CØ�'Ð�'‰>×××Òˆ3×××××Õˆ3×××Ñˆ3××Õ�'××××××Òr-   )r   N)8Ú__doc__ÚbuiltinsrK   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterI   r1   Úpathlibr   Útypingr   r   r   rd   Ú_pytest.monkeypatchr   Úquber.agents.llm_clientr   r	   Úquber.core.extractors.baser
   Ú%quber.core.extractors.camelot.acquirer   Ú7quber.core.extractors.camelot.correspondence.correctionr   Ú!quber.core.extractors.set_of_markr   r¬   Ú'quber.core.extractors.set_of_mark.splitr   r   rª   ÚNormBoxr   Ú__annotations__r   r   r/   r2   r`   rs   r}   r   rƒ   rŽ   r’   r”   r–   r­   r©   rÖ   rÜ   rë   rö   rø   r,   r-   r.   Ú<module>r	     s5  ðò÷ „ ƒÝ ß (Ñ (ã Ý +ç >Ý 5Ý BÝ WÝ Cß Jà
��u˜e UÐ*Ñ
+€à&€ˆÓ &ð *€ˆÓ )Ø,€
ˆGÓ ,ð�^ô òô&ô3ô(ô.ô9ôôôôð	e {ð 	e°tô 	eð PTò I ð I¸xÈ¹}ð IÐX\õ IðD¸ð Èô ð=À+ð =ÐRVô =ð,+#¸{ð +#Ètô +#ð\À{ð ÐW[õ r-   