ó
    9°Mjñ  ã                  ó¤   • S r SSKJr  SSKrSSKJs  Jr  SSK	J
r
  SSKJr  \
 " S S5      5       rSS jrS	 rS
 rS rS rS rSSKJr  S rS rg)aH  Unit tests for the Camelot acquisition helpers.

`cells_to_boxes` aligns Camelot's per-cell geometry to the text grid's shape.
These tests exercise the alignment/clamping logic directly with lightweight
stand-in cell objects; the end-to-end population from a real PDF is covered by
running `camelot_worker` on sample documents.
é    )ÚannotationsN)Ú	dataclass)Úcells_to_boxesc                  ó>   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   Srg)	ÚFakeCellé   ÚfloatÚx1Úy1Úx2Úy2© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r   ó    Ú9/home/mande/repo/quber/tests/core/test_camelot_acquire.pyr   r      s   ‡ àƒIØƒIØƒIØ†Ir   r   c                ó.   • [        X S-   U S-   U S-   5      $ )Né   é   é   )r   )Úvs    r   Ú_cellr      s   € ä�A˜1‘u˜a !™e Q¨¡UÓ+Ð+r   c                 óì  • SS/SS//n [        S5      [        S5      /[        S5      [        S5      //n[        X5      nU Vs/ s H  n[        U5      /PM     nnS	/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=peUS   S   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=peUS   S   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 )NÚaÚbÚcÚdr   é
   é   é   r   ©ú==©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6©ç        g      ð?g       @g      @r   )g      >@g      ?@g      @@g     €@@)r   r   ÚlenÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanation)	ÚgridÚrawÚboxesÚrÚ@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7s	            r   Útest_boxes_align_one_to_oner>      sW  € Ø�#ˆJ˜˜c˜
Ð#€DÜ�!‹H”e˜B“iÐ ¤5¨£9¬e°B«iÐ"8Ð
9€CÜ˜3Ó%€EÙ#Ó$še˜ŒS�‹V‹H™eÐ2Ð$¨!¨¨q¨c¨
Ð2¨
Ñ2×2×2×2Ò2Ð$×2×2Ô2Ð$×2×2Ó2¨
×2×2×2×2×2×2Ó2Ø�‰8�A‰;Ð.Ð.Ð.Ð.Ñ.×.×.×.Ò.ˆ;×.×.Ô.ˆ;×.×.Ó.Ð.×.×.×.×.×.×.Ó.Ø�‰8�A‰;Ð2Ð2Ð2Ð2Ñ2×2×2×2Ò2ˆ;×2×2Ô2ˆ;×2×2Ó2Ð2×2×2×2×2×2×2Ô2ùò %s   ÁG1c                 óÔ  • SS//n [        S5      [        S5      [        S5      //n[        X5      nSS//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"   éc   r-   )g      $@g      &@g      (@g      *@r%   ©z%(py0)s == %(py3)sr7   ©Úpy0Úpy3úassert %(py5)sÚpy5©
r   r   r0   r1   Ú@py_builtinsÚlocalsÚ_should_repr_global_namer2   r3   r4   ©r5   r6   r7   r;   Ú@py_assert1Ú@py_format4Ú@py_format6s          r   Ú1test_shape_matches_grid_not_raw_when_raw_is_widerrO   &   s˜   € à�#ˆJˆ<€DÜ�!‹H”e˜B“i¤ r£Ð+Ð
,€CÜ˜3Ó%€EØ*Ð,DÐEÐFÐFÐFÑF×F×F×FÒFˆ5×F×F×F×F×FÕFˆ5×F×F×FÑFˆ5×F×FÕFÐF×F×F×F×F×F×FÒFr   c                 ó¸  • SS/SS//n [        S5      //n[        X5      nSS /S S //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%   rA   r7   rB   rE   rF   rG   rK   s          r   Ú$test_missing_raw_positions_fill_nonerQ   .   s–   € à�#ˆJ˜˜c˜
Ð#€DÜ�!‹Hˆ:ˆ,€CÜ˜3Ó%€EØ*¨DÐ1°D¸$°<Ð@Ð@Ð@Ñ@×@×@×@Ò@ˆ5×@×@×@×@×@Õ@ˆ5×@×@×@Ñ@ˆ5×@×@Õ@Ð@×@×@×@×@×@×@Ò@r   c                 ó”  • / SQ/n [        S U 5      n/ SQ/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 )	N)r   r   r    )NNNr%   rA   r7   rB   rE   rF   )	r   r0   r1   rH   rI   rJ   r2   r3   r4   )r5   r7   r;   rL   rM   rN   s         r   Ú4test_none_raw_cells_yields_all_none_shaped_like_gridrS   6   sv   € ÚÐ€DÜ˜4 Ó&€EÚ'Ð(Ð(Ð(Ñ(×(×(×(Ò(ˆ5×(×(×(×(×(Õ(ˆ5×(×(×(Ñ(ˆ5×(×(Õ(Ð(×(×(×(×(×(×(Ò(r   c                 ó:  • [        S5      //n / n[        X5      n/ o2U:H  oD(       dì  [        R                  " SU4SX#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      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n =n=n=pCg )Nr   r%   )z9%(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py4)s)
} == %(py9)sr   )rC   Úpy2r*   r,   Úpy9zassert %(py11)sÚpy11rG   )rL   r:   Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s          r   Ú"test_empty_grid_yields_empty_boxesr]   <   sŸ   € Ü! !›H˜:˜,Ð1¨Ð1Œ>˜,Ó+Ð1¨rÐ1¨rÑ1×1×1×1Ò1Ð+×1×1×1×1×1Õ1Œ>×1×1×1Ñ1Œ>×1×1Õ1˜,×1×1Ó1¨×1×1Ó1Ð+×1×1Ó1¨r×1×1×1×1×1×1×1Ð1r   )Úgrounded_gridc                 óä  • SS/SS//n SS/S S//nSu  p#[        XX#5      nU VVs/ s H  oU Vs/ s H  ofR                  PM     snPM      nnnXp:H  oˆ(       d¥  [        R                  " S	U4S
Xp4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 =px/ o´S   S   oˆR                  nSoÜU:H  oîo~(       a  US   S   oÿR                  nSnUU:H  nUnU(       Gd4  [        R                  " S	U4SXÍ45      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       aw  [        R                  " S	W4SWW45      [        R                  " W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=nnUS   S   owR                  nS nUUL oÌ(       d…  [        R                  " SU4SUU4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US   S   owR                  nSnUU:H  oÌ(       d…  [        R                  " S	U4S!UU4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g s  snf s  snnf )"NÚRevenuez$10.9z
Net incomez$5.9)r.   ç      Y@g      i@ç     Àr@)g      y@ra   g     À‚@rb   )g     à…@ra   g      Œ@rb   )g     @�@g     @@r%   )z%(py1)s == %(py3)sÚcells)r)   rD   rE   rF   r   r   )çš™™™™™Ù?rd   g333333ã?gš™™™™™é?)z,%(py5)s
{%(py5)s = %(py3)s.text
} == %(py8)s)rD   rF   Úpy8z%(py10)sÚpy10)z/%(py15)s
{%(py15)s = %(py13)s.box
} == %(py18)s)Úpy13Úpy15Úpy18z%(py20)sÚpy20zassert %(py23)sÚpy23)Úis)z+%(py3)s
{%(py3)s = %(py1)s.box
} is %(py6)s)r)   rD   r,   zassert %(py8)sre   )z,%(py3)s
{%(py3)s = %(py1)s.text
} == %(py6)s)r^   Útextr0   r1   r2   rH   rI   rJ   r3   r4   ÚboxÚappendÚ_format_boolop)rc   r7   Úpage_wÚpage_hr5   r8   r    r9   r;   rM   rN   rL   Ú@py_assert4rZ   Ú@py_assert6Ú@py_assert12Ú@py_assert14Ú@py_assert17Ú@py_assert16Ú@py_format9Ú@py_format11Ú@py_format19Ú@py_format21Ú@py_format22Ú@py_format24rX   r=   s                              r   Ú3test_grounded_grid_pairs_text_with_normalized_boxesr   E   sq  € ð ˜Ð! L°&Ð#9Ð:€EØ(Ð*FÐGÈ$ÐPlÐImÐn€EØ"�N€FÜ˜ vÓ6€DÙ)-Ô.ª A˜QÓšQ˜�VŒV™QÔ©Ð7Ò.Ñ7×7×7×7Ò7Ð.×7×7Ô7Ð.×7×7×7×7×7Ô7°%×7×7×7Ñ7°%×7×7×7×7×7×7Ó7áP�‰7�1‰:ÐP�?‰?ÐP˜gÐP˜gÑ%×P¨$¨q©'°!©*ÐP¯.©.ÐPÐ<PÐP¨.Ð<PÑ*P×P×P×PÖPˆ?×P×PÔPˆ:×P×PÓPˆ?×P×PÓP˜g×P×P×P×P×P×P×PÓP¨.Ð<P×P×PÔP¨*×P×PÓP¨.×P×PÓPÐ<P×P×P×P×P×P×P×P×P×P×P×P×P×P×PÔPØ�‰7�1‰:Ð!�>‰>Ð!˜TÐ!ˆ>˜TÐ!×!×!×!Ò!ˆ>˜T×!×!Ô!ˆ:×!×!Ó!ˆ>×!×!Ó!˜T×!×!×!×!×!×!Ö!Ø�‰7�1‰:Ð*�?‰?Ð*˜lÐ*ˆ?˜lÑ*×*×*×*Ò*ˆ?˜l×*×*Ô*ˆ:×*×*Ó*ˆ?×*×*Ó*˜l×*×*×*×*×*×*×*ùò	  ùÓ.s   ¦	O,¯O'ÁO,Ï'O,c                 ón  • / SQ/n [        U / SS5      nU Vs/ s H  n[        U5      PM     nnU  Vs/ s H  n[        U5      PM     nnX4:H  oU(       do  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pTS	 U 5       n[        U5      oD(       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    V	s/ s H  o™R                  PM     nn	/ SQoCU:H  oU(       do  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pTg s  snf s  snf s  sn	f )N)ÚxÚyÚzg      ƒ@g     Àˆ@r%   r'   r(   r+   r,   c              3  óN   #   • U  H  o  H  o"R                   S L v •  M     M     g 7f)N)rn   )Ú.0ÚrowÚcells      r   Ú	<genexpr>Ú=test_grounded_grid_handles_absent_geometry.<locals>.<genexpr>Y   s    é € Ð@ª4 C»C°D�x‰x˜4Õ¹CÑª4ùs   ‚#%z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall)rC   rU   r*   r   )r^   r/   r0   r1   r2   r3   r4   rŠ   rH   rI   rJ   rm   )
rc   r5   r8   r9   r:   r;   r<   r=   rL   r    s
             r   Ú*test_grounded_grid_handles_absent_geometryr‹   S   s_  € ò Ð€EÜ˜  E¨5Ó1€DÙ Ó!šD�qŒC�ŽF™DÐ<Ð!±eÓ%<²e°¤c¨!¦f±eÐ<Ð%<Ð!Ñ<×<×<×<Ò<Ð!×<×<Ô<Ð!×<×<Ó<Ð%<×<×<×<×<×<×<Ó<Ù@©4Ó@Ð@Œ3Ð@Ó@Ð@Õ@×@×@×@×@×@Ñ@Œ3×@×@×@Ñ@Œ3×@×@Õ@Ð@×@×@Ó@Ð@×@×@×@×@×@Ò@Ø  šGÓ$šG�q�FŒF™GÐ7Ð$ªÐ7¨Ñ7×7×7×7Ò7Ð$×7×7Ô7Ð$×7×7Ó7¨×7×7×7×7×7×7Ô7ùò "ùÒ%<ùâ$s   ˜H(³H-ÆH2)r   r	   Úreturnr   )Ú__doc__Ú
__future__r   ÚbuiltinsrH   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter0   Údataclassesr   Ú%quber.core.extractors.camelot.acquirer   r   r   r>   rO   rQ   rS   r]   Úquber.core.extractors.baser^   r   r‹   r   r   r   Ú<module>r–      sb   ðñõ #ç  „ Õ !å @ð ÷ð ó ðô,ò
3òGòAò)ò2õ 5ò+ó8r   