§
    îœ£j  ã                  ó:  — d Z ddlmZ ddlZddlZddlmZ ddlZddlm	Z	 ddl
mZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZ ddlmZ  ee¦  «                             ¦   «         j        j        Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&dd„Z'd„ Z(dd„Z)dS )z�Tests for the read-only Content.ggpk extract pipeline.

Live cases read the installed Path of Exile 2 client (Content.ggpk / HashCache.dat).
é    )ÚannotationsN)ÚPath)Úparse_bundle_header)Ú	cell_sizeÚparse_datc64)ÚGgpkFs)Úparse_hashcache)Úhash_bundle_pathÚmurmurhash64a)Úfind_content_ggpkÚfind_hashcache)Úextract©Úsnakec                 óÜ   — d} t          | ¦  «        t          | ¦  «        k    sJ ‚t          | ¦  «        t          | dz   ¦  «        k    sJ ‚t          d¦  «        t          d¦  «        k    sJ ‚d S )Ns   data/baseitemtypes.datc64ó   xzData/BaseItemTypes.datc64údata/baseitemtypes.datc64)r   r
   )Úsamples    ú/C:\Projects\AutoPOE2\tests\test_ggpk_extract.pyÚtest_murmurhash64a_is_stabler      sw   € Ø)€FÝ˜Ñ Ô ¥M°&Ñ$9Ô$9Ò9Ð9Ð9Ð9Ý˜Ñ Ô ¥M°&¸4±-Ñ$@Ô$@Ò@Ð@Ð@Ð@ÝÐ7Ñ8Ô8Õ<LÐMhÑ<iÔ<iÒiÐiÐiÐiÐiÐió    c                 ó„   — t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚t          d¦  «        dk    sJ ‚d S )NÚBaseItemTypesÚbase_item_typesÚ
WorldAreasÚworld_areasÚUniqueStashLayoutÚunique_stash_layoutr   © r   r   Útest_snake_table_namesr        sV   € Ý�Ñ!Ô!Ð%6Ò6Ð6Ð6Ð6Ý�ÑÔ -Ò/Ð/Ð/Ð/ÝÐ$Ñ%Ô%Ð)>Ò>Ð>Ð>Ð>Ð>Ð>r   c                 óÆ   — t          dddœ¦  «        dk    sJ ‚t          dddœ¦  «        dk    sJ ‚t          dddœ¦  «        dk    sJ ‚t          dd	dœ¦  «        dk    sJ ‚d S )
NÚi32F)ÚtypeÚarrayé   Ústringé   Ú
foreignrowé   T)r   r   r   r   Útest_cell_size_datc64_layoutr*   &   sŒ   € Ý˜e¨eÐ4Ð4Ñ5Ô5¸Ò:Ð:Ð:Ð:Ý˜h°Ð7Ð7Ñ8Ô8¸AÒ=Ð=Ð=Ð=Ý˜l°UÐ;Ð;Ñ<Ô<ÀÒBÐBÐBÐBÝ˜e¨dÐ3Ð3Ñ4Ô4¸Ò:Ð:Ð:Ð:Ð:Ð:r   c                 óÀ   — dddddœgdœ} t          j        dd¦  «        t          j        d	d
d¦  «        z   dz   }t          || ¦  «        }d„ |D ¦   «         d
dgk    sJ ‚d S )NÚContractI32ÚValr"   F©Únamer#   r$   ©r/   Úcolumnsú<Ié   z<iié   é   ó   »»»»»»»»c                ó   — g | ]
}|d          ‘ŒS )r-   r   ©Ú.0Úrs     r   ú
<listcomp>z?test_datc64_rowcount_and_bb_marker_contract.<locals>.<listcomp>1   s   € Ð#Ð#Ð#˜ˆAˆeŒHÐ#Ð#Ð#r   ©ÚstructÚpackr   ©ÚschemaÚrawÚrowss      r   Ú+test_datc64_rowcount_and_bb_marker_contractrC   -   s~   € Ø#¸%ÈÐY^Ð1_Ð1_Ð0`ÐaÐa€FÝ
Œ+�d˜AÑ
Ô
¥¤¨U°A°rÑ!:Ô!:Ñ
:¸kÑ
J€CÝ˜˜VÑ$Ô$€DØ#Ð#˜dÐ#Ñ#Ô#¨¨2 wÒ.Ð.Ð.Ð.Ð.Ð.r   c                 óÄ   — dddddœgdœ} t          j        ddd	¦  «        }t          j        d
d¦  «        |z   dz   }t          || ¦  «        }|d         d         g k    sJ ‚d S )NÚArrÚRefsÚrowTr.   r0   z<QQé   l   þ~ý}û{÷w r2   é   r6   r   r<   )r@   Ú	count_relrA   rB   s       r   Ú/test_datc64_null_array_offset_does_not_overflowrK   4   s€   € àØ#¨U¸TÐBÐBÐCðð €Fõ ”˜E 1Ð&8Ñ9Ô9€IÝ
Œ+�d˜AÑ
Ô
 Ñ
*¨kÑ
:€CÝ˜˜VÑ$Ô$€DØ�Œ7�6Œ?˜bÒ Ð Ð Ð Ð Ð r   c                 óà   — dddddœd dddœgdœ} t          j        dd¦  «        t          j        d	d
¦  «        z   dz   }t          || ¦  «        }|d         d         d
k    sJ ‚d|d         vsJ ‚d S )NÚWider-   r"   Fr.   r0   r2   rI   z<ié	   r6   r   Úcol_0r<   r?   s      r   Ú4test_datc64_trims_trailing_schema_wider_than_055_rowrP   ?   sœ   € àà E°EÐ:Ð:Ø 5°5Ð9Ð9ð
ðð €Fõ Œ+�d˜AÑ
Ô
¥¤¨T°1Ñ!5Ô!5Ñ
5¸Ñ
E€CÝ˜˜VÑ$Ô$€DØ�Œ7�5Œ>˜QÒÐÐÐØ˜$˜qœ'Ð!Ð!Ð!Ð!Ð!Ð!r   c                 óž  — t          ¦   «         } | €t          j        d¦  «         t          | ¦  «        }|                      ¦   «         j        dk    sJ ‚t          |¦  «        dk    sJ ‚d„ |D ¦   «         }t          d„ |D ¦   «         ¦  «        sJ ‚t          d„ |D ¦   «         ¦  «        }|j	        dv sJ ‚t          |j
        ¦  «        dk    sJ ‚d S )	NzHashCache.dat not installedi  é!   c                óD   — h | ]}|j                              d d¦  «        ’ŒS )ú\ú/)r/   Úreplacer8   s     r   ú	<setcomp>z2test_hashcache_live_client_file.<locals>.<setcomp>T   s(   € Ð5Ð5Ð5¨1ˆQŒV�^Š^˜D #Ñ&Ô&Ð5Ð5Ð5r   c              3  óL   K  — | ]}|                      d ¦  «        p|d k    V — Œ dS ©zPathOfExile.exeN)Úendswith)r9   Úns     r   ú	<genexpr>z2test_hashcache_live_client_file.<locals>.<genexpr>U   s:   è è € ÐVÐVÈ1ˆq�zŠzÐ+Ñ,Ô,ÐF°Ð5FÒ0FÐVÐVÐVÐVÐVÐVr   c              3  ód   K  — | ]+}|j                              d ¦  «        s|j         d k    ¯'|V — Œ,dS rY   )r/   rZ   r8   s     r   r\   z2test_hashcache_live_client_file.<locals>.<genexpr>V   sC   è è € ÐdÐd�Q !¤&§/¢/Ð2CÑ"DÔ"DÐdÈÌÐRcÒHcÐHcˆqÐHcÐHcÐHcÐHcÐdÐdr   )iX«iX%«é    )r   ÚpytestÚskipr	   ÚstatÚst_sizeÚlenÚanyÚnextÚsizeÚsha256)ÚhcÚrecsÚnamesÚexes       r   Útest_hashcache_live_client_filerl   M   så   € Ý	Ñ	Ô	€BØ	€zÝŒÐ1Ñ2Ô2Ð2Ý˜2ÑÔ€DØ�7Š7‰9Œ9Ô Ò$Ð$Ð$Ð$Ýˆt‰9Œ9˜Š?ˆ?ˆ?ˆ?Ø5Ð5°Ð5Ñ5Ô5€EÝÐVÐVÐPUÐVÑVÔVÑVÔVÐVÐVÐVÝ
ÐdÐd˜$ÐdÑdÔdÑ
dÔ
d€CØŒ8Ð+Ð+Ð+Ð+Ð+ÝˆsŒz‰?Œ?˜bÒ Ð Ð Ð Ð Ð r   c                 óV  — t          ¦   «         } | €t          j        d¦  «         |                      ¦   «         j        dk    sJ ‚t          | ¦  «        5 }d„ |                     |j        ¦  «        D ¦   «         }|                     d¦  «        dk    sJ ‚d|v sJ ‚| 	                    d¦  «        }| 	                    d¦  «        }|�|€J ‚t          |                     |d	¦  «        ¦  «        }t          |                     |d	¦  «        ¦  «        }|j        d
v sJ ‚|j        dv sJ ‚|                     |d¦  «        sJ ‚|                     ||j        dz   ¦  «        }||j        |j        dz   …         dk    sJ ‚|j        dv sJ ‚|j        dk    sJ ‚	 d d d ¦  «         d S # 1 swxY w Y   d S )NúContent.ggpk not installedì   û17g– c                ó   — g | ]	}|j         ‘Œ
S r   )r/   )r9   Úes     r   r;   z:test_ggpk_root_and_bundle_headers_live.<locals>.<listcomp>a   s   € ÐFÐFÐF˜A�”ÐFÐFÐFr   ÚBundles2rI   zgateway_list.txtúBundles2/_.index.binú$Bundles2/Folders/data.dat.bundle.bini  ©i¦pãi¶Qä)i9  i:  r3   s   Œ)i‚“ iâ›“ é%   )r   r_   r`   ra   rb   r   Úiter_dir_childrenÚroot_offsetÚcountÚfindr   Úread_payload_prefixÚuncompressed_sizeÚblock_countÚpayload_offset)ÚggpkÚfsrj   ÚindexÚdataÚihÚdhÚpayloads           r   Ú&test_ggpk_root_and_bundle_headers_liver†   [   s  € ÝÑÔ€DØ€|ÝŒÐ0Ñ1Ô1Ð1Ø�9Š9‰;Œ;Ô /Ò1Ð1Ð1Ð1Ý	�‰Œð $˜ØFÐF ×!5Ò!5°b´nÑ!EÔ!EÐFÑFÔFˆØ�{Š{˜:Ñ&Ô&¨!Ò+Ð+Ð+Ð+Ø! UÐ*Ð*Ð*Ð*Ø—’Ð.Ñ/Ô/ˆØ�wŠwÐ=Ñ>Ô>ˆØÐ  TÐ%5Ð%5Ð5Ý  ×!7Ò!7¸¸yÑ!IÔ!IÑJÔJˆÝ  ×!7Ò!7¸¸iÑ!HÔ!HÑIÔIˆØÔ#Ð'AÐAÐAÐAÐAØŒ~ Ð+Ð+Ð+Ð+Ø×%Ò% e¨QÑ/Ô/Ð/Ð/Ð/Ø×(Ò(¨°Ô0AÀAÑ0EÑFÔFˆØ�rÔ(¨2Ô+<¸qÑ+@Ð@ÔAÀ[ÒPÐPÐPÐPØÔ#Ð'=Ð=Ð=Ð=Ð=ØŒ~ Ò#Ð#Ð#Ð#Ð#ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $s   ÁD=FÆF"Æ%F"Útmp_pathr   c                ó¶  — t          ¦   «         }|€t          j        d¦  «         | dz  }t          dz  dz  dz  }t	          |||dd„ ¬¦  «        }|d	         d
k    sJ ‚|d         dk    sJ ‚t          j        t          |¦  «        ¦  «        }|                     d¦  «         	                    ¦   «         d         }||d         k    sJ ‚|                     dd¦  «         	                    ¦   «         }|�
|d         dv sJ ‚t          |                     d¦  «        ¦  «        }|d         t          d¦  «        k    sJ ‚t          |d         ¦  «        dv sJ ‚|                     d¦  «         	                    ¦   «         d         }	|	dk    sJ ‚t          dz  dz  dz                       ¦   «         r|                     d¦  «        dk    sJ ‚|                     ¦   «          d S )Nrn   zpoe2_ggpk.dbÚassetsÚ	game_datazschema.min.jsonTc                 ó   — d S )Nr   )Ú_aÚ_ks     r   ú<lambda>z4test_catalog_extract_writes_sqlite.<locals>.<lambda>}   s   € ˜d€ r   )Ú	ggpk_pathÚdb_pathÚschema_pathÚcatalog_onlyÚlogÚstatuszcatalog-onlyÚggpk_recordsé
   zSELECT COUNT(*) FROM ggpk_filesr   z/SELECT data_size FROM ggpk_files WHERE path = ?)rs   )iàÚi“šÚz#SELECT key, value FROM extract_metaÚ	ggpk_sizero   Úindex_uncompressedru   z$SELECT COUNT(*) FROM hashcache_filesrR   Úschema_versionÚ7)r   r_   r`   ÚREPOr   Úsqlite3ÚconnectÚstrÚexecuteÚfetchoneÚdictÚintÚis_fileÚgetÚclose)
r‡   r   r�   r‘   ÚstatsÚconnr[   rG   ÚmetaÚhc_ns
             r   Ú"test_catalog_extract_writes_sqliterª   r   sÿ  € ÝÑÔ€DØ€|ÝŒÐ0Ñ1Ô1Ð1Ø˜Ñ'€GÝ˜‘/ KÑ/Ð2CÑC€KÝØØØØØ"Ð"ðñ ô €Eð �Œ?˜nÒ,Ð,Ð,Ð,Ø�Ô  BÒ&Ð&Ð&Ð&ÝŒ?�3˜w™<œ<Ñ(Ô(€DØ�ŠÐ6Ñ7Ô7×@Ò@ÑBÔBÀ1ÔE€AØ��nÔ%Ò%Ð%Ð%Ð%Ø
�,Š,Ø9Ø!ñô ÷ ‚h�j„jð ð ˆ?˜s 1œvÐ)CÐCÐCÐCÐCÝ�—’ÐBÑCÔCÑDÔD€DØ�Ô¥ OÑ 4Ô 4Ò4Ð4Ð4Ð4ÝˆtÐ(Ô)Ñ*Ô*Ð.HÐHÐHÐHÐHØ�<Š<Ð>Ñ?Ô?×HÒHÑJÔJÈ1ÔM€DØ�2Š:ˆ:ˆ:ˆ:Ýˆx‰˜+Ñ%Ð(9Ñ9×BÒBÑDÔDð 1Ø�xŠxÐ(Ñ)Ô)¨SÒ0Ð0Ð0Ð0Ø‡J‚J�L„L€L€L€Lr   c            
     ó<  — ddl m}  ddlm}  | dddddd¦  «         | dd	dddd
¦  «         | dddddd
¦  «        g} ||d¦  «        }d„ |D ¦   «         ddgk    sJ ‚ddlm} ddlm}  |ddddddd¬¦  «        } ||gd
¦  «        |u sJ ‚ ||gd¦  «        |u sJ ‚d S )Nr   )ÚLogicalFile)Úselect_canonical_dat_filesz french/data/baseitemtypes.datc64rI   r–   Úfrr   r3   r‚   zdata/tags.datc64rH   )r   ÚTagsc                ó   — g | ]	}|j         ‘Œ
S r   )Úpath)r9   Úfs     r   r;   z=test_select_canonical_prefers_data_datc64.<locals>.<listcomp>�   s   € Ð#Ð#Ð#�qˆAŒFÐ#Ð#Ð#r   )Ú	GgpkEntry)Úfind_bundle_entryzdata.dat.bundle.binÚFILEr   rt   éd   )r/   ÚtagÚoffsetÚrecord_lengthrg   r±   Ú	data_sizez	Data/data)Ú)src.assistant_tool.ggpk_extract.index_binr¬   Ú(src.assistant_tool.ggpk_extract.pipeliner­   Ú'src.assistant_tool.ggpk_extract.ggpk_fsr³   r´   )r¬   r­   ÚfilesÚpickedr³   r´   Úentrys          r   Ú)test_select_canonical_prefers_data_datc64rÁ   “   sI  € ØEÐEÐEÐEÐEÐEØSÐSÐSÐSÐSÐSð 	ˆÐ6¸¸1¸aÀÀTÑJÔJØˆÐ/°°A°q¸"¸fÑEÔEØˆÐ&¨¨1¨a°°VÑ<Ô<ð€Eð
 (Ð'¨Ð/HÑIÔI€FØ#Ð#˜FÐ#Ñ#Ô#Ð(CÐEWÐ'XÒXÐXÐXÐXØAÐAÐAÐAÐAÐAØJÐJÐJÐJÐJÐJàˆIØ"ØØØØØ3Øðñ ô €Eð Ð˜e˜W fÑ-Ô-°Ð6Ð6Ð6Ð6ØÐ˜e˜W kÑ2Ô2°eÐ;Ð;Ð;Ð;Ð;Ð;r   c                ó6  — ddl m}m}m}m} | dz  } ||¦  «        } ||¦  «          ||ddddœg¦  «          ||ddddd	œg¦  «          ||¦  «         |                     d
¦  «                             ¦   «         }|dk    sJ ‚|                     ¦   «          d S )Nr   )r�   Úinit_catalog_schemaÚwrite_dat_tableÚwrite_projectionszproj.dbÚWordsÚ
Headhunter)Ú_rowÚTextr   r4   )rÈ   ÚWordsKeyÚItemVisualIdentityKeyz'SELECT id, name, base_item FROM uniques)Ú0rÇ   Ú )Ú-src.assistant_tool.ggpk_extract.sqlite_exportr�   rÃ   rÄ   rÅ   rŸ   r    r¥   )r‡   r�   rÃ   rÄ   rÅ   r�   r§   rG   s           r   Ú&test_unique_projection_joins_words_keyrÏ   ®   s  € ðð ð ð ð ð ð ð ð ð ð ð ð ˜Ñ"€GØˆ7�7ÑÔ€DØÐ˜ÑÔÐØ€O�D˜'¨Q¸Ð$EÐ$EÐ#FÑGÔGÐGØ€OØØØ ¸QÐ	?Ð	?Ð@ñô ð ð
 Ð�dÑÔÐØ
�,Š,Ð@Ñ
AÔ
A×
JÒ
JÑ
LÔ
L€CØÐ)Ò)Ð)Ð)Ð)Ø‡J‚J�L„L€L€L€Lr   )r‡   r   )*Ú__doc__Ú
__future__r   rœ   r=   Úpathlibr   r_   Ú&src.assistant_tool.ggpk_extract.bundler   Ú&src.assistant_tool.ggpk_extract.datc64r   r   r½   r   Ú)src.assistant_tool.ggpk_extract.hashcacher	   Ú&src.assistant_tool.ggpk_extract.murmurr
   r   Ú%src.assistant_tool.ggpk_extract.pathsr   r   r¼   r   rÎ   r   Ú__file__ÚresolveÚparentr›   r   r    r*   rC   rK   rP   rl   r†   rª   rÁ   rÏ   r   r   r   ú<module>rÛ      sÎ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð à €€€à FÐ FÐ FÐ FÐ FÐ FØ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ :Ð :Ð :Ð :Ð :Ð :Ø EÐ EÐ EÐ EÐ EÐ EØ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SØ <Ð <Ð <Ð <Ð <Ð <Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?à€tˆH�~„~×ÒÑÔÔ&Ô-€ðjð jð jð?ð ?ð ?ð;ð ;ð ;ð/ð /ð /ð!ð !ð !ð"ð "ð "ð!ð !ð !ð$ð $ð $ð.ð ð ð ðB<ð <ð <ð6ð ð ð ð ð r   