ó
    e€;j !  ã                  óf  • S r SSKJr  SSKrSSKJs  Jr  SSK	J
r
JrJrJrJr  SSKJrJr  SSKJrJrJrJrJr  SSKJr  SSKJrJrJr  SS	KJrJ r J!r!  S
u  r"r#\\$\$\$\$4   r%Sr&S S jr'  S!     S"S jjr(\&SS4S#S jjr)S$S%S jjr*S r+S r,S r-S r.S r/S r0S r1S r2S r3S r4S r5S r6S r7S r8g)&a  Tests for the docling-spine / Camelot reconciliation.

The matcher and graft are exercised against synthetic DoclingDocuments built with
docling-core's own API, so the box-frame conversions and the docling-core
mutation calls are tested for real (no docling pipeline run).
é    )ÚannotationsN)ÚListÚLiteralÚOptionalÚSequenceÚTuple)ÚBoundingBoxÚCoordOrigin)ÚDoclingDocumentÚPictureClassificationClassÚPictureClassificationDataÚProvenanceItemÚ	TableData©ÚExtractedTable)Ú	PageParseÚParseResultÚTableProvenance)Úbuild_unified_documentÚmarkdown_to_table_dataÚmatch_tables)g      ƒ@g     Àˆ@z+| A | B |
| --- | --- |
| 1 | 2 |
| 3 | 4 |c                ó†   • U u  pp4[        U[        -  U[        -  SU-
  [        -  SU-
  [        -  [        R                  S9$ )Nç      ð?)ÚlÚrÚtÚbÚcoord_origin)r	   ÚPAGE_WÚPAGE_Hr
   Ú
BOTTOMLEFT)ÚboxÚx1Úy1Úx2Úy2s        Ú3/home/mande/repo/quber/tests/core/test_reconcile.pyÚ_norm_to_bottomleftr(      sG   € Ø�N€BˆBÜØ
Œv‰+Ø
Œv‰+Ø�‰8”vÑ
Ø�‰8”vÑ
Ü ×+Ñ+ñð ó    c                óN  • [        SS9n/ nU  Hi  u  pE[        S[        U5      SS9nUR                  [	        / SSS9US9nUR                  [        UR                  SS	US
:X  a  SOSUS
:X  a  SOSUS95        Mk     U H€  u  pH[        S[        U5      SS9nUR                  US9n	U(       d  M1  U	R                  R                  [        S[        U5       V
Vs/ s H  u  p«[        USU
S-  -
  S9PM     snn
S95        M‚     [        S[        [        / S9/n[!        U/ XÃS9$ s  snn
f )zMA ParseResult with docling tables (box, verdict) and pictures (box, classes).Ú	synthetic)Únameé   )r   r   )Úpage_noÚbboxÚcharspanr   )Útable_cellsÚnum_rowsÚnum_cols)ÚdataÚprové
   Úocrr   ç        g\�Âõ(\ï?)Úself_refr.   Ú
cell_countÚfrom_ocr_fractionÚmean_ocr_confidenceÚverdict)r5   ÚtestçÍÌÌÌÌÌì?çš™™™™™¹?)Ú
class_nameÚ
confidence)Ú
provenanceÚpredicted_classes)r.   ÚwidthÚheightÚcells)ÚdocumentÚpage_scoresÚpagesÚtable_provenance)r   r   r(   Ú	add_tabler   Úappendr   r9   Úadd_picturer   r   Ú	enumerater   r   r   r    r   )ÚtablesÚpicturesÚdocrC   r"   r=   r5   ÚitemÚclassesÚpicÚiÚcrJ   s                r'   Ú_make_parserX   *   sE  € ô
 ˜{Ñ
+€CØ(*€JÛ‰ˆÜ aÔ.AÀ#Ó.FÐQWÑXˆØ�}‰}¤)¸ÀQÐQRÑ"SÐZ^ˆ}Ð_ˆØ×ÑÜØŸ™ØØØ)0°EÓ)9¡#¸sØ,3°uÓ,<¡DÀ#Øñö		
ñ ó !‰ˆÜ aÔ.AÀ#Ó.FÐQWÑXˆØ�o‰o 4ˆoÐ(ˆßˆ7ð �O‰O×"Ñ"Ü)Ø%ô %.¨gÔ$6ô'â$6™D˜Aô 3¸aÈCÐRSÐVYÑRYÉMÔZÙ$6ò'ñöñ !ô ˜q¬´vÀRÑHÐI€EÜ °¸5Ñ^Ð^ùó's   ÃD!g     ÀW@Ú c           	     ó   • [        USU UUSS9$ )Nr-   zx.pdf)ÚmarkdownÚpageÚ
som_regionÚcamelot_accuracyÚtitleÚsourcer   )r"   r[   Úaccuracyr_   s       r'   Ú_somrb   Q   s!   € ÜØØØØ!ØØñð r)   c                óŠ   • [        X5      nUc  US   R                  $ U H   nX$R                  ;   d  M  UR                  s  $    g)Nr   Únone)r   ÚkindÚsom_indices)ÚparseÚsomsÚsom_idxÚmatchesÚms        r'   Ú_kind_ofrl   \   sA   € Ü˜5Ó'€GØ�Ø�q‰z�‰ÐÛˆØ—m‘mÕ#Ø—6‘6ŠMñ ð r)   c                 ó.  • [        [        5      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                   Vs/ s H  ofR                  (       d  M  UPM     nnU Vs1 s H  ofR                  iM     nnS
S1o8U: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“U R                   Vs0 s H%  ofR                  UR                   4UR                  _M'     nn/ oS   n	SoÙU:H  o"o‚(       a  US   nSoþU:H  nUnU(       Gd
  [        R                  " SU4SX�45      [        R                  " U	5      [        R                  " U5      S.-  nSSU0-  nUR#                  U5        U(       ab  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nU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=nng s  snf s  snf s  snf )Né   ©ú==)z0%(py2)s
{%(py2)s = %(py0)s.num_rows
} == %(py5)sr4   ©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7é   ©z0%(py2)s
{%(py2)s = %(py0)s.num_cols
} == %(py5)sÚAÚB©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6)r-   r   Ú1)rw   r-   Ú4)z%(py3)s == %(py6)s)Úpy3r€   z%(py8)sÚpy8)z%(py11)s == %(py14)s)Úpy11Úpy14z%(py16)sÚpy16r   zassert %(py19)sÚpy19)r   Ú	SAMPLE_MDr2   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr3   r1   Úcolumn_headerÚtextÚstart_row_offset_idxÚstart_col_offset_idxrM   Ú_format_boolop)r4   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8rW   ÚheaderÚ@py_assert0Ú@py_assert2Ú@py_format5Ú@py_format7ÚbodyÚ@py_assert5Ú@py_assert10Ú@py_assert13Ú@py_assert12Ú@py_format9Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                         r'   Ú+test_markdown_to_table_data_grid_and_headerr«   i   sV  € Ü!¤)Ó,€DØ�=‰=Ð˜AÐ˜AÑ×××Òˆ=×××××Õˆ4×××Ñˆ4××Õˆ=××Ó˜A××××××ÓØ�=‰=Ð˜AÐ˜AÑ×××Òˆ=×××××Õˆ4×××Ñˆ4××Õˆ=××Ó˜A××××××ÓØ×)Ò)Ó=Ò)�A¯_­_�aÑ)€FÐ=Ù"Ó#šF�q�FŒF™FÐ1Ð#¨¨S zÐ1 zÑ1×1×1×1Ò1Ð#×1×1Ô1Ð#×1×1Ó1 z×1×1×1×1×1×1Ó1ØNR×N^ÒN^Ó_ÒN^È×#Ñ# Q×%;Ñ%;Ð<¸a¿f¹fÒDÑN^€DÐ_Ù6�‰<Ð6˜3Ð6˜3Ñ×6 4¨¡<Ð6°3Ð6°3Ñ#6×6×6×6Ö6ˆ<×6×6Ô6ˆ<×6×6Ó6˜3×6×6×6×6×6×6×6Ó6 <°3×6×6Ô6 <×6×6Ó6°3×6×6×6×6×6×6×6×6×6×6×6×6×6×6Ñ6ùò >ùÚ#ùÚ_s   ÇPÇ$PÇ0PÊ,Pc                 ó  • [        S5      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                   Vs/ s H  ofR                  S	:X  d  M  UPM     nn[        U5      nSosU:H  oˆ(       d×  [        R                  " SU4S
X74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=p‡g s  snf )Nz'| A | B | C |
| --- | --- | --- |
| 1 |rn   ro   rx   r4   rq   ru   rv   r-   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚlen)rr   rs   r~   rv   zassert %(py9)sÚpy9)r   r3   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r1   r”   r­   )
r4   r—   r˜   r™   rš   r›   rW   Ú@py_assert6r¢   Ú@py_format10s
             r'   Ú,test_markdown_to_table_data_pads_ragged_rowsr±   s   s(  € Ü!Ð"MÓN€DØ�=‰=Ð˜AÐ˜AÑ×××Òˆ=×××××Õˆ4×××Ñˆ4××Õˆ=××Ó˜A××××××ÓØ×+Ò+ÓKÒ+�a×/EÑ/EÈÑ/J—Ñ+ÐQÐKŒ3ÐKÓLÐQÐPQÐQÐPQÑQ×Q×Q×QÒQÐL×Q×Q×Q×Q×QÕQŒ3×Q×Q×QÑQŒ3×Q×QÕQÐK×Q×QÓQÐL×Q×QÓQÐPQ×Q×Q×Q×Q×Q×QÖQùÒKs   Ã1HÄHc                 óÞ  • [        S5      n / oR                  nSo2U:H  oDoT(       a  U R                  n/ ovU:H  oˆnU(       G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-  o¡R                  U
5        U(       a¬  [        R                  " SW4S	WW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-  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‡g )NrY   r   ro   )z0%(py4)s
{%(py4)s = %(py2)s.num_rows
} == %(py7)sr4   )rs   r~   rv   z%(py9)sr®   )z7%(py13)s
{%(py13)s = %(py11)s.table_cells
} == %(py16)s)r…   Úpy13r‡   z%(py18)sÚpy18zassert %(py21)sÚpy21)r   r2   r1   rŠ   r‹   rŒ   r�   rŽ   r�   rM   r–   r�   r‘   )r4   r—   r™   r¯   r¢   r�   r¥   Ú@py_assert15Ú@py_assert14r›   r°   r¨   Ú@py_format19rª   Ú@py_format22s                  r'   Ú!test_markdown_to_table_data_emptyrº   y   sþ   € Ü! "Ó%€DÙ8�=‰=Ð8˜AÐ8˜AÑ×8 $×"2Ñ"2Ð8°bÐ8°bÑ"8×8×8×8Õ8ˆ=×8×8×8×8×8Õ8ˆ4×8×8×8Ñ8ˆ4×8×8Õ8ˆ=×8×8Ó8˜A×8×8×8×8×8×8×8Ò8Ð"2°b×8×8×8×8×8Õ8 $×8×8×8Ñ8 $×8×8Õ8Ð"2×8×8Ó8°b×8×8×8×8×8×8×8×8×8×8×8×8×8×8r)   c                 óº  • Sn [        U S4/S9n[        U 5      /n[        X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      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=n=pTg )N©r@   r@   r?   gš™™™™™Ù?Únative©rP   Úreplacero   ©z9%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} == %(py8)srl   rg   ©rr   r}   rƒ   rt   r„   úassert %(py10)sÚpy10©rX   rb   rl   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   ©r"   rg   rž   r˜   Ú@py_assert7r¯   r¦   Ú@py_format11s           r'   Útest_match_replace_one_to_onerÈ   �   sÂ   € Ø
€CÜ  h Ð0Ñ1€EÜ  ›I˜;Ð4Œ8�EÓ'Ð4¨9Ð4¨9Ñ4×4×4×4Ó4Ð'×4×4×4×4×4Õ4Œ8×4×4×4Ñ4Œ8×4×4×4×4×4Ö4�E×4×4×4Ñ4�E×4×4Õ4˜;×4×4Ó4Ð'×4×4Ó4¨9×4×4×4×4×4×4Ö4r)   c            	     óâ  • [        S/S9n [        S5      /nSn[        XUS9nSoCU:H  oU(       Gd7  [        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      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=pTg )N©r¼   r½   r¾   ©r@   g333333ã?r?   r?   r   ©ri   Údocling_missro   )zK%(py7)s
{%(py7)s = %(py0)s(%(py1)s, %(py3)s, som_idx=%(py5)s)
} == %(py10)srl   rg   )rr   r}   rƒ   rt   rv   rÃ   zassert %(py12)sÚpy12rÄ   )rg   rž   r˜   r¯   Ú@py_assert9Ú@py_assert8rÇ   Ú@py_format13s           r'   Útest_match_docling_missrÒ   ‡   sÓ   € ÜÐ @ÐAÑB€Eä Ð!5Ó6Ð7ÐUÀÐUŒ8�EÀÑCÐUÀ~ÐUÀ~ÑU×U×U×UÓUÐC×U×U×U×U×UÕUŒ8×U×U×UÑUŒ8×U×U×U×U×UÖU�E×U×U×UÑU�E×U×UÕUÐ7×U×UÓUÀ×U×UÓUÐC×U×UÓUÀ~×U×U×U×U×U×U×UÐUr)   c                 óì  • Sn [        U S/4/S9n[        U[        U 5      /5      nUS   o3R                  nSoTU:H  of(       d„  [        R
                  " SU4SXE4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=peUS   o3R                  nS/oTU:H  of(       d„  [        R
                  " SU4SXE4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=peg )Nr¼   Ú	bar_chart)rQ   r   Úchartro   )z,%(py3)s
{%(py3)s = %(py1)s.kind
} == %(py6)s)r}   rƒ   r€   zassert %(py8)sr„   )z7%(py3)s
{%(py3)s = %(py1)s.picture_classes
} == %(py6)s)
rX   r   rb   re   rŠ   r‹   r�   r�   r‘   Úpicture_classes)	r"   rg   rj   r�   rž   r¢   r˜   r    r¦   s	            r'   Útest_match_chart_over_picturer×   �   sñ   € Ø
€CÜ 3¨¨Ð"6Ð!7Ñ8€EÜ˜5¤4¨£9 +Ó.€GØ�1‰:Ð%�?‰?Ð%˜gÐ%˜gÑ%×%×%×%Ò%ˆ?×%×%Ô%ˆ:×%×%Ó%ˆ?×%×%Ó%˜g×%×%×%×%×%×%Õ%Ø�1‰:Ð6×%Ñ%Ð6¨+¨Ð6¨Ñ6×6×6×6Ò6Ð%×6×6Ô6ˆ:×6×6Ó6Ð%×6×6Ó6¨×6×6×6×6×6×6Ö6r)   c                 óº  • Sn [        U S4/S9n[        U SSS9/n[        X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      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pTg )Nr¼   r7   r¾   rY   r8   )r[   ra   Úimage_tablero   rÀ   rl   rg   rÁ   rÂ   rÃ   rÄ   rÅ   s           r'   Ú$test_match_image_table_no_text_layerrÚ   •   sÈ   € Ø
€CÜ  e ˜~Ñ.€Eä  ¨r¸CÑ@ÐAÐSŒ8�EÓBÐSÀmÐSÀmÑS×S×S×SÓSÐB×S×S×S×S×SÕSŒ8×S×S×SÑSŒ8×S×S×S×S×SÖS�E×S×S×SÑS�E×S×SÕSÐA×S×SÓSÐB×S×SÓSÀm×S×S×S×S×S×SÖSr)   c            	     óf  • Sn [        U S4/S9n[        S5      [        S5      /nSn[        XUS9nSoTU:H  of(       Gdm  [        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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=peg )N©r@   r@   r?   g      à?r½   r¾   ©r@   g¸…ëQ¸¾?r?   gìQ¸…ëÑ?©r@   g{®GázÔ?r?   g¸…ëQ¸Þ?r   rÌ   Údocling_undercountro   )zJ%(py6)s
{%(py6)s = %(py0)s(%(py1)s, %(py2)s, som_idx=%(py4)s)
} == %(py9)srl   rg   rh   )rr   r}   rs   r~   r€   r®   zassert %(py11)sr…   rÄ   )	Úregionrg   rh   r™   r¢   rÐ   rÆ   r°   Ú@py_format12s	            r'   Útest_match_docling_undercountrâ   œ   sú   € Ø!€FÜ ¨Ð 2Ð3Ñ4€EäÐ'Ó(¬$Ð/EÓ*FÐG€DØ)*ÐCŒ8�E¨Ñ+ÐCÐ/CÐCÐ/CÑC×C×C×CÓCÐ+×C×C×C×C×CÕCŒ8×C×C×CÑCŒ8×C×C×C×C×CÖC�E×C×C×CÑC�E×C×C×C×C×CÖC˜4×C×C×CÑC˜4×C×CÕC¨×C×CÓCÐ+×C×CÓCÐ/C×C×C×C×C×C×CÖCr)   c                 ó¸  • Sn [        SS/S9n[        U 5      /n[        X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      [        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pTg )NrÜ   )rÝ   r½   )rÞ   r½   r¾   Ú
som_mergedro   rÀ   rl   rg   rÁ   rÂ   rÃ   rÄ   )Úbigrg   rž   r˜   rÆ   r¯   r¦   rÇ   s           r'   Útest_match_som_mergedræ   ¤   sÂ   € Ø
€CÜÐ BÐDfÐgÑh€Eä  ›I˜;Ð7Œ8�EÓ'Ð7¨<Ð7¨<Ñ7×7×7×7Ó7Ð'×7×7×7×7×7Õ7Œ8×7×7×7Ñ7Œ8×7×7×7×7×7Ö7�E×7×7×7Ñ7�E×7×7Õ7˜;×7×7Ó7Ð'×7×7Ó7¨<×7×7×7×7×7×7Ö7r)   c                 óz  • Sn [        U S4/S9n[        U/ 5      nU Vs/ s H  o3R                  PM     nnS/oTU:H  of(       do  [        R                  " SU4SXE45      [        R
                  " U5      [        R
                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=peg s  snf )
Nr¼   r½   r¾   Úsom_missro   r{   r|   r   r€   )rX   r   re   rŠ   r‹   r�   r�   r‘   )	r"   rg   rj   rk   r�   r™   rž   rŸ   r    s	            r'   Útest_match_som_miss_reportedré   «   s…   € Ø
€CÜ  h Ð0Ñ1€EÜ˜5 "Ó%€GÙ#Ó$šG�q�FŒF™GÐ4Ð$¨¨Ð4¨Ñ4×4×4×4Ò4Ð$×4×4Ô4Ð$×4×4Ó4¨×4×4×4×4×4×4Ô4ùÒ$s   ŸB8c                 ó
  • Sn [        U S4/S9n[        U 5      /n[        X5      nS[        [        40n[        UR                  X#U5      u  pV/ ovU:H  oˆ(       d¥  [        R                  " SU4SXg4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R                  R                  S   o»R                   owR"                  nSoÜU:H  oî(       d™  [        R                  " SU4SXÍ4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=píUR                  S   o»R                   owR"                  nSoÜU:H  oî(       d™  [        R                  " SU4SXÍ4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=píUR                  S   o»R                   owR$                  nSoÜU:H  oî(       d™  [        R                  " SU4SXÍ4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=píg )Nr¼   r½   r¾   r-   ro   ©z%(py0)s == %(py3)sÚerrors©rr   rƒ   úassert %(py5)srt   r   )zJ%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.data
}.num_rows
} == %(py8)s)r}   rƒ   rt   r„   rÂ   rÃ   rn   rw   )zJ%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.data
}.num_cols
} == %(py8)s)rX   rb   r   r   r    r   rH   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   rP   r4   r2   r3   )r"   rg   rh   rj   Ú	page_dimsÚunifiedrì   rž   r—   Ú@py_format4rš   r�   r˜   rÆ   r¯   r¦   rÇ   s                    r'   Ú6test_graft_replace_rebuilds_body_and_keeps_source_purerò   µ   s-  € Ø
€CÜ  h Ð0Ñ1€EÜ�‹Iˆ;€DÜ˜5Ó'€GØ”VœVÐ$Ð%€Iä,¨U¯^©^¸TÈIÓV�O€GØÐ�R‰<×××Òˆ6×××××Õˆ6×××Ñˆ6××Õ�R××××××Ñà�>‰>× Ñ  Ñ#Ð6×(Ñ(Ð6×1Ñ1Ð6°QÐ6°QÑ6×6×6×6Ò6Ð1×6×6Ô6Ð#×6×6Ó6Ð(×6×6Ó6Ð1×6×6Ó6°Q×6×6×6×6×6×6×6à�>‰>˜!ÑÐ/×!Ñ!Ð/×*Ñ*Ð/¨aÐ/¨aÑ/×/×/×/Ò/Ð*×/×/Ô/Ð×/×/Ó/Ð!×/×/Ó/Ð*×/×/Ó/¨a×/×/×/×/×/×/×/Ø�>‰>˜!ÑÐ/×!Ñ!Ð/×*Ñ*Ð/¨aÐ/¨aÑ/×/×/×/Ò/Ð*×/×/Ô/Ð×/×/Ó/Ð!×/×/Ó/Ð*×/×/Ó/¨a×/×/×/×/×/×/×/Ð/r)   c                 ó®  • Sn [        U S4/S9n[        U 5      [        S5      /n[        X5      n[        UR                  X#S[
        [        405      u  pE/ oeU:H  ow(       d¥  [        R                  " SU4SXV4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 =pvUR                  n[!        U5      n
SoºU:H  oÌ(       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      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n
=pËg )Nr¼   r½   r¾   rË   r-   ro   rë   rì   rí   rî   rt   rw   ©zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.tables
})
} == %(py8)sr­   rð   rÁ   rÂ   rÃ   )rX   rb   r   r   rH   r   r    rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   rP   r­   )Úmatchedrg   rh   rj   rð   rì   rž   r—   rñ   rš   r˜   rÆ   r¯   r¦   rÇ   s                  r'   Ú#test_graft_insert_adds_missed_tablerö   Å   s[  € Ø"€GÜ ¨(Ð 3Ð4Ñ5€Eô �‹Mœ4Ð 4Ó5Ð6€DÜ˜5Ó'€GÜ,¨U¯^©^¸TÈQÔQWÔY_ÐP`ÐLaÓb�O€GØÐ�R‰<×××Òˆ6×××××Õˆ6×××Ñˆ6××Õ�R××××××ÑØ�~‰~Ð#Œ3ˆ~ÓÐ# !Ð# !Ñ#×#×#×#Ó#Ð×#×#×#×#×#Õ#Œ3×#×#×#Ñ#Œ3×#×#×#×#×#Ö#ˆw×#×#×#Ñ#ˆw×#×#Õ#ˆ~×#×#Ó#Ð×#×#Ó# !×#×#×#×#×#×#Ö#r)   c                 óª  • [        S/S9n [        SSSSS9/n[        X5      n[        U R                  XS[
        [        405      u  p4UR                  n[        U5      nSovU:H  oˆ(       Gd"  [        R                  " S	U4S
Xg4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      [        R                  " U5      S.-  n	SSU	0-  n
[        [        R                   " U
5      5      eS =n=n=p‡S 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Ë   rY   r8   ú
Lost table)r[   ra   r_   r-   ro   rô   r­   rð   rÁ   rÂ   rÃ   c              3  ó,   #   • U  H
  nS U;   v •  M     g7f)rø   N© ©Ú.0Úes     r'   Ú	<genexpr>Ú;test_graft_insert_empty_body_is_surfaced.<locals>.<genexpr>×   s   é € Ð1ª& Qˆ|˜qÖ ª&ùó   ‚ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©rr   rs   r~   )rX   rb   r   r   rH   r   r    rP   r­   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r  )rg   rh   rj   rð   rì   rž   r˜   rÆ   r¯   r¦   rÇ   r—   r™   rŸ   s                 r'   Ú(test_graft_insert_empty_body_is_surfacedr  Ñ   s[  € ÜÐ @ÐAÑB€EÜÐ%°¸SÈÑUÐV€DÜ˜5Ó'€GÜ,¨U¯^©^¸TÈQÔQWÔY_ÐP`ÐLaÓb�O€GØ�~‰~Ð#Œ3ˆ~ÓÐ# !Ð# !Ñ#×#×#×#Ó#Ð×#×#×#×#×#Õ#Œ3×#×#×#Ñ#Œ3×#×#×#×#×#Ö#ˆw×#×#×#Ñ#ˆw×#×#Õ#ˆ~×#×#Ó#Ð×#×#Ó# !×#×#×#×#×#×#Õ#Ù1©&Ó1Ð1Œ3Ð1Ó1Ð1Õ1×1×1×1×1×1Ñ1Œ3×1×1×1Ñ1Œ3×1×1Õ1Ð1×1×1Ó1Ð1×1×1×1×1×1Ó1r)   c                 óœ  • Sn [        U S4/S9n[        U/ 5      n[        UR                  / US[        [
        405      u  p4UR                  n[        U5      nSovU:H  oˆ(       Gd"  [        R                  " SU4SXg4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      [        R                  " U5      S	.-  n	S
SU	0-  n
[        [        R                  " U
5      5      eS =n=n=p‡S 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-   ro   rô   r­   rð   rÁ   rÂ   rÃ   c              3  ó,   #   • U  H
  nS U;   v •  M     g7f)zno SoM matchNrú   rû   s     r'   rþ   Ú8test_graft_som_miss_surfaced_as_error.<locals>.<genexpr>à   s   é € Ð3ªF qˆ~ Ö"ªFùr   r  r  r  )rX   r   r   rH   r   r    rP   r­   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r  )r"   rg   rj   rð   rì   rž   r˜   rÆ   r¯   r¦   rÇ   r—   r™   rŸ   s                 r'   Ú%test_graft_som_miss_surfaced_as_errorr  Ú   sR  € Ø
€CÜ  h Ð0Ñ1€EÜ˜5 "Ó%€GÜ,¨U¯^©^¸RÀÈ1ÌvÔW]ÐN^ÐJ_Ó`�O€GØ�~‰~Ð#Œ3ˆ~ÓÐ# !Ð# !Ñ#×#×#×#Ó#Ð×#×#×#×#×#Õ#Œ3×#×#×#Ñ#Œ3×#×#×#×#×#Ö#ˆw×#×#×#Ñ#ˆw×#×#Õ#ˆ~×#×#Ó#Ð×#×#Ó# !×#×#×#×#×#×#Õ#Ù3©FÓ3Ð3Œ3Ð3Ó3Ð3Õ3×3×3×3×3×3Ñ3Œ3×3×3×3Ñ3Œ3×3×3Õ3Ð3×3×3Ó3Ð3×3×3×3×3×3Ó3r)   )r"   ÚNormBoxÚreturnr	   )rú   rú   )rP   z;Sequence[Tuple[NormBox, Literal['native', 'ocr', 'empty']]]rQ   z#Sequence[Tuple[NormBox, List[str]]]r
  r   )
r"   r	  r[   Ústrra   Úfloatr_   r  r
  r   )N)rg   r   rh   zList[ExtractedTable]ri   zOptional[int]r
  r  )9Ú__doc__Ú
__future__r   ÚbuiltinsrŒ   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterŠ   Útypingr   r   r   r   r   Údocling_core.types.doc.baser	   r
   Údocling_core.types.doc.documentr   r   r   r   r   Úquber.core.extractors.baser   Úquber.core.parsers.resultr   r   r   Úquber.core.reconciler   r   r   r   r    r  r	  r‰   r(   rX   rb   rl   r«   r±   rº   rÈ   rÒ   r×   rÚ   râ   ræ   ré   rò   rö   r  r  rú   r)   r'   Ú<module>r     sê   ðñõ #ç  „ × ;Õ ;ç @÷õ õ 6ß MÑ Mß ]Ñ ]à�€ˆØ
��u˜e UÐ*Ñ
+€à<€	ôð KMØ46ð$_ØGð$_à1ð$_ð õ$_ðN (1ÀDÐWYö öò7òRò9ò5òVò7òTòDò8ò5ò0ò 	$ò2ó4r)   