§
    =iÈjÓ4  ã                   ó(  — 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ZddlZddlmZ ddlZddlZddlZddlmZ  ee¦  «                             ¦   «         j        j        Zej                             d eedz  ¦  «        ¦  «         ddlmZmZmZm Z m!Z!  ej"        d¬¦  «        d	„ ¦   «         Z#	 	 	 	 	 	 d!dede$de$de$de$de%de&defd„Z' G d„ d¦  «        Z( G d„ d¦  «        Z) G d„ d¦  «        Z*e+dk    r ej,        ed g¦  «         dS dS )"u(  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - ADVERSARIAL CRITIC GATE TEST SUITE
=============================================================================
Milestone M1 Challenger Empirical Verification Harness.
Adversarially tests:
1. Pydantic v2 Schema: round-trip serialization, boundary conditions (0.79 vs 0.80),
   invalid types, out-of-range floats, nan/inf, action overrides.
2. evaluate_shot_gate (Táº§ng 1):
   - Corrupted files (0-byte, invalid headers, truncated).
   - Missing files.
   - Black frames defect detection.
   - Frozen frames defect detection and score behavior.
   - Ultra-short / 1-frame video behavior.
   - Character cross-contamination detection.
3. evaluate_scene_gate (Táº§ng 2):
   - Smooth flow across sequential shots.
   - Severe color shift triggering color match.
   - Empty input list resilience.
   - Adversarial edge case: missing and corrupted files in scene list.
=============================================================================
é    N)ÚPath)ÚValidationErrorÚ05_Production_Pipeline)ÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluationÚevaluate_shot_gateÚevaluate_scene_gateÚsession)Úscopec              #   ó‚   K  — |                       d¦  «        }|V — t          j        t          |¦  «        d¬¦  «         dS )uJ   ThÆ° má»¥c táº¡m thá»�i sinh video cho cÃ¡c bÃ i kiá»ƒm tra Ä‘á»‘i khÃ¡ng.Úadv_critic_mediaT)Úignore_errorsN)ÚmktempÚshutilÚrmtreeÚstr)Útmp_path_factoryÚtemp_dirs     ú>C:\Projects\KieuStory\tests\test_adversarial_critic_gate_m1.pyÚadv_media_dirr   0   sF   è è € ð  ×&Ò&Ð'9Ñ:Ô:€HØ
€N€N€NÝ
„M•#�h‘-”-¨tÐ4Ñ4Ô4Ð4Ð4Ð4ó    é0   é   é   éÐ  ©éd   é–   éÈ   TÚfilepathÚ
num_framesÚfpsÚwidthÚheightÚ	color_bgrÚ	is_motionÚreturnc           	      ó:  — t          j        dŽ }t          j        t          | ¦  «        ||||f¦  «        }	 t	          |¦  «        D ]¦}	t          j        ||df|t
          j        ¬¦  «        }
|rit          t          j	        |	dz  ¦  «        dz  ¦  «        }t          |dz  |dz  z   ¦  «        }t          j
        |
|t          |dz  ¦  «        fdd	d
¦  «         |                     |
¦  «         Œ§	 |                     ¦   «          n# |                     ¦   «          w xY w| S )u-   HÃ m phá»¥ trá»£ sinh file video MP4 chuáº©n.Úmp4vé   )Údtypeg      $@é   é   é
   é<   )éÿ   r1   r1   éÿÿÿÿ)Úcv2ÚVideoWriter_fourccÚVideoWriterr   ÚrangeÚnpÚfullÚuint8ÚintÚsinÚcircleÚwriteÚrelease)r!   r"   r#   r$   r%   r&   r'   ÚfourccÚoutÚiÚframeÚoffsetÚcxs                r   Ú_write_mp4_videorE   8   s  € õ Ô# VÐ,€FÝ
Œ/�#˜h™-œ-¨°°u¸f°oÑ
FÔ
F€Cð
Ý�zÑ"Ô"ð 	ð 	ˆAÝ”G˜V U¨AÐ.°	ÅÄÐJÑJÔJˆEØð Rå�RœV A¨¡HÑ-Ô-°Ñ2Ñ3Ô3�Ý˜ ™ V¨b¡[Ñ0Ñ1Ô1�Ý”
˜5 2¥s¨6°A©:¡¤Ð"7¸¸_ÈbÑQÔQÐQØ�IŠI�eÑÔÐÐð	ð 	�Š‰Œˆˆøˆ�Š‰ŒˆˆøøøØ€Os   ¶B6D ÄDc                   ót  — e Zd Zd„ Zd„ Zd„ Zej                             ddddd e	d	¦  «         e	d
¦  «         e	d¦  «        ddg	¦  «        d„ ¦   «         Z
ej                             ddd e	d	¦  «        dg¦  «        d„ ¦   «         Zej                             ddd e	d	¦  «        dg¦  «        d„ ¦   «         ZdS )ÚTestPydanticAdversarialSchemac           
      ój  — t          ddddgddd¬¦  «        }t          dddd	dddd¬
¦  «        }t          dd||dd¬¦  «        }|                     ¦   «         }t          j        |¦  «        }||k    }|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  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }|j        }	ddg}
|	|
k    }|s½t          j        d|fd|	|
f¦  «        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}}
|j        }|j        }	d}
|	|
k    }|s½t          j        d|fd|	|
f¦  «        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}}
|j        }d}||u }	|	sªt          j        d|	fd||f¦  «        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}	}dS )!zKStress-test: round-trip serialization with all sub-models and defect lists.Tg\�Âõ(\ï?Úminor_grainÚedge_fringeFg®Gázî?)Úcharacter_matchÚcharacter_confidenceÚvisual_defectsÚsquint_or_extra_limbsÚaudio_guard_okÚscoregq=
×£pí?g…ëQ¸í?)Újunction_smoothnessÚaxis_180_okÚ
eyeline_okÚcolor_continuityÚtrigger_color_matchÚtempo_okÚtrigger_trim_staticrP   gÃõ(\�Âí?ÚAPPROVEz)Stress-test: full hierarchical roundtrip.)Úoverall_scoreÚapprovedÚ	shot_evalÚ
scene_evalÚsuggested_actionÚcritique_notes©ú==)z%(py0)s == %(py2)sÚrestoredÚverdict)Úpy0Úpy2zassert %(py4)sÚpy4N)zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.shot_eval
}.visual_defects
} == %(py7)s©rc   rd   re   Úpy7úassert %(py9)sÚpy9)z[%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.scene_eval
}.junction_smoothness
} == %(py7)s©Úis©z0%(py2)s
{%(py2)s = %(py0)s.approved
} is %(py5)s©rc   rd   Úpy5úassert %(py7)srg   )r   r   r   Úmodel_dump_jsonÚmodel_validate_jsonÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr[   rM   r\   rQ   rZ   )Úselfr[   r\   rb   Údumpedra   Ú@py_assert1Ú@py_format3Ú@py_format5Ú@py_assert3Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10Ú@py_assert4Ú@py_format6s                   r   Ú!test_roundtrip_complete_hierarchyz?TestPydanticAdversarialSchema.test_roundtrip_complete_hierarchyW   sv  € å"Ø Ø!%Ø)¨=Ð9Ø"'ØØð
ñ 
ô 
ˆ	õ %Ø $ØØØ!Ø %ØØ %Øð	
ñ 	
ô 	
ˆ
õ %ØØØØ!Ø&ØFð
ñ 
ô 
ˆð ×(Ò(Ñ*Ô*ˆÝ%Ô9¸&ÑAÔAˆà˜7Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆx˜7Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆxÑ"Ô"Ð"Õ"Ô"ˆxÑ"Ô"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"˜7Ñ"Ô"Ð"Õ"Ô"˜7Ñ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"ØÔ!ÐRÐ!Ô0ÐR°]ÀMÐ4RÐRÐ0Ð4RÒRÐRÐRÐRÕRÔRÐRÐRÐRÐRÐ0Ð4RÐRÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔRˆxÑRÔRÐRÕRÔRˆxÑRÔRÐRÐRÕRÔRÐ!ÑRÔRÕRÔRÐ0ÑRÔRÕRÔRÐ4RÑRÔRÐRÐRÑRÐRÐRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRÐRØÔ"Ð>Ð"Ô6Ð>¸$Ð>Ð6¸$Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð6¸$Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆxÑ>Ô>Ð>Õ>Ô>ˆxÑ>Ô>Ð>Ð>Õ>Ô>Ð"Ñ>Ô>Õ>Ô>Ð6Ñ>Ô>Õ>Ô>¸$Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆxÑ(Ô(Ð(Õ(Ô(ˆxÑ(Ô(Ð(Ð(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r   c                 ó†  — t          dd¬¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        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}}t          dd¬¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        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}}t          dd¬¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        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}}t          dd¬¦  «        }	|	j        }d}||u }|sªt          j        d|fd||f¦  «        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}}dS )zGStress-test: exact boundary condition around 0.8000 (0.7999 vs 0.8000).g¸@‚âÇ˜é?rX   )rY   r]   Frj   rl   Úv_subrm   ro   rg   NgHáz®Gé?Úv_79çš™™™™™é?TÚv_80g|ò°Pkšé?Úv_super©
r   rZ   rr   rs   rt   ru   rv   rw   rx   ry   )
rz   rˆ   r|   r„   r   r…   r‚   r‰   r‹   rŒ   s
             r   Útest_score_boundary_precisionz;TestPydanticAdversarialSchema.test_score_boundary_precision|   sÐ  € õ #°È)ÐTÑTÔTˆØŒ~Ð& Ð&ˆ~ Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ~ Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Õ&Ô&ˆuÑ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Õ&Ô& Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&õ "°ÀyÐQÑQÔQˆØŒ}Ð% Ð%ˆ} Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ} Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆtÑ%Ô%Ð%Õ%Ô%ˆtÑ%Ô%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%õ "°ÈÐSÑSÔSˆØŒ}Ð$ Ð$ˆ} Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ} Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆtÑ$Ô$Ð$Õ$Ô$ˆtÑ$Ô$Ð$Ð$Õ$Ô$ˆ}Ñ$Ô$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$õ %°6ÈIÐVÑVÔVˆØÔÐ' 4Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'r   c                 óª  — t          dddd¬¦  «        }|j        }d}||u }|sªt          j        d|fd||f¦  «        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}}dS )zLStress-test: even with perfect 1.0 score, RETAKE_SHOT forces approved=False.g      ð?TÚRETAKE_SHOTu+   Cáº§n quay láº¡i do vi pháº¡m ká»‹ch báº£n.)rY   rZ   r]   r^   Frj   rl   rb   rm   ro   rg   Nr�   ©rz   rb   r|   r„   r   r…   r‚   s          r   Ú'test_retake_action_overrides_high_scorezETestPydanticAdversarialSchema.test_retake_action_overrides_high_scoreŽ   s  € å$ØØØ*ØHð	
ñ 
ô 
ˆð ÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r   Úinvalid_valgü©ñÒMbP¿g      ð¿gj¼t“ð?g       @ÚnanÚinfz-infÚinvalid_textNc                 óŠ   — t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z[Stress-test: VideoCriticVerdict rejects out-of-range floats, NaNs, Infs, and invalid types.)rY   N)ÚpytestÚraisesr   r   ©rz   r“   s     r   Ú+test_invalid_overall_score_types_and_boundszITestPydanticAdversarialSchema.test_invalid_overall_score_types_and_bounds˜   s‰   € õ Œ]�?Ñ+Ô+ð 	:ð 	:Ý¨[Ð9Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:s   š8¸<¿<gš™™™™™¹¿gš™™™™™ñ?Úbadc                 ó  — t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zOStress-test: ShotEvaluation strictly validates confidence and score boundaries.)rL   N©rP   )r˜   r™   r   r   rš   s     r   Ú)test_shot_evaluation_boundary_constraintszGTestPydanticAdversarialSchema.test_shot_evaluation_boundary_constraints¢   s  € õ Œ]�?Ñ+Ô+ð 	=ð 	=Ý°Ð<Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=õ Œ]�?Ñ+Ô+ð 	.ð 	.Ý Ð-Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   š7·;¾;ÁA9Á9A=Â A=c                 óŽ  — t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          |¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zSStress-test: SceneEvaluation strictly validates continuity and junction boundaries.)rQ   N)rT   rž   )r˜   r™   r   r   rš   s     r   Ú*test_scene_evaluation_boundary_constraintszHTestPydanticAdversarialSchema.test_scene_evaluation_boundary_constraints«   sy  € õ Œ]�?Ñ+Ô+ð 	=ð 	=Ý°Ð<Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=õ Œ]�?Ñ+Ô+ð 	:ð 	:Ý¨[Ð9Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:õ Œ]�?Ñ+Ô+ð 	/ð 	/Ý +Ð.Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s0   š7·;¾;ÁA8Á8A<Á?A<ÂB:Â:B>ÃB>)Ú__name__Ú
__module__Ú__qualname__r†   rŽ   r’   r˜   ÚmarkÚparametrizeÚfloatr›   rŸ   r¡   © r   r   rG   rG   V   s&  € € € € € ð#)ð #)ð #)ðJ(ð (ð (ð$)ð )ð )ð „[×Ò˜]Ø��e˜SØˆˆe‰Œ�e�e˜E‘l”l E E¨&¡M¤MØ˜ð-ñ ô ð
:ð :ñô ð
:ð
 „[×Ò˜]¨T°3¸¸¸e¹¼ÀeÐ,LÑMÔMð.ð .ñ NÔMð.ð „[×Ò˜]¨T°3¸¸¸e¹¼ÀeÐ,LÑMÔMð	/ð 	/ñ NÔMð	/ð 	/ð 	/r   rG   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestEvaluateShotGateAdversarialc                 ó2  — |dz  }|                      d¦  «         t          dt          |¦  «        d¬¦  «        }|j        }d}||k    }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||u}|sªt	          j        d|fd||f¦  «        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}}|j        }|j        }d}	||	k    }
|
s½t	          j        d|
fd||	f¦  «        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}
}	dS )zUStress-test: 0-byte file must be immediately rejected with score 0.0 and RETAKE_SHOT.zzero_byte.mp4r   Úshot_0bÚ	heuristic©Úforce_engineç        r_   ©z5%(py2)s
{%(py2)s = %(py0)s.overall_score
} == %(py5)srb   rm   ro   rg   NFrj   rl   r�   ©z8%(py2)s
{%(py2)s = %(py0)s.suggested_action
} == %(py5)s©úis not©z5%(py2)s
{%(py2)s = %(py0)s.shot_eval
} is not %(py5)s)zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.shot_eval
}.score
} == %(py7)srf   rh   ri   )Úwrite_bytesr	   r   rY   rr   rs   rt   ru   rv   rw   rx   ry   rZ   r]   r[   rP   )rz   r   Úprb   r|   r„   r   r…   r‚   r€   r�   rƒ   s               r   Ú'test_shot_gate_zero_byte_corrupted_filezGTestEvaluateShotGateAdversarial.test_shot_gate_zero_byte_corrupted_file½   sÁ  € à˜OÑ+ˆØ	�Š�cÑÔÐå$ Yµ°A±´À[ÐQÑQÔQˆØÔ$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ'Ð8¨=Ð8Ð'¨=Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð'¨=Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Ð8Õ8Ô8Ð'Ñ8Ô8Õ8Ô8¨=Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÔ Ð,¨Ð,Ð ¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð ¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Ð,Õ,Ô,Ð Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔ Ð-Ð Ô&Ð-¨#Ð-Ð&¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð&¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Ð-Õ-Ô-Ð Ñ-Ô-Õ-Ô-Ð&Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r   c                 óú  — |dz  }|                      d¦  «         t          dt          |¦  «        d¬¦  «        }|j        }d}||k    }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt	          j        d|fd||f¦  «        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}}dS )zFStress-test: file with garbage header must be rejected with score 0.0.zgarbage_header.mp4s%       ftypmp42RANDOM_CORRUPT_BYTES_DATAÚshot_garbager­   r®   r°   r_   r±   rb   rm   ro   rg   NFrj   rl   r�   r²   )r¶   r	   r   rY   rr   rs   rt   ru   rv   rw   rx   ry   rZ   r]   )	rz   r   r·   rb   r|   r„   r   r…   r‚   s	            r   Ú&test_shot_gate_truncated_garbage_byteszFTestEvaluateShotGateAdversarial.test_shot_gate_truncated_garbage_bytesÉ   sã  € àÐ0Ñ0ˆØ	�ŠÐJÑKÔKÐKå$ ^µS¸±V´VÈ+ÐVÑVÔVˆØÔ$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ'Ð8¨=Ð8Ð'¨=Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð'¨=Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Ð8Õ8Ô8Ð'Ñ8Ô8Õ8Ô8¨=Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8r   c                 ó¬  — t          ddd¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        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}}|j
        }d}||u }|sªt          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        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}}dS )zFStress-test: non-existent file path returns score 0.0 and RETAKE_SHOT.Úshot_missingz$c:/no_such_directory/nonexistent.mp4r­   r®   r°   r_   r±   rb   rm   ro   rg   NFrj   rl   r�   r²   )r	   rY   rr   rs   rt   ru   rv   rw   rx   ry   rZ   r]   r‘   s          r   Ú$test_shot_gate_nonexistent_file_pathzDTestEvaluateShotGateAdversarial.test_shot_gate_nonexistent_file_pathÓ   sÁ  € å$ ^Ð5[ÐjuÐvÑvÔvˆØÔ$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ'Ð8¨=Ð8Ð'¨=Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð'¨=Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Ð8Õ8Ô8Ð'Ñ8Ô8Õ8Ô8¨=Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8r   c                 óv  — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        d¬¦  «        }|j        }d	}||k     }|sªt	          j        d
|fd||f¦  «        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}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt	          j        d|fd||f¦  «        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}}d„ |j        j        D ¦   «         }t!          |¦  «        }|s•ddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}dS )z<Stress-test: 100% black frames video must fail quality gate.zpure_black_120f.mp4éx   )r   r   r   F©r"   r&   r'   Ú
shot_blackr­   r®   rŠ   ©ú<©z4%(py2)s
{%(py2)s = %(py0)s.overall_score
} < %(py5)srb   rm   ro   rg   Nrj   rl   r�   r_   r²   c              3   ó   K  — | ]}d |v V — Œ	dS )zBlack frameNr¨   ©Ú.0Úds     r   ú	<genexpr>zSTestEvaluateShotGateAdversarial.test_shot_gate_pure_black_frames.<locals>.<genexpr>ã   s'   è è € ÐPÐP¨!�= AÐ%ÐPÐPÐPÐPÐPÐPr   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©rc   rd   re   )rE   r	   r   rY   rr   rs   rt   ru   rv   rw   rx   ry   rZ   r]   r[   rM   rË   ©
rz   r   r·   rb   r|   r„   r   r…   r‚   r~   s
             r   Ú test_shot_gate_pure_black_framesz@TestEvaluateShotGateAdversarial.test_shot_gate_pure_black_framesÚ   s£  € àÐ1Ñ1ˆÝ˜ s°iÈ5ÐQÑQÔQÐQå$ \µ3°q±6´6ÈÐTÑTÔTˆØÔ$Ð+ tÐ+Ð$ tÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$ tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ'Ð8¨=Ð8Ð'¨=Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð'¨=Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Ð8Õ8Ô8Ð'Ñ8Ô8Õ8Ô8¨=Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØPÐP¨wÔ/@Ô/OÐPÑPÔPÐP�sÐPÑPÔPÐPÐPÐPÐPÐPÕPÔPÑPÔPÐPÐPÕPÔP�sÑPÔPÐPÕPÔP�sÑ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ÐPr   c                 ó¶  — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        d¬¦  «        }|j        }d	}||u}|sªt	          j        d
|fd||f¦  «        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}}d„ |j        j        D ¦   «         }t          |¦  «        }|s·t	          j        d|j        j        › �¦  «        dz   dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚d	x}}d	S )z’
        Stress-test: frozen frames (zero motion across 120 frames / 5 seconds)
        must register the defect 'Frozen video detected'.
        zfrozen_120f.mp4rÀ   )rÀ   éŒ   é    FrÁ   Úshot_frozenr­   r®   Nr³   rµ   rb   rm   ro   rg   c              3   ó   K  — | ]}d |v V — Œ	dS )ÚFrozenNr¨   rÇ   s     r   rÊ   z`TestEvaluateShotGateAdversarial.test_shot_gate_frozen_frames_defect_reporting.<locals>.<genexpr>ï   s&   è è € ÐKÐK Q�8˜q�=ÐKÐKÐKÐKÐKÐKr   z*Expected 'Frozen' defect in defects list: z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rË   rÌ   )rE   r	   r   r[   rr   rs   rt   ru   rv   rw   rx   ry   rM   rË   Ú_format_assertmsgrÍ   s
             r   Ú-test_shot_gate_frozen_frames_defect_reportingzMTestEvaluateShotGateAdversarial.test_shot_gate_frozen_frames_defect_reportingå   sn  € ð
 Ð-Ñ-ˆÝ˜ s°oÐQVÐWÑWÔWÐWå$ ]µC¸±F´FÈÐUÑUÔUˆØÔ Ð,¨Ð,Ð ¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð ¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Ð,Õ,Ô,Ð Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØKÐK¨'Ô*;Ô*JÐKÑKÔKð 	
�sÐKÑKÔKð 	
ÐKð 	
õ 	
ìð \¸Ô9JÔ9YÐ[Ð[ñ	
ô 	
ð 	
ñ 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ ñ 	
ô 	
ð 	
õ 	
ä 	õ ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð Lñ 	
ô 	
õ 	
ä 	ð Lñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r   c                 ó  — t           dz  dz  dz  dz  }|                     ¦   «         st          j        d¦  «         t	          j        t          |¦  «        ¦  «        }|€t          j        d¦  «         |dz  }t	          j        d	Ž }|j        dd
…         \  }}t	          j	        t          |¦  «        |d||f¦  «        }	 t          d¦  «        D ]}	|                     |¦  «         Œ	 |                     ¦   «          n# |                     ¦   «          w xY wt          dt          |¦  «        dd¬¦  «        }
g }|
j        }|j        }d}||u }|}|s|
j        }d}||k     }|}|�s‘t#          j        d|fd||f¦  «        dt'          j        ¦   «         v st#          j        |
¦  «        rt#          j        |
¦  «        ndt#          j        |¦  «        t#          j        |¦  «        t#          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |sžt#          j        d|fd||f¦  «        dt'          j        ¦   «         v st#          j        |
¦  «        rt#          j        |
¦  «        ndt#          j        |¦  «        t#          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t#          j        |d¦  «        i z  }dd |iz  }t3          t#          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}}dS )!u¶   
        Stress-test: if expected character is Kim Trá»�ng, but video frame matches
        ThÃºy Kiá»�u master portrait, the gate must detect character cross-contamination.
        Ú	04_AssetsÚ
charactersÚ01_Main_Protagonistszthuy_kieu_maiden_16yo_720p.pngz,Thuy Kieu master portrait not found on disk.Nz"Unable to read Thuy Kieu portrait.zsimulated_kieu_video.mp4r*   r.   r   r   Úep01_scene07_shot01Ú	kim_trongr­   )Úshot_idÚ
video_pathÚexpected_characterr¯   FrŠ   rj   )zV%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.shot_eval
}.character_match
} is %(py9)srb   )rd   re   Úpy6ri   z%(py11)sÚpy11rÃ   )z8%(py15)s
{%(py15)s = %(py13)s.overall_score
} < %(py18)s)Úpy13Úpy15Úpy18z%(py20)sÚpy20é   zassert %(py23)sÚpy23)ÚPROJECT_ROOTÚexistsr˜   Úskipr3   Úimreadr   r4   Úshaper5   r6   r=   r>   r	   r[   rK   rY   rr   rs   rt   ru   rv   rw   ÚappendÚ_format_booloprx   ry   )rz   r   Úkieu_portraitÚkieu_imgr·   r?   ÚhÚwr@   Ú_rb   r|   r   r�   Ú@py_assert8Ú@py_assert7Ú@py_assert0Ú@py_assert14Ú@py_assert17Ú@py_assert16rƒ   Ú@py_format12Ú@py_format19Ú@py_format21Ú@py_format22Ú@py_format24s                             r   Ú,test_shot_gate_character_cross_contaminationzLTestEvaluateShotGateAdversarial.test_shot_gate_character_cross_contaminationó   sˆ  € õ
 % {Ñ2°\ÑAÐDZÑZÐ]}Ñ}ˆØ×#Ò#Ñ%Ô%ð 	HÝŒKÐFÑGÔGÐGå”:�c -Ñ0Ô0Ñ1Ô1ˆØÐÝŒKÐ<Ñ=Ô=Ð=ð Ð6Ñ6ˆÝÔ'¨Ð0ˆØŒ~˜b˜q˜bÔ!‰ˆˆ1ÝŒo�c !™fœf f¨b°1°a°&Ñ9Ô9ˆð	Ý˜2‘Y”Yð $ð $�Ø—	’	˜(Ñ#Ô#Ð#Ð#ð$ð �KŠK‰MŒMˆMˆMøˆC�KŠK‰MŒMˆMˆMøøøå$Ø)Ý˜1‘v”vØ*Ø$ð	
ñ 
ô 
ˆð 	ZÐYˆwÔ ÐYÐ Ô0ÐY°EÐYÐ0°EÐ9ÐYÐYÐYÐYÐY¸WÔ=RÐYÐUYÐYÐ=RÐUYÒ=YÐYÐYÐYÐYÑYÕYÔYÐYÐYÐYÐYÐ0°EÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆwÑYÔYÐYÕYÔYˆwÑYÔYÐYÐYÕYÔYÐ ÑYÔYÕYÔYÐ0ÑYÔYÕYÔY°EÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÐY×YÒYÐYÑYÔYÐYÐYÐYÕYÔYÐYÐYÐYÐYÐ=RÐUYÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔY¸WÑYÔYÐYÕYÔY¸WÑYÔYÐYÐYÕYÔYÐ=RÑYÔYÕYÔYÐUYÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÐY×YÒYÐYÑYÔYÐYÕYÔYÐYÐYÑYÔYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYs   Â?'C< Ã<DN)	r¢   r£   r¤   r¸   r»   r¾   rÎ   rÖ   rÿ   r¨   r   r   rª   rª   ¼   sv   € € € € € ð
.ð 
.ð 
.ð9ð 9ð 9ð9ð 9ð 9ð	Qð 	Qð 	Qð
ð 
ð 
ðZð Zð Zð Zð Zr   rª   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )Ú TestEvaluateSceneGateAdversarialc                 óú  — |dz  }|dz  }t          |ddd¬¦  «         t          |ddd¬¦  «         t          dt          |¦  «        t          |¦  «        gd¬	¦  «        }|j        }d
}||k    }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt	          j        d|fd||f¦  «        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}}|j        }|j        }d}
||
u }|s½t	          j        d|fd||
f¦  «        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}}
dS )zQStress-test: sequential shots with consistent color palette achieve score >= 0.8.zsmooth_shot_1.mp4zsmooth_shot_2.mp4r   r   TrÁ   Úscene_smoothr­   r®   rŠ   )ú>=)z5%(py2)s
{%(py2)s = %(py0)s.overall_score
} >= %(py5)srb   rm   ro   rg   Nrj   rl   rX   r_   r²   F©z[%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.scene_eval
}.trigger_color_match
} is %(py7)srf   rh   ri   )rE   r
   r   rY   rr   rs   rt   ru   rv   rw   rx   ry   rZ   r]   r\   rU   )rz   r   Ús1Ús2rb   r|   r„   r   r…   r‚   r€   r�   rƒ   s                r   Útest_scene_gate_smooth_flowz<TestEvaluateSceneGateAdversarial.test_scene_gate_smooth_flow  s  € àÐ0Ñ0ˆØÐ0Ñ0ˆÝ˜¨°oÐQUÐVÑVÔVÐVÝ˜¨°oÐQUÐVÑVÔVÐVå% nµs¸2±w´wÅÀBÁÄÐ6HÐWbÐcÑcÔcˆØÔ$Ð,¨Ð,Ð$¨Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Ð,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔÐ' 4Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ'Ð4¨9Ð4Ð'¨9Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð'¨9Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Ð4Õ4Ô4Ð'Ñ4Ô4Õ4Ô4¨9Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØÔ!Ð>Ð!Ô5Ð>¸Ð>Ð5¸Ð>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð5¸Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆwÑ>Ô>Ð>Õ>Ô>ˆwÑ>Ô>Ð>Ð>Õ>Ô>Ð!Ñ>Ô>Õ>Ô>Ð5Ñ>Ô>Õ>Ô>¸Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>r   c                 ó|  — |dz  }|dz  }t          |ddd¬¦  «         t          |ddd¬¦  «         t          dt          |¦  «        t          |¦  «        gd	¬
¦  «        }|j        }|j        }d}||u }|s½t          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        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}}|j        }d}||k     }|sªt          j        d|fd||f¦  «        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}}dS )zUStress-test: severe color shift (pure green vs pure red) triggers color match action.zpure_green_shot.mp4zpure_red_shot.mp4r   )r   r1   r   FrÁ   )r   r   r1   Úscene_color_shiftr­   r®   Trj   r  rb   rf   rh   ri   NÚAPPLY_COLOR_MATCHr_   r²   rm   ro   rg   rŠ   rÃ   rÅ   )rE   r
   r   r\   rU   rr   rs   rt   ru   rv   rw   rx   ry   r]   rY   )rz   r   r  r  rb   r|   r   r€   r�   r‚   rƒ   r„   r…   s                r   Ú7test_scene_gate_severe_color_shift_triggers_color_matchzXTestEvaluateSceneGateAdversarial.test_scene_gate_severe_color_shift_triggers_color_match'  s8  € àÐ2Ñ2ˆØÐ0Ñ0ˆÝ˜¨°kÈUÐSÑSÔSÐSÝ˜¨°kÈUÐSÑSÔSÐSå%Ð&9½CÀ¹G¼GÅSÈÁWÄWÐ;MÐ\gÐhÑhÔhˆØÔ!Ð=Ð!Ô5Ð=¸Ð=Ð5¸Ð=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð5¸Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=ˆwÑ=Ô=Ð=Õ=Ô=ˆwÑ=Ô=Ð=Ð=Õ=Ô=Ð!Ñ=Ô=Õ=Ô=Ð5Ñ=Ô=Õ=Ô=¸Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØÔ'Ð>Ð+>Ð>Ð'Ð+>Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð'Ð+>Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆwÑ>Ô>Ð>Õ>Ô>ˆwÑ>Ô>Ð>Ð>Õ>Ô>Ð'Ñ>Ô>Õ>Ô>Ð+>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÔ$Ð+ tÐ+Ð$ tÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$ tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r   c                 ó¬  — t          dg d¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        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}}|j
        }d}||u }|sªt          j        d|fd||f¦  «        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}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        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}}dS )zCStress-test: empty shot list must return score 0.0 and RETAKE_SHOT.Úscene_emptyr­   r®   r°   r_   r±   rb   rm   ro   rg   NFrj   rl   r�   r²   )r
   rY   rr   rs   rt   ru   rv   rw   rx   ry   rZ   r]   r‘   s          r   Ú$test_scene_gate_empty_list_rejectionzETestEvaluateSceneGateAdversarial.test_scene_gate_empty_list_rejection3  s¿  € å% m°RÀkÐRÑRÔRˆØÔ$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Õ+Ô+ˆwÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Õ(Ô(ˆwÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ'Ð8¨=Ð8Ð'¨=Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð'¨=Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Ð8Õ8Ô8Ð'Ñ8Ô8Õ8Ô8¨=Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8r   N)r¢   r£   r¤   r  r  r  r¨   r   r   r  r    sA   € € € € € ð?ð ?ð ?ð
,ð 
,ð 
,ð9ð 9ð 9ð 9ð 9r   r  Ú__main__z-v)r   r   r   r   r   T)-Ú__doc__Úbuiltinsrt   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterr   ÚosÚsysÚjsonÚmathÚtempfiler   Úpathlibr   r˜   Únumpyr7   r3   Úpydanticr   Ú__file__ÚresolveÚparentrè   ÚpathÚinsertr   Úantigravity_critic_gater   r   r   r	   r
   Úfixturer   r:   ÚtupleÚboolrE   rG   rª   r  r¢   Úmainr¨   r   r   ú<module>r(     s—  ððð ð. € € € € € € € € € € € € €	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø $Ð $Ð $Ð $Ð $Ð $àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø „‡‚��3�3�|Ð&>Ñ>Ñ?Ô?Ñ @Ô @Ð @ðð ð ð ð ð ð ð ð ð ð ð ð ð ð €„�iÐ Ñ Ô ð5ð 5ñ !Ô ð5ð ØØØØ&Øðð Øðàðð 
ðð ð	ð
 ðð ðð ðð 
ðð ð ð ð<_/ð _/ð _/ð _/ð _/ñ _/ô _/ð _/ðLVZð VZð VZð VZð VZñ VZô VZð VZðz9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ðD ˆzÒÐØ€F„K�˜4Ð Ñ!Ô!Ð!Ð!Ð!ð Ðr   