Ë
    Š:ØjÚA  ã                   óà  — d dl Z d dlZd dlZd dlZd dlZd dlmZ ej                  j                  d  e	 ee
«      j                  «       j                  «      «       d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z(  G d„ dejR                  «      Z* G d	„ d
ejR                  «      Z+ G d„ dejR                  «      Z, G d„ dejR                  «      Z- G d„ dejR                  «      Z. G d„ dejR                  «      Z/ G d„ dejR                  «      Z0 G d„ dejR                  «      Z1 G d„ dejR                  «      Z2e3dk(  r ejh                  «        yy)é    N)ÚPath)ÚSTAGESÚSTAGE_DRESSÚSTAGE_LEVELÚDEFAULT_STAGE_QUOTASÚdress_for_stageÚdress_negativeÚforce_nude_forÚload_stage_camerasÚparse_stage_quotasÚstage_for_recordÚstage_allows_pose)Úload_affinityÚvalidate_pose_scene)
ÚJobÚ_image_nameÚassign_camerasÚchoose_outfit_storyÚcompose_stage_jobsÚcompose_theme_jobsÚcompute_metricsÚload_themesÚoutfit_line_for_stageÚtheme_negative)Úselect_postsc                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚStageModelTestc                 óø   — | j                  t        d«       | j                  t        D �cg c]  }t        |   ‘Œ c}g d¢«       | j                  t        D �cg c]  }t        |   ‘Œ c}g d¢«       y c c}w c c}w )N©Ú	sugerenteÚspicy1Úspicy2Ú	explicit1Ú	explicit2)r    Úspicyr%   Ú	explicitor&   )ÚdressedÚ	strippingÚlingerieÚclothedÚnude)ÚassertEqualr   r   r   )ÚselfÚss     úEngine/test_stages.pyÚtest_stage_mapping_is_exactz*StageModelTest.test_stage_mapping_is_exact   sm   € Ø×Ñœð "<ô 	=à×Ñµ&Ó9±&¨Qœ+ a›.°&Ñ9ÚRô	Tà×Ñµ&Ó9±&¨Qœ+ a›.°&Ñ9ÚPõ	Rùò :ùâ9s   ªA2ÁA7c           
      óª   — | j                  t        d «      t        «       | j                  t        d«      t        t	        t
        g d¢«      «      «       y )Nz	1,2,3,4,5)é   é   é   é   é   )r,   r   r   ÚdictÚzipr   ©r-   s    r/   Ú)test_parse_stage_quotas_default_and_validz8StageModelTest.test_parse_stage_quotas_default_and_valid   s>   € Ø×ÑÔ+¨DÓ1Ô3GÔHØ×ÑÔ+¨KÓ8Üœc¤&ª/Ó:Ó;õ	=ó    c                 ó|   — dD ]+  }| j                  t        «      5  t        |«       d d d «       Œ- y # 1 sw Y   Œ8xY w)N)z9,9,9,9z	9,9,9,9,xz
-1,9,9,9,9)ÚassertRaisesÚ
ValueErrorr   )r-   Útexts     r/   Ú*test_parse_stage_quotas_rejects_bad_valuesz9StageModelTest.test_parse_stage_quotas_rejects_bad_values$   s1   € Û:ˆDØ×"Ñ"¤:Õ.Ü" 4Ô(÷ /Ð.ñ ;ß.Ð.ús   ›2²;	c                 óê   — | j                  t        dddœ«      d«       | j                  t        ddi«      d«       | j                  t        ddi«      d«       | j                  t        i «      d«       y )	Nr"   r%   )ÚstageÚnivelrC   r!   r&   r$   r    )r,   r   r9   s    r/   Ú)test_stage_for_record_falls_back_to_nivelz8StageModelTest.test_stage_for_record_falls_back_to_nivel)   sl   € Ø×ÑÔ)°HÀwÑ*OÓPØ!ô	#à×ÑÔ)¨7°GÐ*<Ó=¸xÔHØ×ÑÔ)¨7°KÐ*@ÓAÀ;ÔOØ×ÑÔ)¨"Ó-¨{Õ;r;   c                 óì  — | j                  t        d«      d«       | j                  t        dd«      d«       | j                  t        dd«      d«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d«       | j                  t        d«      d	«       | j	                  t
        «      5  t        d
«       d d d «       y # 1 sw Y   y xY w)Nr"   r)   Úautor*   ztopless, bottomlessr+   Ú ÚneverÚalwaysÚnope)r,   r   r	   r
   r=   r>   r9   s    r/   Útest_dress_and_negativez&StageModelTest.test_dress_and_negative0   s¼   € Ø×Ñœ¨Ó2°JÔ?Ø×Ñœ¨°6Ó:¸JÔGØ×Ñœ¨°9Ó=¸yÔIØ×Ñœ¨
Ó3Ð5JÔKØ×Ñœ¨Ó/°Ô4Ø×Ñœ¨
Ó3°WÔ=Ø×Ñœ¨Ó/°Ô:Ø×ÑœzÕ*Ü˜FÔ#÷ +×*Ñ*ús   ÃC*Ã*C3N)Ú__name__Ú
__module__Ú__qualname__r0   r:   r@   rD   rK   © r;   r/   r   r      s   „ òRò=ò
)ò
<ó	$r;   r   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚCameraDataTestc                 ó<  — t        j                  «       5 }t        |«      dz  }t        |dg¬«      }| j	                  t        |«      t        t        «      «       | j                  t        d„ |j                  «       D «       «      «       d d d «       y # 1 sw Y   y xY w)Nz	nope.jsonúcowboy shot©Úfallbackc              3   ó(   K  — | ]
  }|d gk(  –— Œ y­w)rS   NrO   )Ú.0Úvs     r/   Ú	<genexpr>zACameraDataTest.test_missing_file_uses_fallback.<locals>.<genexpr>B   s   è ø€ ÐK¹l¸  m _Õ 4¹lùs   ‚)
ÚtempfileÚTemporaryDirectoryr   r   r,   Úsetr   Ú
assertTrueÚallÚvalues)r-   ÚtdÚmissingÚgots       r/   Útest_missing_file_uses_fallbackz.CameraDataTest.test_missing_file_uses_fallback=   sm   € Ü×(Ñ(Ô*¨bÜ˜2“h Ñ,ˆGÜ$ W¸°ÔGˆCØ×ÑœS ›X¤s¬6£{Ô3Ø�O‰OœCÑK¸c¿j¹j¼lÓKÓKÔL÷	 +×*Ñ*ús   •A4BÂBc                 ó8  — t        j                  «       5 }t        |«      dz  }|j                  t	        j
                  ddgi«      d¬«       t        |dg¬«      }| j                  |d   dg«       | j                  |d   dg«       d d d «       y # 1 sw Y   y xY w)	Nzcameras.jsonr    Úportraitzutf-8)ÚencodingrS   rT   r$   )rZ   r[   r   Ú
write_textÚjsonÚdumpsr   r,   )r-   r`   Úpathrb   s       r/   Ú+test_valid_file_missing_stage_uses_fallbackz:CameraDataTest.test_valid_file_missing_stage_uses_fallbackD   sŒ   € Ü×(Ñ(Ô*¨bÜ˜“8˜nÑ,ˆDØ�O‰OœDŸJ™J¨°j°\Ð'BÓCØ%,ð ô .ä$ T°]°OÔDˆCØ×Ñ˜S Ñ-°
¨|Ô<Ø×Ñ˜S Ñ-°¨Ô?÷ +×*Ñ*ús   •A2BÂBc                 óŠ  — t        «       }|j                  «       D ��cg c]  }|D ]  }|‘Œ Œ }}}| j                  d|«       | j                  d|«       | j                  d|d   «       | j                  d|d   «       | j                  d|d   «       | j                  d|d   «       | j                  d|d   «       y c c}}w )	Nz	full bodyz	wide shotú	from sider"   r#   r$   r    r!   )r   r_   ÚassertNotInÚassertIn)r-   rb   r_   ÚcÚflats        r/   Ú;test_real_file_has_no_full_body_and_side_only_where_allowedzJCameraDataTest.test_real_file_has_no_full_body_and_side_only_where_allowedM   s²   € Ü Ó"ˆØ #§
¡
¤Ô=¡�f³f°’°f� ˆÑ=Ø×Ñ˜ dÔ+Ø×Ñ˜ dÔ+Ø�‰�k 3 x¡=Ô1Ø�‰�k 3 {Ñ#3Ô4Ø�‰�k 3 {Ñ#3Ô4Ø×Ñ˜ c¨+Ñ&6Ô7Ø×Ñ˜ c¨(¡mÕ4ùó >s   žB?N)rL   rM   rN   rc   rk   rr   rO   r;   r/   rQ   rQ   <   s   „ òMò@ó	5r;   rQ   c                   ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚPoseSceneTestc                 ó"   — t        «       | _        y )N)r   Úaffr9   s    r/   ÚsetUpzPoseSceneTest.setUpZ   s   € Ü “?ˆ�r;   c                 óÂ   — t        dd| j                  «      }| j                  t        d„ |D «       «      «       | j	                  t        dd| j                  «      g «       y )Nz1girl, against_wallúoffice, desk, office chairc              3   ó@   K  — | ]  }d |j                  «       v –— Œ y­w)ÚwallN©Úlower©rW   Úws     r/   rY   z@PoseSceneTest.test_against_wall_requires_wall.<locals>.<genexpr>`   s   è ø€ ÐB¹°A˜F a§g¡g£iÔ/¹ùs   ‚zoffice, wall, desk)r   rv   r]   Úanyr,   ©r-   Úwarningss     r/   Útest_against_wall_requires_wallz-PoseSceneTest.test_against_wall_requires_wall]   sW   € Ü&Ð'<Ø'CÀTÇXÁXóOˆà�‰œÑB¹ÓBÓBÔCØ×ÑÔ,Ð-BØ-AÀ4Ç8Á8óMØNPõ	Rr;   c                 ó¢   — t        dd| j                  «      }| j                  |«       | j                  t        dd| j                  «      g «       y )Nz1girl, lying, on_sidery   zbedroom, bed)r   rv   r]   r,   r�   s     r/   Ú#test_lying_needs_horizontal_supportz1PoseSceneTest.test_lying_needs_horizontal_supportd   sL   € Ü&Ð'>Ø'CÀTÇXÁXóOˆà�‰˜Ô!Ø×ÑÔ,Ð-DØ-;¸T¿X¹XóGØHJõ	Lr;   c                 óž   — | j                  t        dd| j                  «      «       | j                  t        dd| j                  «      g «       y )Nzmissionary, sexzoffice, deskÚcowgirl_positionzoffice, office chair)r]   r   rv   r,   r9   s    r/   Útest_missionary_and_cowgirlz)PoseSceneTest.test_missionary_and_cowgirlk   sK   € Ø�‰Ô+Ð,=Ø,:¸D¿H¹HóFô 	Gà×ÑÔ,Ð-?Ø-CÀTÇXÁXóOØPRõ	Tr;   c                 ót   — t        dd| j                  «      }| j                  t        d„ |D «       «      «       y )NÚlyingzpool, waterc              3   óh   K  — | ]*  }d |j                  «       v xs d|j                  «       v –— Œ, y­w)ÚpoolÚwaterNr|   r~   s     r/   rY   z3PoseSceneTest.test_pool_conflict.<locals>.<genexpr>s   s6   è ø€ ð /Ù%- ð # a§g¡g£iÐ/ÒG°7¸a¿g¹g»iÐ3GÓGÙ%-ùs   ‚02)r   rv   r]   r€   r�   s     r/   Útest_pool_conflictz PoseSceneTest.test_pool_conflictq   s4   € Ü& w°¸t¿x¹xÓHˆØ�‰œñ /Ù%-ó/ó /õ 	0r;   c                 ó¨   — t        j                  «       5 }| j                  t        t	        |«      dz  «      di i«       d d d «       y # 1 sw Y   y xY w)Nz	nope.yamlÚposes)rZ   r[   r,   r   r   )r-   r`   s     r/   Útest_missing_file_is_emptyz(PoseSceneTest.test_missing_file_is_emptyv   s>   € Ü×(Ñ(Ô*¨bØ×Ñœ]¬4°«8°kÑ+AÓBÀWÈbÀMÔR÷ +×*Ñ*ús   •*AÁAN)	rL   rM   rN   rw   rƒ   r…   rˆ   rŽ   r‘   rO   r;   r/   rt   rt   Y   s$   „ ò#òRòLòTò0ó
Sr;   rt   c                   ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚOutfitStoryTestc                 óJ   — t        «       | _        | j                  d   | _        y )NÚoficina)r   Úthemesr•   r9   s    r/   rw   zOutfitStoryTest.setUp|   s   € Ü!“mˆŒØ—{‘{ 9Ñ-ˆ�r;   c           	      óê  — t        | j                  d«      \  }}| j                  |d«       | j                  dt	        | j                  |d|«      «       | j                  dt	        | j                  |d|«      «       | j                  dt	        | j                  |d|«      «       | j                  dt	        | j                  |d	|«      «       | j                  t	        | j                  |d
|«      d«       y )NÚoffice_ladyúoffice ladyr    úunbuttoned shirtr!   ú	black brar"   úclothed sexr#   r$   rG   )r   r•   r,   ro   r   )r-   ÚbaseÚentrys      r/   Útest_office_story_is_consistentz/OutfitStoryTest.test_office_story_is_consistent€   sÙ   € Ü)¨$¯,©,¸ÓF‰ˆˆeØ×Ñ˜˜}Ô-Ø�‰�mÔ%:Ø�L‰L˜$ ¨Uó&4ô 	5à�‰Ð(Ô*?Ø�L‰L˜$ ¨%ó+1ô 	2à�‰�kÔ#8Ø�L‰L˜$ ¨%ó$1ô 	2à�‰�mÔ%:Ø�L‰L˜$ ¨Uó&4ô 	5à×ÑÔ.Ø�L‰L˜$ ¨Uó4Ø57õ	9r;   c                 óT  — t        | j                  d«      \  }}| j                  |d«       | j                  t        «      5  t        | j                  d«       d d d «       | j                  t        «      5  t        ddddgiiid«       d d d «       y # 1 sw Y   Œ;xY w# 1 sw Y   y xY w)NÚsuitrJ   Úoutfitr    ÚxÚshirt)r   r•   r,   r=   r>   )r-   r�   Ú_s      r/   Ú(test_preferred_base_and_incomplete_storyz8OutfitStoryTest.test_preferred_base_and_incomplete_storyŽ   s‹   € Ü% d§l¡l°FÓ;‰ˆˆaØ×Ñ˜˜vÔ&Ø×ÑœzÕ*Ü §¡¨fÔ5÷ +à×ÑœzÕ*Ü ¨K¸#À¸yÐ9IÐ+JÐ KØ #ô%÷ +Ð*÷ +Ð*úç*Ð*ús   ÁBÁ5BÂBÂB'c                 ó’   — dddgiiddgdgdœidœ}| j                  t        «      5  t        |d«       d d d «       y # 1 sw Y   y xY w)Nr    r£   r¤   ÚopenÚsex)r!   r#   )r¢   Úoutfit_story)r=   r>   r   )r-   Úbrokens     r/   Ú%test_story_missing_spicy2_is_rejectedz5OutfitStoryTest.test_story_missing_spicy2_is_rejected—   sV   € Ø(¨3°°	Ð*:Ð;Ø#&°F°8Ø7<°gñ)?ð #@ñAˆð ×ÑœzÕ*Ü ¨Ô,÷ +×*Ñ*ús	   §=½AN)rL   rM   rN   rw   rŸ   r¦   r¬   rO   r;   r/   r“   r“   {   s   „ ò.ò9ò%ó-r;   r“   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚStageCompositionTestc                 ó‚  — dddg dœdddg dœddd	g dœd
ddg dœdddg dœg}dD �ci c]	  }|d|z   g“Œ }}t         D �ci c]  }|d“Œ }}t        d|d|i |dt        j                  d«      «      }| j	                  |D �cg c]  }|j
                  ‘Œ c}t        t         «      «       | j	                  t        |D �ch c]  }|j                  dk(  sŒ|j                  ’Œ  c}«      d«       |D �cg c]  }|j
                  dk(  sŒ|‘Œ c}d   }| j                  |j                  d«       y c c}w c c}w c c}w c c}w c c}w )NÚp1r    Ústanding©ÚidrC   Ú	pose_lineÚtemaÚp2r%   ÚkneelingÚp3rŠ   Úp4r&   Ú
missionaryÚp5Úcum_overflow©r    r%   r&   zpool r2   r6   ç        r3   r#   r   )r   r   ÚrandomÚRandomr,   rB   ÚlistÚlenrC   Úpose_idÚassertNotEqualr´   )	r-   ÚbankÚlvÚpoolsr.   ÚquotasÚjobsÚjr#   s	            r/   Ú&test_one_job_per_stage_and_shared_bankz;StageCompositionTest.test_one_job_per_stage_and_shared_bank    sX  € à +¸JÐPRÑSØ '¸
ÈBÑOØ '¸ÈÑLØ +¸LÐRTÑUØ +¸NÐTVÑWð
ˆñ 5ó6Ù4ð )+��g ‘l�^Ñ#Ø4ð 	ð 6å &Ó'¡˜1�!�Q‘$ ˆÐ'Ü! ! V¨S°$¸¸EÀ1Ü"(§-¡-°Ó"2ó4ˆà×Ñ©4Ó0©4 a˜!Ÿ'›'¨4Ñ0´$´v³,Ô?Ø×Ñœ±ÓL±¨A¸¿¹ÀGÓ9K˜aŸi›i°ÑLÓMÈqÔQÙ $Ó?¡˜1¨¯©°;Ó(>’Q Ñ?ÀÑBˆ	Ø×Ñ˜I×/Ñ/°Õ@ùò6ùâ'ùò 1ùÚLùÚ?s(   ¥D(½
D-Á=D2Â9D7ÃD7Ã,D<ÄD<c                 óÜ   — | j                  t        dd«      «       | j                  t        dd«      «       | j                  t        dd«      «       | j                  t        dd«      «       y )Nr#   zcum, after_sexr$   Úorgasmzmissionary, blush)ÚassertFalser   r]   r9   s    r/   Ú3test_explicit1_filters_pool_and_explicit2_allows_itzHStageCompositionTest.test_explicit1_filters_pool_and_explicit2_allows_it²   sY   € Ø×ÑÔ*¨;Ð8HÓIÔJØ�‰Ô)¨+Ð7GÓHÔIØ×ÑÔ*¨;¸ÓAÔBØ�‰Ô)¨+Ð7JÓKÕLr;   c                 ór   — | j                  t        dddidg i i dt        j                  d«      «      g «       y )Né-   r    r   gš™™™™™É?r2   )r,   r   r¿   rÀ   r9   s    r/   Ú test_empty_quota_returns_no_jobsz5StageCompositionTest.test_empty_quota_returns_no_jobs¸   s<   € Ø×ÑÔ+¨B°¸aÐ0@À#ÀrÈ2Ø,.°´6·=±=ÀÓ3CóEØFHõ	Jr;   N)rL   rM   rN   rË   rÏ   rÒ   rO   r;   r/   r®   r®   Ÿ   s   „ òAò$MóJr;   r®   c                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚStageWiringTestc                 óH   — dgddddgiiddgdgdgd	œiddd
giddgiddgidœS )NÚofficer    r˜   r™   zwhite shirtrš   r›   rœ   )r!   r"   r#   ÚdeskÚwindowzwindow lightÚlaptop)Ú	seed_tagsr¢   rª   ÚsceneÚlightingÚpropsrO   r9   s    r/   Ú_themezStageWiringTest._theme¾   sd   € à"˜Ø" ]°]ÀMÐ4RÐ$SÐTØ*Ø-Ð.Ø&˜-Ø+˜_ñ-ð ð
  ¨6Ð 2Ð3Ø! NÐ#3Ð4Ø  
Ð+ñ
ð 	
r;   c                 ó2  — dddg dœdddg dœddd	g dœd
ddg dœdddg dœg}| j                  «       }t        D �ci c]  }|d“Œ }}t        dgdt        dddidd|i i g t	        j
                  d«      d|id|di i¬«      }| j                  t        |«      d«       | j                  t        d„ |D «       «      «       |D �ci c]  }|j                  |“Œ }}| j                  d|d   j                  «       | j                  d|d   j                  «       | j                  d|d   j                  «       | j                  |d    j                  d!«       | j                  |d   j                  d"«       | j                  |d    j                  d#«       y c c}w c c}w )$Nr°   r    r±   r²   r¶   r%   r·   r¸   rŠ   r¹   r&   rº   r»   r©   r2   r•   r6   ú	per-imager¢   r˜   rF   r¾   r�   )r–   Úmax_variantsÚstage_quotasÚaffinityc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r˜   N)Úoutfit_base)rW   rÊ   s     r/   rY   zKStageWiringTest.test_base_outfit_is_shared_across_stages.<locals>.<genexpr>Ü   s   è ø€ ÐIÁD¸q˜AŸM™M¨]Õ:ÁDùs   ‚rš   r!   r›   r"   rœ   r#   r$   rG   r)   r+   )rÞ   r   r   r   r¿   rÀ   r,   rÂ   r]   r^   rB   ro   Úoutfit_lineÚdress)r-   rÅ   Úthemer.   rÈ   rÉ   rÊ   Úby_stages           r/   Ú(test_base_outfit_is_shared_across_stagesz8StageWiringTest.test_base_outfit_is_shared_across_stagesÌ   s¤  € à +¸JÐPRÑSØ '¸
ÈBÑOØ '¸ÈÑLØ +¸LÐRTÑUØ +¸EÈ2ÑNð
ˆð —‘“ˆÝ &Ó'¡˜1�!�Q‘$ ˆÐ'Ü!ØˆK˜Ô0°+Ø�}Ð% v¨s°D¸"¸bÀ"Ü�M‰M˜!Ó i°Ð%7ÀaØ¨7°B¨-ô	9ˆð
 	×Ñœ˜T› AÔ&Ø�‰œÑIÁDÓIÓIÔJÙ(,Ó-© 1�A—G‘G˜Q‘J¨ˆÐ-Ø�‰Ð(¨(°8Ñ*<×*HÑ*HÔIØ�‰�k 8¨HÑ#5×#AÑ#AÔBØ�‰�m X¨kÑ%:×%FÑ%FÔGØ×Ñ˜ +Ñ.×:Ñ:¸BÔ?Ø×Ñ˜ (Ñ+×1Ñ1°:Ô>Ø×Ñ˜ +Ñ.×4Ñ4°fÕ=ùò (ùò .s   ¹
FÂ>Fc                 óP  — dgdddgiii i i dœ}dddg dœdd	d
g dœdd	dg dœdddg dœdddg dœg}| j                  t        «      5  t        dgdt        di dd|i i g t	        j
                  d«      d|it        D �ci c]  }|d“Œ c}di i¬«       d d d «       y c c}w # 1 sw Y   y xY w)Nr£   r    r¤   ©rÚ   r¢   rÛ   rÜ   rÝ   r°   r±   r²   r¶   r%   r·   r¸   rŠ   r¹   r&   rº   r»   r©   r6   rà   rF   r¾   r2   r�   )r–   râ   rã   )r=   Ú
SystemExitr   r   r¿   rÀ   r   )r-   rè   rÅ   r.   s       r/   Ú,test_story_missing_fails_without_legacy_flagz<StageWiringTest.test_story_missing_fails_without_legacy_flagå   sâ   € Ø"˜e°¸cÀGÀ9Ð=MÐ/NØ¨"°rñ;ˆð  +¸JÐPRÑSØ '¸
ÈBÑOØ '¸ÈÑLØ +¸LÐRTÑUØ +¸EÈ2ÑNð
ˆð ×ÑœzÕ*Ü ˜u aÔ)=¸{ÈBØ% s¨D°"°b¸"¼f¿m¹mÈAÓ>NØ'*¨E lÝ;AÓ,B¹6°a¨Q°©T¸6Ñ,BØ)0°"¨õ	7÷ +Ð*ùò -C÷	 +Ð*ús   Á5BÁ9
B$ÂBÂBÂB%c                 óR  — dgdddgiii i i dœ}dddg dœg}t        dgdt        d	i d
d|i i g t        j                  d«      d|iddiddi i¬«      }| j	                  t        |«      d«       | j                  |d   j                  «       | j                  d|d   j                  «       y )Nr£   r    r¤   rì   r°   r±   r²   r2   rà   rF   r¾   Tr�   )r–   râ   Úallow_legacy_outfitrã   r   )
r   r   r¿   rÀ   r,   rÂ   r]   Úoutfit_fallbackro   ræ   ©r-   rè   rÅ   rÉ   s       r/   Ú(test_legacy_outfit_opt_in_marks_fallbackz8StageWiringTest.test_legacy_outfit_opt_in_marks_fallbackö   sÄ   € Ø"˜e°¸cÀGÀ9Ð=MÐ/NØ¨"°rñ;ˆà kÀ
Øñð ˆä!ØˆE�1Ô*¨K¸¸VÀSØ�"�b˜"œfŸm™m¨AÓ.¸¸U°|Ø% qÐ)¸tØ˜r�]ô	$ˆð
 	×Ñœ˜T› AÔ&Ø�‰˜˜Q™×/Ñ/Ô0Ø�‰�g˜t A™w×2Ñ2Õ3r;   c                 óÖ   — | j                  «       }dddg dœg}t        dgdt        di dd	|i i g t        j                  d«      d|idddid
dddgiiid¬«      }| j                  |g «       y )Nr°   r    zagainst_wall, standingr²   r•   r2   rà   rF   r¾   r�   Úagainst_wallÚrequiresr{   T)r–   rá   râ   rã   Ústrict_scene)rÞ   r   r   r¿   rÀ   r,   rò   s       r/   Ú test_strict_scene_drops_conflictz0StageWiringTest.test_strict_scene_drops_conflict  s�   € Ø—‘“ˆØ kØ6ÀñDð Eˆä!ØˆK˜Ô0°+¸rØ�C˜˜r 2 r¬6¯=©=¸Ó+;Ø˜uÐ%°AØ% qÐ)Ø °¸f¸XÐ0FÐGÐHØôˆð 	×Ñ˜˜rÕ"r;   c                 óB  — t        dddddgd«      }d|_        d|_        | j                  t	        |d	«      d
«       d|_        | j                  t	        |d	«      d	«       | j                  t        d|d«      d«       d |_        | j                  t        d|d«      d«       y )Nr%   ÚposerÅ   Úpb1r•   rG   r"   r)   Úbadzbad, topless, bottomlessr+   é   é{   z07_spicy2_pb1_s123.pngz07_spicy_pb1_s123.png)r   rB   rç   r,   r   r   ©r-   Újobs     r/   Útest_negative_and_image_namez,StageWiringTest.test_negative_and_image_name  s—   € Ü�'˜6 6¨5°9°+¸rÓBˆØˆŒ	ØˆŒ	Ø×Ñœ¨¨UÓ3Ð5OÔPØˆŒ	Ø×Ñœ¨¨UÓ3°UÔ;Ø×Ñœ Q¨¨SÓ1Ð3KÔLØˆŒ	Ø×Ñœ Q¨¨SÓ1Ð3JÕKr;   c           
      óÔ   — t        dddœdddœgddddœdddddd	œ¬
«      }| j                  |d   d   d«       | j                  |d   d   d«       | j                  |d   d   d«       y )Nr%   r"   )rC   rB   r&   r#   r   r2   r½   r   )ÚplannedÚplanned_stageré   Úshortfall_stage)r   r,   )r-   Úmetricss     r/   Útest_metrics_by_stagez%StageWiringTest.test_metrics_by_stage  s�   € Ü!Ø¨Ñ2Ø"¨[Ñ9ð;à"#¨a¸aÑ@Ø()°QÀ!Ø()¸ñ;ô	<ˆð 	×Ñ˜ Ñ,¨XÑ6¸Ô:Ø×Ñ˜ Ñ,¨[Ñ9¸1Ô=Ø×Ñ˜Ð!2Ñ3°HÑ=¸qÕAr;   N)
rL   rM   rN   rÞ   rê   rî   ró   rø   r  r  rO   r;   r/   rÔ   rÔ   ½   s'   „ ò
ò>ò27ò"4ò#ò	Ló	Br;   rÔ   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚStageCameraTestc           	      ód  — t        ddddg d«      t        ddddg d«      g}|D ]	  }d|_        Œ t        |dgddd	gi¬
«       | j                  |D �cg c]  }|j                  ‘Œ c}d	d	g«       | j                  |d   j                  d«       | j                  |d   j                  d	«       y c c}w )Nr%   zlying, on_siderÅ   rû   rG   Úpb2r"   rS   rm   ©Ústage_camerasr   r2   )r   rB   r   rÄ   Úcamerar,   )r-   rÉ   r   rÊ   s       r/   Útest_side_is_not_forcedz'StageCameraTest.test_side_is_not_forced)  s»   € ä�Ð)¨6°5¸"¸bÓAÜ�Ð)¨6°5¸"¸bÓAð
ˆó ˆCØ ˆC�Ið ä�t˜m˜_Ø&.°ÀÐ0LÐ%Mõ	Oà×Ñ©tÓ4©t¨!˜QŸX›X¨tÑ4°{ÀKÐ6PÔQØ×Ñ˜˜a™Ÿ™¨Ô7Ø×Ñ˜˜a™Ÿ™¨Õ5ùò 5s   ÁB-c                 ó�   — t        ddddg d«      }d|_        t        |gdgddgi¬«       | j                  |j                  d«       y )	Nr    rŠ   rÅ   rû   rG   rm   re   r  ©r   rB   r   r,   r  rÿ   s     r/   Ú%test_stage_without_side_never_gets_itz5StageCameraTest.test_stage_without_side_never_gets_it6  sL   € Ü�+˜w¨°°r¸2Ó>ˆØˆŒ	Ü˜�u˜{˜mØ&1°J°<Ð%@õ	Bà×Ñ˜Ÿ™ ZÕ0r;   c                 óŒ   — t        ddddg d«      }d|_        t        |gg dg i¬«       | j                  |j                  d«       y )Nr%   rú   rÅ   rû   rG   r!   r  r  rÿ   s     r/   Útest_empty_pool_is_emptyz(StageCameraTest.test_empty_pool_is_empty=  sC   € Ü�'˜6 6¨5°"°bÓ9ˆØˆŒ	Ü˜�u˜b°¸2°Õ?Ø×Ñ˜Ÿ™ RÕ(r;   N)rL   rM   rN   r  r  r  rO   r;   r/   r	  r	  (  s   „ ò6ò1ó)r;   r	  c                   ó   — e Zd Zd„ Zy)ÚCliTestc                 óR  — dd l }|j                  t        j                  dddddddd	d
ddgt	        t
        «      j                  «       j                  j                  dd¬«      }| j                  |j                  d«       | j                  d|j                  |j                  z   «       y )Nr   zEngine/pack_builder.pyz--charÚ	Makima_v2z--themer•   z--packz	--dry-runz--levelsz15,16,14z--stagesz	9,9,9,9,9T)Úcwdr?   Úcapture_outputzno se pueden usar)Ú
subprocessÚrunÚsysÚ
executabler   Ú__file__ÚresolveÚparentrÄ   Ú
returncodero   ÚstdoutÚstderr)r-   r  Úresults      r/   Ú+test_cli_rejects_levels_and_stages_togetherz3CliTest.test_cli_rejects_levels_and_stages_togetherE  s”   € ÛØ—‘Ü�^‰^Ð5°xÀØ˜	 8¨[Ø˜ Z°ð>ô ”X“×&Ñ&Ó(×/Ñ/×6Ñ6Ø dð  ó ,ˆð 	×Ñ˜F×-Ñ-¨qÔ1Ø�‰Ð)¨6¯=©=¸6¿=¹=Ñ+HÕIr;   N)rL   rM   rN   r&  rO   r;   r/   r  r  D  s   „ ó	Jr;   r  c                   ó   — e Zd Zd„ Zy)ÚSelectPostsTestc                 óz  — dddœddddœddd	dœg}t        |d
d
d¬«      }|D ��cg c]  }|d   dk(  sŒ|d   D ]  }|‘Œ Œ }}}|D ��cg c]  }|d   dk(  sŒ|d   D ]  }|‘Œ Œ }}}| j                  d|«       | j                  d|«       | j                  d|«       | j                  d	|«       y c c}}w c c}}w )Nr%   zold.png)rC   Úfiler"   znew.png)rC   rB   r*  r&   r#   zexp.pngr2   r5   )ÚsfwÚexpÚper_postÚkindr+  Úfilesr,  )r   ro   rn   )r-   ÚrecordsÚpostsÚpÚfr+  r,  s          r/   Ú,test_spicy2_is_explicit_and_old_spicy_is_sfwz<SelectPostsTest.test_spicy2_is_explicit_and_old_spicy_is_sfwR  sÐ   € à yÑ1Ø¨¸)ÑDØ!¨KÀÑKð
ˆô
 ˜W¨!°¸QÔ?ˆÙÔJ™%�Q 1 V¡9°Ó#5¸qÀ¼z¸!Šq¸zˆq˜%ˆÑJÙÔJ™%�Q 1 V¡9°Ó#5¸qÀ¼z¸!Šq¸zˆq˜%ˆÑJØ�‰�i Ô%Ø×Ñ˜ CÔ(Ø�‰�i Ô%Ø�‰�i Õ%ùó KùÛJs   ¥B1³B1Á	B7ÁB7N)rL   rM   rN   r4  rO   r;   r/   r(  r(  Q  s   „ ó&r;   r(  Ú__main__)5rh   r¿   r  rZ   ÚunittestÚpathlibr   rj   ÚinsertÚstrr  r   r!  Ústagesr   r   r   r   r   r	   r
   r   r   r   r   Ú
pose_scener   r   Úpack_builderr   r   r   r   r   r   r   r   r   r   Úselect_x_postsr   ÚTestCaser   rQ   rt   r“   r®   rÔ   r	  r  r(  rL   ÚmainrO   r;   r/   Ú<module>r@     s;  ðÛ Û Û 
Û Û Ý à ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×6Ñ6Ó7Ô 8÷'÷ '÷ 'ñ '÷ :÷A÷ A÷ Aõ (ô#$�X×&Ñ&ô #$ôL5�X×&Ñ&ô 5ô:S�H×%Ñ%ô SôD!-�h×'Ñ'ô !-ôHJ˜8×,Ñ,ô Jô<hB�h×'Ñ'ô hBôV)�h×'Ñ'ô )ô8
Jˆh×Ñô 
Jô&�h×'Ñ'ô &ð  ˆzÒØ€H‡M�M…Oð r;   