Ë
    ðÆj{  ã                   óT  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlZddlZd#d„Zdeeef   defd„Zej0                  d	„ «       Zd
„ Zej6                  j9                  dg d¢«      d„ «       Zej6                  j9                  dg d¢«      d„ «       Zd„ Zd„ Z ej6                  j9                  dg d¢«      d„ «       Z!ej6                  j9                  dg d¢«      d„ «       Z"ej6                  j9                  dg d¢«      d„ «       Z#d„ Z$d„ Z%d„ Z&d„ Z'd „ Z(d!„ Z)d"„ Z*y)$z-games_town: the town kit in OhMyGames builds.é    N)ÚPath)ÚSimpleNamespacec                 óB   — t        | |dddg t        ||d¬«      ||¬«	      S )NÚ )ÚviewÚsettingÚlook)	ÚtitleÚpitchÚgenreÚ	core_loopÚfirst_versionÚmoodÚworldÚlaneÚstage)ÚN)r
   r   r   r   r   r   s         úJ/home/claude-agent/forge-build/forge-assets/omg/factory/test_games_town.pyÚ_cardr      s.   € Ü�5 ¨R¸2ÈRÐVXÜ˜$¨°bÔ9ÀÈEôSð Só    ÚfilesÚreturnc                 ó†  — t        j                  «       }t        j                  |d¬«      5 }| j	                  «       D ]O  \  }}t        j
                  |«      }t        |«      |_        |j                  |t        j                  |«      «       ŒQ 	 d d d «       |j                  «       S # 1 sw Y   |j                  «       S xY w)Nzw:gz)ÚfileobjÚmode)
ÚioÚBytesIOÚtarfileÚopenÚitemsÚTarInfoÚlenÚsizeÚaddfileÚgetvalue)r   ÚbufÚtfÚnameÚdataÚinfos         r   Ú_tarr+      s’   € Ü
�*‰*‹,€CÜ	�‰˜c¨Ô	/ð /°2ØŸ+™+›-ò 	/‰JˆD�$Ü—?‘? 4Ó(ˆDÜ˜D›	ˆDŒIØ�J‰J�tœRŸZ™Z¨Ó-Õ.ñ	/÷/ð
 �<‰<‹>Ð÷/ð
 �<‰<‹>Ðús   ¬A#B(Â(C c                 óÂ   — | dz  j                  t        dddœ«      «       | dz  j                  t        ddi«      «       | dz  j                  t        d	di«      «       | S )
Nútownkit.tar.gzó   towns	   export {})úTOWN.mdzsettlement.mjsútownkit-medieval.tar.gzútown/kits/medieval/kit.glbs   glbútownkit-breton.tar.gzztown/kits/breton/kit.glb)Úwrite_bytesr+   )Útmp_paths    r   Úassetsr5      sf   € àÐ Ñ ×-Ñ-¬d¸wÐZfÑ3gÓ.hÔiØÐ)Ñ)×6Ñ6´tÐ=YÐ[aÐ<bÓ7cÔdØÐ'Ñ'×4Ñ4´TÐ;UÐW]Ð:^Ó5_Ô`Ø€Or   c                 óŽ  — t        j                  | d   j                  dd«      d   «      }t        j                  t        j                  |«      ¬«      5 }|j                  «       D �ci c]=  }|j                  «       sŒ|j                  |j                  |«      j                  «       “Œ? c}cd d d «       S c c}w # 1 sw Y   y xY w)NÚurlú,é   )r   )Úbase64Ú	b64decodeÚsplitr   r   r   r   Ú
getmembersÚisfiler(   ÚextractfileÚread)Úattr)   r'   Úms       r   Ú_membersrC   &   s˜   € Ü×Ñ˜C ™J×,Ñ,¨S°!Ó4°QÑ7Ó8€DÜ	�‰œbŸj™j¨Ó.Ô	/ð Y°2Ø:<¿-¹-»/ÖX°QÈQÏXÉXÍZ�—‘˜Ÿ™ qÓ)×.Ñ.Ó0Ñ0ÒX÷Yñ YùÚX÷Yð Yús$   ÁB;Á(B6Á>,B6Â*B;Â6B;Â;Cztitle,pitch,kind))zHarvest Hamletz)Run a medieval village through one winterÚmedieval)zKnights of the ReachzKnights hold a castle townrD   )zTavern Talesz1Pour ale in a tavern and keep the blacksmith busyrD   )zKingdom Builderz1A fantasy kingdom with peasants and a feudal lordrD   )zAbbey Ledgerz/Keep the monastery bakery and the cathedral fedrD   )zBreton CoastzA granite village in BrittanyÚbreton)zMorbihan WalkzWalk the lanes of a Breton portrE   )zFishing Villagez%Sail out of a fishing village at dawnrE   c                 ó  — t         j                  }t        | |«      } ||«      }||k(  }|�sÕt        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  | «      rt        j                  | «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}x}}y )N©ú==)zw%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.town_kind
}(%(py7)s
{%(py7)s = %(py3)s(%(py4)s, %(py5)s)
})
} == %(py11)sÚgtr   r
   r   Úkind)Úpy0Úpy2Úpy3Úpy4Úpy5Úpy7Úpy9Úpy11zassert %(py13)sÚpy13©rI   Ú	town_kindr   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)	r
   r   rJ   Ú@py_assert1Ú@py_assert6Ú@py_assert8Ú@py_assert10Ú@py_format12Ú@py_format14s	            r   Ú$test_settlement_words_name_the_stylerd   ,   s  € ô �<‰<Ð4œ˜e UÓ+Ð4‰<Ð+Ó,Ð4Ð,°Ñ4×4×4Ö4Ð,°×4×4×4×4×4Ñ4Œ2×4×4Ó4Œ2×4×4Ô4ˆ<×4×4×4×4×4Ð4œ×4×4Ó4œ×4×4×4×4×4Ò4˜e×4×4Ó4˜e×4×4×4×4×4Ò4 U×4×4Ó4 U×4×4Ô4Ð+×4×4Ò4Ð,×4×4×4×4×4Ð4°×4×4Ó4°×4×4×4×4×4×4×4Ð4r   ztitle,pitch))zStar Piratesz+Dogfight in space with aliens and asteroids)zDowntown Heatz'A crime story in a modern city downtown)zRally Racerz)Drift a rally car around a racing circuit)zKeyboard FootballzScore goals in a soccer league)zKingdom Hearts Fan Gamez"A kingdom hearts style action game)z	Skin Shopz)Sell a market for skins in a fast shooter)zNeon Metropolisz(Sci-fi skyscrapers and a neon metropolis)zCrate Crashz-A puzzle about stacking crates in a warehousec                 óÂ  — t         j                  }t        | |«      } ||«      }d }||u }|�s¨t        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  | «      rt        j                  | «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )
N©Úis)zw%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.town_kind
}(%(py7)s
{%(py7)s = %(py3)s(%(py4)s, %(py5)s)
})
} is %(py12)srI   r   r
   r   )rK   rL   rM   rN   rO   rP   rQ   Úpy12úassert %(py14)sÚpy14rT   )	r
   r   r^   r_   r`   Ú@py_assert11ra   Ú@py_format13Ú@py_format15s	            r   Ú8test_modern_space_sport_and_everyday_words_are_not_townsrn   :   s  € ô �<‰<Ð4œ˜e UÓ+Ð4‰<Ð+Ó,Ð4°Ð4Ð,°Ð4×4×4Ö4Ð,°×4×4×4×4×4Ñ4Œ2×4×4Ó4Œ2×4×4Ô4ˆ<×4×4×4×4×4Ð4œ×4×4Ó4œ×4×4×4×4×4Ò4˜e×4×4Ó4˜e×4×4×4×4×4Ò4 U×4×4Ó4 U×4×4Ô4Ð+×4×4Ò4Ð,×4×4Ò4°×4×4×4×4×4×4×4Ð4r   c                  ó  — t         j                  } d}d}t        ||«      } | |«      }d }||u }|�sNt        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x} x}x}x}x}x}}y )
NzAlien Villagezan alien village in spacerf   )zy%(py11)s
{%(py11)s = %(py2)s
{%(py2)s = %(py0)s.town_kind
}(%(py9)s
{%(py9)s = %(py3)s(%(py5)s, %(py7)s)
})
} is %(py14)srI   r   )rK   rL   rM   rO   rP   rQ   rR   rj   zassert %(py16)sÚpy16rT   )	r^   Ú@py_assert4r_   r`   ra   Ú@py_assert13Ú@py_assert12rm   Ú@py_format17s	            r   Ú%test_space_wins_over_settlement_wordsru   H   sé   € Ü�<‰<ÐT˜oÐTÐ/JÐTœ˜oÐ/JÓKÐT‰<ÐKÓLÐTÐPTÐTÐLÐPTÐT×T×TÖTÐLÐPT×T×T×T×T×TÑTŒ2×T×TÓTŒ2×T×TÔTˆ<×T×T×T×T×TÐTœ×T×TÓTœ×T×TÔT˜o×T×TÒTÐ/J×T×TÒTÐK×T×TÒTÐL×T×TÒTÐPT×T×T×T×T×T×T×TÔTr   c                  óR  — t         j                  } d}d}t        ||«      }d} | ||«      }d}||k(  }|�sbt        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	œ	z  }d
d|iz  }	t        t        j                  |	«      «      ‚d x} x}x}x}x}x}x}}y )Nz
Quiet Gameza walkza medieval hamlet at duskrD   rG   )zƒ%(py13)s
{%(py13)s = %(py2)s
{%(py2)s = %(py0)s.town_kind
}(%(py9)s
{%(py9)s = %(py3)s(%(py5)s, %(py7)s)
}, %(py11)s)
} == %(py16)srI   r   )	rK   rL   rM   rO   rP   rQ   rR   rS   rp   úassert %(py18)sÚpy18rT   )
r^   rq   r_   r`   ra   rs   Ú@py_assert15Ú@py_assert14rt   Ú@py_format19s
             r   Útest_prompt_counts_as_wordsr|   L   sû   € Ü�<‰<Ða˜lÐa¨HÐaœ˜l¨HÓ5ÐaÐ7RÐa‰<Ð5Ð7RÓSÐaÐWaÐaÐSÐWaÑa×a×aÖaÐSÐWa×a×a×a×a×aÑaŒ2×a×aÓaŒ2×a×aÔaˆ<×a×a×a×a×aÐaœ×a×aÓaœ×a×aÔa˜l×a×aÒa¨H×a×aÒaÐ5×a×aÒaÐ7R×a×aÒaÐS×a×aÒaÐWa×a×a×a×a×a×a×aÖar   z
pitch,tier))za hamlet of five housesÚhamlet)za village with a wellÚvillage)za castle town with wallsÚtown)za walled city with a cathedralÚcity)za medieval marketr~   c                 óÄ  — t         j                  }d}t        || «      } ||«      }||k(  }|�s¨t        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )NÚTrG   )zy%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.town_tier
}(%(py8)s
{%(py8)s = %(py3)s(%(py5)s, %(py6)s)
})
} == %(py12)srI   r   r   Útier©rK   rL   rM   rO   Úpy6Úpy8Úpy10rh   ri   rj   )rI   Ú	town_tierr   rV   rW   rX   rY   rZ   r[   r\   r]   )	r   rƒ   r^   rq   Ú@py_assert7Ú@py_assert9rk   rl   rm   s	            r   Útest_tier_from_wordsr‹   P   s  € ô �<‰<Ð2˜cÐ2œ˜c 5Ó)Ð2‰<Ð)Ó*Ð2Ð*¨dÑ2×2×2Ö2Ð*¨d×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˜c×2×2×2×2×2Ð2 5×2×2Ó2 5×2×2Ô2Ð)×2×2Ò2Ð*×2×2×2×2×2Ð2¨d×2×2Ó2¨d×2×2×2×2×2×2×2Ò2r   z
pitch,site))za village on a river bankÚriver)úa fishing village on the coastÚcoast)za hilltop villageÚhill)za village at a crossroadsÚ
crossroads)za village on a ridgeÚspur)za village in a fieldÚplain)za hilltop village by the riverrŒ   c                 óÄ  — t         j                  }d}t        || «      } ||«      }||k(  }|�s¨t        j                  d|fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )Nr‚   rG   )zy%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.town_site
}(%(py8)s
{%(py8)s = %(py3)s(%(py5)s, %(py6)s)
})
} == %(py12)srI   r   r   Úsiter„   ri   rj   )rI   Ú	town_siter   rV   rW   rX   rY   rZ   r[   r\   r]   )	r   r”   r^   rq   r‰   rŠ   rk   rl   rm   s	            r   Útest_site_from_wordsr–   [   s  € ô �<‰<Ð2˜cÐ2œ˜c 5Ó)Ð2‰<Ð)Ó*Ð2Ð*¨dÑ2×2×2Ö2Ð*¨d×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˜c×2×2×2×2×2Ð2 5×2×2Ó2 5×2×2Ô2Ð)×2×2Ò2Ð*×2×2×2×2×2Ð2¨d×2×2Ó2¨d×2×2×2×2×2×2×2Ò2r   zstage,view,lane,fits))ÚnoneÚthirdÚcustomT)ÚroomÚfirstr™   F)r—   Útopr™   T)Úboardr˜   r™   F)r—   Úsider™   F)r—   r˜   ÚquickFc                 óþ  — t         j                  }d}d}t        ||| ||¬«      } ||«      }||u }	|	�s>t        j                  d|	fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dt        j                  «       v st        j                  | «      rt        j                  | «      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}}	y )NÚVillageúa medieval village)r   r   r   rf   )z§%(py14)s
{%(py14)s = %(py2)s
{%(py2)s = %(py0)s.town_fits
}(%(py12)s
{%(py12)s = %(py3)s(%(py5)s, %(py7)s, stage=%(py8)s, view=%(py9)s, lane=%(py10)s)
})
} is %(py16)srI   r   r   r   r   Úfits)rK   rL   rM   rO   rP   r†   rQ   r‡   rh   rj   rp   rw   rx   )rI   Ú	town_fitsr   rV   rW   rX   rY   rZ   r[   r\   r]   )r   r   r   r£   r^   rq   r_   rk   rr   ry   rt   r{   s               r   Ú!test_fits_follows_the_garage_ruler¥   h   sc  € ô �<‰<Ðj˜iÐjÐ)=Ðjœ˜iÐ)=ÀUÐQUÐ\`ÔaÐj‰<ÐaÓbÐjÐbÐfjÐj×j×jÖjÐbÐfj×j×j×j×j×jÑjŒ2×j×jÓjŒ2×j×jÔjˆ<×j×j×j×j×jÐjœ×j×jÓjœ×j×jÔj˜i×j×jÒjÐ)=×j×j×j×j×jÐjÀU×j×jÓjÀU×j×j×j×j×jÒjÐQU×j×jÓjÐQU×j×j×j×j×jÒjÐ\`×j×jÓjÐ\`×j×jÔjÐa×j×jÒjÐb×j×j×j×j×jÐjÐfj×j×jÓjÐfj×j×j×j×j×j×j×jÔjr   c                 óø  — t        j                  t        dd«      dd| «      \  }}}|D �cg c]  }|d   ‘Œ	 }}ddg}||k(  }|slt        j                  d|fd	||f«      t        j
                  |«      t        j
                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}g }
d}||v }|}|rd}||v }|}|rd}||v}|}|�sçt        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd|iz  }|
j                  |«       |�rt        j                  dfd|f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd|iz  }|
j                  |«       |rŒt        j                  dfd|f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd|iz  }|
j                  |«       t        j                  |
d«      i z  }d d!|iz  }t        t        j                  |«      «      ‚d x}x}
x}x}x}x}x}}g }
|d"   }d#}||k(  }|}|r|d$   }d%}||k(  }|}|r|d&   }d'}||k(  }|}|�s_t        j                  d|fd(||f«      t        j
                  |«      t        j
                  |«      d)œz  }	d*d+|	iz  }|
j                  |«       |rÀt        j                  dfd,f«      t        j
                  |«      t        j
                  |«      d-œz  }d.d/|iz  }|
j                  |«       |r_t        j                  dfd0|f«      t        j
                  |«      t        j
                  |«      d1œz  }d2d!|iz  }|
j                  |«       t        j                  |
d«      i z  } d3d4| iz  }!t        t        j                  |!«      «      ‚d x}x}
x}x}x}x}x}x}x}x}}y c c}w )5Nr¡   r¢   é   r   Úfilenamer-   r0   rG   ©z%(py1)s == %(py4)s©Úpy1rN   úassert %(py6)sr…   Úatt3Úatt4Úatt1©Úin)z%(py3)s in %(py5)sÚcontract)rM   rO   z%(py7)srP   )z%(py10)s in %(py12)s)r‡   rh   z%(py14)srj   )únot in)z%(py17)s not in %(py19)s)Úpy17Úpy19z%(py21)sÚpy21r   zassert %(py24)sÚpy24rJ   rD   rƒ   r~   r”   r’   )z%(py3)s == %(py6)s)rM   r…   z%(py8)sr†   )z%(py11)s == %(py14)s)rR   rj   z%(py16)srp   )z%(py19)s == %(py22)s)rµ   Úpy22z%(py24)szassert %(py27)sÚpy27)rI   Útown_attachmentsr   rV   rW   r[   r\   r]   rX   rY   rZ   ÚappendÚ_format_boolop)"r5   Úattsr²   ÚmetaÚaÚ@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7r^   rq   rŠ   rk   Ú@py_assert16Ú@py_assert18Ú@py_format6Ú@py_format8rl   rm   Ú@py_format20Ú@py_format22Ú@py_format23Ú@py_format25Ú@py_assert5ra   rr   rs   Ú@py_assert21Ú@py_assert20Ú@py_format9rt   Ú@py_format26Ú@py_format28s"                                     r   Ú/test_town_attachments_numbered_from_first_indexrÓ   t   s²  € Ü×.Ñ.¬u°YÐ@TÓ/UÐWXÐZ\Ð^dÓeÑ€Dˆ(�DØ#'Ö(˜aˆAˆj‹MÐ(ÐYÐ(Ð-=Ð?XÐ,YÐYÐ(Ð,YÑY×Y×YÕYÐ(Ð,Y×Y×YÓYÐ(×Y×YÒYÐ,Y×Y×Y×Y×Y×Y×YÓYÙOˆ6ÐOˆ6�XÐÔO &ÐO &¨HÐ"4ÔO¸ÐO¸ÀxÐ9O×O×O×OÐOˆ6�X×O×OÓOˆ6×O×O×O×O×OÐO�X×O×OÓO�X×O×O×O×O×O×O×OÐO &¨H×O×OÓO &×O×O×O×O×OÐO¨H×O×OÓO¨H×O×O×O×O×O×O×O¸Àx×O×OÓO¸×O×O×O×O×OÐOÀx×O×OÓOÀx×O×O×O×O×O×O×O×O×O×O×O×O×O×OÐOÙ_ˆ4�‰<Ð_˜:Ð_ˆ<˜:Ñ%Ô_¨$¨v©,Ð_¸)Ð_¨,¸)Ñ*CÔ_ÈÈVÉÐ_ÐX_Ð_ÈÐX_ÑH_×_×_×_Ð_ˆ<˜:×_×_Ó_ˆ<×_×_Ò_˜:×_×_×_×_×_×_Õ_¨,¸)×_×_Ó_¨,×_×_Ò_¸)×_×_×_×_×_×_Õ_ÈÐX_×_×_Ó_È×_×_Ò_ÐX_×_×_×_×_×_×_×_×_×_×_×_×_×_×_Õ_ùò )s   «Q7c                 óˆ  — t        j                  t        dd«      dd| «      \  }}}|d   }d}||k(  }|slt        j                  d|fd||f«      t        j
                  |«      t        j
                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }t        j                  }	d}
| |
z  }|j                  } |«       } |	|«      }|j                  } |«       }||k(  }|�snt        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  t        «      rt        j
                  t        «      ndt        j
                  |	«      dt        j                  «       v st        j                  | «      rt        j
                  | «      ndt        j
                  |
«      t        j
                  |«      t        j
                  |«      t        j
                  |«      t        j
                  |«      t        j
                  |«      dœ
z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}	x}
x}x}x}x}x}}| dz  j                  d«       t         j                   } || «      }	d}
|	|
k(  }|�s
t        j                  d|fd|	|
f«      dt        j                  «       v st        j                  t         «      rt        j
                  t         «      ndt        j
                  |«      dt        j                  «       v st        j                  | «      rt        j
                  | «      ndt        j
                  |	«      t        j
                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}	x}}
y )Nr¡   za breton fishing villager   r   rJ   rE   rG   r©   rª   r¬   r…   Úshar-   )zÏ%(py1)s == %(py19)s
{%(py19)s = %(py17)s
{%(py17)s = %(py15)s
{%(py15)s = %(py5)s
{%(py5)s = %(py3)s.sha256
}(%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (%(py6)s / %(py8)s).read_bytes
}()
})
}.hexdigest
}()
}Úhashlibr5   )
r«   rM   rO   r…   r†   rR   rS   Úpy15r´   rµ   úassert %(py21)sr¶   ztownkit.shazabc123
Úabc123)zN%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.town_sha
}(%(py3)s)
} == %(py8)srI   )rK   rL   rM   rO   r†   zassert %(py10)sr‡   )rI   rº   r   rV   rW   r[   r\   r]   rÖ   Úsha256Ú
read_bytesÚ	hexdigestrX   rY   rZ   Ú
write_textÚtown_sha)r5   r½   Ú_r¾   rÀ   rÁ   rÂ   rÃ   rÄ   rq   r‰   rŠ   ra   rs   rz   rÅ   rÆ   rÉ   rÊ   r^   r_   rÐ   Ú@py_format11s                          r   Ú!test_meta_sha_is_the_code_tarballrá   {   sT  € Ü×'Ñ'¬¨iÐ9SÓ(TÐVWÐY[Ð]cÓd�M€Dˆ!ˆTØ�‰<Ð#˜8Ð#ˆ<˜8Ñ#×#×#Õ#ˆ<˜8×#×#Ó#ˆ<×#×#Ò#˜8×#×#×#×#×#×#Ó#Ø�‰;Ð^œ'Ÿ.™.Ð^Ð3CÐ^¨&Ð3CÑ*CÐ^Ð*C×)OÑ)OÐ^Ñ)OÓ)QÐ^™.Ð)QÓRÐ^ÐR×\Ñ\Ð^Ñ\Ó^Ð^ˆ;Ð^Ñ^×^×^Ö^ˆ;Ð^×^×^Ó^ˆ;×^×^×^×^×^Ð^œ'×^×^Ó^œ'×^×^Ô^˜.×^×^×^×^×^Ð^¨&×^×^Ó^¨&×^×^Ô^Ð3C×^×^Ò^Ð)O×^×^Ò^Ð)Q×^×^Ò^ÐR×^×^Ò^Ð\×^×^Ò^Ð^×^×^×^×^×^×^×^×^Ñ^ØˆmÑ×'Ñ'¨
Ô3Ü�;‰;Ð*‰;�vÓÐ* (Ð*Ð (Ñ*×*×*Ö*Ð (×*×*×*×*×*Ñ*Œ2×*×*Ó*Œ2×*×*Ô*ˆ;×*×*×*×*×*Ð*�v×*×*Ó*�v×*×*Ô*Ð×*×*Ò* (×*×*×*×*×*×*Ö*r   c                 ó:  — t        j                  t        dd«      dd| «      \  }}}t        |d   «      d   }d}||k(  }|slt	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      d	œz  }d
d|iz  }t        t	        j                  |«      «      ‚d x}x}}d}|d   }t        |«      }	||	v }|sÉt	        j
                  d|fd||	f«      t	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |	«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}x}}	y )Nr¡   r¢   r   r   r/   r.   rG   r©   rª   r¬   r…   r1   r9   r°   )z0%(py1)s in %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}rC   )r«   rM   rO   rP   zassert %(py9)srQ   )rI   rº   r   rC   rV   rW   r[   r\   r]   rX   rY   rZ   )r5   r½   rß   rÀ   rÁ   rÂ   rÃ   rÄ   rq   r_   rÈ   Ú@py_format10s               r   Ú%test_attachment_bytes_are_the_bundlesrä   ƒ   s  € Ü×$Ñ$¤U¨9Ð6JÓ%KÈQÐPRÐTZÓ[�J€Dˆ!ˆQÜ�D˜‘GÓ˜YÑ'Ð2¨7Ð2Ð'¨7Ñ2×2×2Õ2Ð'¨7×2×2Ó2Ð'×2×2Ò2¨7×2×2×2×2×2×2Ó2Ø'Ð<°D¸±GÐ<¬8°GÓ+<Ð<Ð'Ð+<Ð<×<×<Õ<Ð'Ð+<×<×<Ó<Ð'×<×<×<×<×<Ð<¬8×<×<Ó<¬8×<×<Ô<°G×<×<Ò<Ð+<×<×<×<×<×<×<Ö<r   c                 ó&  — t        j                  t        dd«      dd| «      \  }}}dD ]æ  }||v }|sÜt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	d
œz  }t        j                  |«      dz   d|iz  }t        t        j                  |«      «      ‚d }Œè y )NÚHarbourr�   r   r   )zsrc/lib/townzpublic/townr/   zSETTLEMENT.mdzcreateTown(z
town.groupztown.collidersztown.heightAtztier: 'village'zsite: 'coast'zstyle: 'breton'zmain squarer°   )z%(py0)s in %(py2)sÚneedler²   )rK   rL   z
>assert %(py4)srN   )rI   rº   r   rV   rW   rX   rY   rZ   r[   Ú_format_assertmsgr\   r]   )r5   rß   r²   rç   r^   Ú@py_format3rÃ   s          r   Ú*test_contract_names_the_files_and_the_lawsrê   ‰   s®   € Ü×(Ñ(¬¨yÐ:ZÓ)[Ð]^Ð`bÐdjÓk�N€A€x�ðjò *ˆà˜Ð!×)×)Õ)ˆv˜×)×)×)×)×)Ñ)ˆv×)×)Ó)ˆv×)×)×)×)×)Ò)˜×)×)Ó)˜×)×)×)Ñ) 6×)×)×)×)×)Õ)ñ*r   c                 óX  — | dz  }|j                  «        t        j                  }d}d}t        ||«      }d}d} |||||«      }	d }
|	|
u }|�s·t	        j
                  d|fd|	|
f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      d	t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd	t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |	«      t	        j                  |
«      d
œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}x}x}x}x}	x}}
|dz  j                  «        t        j                  }d}d}t        ||«      }d}d} |||||«      }	d }
|	|
u }|�s·t	        j
                  d|fd|	|
f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      d	t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd	t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |	«      t	        j                  |
«      d
œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}x}x}x}x}	x}}
y )NÚemptyr¡   r¢   r   r   rf   ©zž%(py16)s
{%(py16)s = %(py2)s
{%(py2)s = %(py0)s.town_attachments
}(%(py9)s
{%(py9)s = %(py3)s(%(py5)s, %(py7)s)
}, %(py11)s, %(py13)s, %(py14)s)
} is %(py19)srI   r   ©rK   rL   rM   rO   rP   rQ   rR   rS   rj   rp   rµ   rØ   r¶   r0   r5   )ÚmkdirrI   rº   r   rV   rW   rX   rY   rZ   r[   r\   r]   Úunlink)r4   r5   rì   r^   rq   r_   r`   ra   rs   ry   rÆ   Ú@py_assert17rÉ   rÊ   s                 r   Ú!test_missing_bundle_means_no_townrò   �   sŠ  € Ø�wÑ€EØ	‡K�K„MÜ×ÑÐ\ YÐ\Ð0DÐ\œu YÐ0DÓEÐ\ÀqÐ\È"Ð\ÑÐEÀqÈ"ÈeÓTÐ\ÐX\Ð\ÐTÐX\Ð\×\×\Ö\ÐTÐX\×\×\×\×\×\Ñ\Œ2×\×\Ó\Œ2×\×\Ô\Ð×\×\×\×\×\Ð\œu×\×\Ó\œu×\×\Ô\ Y×\×\Ò\Ð0D×\×\Ò\ÐE×\×\Ò\Àq×\×\Ò\È"×\×\×\×\×\Ð\Èe×\×\Ó\Èe×\×\Ô\ÐT×\×\Ò\ÐX\×\×\×\×\×\×\×\×\ØÐ'Ñ'×/Ñ/Ô1Ü×ÑÐ] YÐ]Ð0DÐ]œu YÐ0DÓEÐ]ÀqÐ]È"Ð]ÑÐEÀqÈ"ÈfÓUÐ]ÐY]Ð]ÐUÐY]Ð]×]×]Ö]ÐUÐY]×]×]×]×]×]Ñ]Œ2×]×]Ó]Œ2×]×]Ô]Ð×]×]×]×]×]Ð]œu×]×]Ó]œu×]×]Ô] Y×]×]Ò]Ð0D×]×]Ò]ÐE×]×]Ò]Àq×]×]Ò]È"×]×]×]×]×]Ð]Èf×]×]Ó]Èf×]×]Ô]ÐU×]×]Ò]ÐY]×]×]×]×]×]×]×]×]Ð]r   c                 ó.  — | dz  j                  «        t        j                  }d}d}t        ||«      }d}d} ||||| «      }d }||u }	|	�s·t	        j
                  d|	fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      d	t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd	t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      d
t        j                  «       v st	        j                  | «      rt	        j                  | «      nd
t	        j                  |«      t	        j                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}x}x}x}x}x}x}	}t        j                  }d}d}t        ||«      }d}d} ||||| «      }d }||u}	|	�s·t	        j
                  d|	fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      d	t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd	t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      d
t        j                  «       v st	        j                  | «      rt	        j                  | «      nd
t	        j                  |«      t	        j                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}x}x}x}x}x}x}	}y )Nr2   ÚBretonza Breton villager   r   rf   rí   rI   r   r5   rî   rØ   r¶   r¡   r¢   )úis not)z¢%(py16)s
{%(py16)s = %(py2)s
{%(py2)s = %(py0)s.town_attachments
}(%(py9)s
{%(py9)s = %(py3)s(%(py5)s, %(py7)s)
}, %(py11)s, %(py13)s, %(py14)s)
} is not %(py19)s)rð   rI   rº   r   rV   rW   rX   rY   rZ   r[   r\   r]   )r5   r^   rq   r_   r`   ra   rs   ry   rÆ   rñ   rÉ   rÊ   s               r   Ú/test_missing_style_bundle_only_drops_that_stylerö   ˜   sw  € ØÐ%Ñ%×-Ñ-Ô/Ü×ÑÐZ XÐZÐ/AÐZœu XÐ/AÓBÐZÀAÐZÀrÐZÑÐBÀAÀrÈ6ÓRÐZÐVZÐZÐRÐVZÐZ×Z×ZÖZÐRÐVZ×Z×Z×Z×Z×ZÑZŒ2×Z×ZÓZŒ2×Z×ZÔZÐ×Z×Z×Z×Z×ZÐZœu×Z×ZÓZœu×Z×ZÔZ X×Z×ZÒZÐ/A×Z×ZÒZÐB×Z×ZÒZÀA×Z×ZÒZÀr×Z×Z×Z×Z×ZÐZÈ6×Z×ZÓZÈ6×Z×ZÔZÐR×Z×ZÒZÐVZ×Z×Z×Z×Z×Z×Z×Z×ZÜ×ÑÐa YÐaÐ0DÐaœu YÐ0DÓEÐaÀqÐaÈ"ÐaÑÐEÀqÈ"ÈfÓUÐaÐ]aÐaÐUÐ]aÐa×a×aÖaÐUÐ]a×a×a×a×a×aÑaŒ2×a×aÓaŒ2×a×aÔaÐ×a×a×a×a×aÐaœu×a×aÓaœu×a×aÔa Y×a×aÒaÐ0D×a×aÒaÐE×a×aÒaÀq×a×aÒaÈ"×a×a×a×a×aÐaÈf×a×aÓaÈf×a×aÔaÐU×a×aÒaÐ]a×a×a×a×a×a×a×a×aÐar   c                 ó<  — t         j                  }d}d}t        ||«      }d}d} ||||| «      }d }||u }	|	�s·t        j                  d|	fd||f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	t        j                  «       v st        j                  | «      rt        j                  | «      nd	t        j                  |«      t        j                  |«      d
œz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}x}x}x}	}t         j                  }d}d}d}t        |||¬«      }d}d} ||||| «      }	d }|	|u }|�sËt        j                  d|fd|	|f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      d	t        j                  «       v st        j                  | «      rt        j                  | «      nd	t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}x}x}x}	x}}y )NÚSpacezdogfight in spacer   r   rf   rí   rI   r   r5   rî   rØ   r¶   r¡   r¢   r�   )r   )z¯%(py18)s
{%(py18)s = %(py2)s
{%(py2)s = %(py0)s.town_attachments
}(%(py11)s
{%(py11)s = %(py3)s(%(py5)s, %(py7)s, stage=%(py9)s)
}, %(py13)s, %(py15)s, %(py16)s)
} is %(py21)s)rK   rL   rM   rO   rP   rQ   rR   rS   r×   rp   rx   r¶   zassert %(py23)sÚpy23)rI   rº   r   rV   rW   rX   rY   rZ   r[   r\   r]   )r5   r^   rq   r_   r`   ra   rs   ry   rÆ   rñ   rÉ   rÊ   rz   rÏ   Ú@py_assert19Ú@py_format24s                   r   Útest_no_settlement_no_townrü   ž   s€  € Ü×ÑÐZ WÐZÐ.AÐZœu WÐ.AÓBÐZÀAÐZÀrÐZÑÐBÀAÀrÈ6ÓRÐZÐVZÐZÐRÐVZÐZ×Z×ZÖZÐRÐVZ×Z×Z×Z×Z×ZÑZŒ2×Z×ZÓZŒ2×Z×ZÔZÐ×Z×Z×Z×Z×ZÐZœu×Z×ZÓZœu×Z×ZÔZ W×Z×ZÒZÐ.A×Z×ZÒZÐB×Z×ZÒZÀA×Z×ZÒZÀr×Z×Z×Z×Z×ZÐZÈ6×Z×ZÓZÈ6×Z×ZÔZÐR×Z×ZÒZÐVZ×Z×Z×Z×Z×Z×Z×Z×ZÜ×ÑÐl YÐlÐ0DÐlÈGÐlœu YÐ0DÈGÔTÐlÐVWÐlÐY[ÐlÑÐTÐVWÐY[Ð]cÓdÐlÐhlÐlÐdÐhlÐl×l×lÖlÐdÐhl×l×l×l×l×lÑlŒ2×l×lÓlŒ2×l×lÔlÐ×l×l×l×l×lÐlœu×l×lÓlœu×l×lÔl Y×l×lÒlÐ0D×l×lÒlÈG×l×lÒlÐT×l×lÒlÐVW×l×lÒlÐY[×l×l×l×l×lÐlÐ]c×l×lÓlÐ]c×l×lÔlÐd×l×lÒlÐhl×l×l×l×l×l×l×l×lÒlr   )r   r—   r˜   r™   r   )+Ú__doc__ÚbuiltinsrX   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterV   r:   rÖ   r   r   Úpathlibr   Útypesr   r   ÚpytestÚ
games_townrI   r   ÚdictÚstrÚbytesr+   Úfixturer5   rC   ÚmarkÚparametrizerd   rn   ru   r|   r‹   r–   r¥   rÓ   rá   rä   rê   rò   rö   rü   © r   r   ú<module>r     sm  ðÙ 3ç  „ ƒÛ Û 	Û Ý Ý &ã ã óSð
��S˜%�ZÑ ð  Uó ð ‡�ñó ðòYð ‡�×ÑÐ+ò 	.ó 	ñ5ó	ð5ð ‡�×Ñ˜ò 	)ó 	ñ5ó	ð5òUòbð ‡�×Ñ˜ò (ó ñ3óð3ð ‡�×Ñ˜ò (ó ñ3óð3ð ‡�×ÑÐ/ò 2ó ñkóðkò`ò+ò=ò*ò^òbómr   