
    ;\Sj>&                     n   d Z ddlZddlmc mZ ddlZddlm	Z	m
Z
 g dZ G d d      Zde
fdZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zedk(  rddlZ e e        jC                               D  cg c]  \  } }| jE                  d      s| c}} Z#dZ$e#D ]  Z%	  e%         e&de%j:                          !  e&d e)e#      e$z
   d e)e#       d        e*e$rd      d      yc c}} w # e'$ r. e$dz  Z$ e&de%j:                           ejP                          Y w xY w) u  Frustration meter (voice.frustration): the simmer→overflow curve, pure logic.

What's under test, without any audio or LLM:
  1. the interface main.py depends on (level/mood_tag/attitude/exploded/reasons)
  2. ordinary varied talk stays composed forever (no drift-into-anger)
  3. repeats climb the meter and the stages progress in order, never backwards
  4. time cools it — one bad minute is forgotten, not carried for an hour
  5. appreciation vents it; overflow is EARNED (several asks), rare in a mixed
     session, and refractory right after a blow-up (one tantrum per scene)
  6. the meter reads the prosody tone note — shouting heats it faster

Run: `python -m pytest test_frustration.py`  (or standalone: `python test_frustration.py`).
    N)FrustrationMeter
FrustState)composedcurtclippedsnappingseethingoverflowc                   (    e Zd ZdZddZdedefdZy)ClockuF   Deterministic monotonic time — every update passes `now` explicitly.returnNc                     d| _         y )Ng     @@t)selfs    >/Users/ahmed/devFolder/Ultron/claude-voice/test_frustration.py__init__zClock.__init__   s	        sc                 D    | xj                   |z  c_         | j                   S )Nr   )r   r   s     r   tickz
Clock.tick   s    !vvr   )r   N)__name__
__module____qualname____doc__r   floatr    r   r   r   r      s    Pe  r   r   r   c                 J     | j                   |fd|j                  |      i|S )Nnow)updater   )meterclocktextgapkws        r   _runr&   "   s%    5<<8%**S/8R88r   c            	         t               t               }} t        | |dd      }dD ]0  }t        ||      }|st	        j
                  d|       dz   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                  |      d	z  }t        t	        j                  |            d }3 g }|j                  }t        |t              }|}	|r|j                  }
t        |
t               }|}	|	sed
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t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }|j#                  |       |rd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t	        j                  
      dt        j                         v st	        j                  t               rt	        j                  t               ndt	        j                        dz  }|j#                  |       t	        j$                  |d      i z  }dd|iz  }t        t	        j                  |            d x}	x}x}x}x}
}|j&                  }d}||v }|st	        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} ||      }|j&                  }d}||v }|st	        j(                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       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}}y ) Nzhello there jarvis        )levelmood_tagattitudeexplodedreasonsstagezFrustState must expose .z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}hasattrstf)py0py1py2py4zI%(py8)s
{%(py8)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.level
}, %(py6)s)
}
isinstancer   )r4   py3py5py6py8zR%(py16)s
{%(py16)s = %(py10)s(%(py13)s
{%(py13)s = %(py11)s.reasons
}, %(py14)s)
}list)py10py11py13py14py16r   zassert %(py19)spy19)calmdryannoyedurgentin)z0%(py2)s
{%(py2)s = %(py0)s.mood_tag
} in %(py5)sr2   r4   r8   assert %(py7)spy7open chrome)zk%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.update
}(%(py4)s)
}.mood_tag
} in %(py11)sm)r2   r4   r5   r9   r:   r=   zassert %(py13)sr>   )r   r   r&   r/   
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr)   r6   r   r-   r;   append_format_boolopr*   _call_reprcomparer    )rL   cr0   r1   @py_assert3@py_format5@py_assert1@py_assert4@py_assert7@py_assert0@py_assert12@py_assert15@py_format9@py_format17@py_format18@py_format20@py_format6@py_format8@py_assert5@py_assert10@py_assert9@py_format12@py_format14s                          r   test_interface_fields_presentrl   (   s   uwqA	a(#	.BNr1~=~==!9!=======w===w======r===r======1===1===~====== OGbhhG:h&G&G&bjjG:j$+GG+GGGGGGG:GGG:GGGGGGbGGGbGGGhGGGGGGGGGGGG&GGGG&GGGGG:GGG:GGGGGGbGGGbGGGjGGGGGG$GGG$GGG+GGGGGGGGGGGGGG;;>>>;>>>>>;>>>>>>>2>>>2>>>;>>>>>>>>>>>88 :M :8M" :"++ : 0: :+ 0: : :(9(9:+ 0: : :396: :!9!9  : :09	  : :09	  : :09	 " : :09	 # : :09	 , : :09	0: : : : :&9&9: : :r   c                  z   dt         j                  d<   	 t               } | j                  d      }g }|j                  }d}||k(  }|}|r|j
                  }d}||k(  }	|	}|st        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}	}g }|j                   }d }||u }|}|r|j"                  }| }	|	}|sLt        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  }|j                  |       |rlddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}}	t         j                  j%                  dd        y # t         j                  j%                  dd        w xY w)N0FRUSTRATIONz same thing same thing same thingr(   rB   ==)z-%(py4)s
{%(py4)s = %(py2)s.level
} == %(py7)sr0   r4   r5   rJ   %(py9)spy9)z4%(py13)s
{%(py13)s = %(py11)s.mood_tag
} == %(py16)sr=   r>   r@   %(py18)spy18r   assert %(py21)spy21is)z0%(py4)s
{%(py4)s = %(py2)s.attitude
} is %(py7)sz,not %(py13)s
{%(py13)s = %(py11)s.exploded
})r=   r>   zassert %(py17)spy17)osenvironr   r    r)   r*   rM   rW   rO   rP   rQ   rR   rU   rV   rS   rT   r+   r,   pop)rL   r0   r[   rY   @py_assert6rg   r^   r_   r`   @py_assert14rf   @py_format10rb   @py_format19rd   @py_format22@py_format15@py_format16rc   s                      r   test_kill_switchr   4   s	    #BJJ},XX898rxx838x382;;8&8;&#88888x3888888r888r888x88838888888;&88888828882888;888&888888888888886r{{6d6{d"62;;6;6666{d666666r666r666{666d666666666626662666;6666666666666


}d+

}d+s   M"N "N:c            
         t               t               }} g d}d }t        d      D ]  }t        | |||t	        |      z     d| z   d      }|j
                  }| }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d x}} g }|j                  }d}||k(  }	|	}
|	r|j                  }d }||u }|}
|
st        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  }|j!                  |       |	rt        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  }|j!                  |       t        j"                  |d      i z  }dd|iz  }t        t        j                  |            d x}
x}x}x}	x}x}x}}|j$                  }d}||k  }|st        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}}y )N)z%good morning jarvis how are you todayzwhat's the weather looking likez%remind me about the meeting with saadz%did the scraper finish the riyadh runzplay some music pleasez&what do you think of the new dashboardz tell me a joke about programmersz!how long until the deploy is done(   z	 variant g      .@z0assert not %(py2)s
{%(py2)s = %(py0)s.exploded
}lastr2   r4   r   rp   )z-%(py4)s
{%(py4)s = %(py2)s.stage
} == %(py7)srr   rs   rt   rz   z4%(py13)s
{%(py13)s = %(py11)s.attitude
} is %(py16)sru   rv   rw   r   rx   ry   333333?<z,%(py2)s
{%(py2)s = %(py0)s.level
} < %(py5)srH   rI   rJ   )r   r   ranger&   lenr,   rO   rP   rM   rQ   rR   rS   rT   r.   r+   rW   rU   rV   r)   )rL   rX   linesr   ir[   rY   @py_format4r   rg   r^   r_   r`   r   rf   r   rb   r   rd   r   r\   re   s                         r   test_varied_chat_never_heatsr   A   s   uwqA	E D2YAq%CJ/IaS/A4H== =        4   4   =        >4::==:#===(=====:======4===4===:=======================================::::44:r   c                  *   t               t               }} g }d }t        d      D ];  }t        | |dd      }|j	                  |j
                         |j                  s9|} n |D cg c]  }t        j                  |       }}t        |      }||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                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
t        j                   d	|       d
z   d|
iz  }t#        t        j$                  |            d x}	}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                   d      dz   d|iz  }
t#        t        j$                  |
            d x}}d }||u}	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                   d      dz   d|iz  }
t#        t        j$                  |
            d x}	}d}||k\  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                   d|dz          dz   d|iz  }
t#        t        j$                  |
            d x}	}y c c}w )N   zwhen is the bloomwell deadlineg      4@rp   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}idxsorted)r2   r4   r7   r8   z'stages must not regress while heating: 
>assert %(py7)srJ   r   rF   )z%(py1)s in %(py3)sseen)r3   r7   z(the first simmer stage should be visited
>assert %(py5)sr8   is not)z%(py0)s is not %(py3)sexploded_atr2   r7   z&sustained identical asks must overflow   >=)z%(py0)s >= %(py3)su#   overflow too cheap — blew on ask    )r   r   r   r&   rU   r.   r,   _STAGE_ORDERindexr   rM   rW   rO   rP   rQ   rR   rN   rS   rT   )rL   rX   r   r   r   r0   r   r   r\   r[   re   rf   r^   @py_assert2r   s                  r   &test_repeats_climb_and_stages_progressr   W   s\   uwqADK1X!Q8$?BHH;;K  +/
/$Q<a $C
/+O3+OOO3+OOOOOO3OOO3OOOOOO&OOO&OOOOOOOOOOOO+OOO!HOOOOOOOE6T>EEE6TEEE6EEEEEETEEETEEEEEEEEEEE"L;d"LLL;dLLLLLL;LLL;LLLdLLL$LLLLLLLR;!RRR;!RRRRRR;RRR;RRR!RRRB;q=/RRRRRRR	 0s   &Pc                     t               t               }} i }t        d      D ]C  }t        | |dd      }|j                  r|j                  ||j
                  <   |j                  sC n t        |      }d}||k\  }|st        j                  d|fd||f      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t        j                  |      t        j                  |      d	z  }t        j                  d
      dz   d|iz  }	t        t        j                   |	            d x}x}}t#        |j%                               }
t'        |
      }t        |      }t        |
      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nd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t        j                  |      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t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                   |            d x}x}x}}d |
D        }t)        |      }|sd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}}y )Nr   zopen the ultron dashboard now      @   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   hints)r2   r3   r7   r9   z.should pass through at least two simmer stages
>assert %(py8)sr:   rp   )zn%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py11)s
{%(py11)s = %(py8)s(%(py9)s)
}settexts)r2   r3   r4   r5   r9   r:   rt   r=   zeach stage needs its own voicez
>assert %(py13)sr>   c              3   $   K   | ]  }d |v  
 yw)(Nr   ).0r   s     r   	<genexpr>z7test_attitude_texts_differ_per_stage.<locals>.<genexpr>v   s     'Asaxs   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r2   r4   r5   )r   r   r   r&   r+   r.   r,   r   rM   rW   rO   rP   rQ   rR   rN   rS   rT   r;   valuesr   r   )rL   rX   r   _r0   r   rg   r\   @py_format7ra   r   rY   rh   r]   rj   rk   r[   rZ   s                     r   $test_attitude_texts_differ_per_stager   i   sk   uwqAE1X!Q7=;; kkE"((O;;  u:LL:?LLL:LLLLLL3LLL3LLLLLLuLLLuLLL:LLLLLLLLLLLLLL E5zJ3z?Jc%jJ?j(JJJ?jJJJJJJ3JJJ3JJJJJJsJJJsJJJJJJ5JJJ5JJJzJJJ?JJJJJJcJJJcJJJJJJ%JJJ%JJJjJJJ*JJJJJJJJ'''3'''''''''3'''3''''''''''''''r   c                  2   t               t               }} t        | |dd       t        | |dd      }t        | |dd      }|j                  }|j                  |j                  dz  z
  }g }|j                  }||z
  }||kD  }	|	}
|	sd}|j                  }||v }|}
|
st        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	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }dd|iz  }|j                  |       |	st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      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}}y )Nzwhat time is the flight      $@gh?zasked 3x>)z8%(py2)s > (%(py4)s - %(py7)s
{%(py7)s = %(py5)s.level
})rise_3rdrise_2nda)r4   r5   r8   rJ   z%(py10)sr<   rF   )z3%(py13)s in %(py17)s
{%(py17)s = %(py15)s.reasons
}b)r>   py15r|   z%(py19)srA   r   zassert %(py22)spy22)r   r   r&   r)   r-   rM   rW   rO   rP   rQ   rR   rU   rV   rS   rT   )m1c1r   r   r   r   r[   r   @py_assert8rY   r^   r_   @py_assert16r   ra   @py_format11rc   rd   @py_format21@py_format23s                       r   &test_third_ask_stings_more_than_secondr   y   s   BR*D1R.5AR.5AwwHww#888HCCh(C8((CJC!))CJ),CCCCC8(CCCCCC8CCC8CCCCCChCCChCCCCCCCCCCCCCCCCCCCJ)CCCJCCCCCC!CCC!CCC)CCCCCCCCCCCCCCr   c                     t               t               }} t        d      D ]  }t        | |dd      }t        | |dd      }  j                  }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d	      d
z   d|iz  }t        t        j                  |            d x}x}}t        | |dd      }	g }|	j                  }d}
||
k  }|}|r|	j                  }d}||k(  }|}|st        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  }|j                  |       |rt        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  }|j                  |       t        j                   |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}
x}x}}|	j"                  }d }||u }|st        j                  d|fd||f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      dz  }t        j                  d       d
z   d|iz  }t        t        j                  |            d x}x}}y )!Nr   zcheck the scraper statusg      @g?r   )z,%(py2)s
{%(py2)s = %(py0)s.level
} > %(py5)sr0   rH   z(sanity: the pestering actually heated itr   rJ   zgood morning jarvis lovely dayg     @皙?r   r   )z,%(py4)s
{%(py4)s = %(py2)s.level
} < %(py7)srB   rr   rs   rt   rp   )z1%(py13)s
{%(py13)s = %(py11)s.stage
} == %(py16)sru   rv   rw   r   rx   ry   rz   )z0%(py2)s
{%(py2)s = %(py0)s.attitude
} is %(py5)sz$ten quiet minutes must fully forgive)r   r   r   r&   r)   rM   rW   rO   rP   rQ   rR   rN   rS   rT   r.   rU   rV   r+   )rL   rX   r   r0   r[   r\   rY   re   rf   rB   r   rg   r^   r_   r`   r   r   rb   r   rd   r   s                        r   test_time_cools_it_downr      s1   uwqA1X!Q2C8!Q2C8  88EcE8c>EEE8cEEEEEE2EEE2EEE8EEEcEEEEEEEEEEE16>D84::88:8

8j8
j 88888:88888848884888:8888888888
j888888888888
888j88888888888888==HDH=D HHH=DHHHHHH4HHH4HHH=HHHDHHH"HHHHHHHHr   c                     t               t               }} t        d      D ]  }t        | |dd      }t        | |dd      }  j                  }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}}t        | |dd      }|j                  }d}	||	z
  }
||
k  }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}x}	}
d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr   zrestart the dashboard service       @gffffff?r   )z%(py0)s > %(py3)shotr   zassert %(py5)sr8   z'thanks jarvis, brilliant work as alwaysr   r   r   )z8%(py2)s
{%(py2)s = %(py0)s.level
} < (%(py4)s - %(py6)s)r0   r2   r4   r5   r9   z+a thank-you should visibly vent the tensionz
>assert %(py9)srt   appreciatedrF   z/%(py1)s in %(py5)s
{%(py5)s = %(py3)s.reasons
}r3   r7   r8   rI   rJ   )r   r   r   r&   r)   rM   rW   rO   rP   rQ   rR   rS   rT   rN   r-   )rL   rX   r   r0   r   r   r[   r   re   rg   r]   rY   rf   r   r^   r\   s                   r   test_appreciation_ventsr      s   uwqA1X!Q7=!Q7=  ((C3:333	a=t	DB88NCNcCiN8iNNN8iNNNNNN2NNN2NNN8NNNNNNcNNNcNNNCNNN!NNNNNNNN&BJJ&=J&&&&=J&&&=&&&&&&B&&&B&&&J&&&&&&&r   c            
      p   t               t               }} g d}t        d      D ]  }t        | |||t	        |      z      d| d      }|j
                  }| }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d x}} j                  }d	}||k  }|st        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}}y )N)opencloseplaypausemutecheckrunstopx   z thingg      @z.barked orders alone must never cause a tantrumz2
>assert not %(py2)s
{%(py2)s = %(py0)s.exploded
}r0   r   
ףp=
?<=z-%(py2)s
{%(py2)s = %(py0)s.level
} <= %(py5)srH   rI   rJ   )r   r   r   r&   r   r,   rM   rN   rO   rP   rQ   rR   rS   rT   r)   rW   )rL   rX   verbsr   r0   r[   rY   r   r\   re   rf   s              r    test_overflow_needs_a_hot_reasonr      s   uwqANE3Z!Q5SZ01s;SA;;P;PPP PPPPPPP2PPP2PPP;PPPPPP  88t8t8t228tr   c                  t   t               t               }} d}g d}t        d      D ]P  }||t        |      z     }d|dz  dz  z   }|dv rd\  }}t	        | |||dv rd	nd
| z   |      }||j
                  z  }R d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
t        j                  d| d      dz   d|
iz  }t        t        j                  |            d x}	}y )Nr   )zhow is the riyadh scrape goingrK   zwhat should i eat tonightzsend the report to eliez%what do you think about the new voicezplay some jazz<   g      (@      )      r   )   )zdid the email go outr     rp   z%(py0)s == %(py3)sblowsr   z&a normal hour of use must not include z	 tantrumsr   r8   )r   r   r   r   r&   r,   rM   rW   rO   rP   rQ   rR   rN   rS   rT   )rL   rX   r   chatr   r#   r$   r0   r   r[   r   re   s               r   #test_overflow_rare_in_mixed_sessionr      s   uwqAED 2YAD	M"a!eq[   3ID#!Qa+;&;1QCI3O  P5A:PPP5APPPPPP5PPP5PPPAPPP?wiPPPPPPPr   c                     t               t               }} d}t        d      D ]  }t        | |dd      }||j                  z  }! d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }t        j                  d
| d      dz   d|iz  }t        t        j                  |            d x}}j                  }d}	||	k  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}
}	y )Nr      zwhy is it not workingr   r   rp   r   r   r   z$kept hammering inside the cooldown: z	 blow-upsr   r8   r   r   r   r0   rH   z0post-blow-up pestering parks at seething, cappedr   rJ   )r   r   r   r&   r,   rM   rW   rO   rP   rQ   rR   rN   rS   rT   r)   )rL   rX   r   r   r0   r   r[   r   re   r\   rY   rf   s               r   %test_refractory_one_tantrum_per_scener      s'   uwqAE2Y!Q/5  N5A:NNN5ANNNNNN5NNN5NNNANNN=eWINNNNNNN88OtO8tOOO8tOOOOOO2OOO2OOO8OOOtOOOOOOOOOOOr   c                     t               t               }} d }t        d      D ]  }t        | |dd      }|j                  s n g }d }||u}|}|r|j                  }|}|s8t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd	|	iz  }
|j                  |
       |rld
dt        j                         v st        j                  |      rt        j                  |      ndt        j                        dz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}}g }|j                  }d}||k(  }|}|r|j                   }d }||u }|}|st        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}}|j"                  }d}||k  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	t        j$                  d       d!z   d	|	iz  }
t        t        j                  |
            d x}x}}y )"Nr   zanswer me right nowr   r   )z%(py2)s is not %(py5)sr0   )r4   r8   z%(py7)srJ   z'%(py11)s
{%(py11)s = %(py9)s.exploded
})rt   r=   r   zassert %(py14)sr?   rE   rp   )z0%(py4)s
{%(py4)s = %(py2)s.mood_tag
} == %(py7)srr   rs   rt   rz   r   ru   rv   rw   rx   ry   r   r   r   rH   z1catharsis: the blow-up resets below the curt liner   )r   r   r   r&   r,   rM   rW   rO   rP   rQ   rR   rU   rV   rS   rT   r*   r+   r)   rN   )rL   rX   r0   r   r[   r\   rY   r^   rh   re   rf   rj   @py_format13r   r   rg   r_   r`   r   r   rb   r   rd   r   s                           r   $test_reset_after_blowup_is_calm_sider      sU   uwqA	B1X!Q-s3;;  *T)2T>)bkk)k)))2T))))))2)))2)))T))))))))))b)))b)))k))))))))))))):2;;:(:;(":r{{:d:{d':::::;(::::::2:::2:::;:::(:::::::{d::::::r:::r:::{:::d::::::::::::::88NcN8c>NNN8cNNNNNN2NNN2NNN8NNNcNNNNNNNNNNNr   c                     t               t               }} t               t               }}t        d      D ]   }t        | |dd      }t        ||ddd      }" j                  }j                  }d}	||	z   }
||
kD  }|st        j                  d|fd||
f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |	      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}x}x}	}
d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr   zfix the build alreadyr   z
loud, fasttoneg333333?r   )zS%(py2)s
{%(py2)s = %(py0)s.level
} > (%(py6)s
{%(py6)s = %(py4)s.level
} + %(py8)s)sssq)r2   r4   r5   r9   r:   z$being shouted at must heat it fasterz
>assert %(py11)sr=   yellingrF   r   r   rI   rJ   )r   r   r   r&   r)   rM   rW   rO   rP   rQ   rR   rN   rS   rT   r-   )quietcqshoutycsr   r   r   r[   rg   r]   ri   rY   r   rj   r^   r\   r   re   rf   s                      r   test_yelling_heats_fasterr     st    "EG2E!#UWBF1X%4d;&"5t,O  88MbhhMMhoM8o%MMM8oMMMMMM2MMM2MMM8MMMMMMbMMMbMMMhMMMMMM'MMMMMMMM"

"9
""""9
"""9""""""""""""
"""""""r   c                     t               t               }} t        | |dd      }d}|j                  }||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}t        | |d
d      }d}|j                  }||v}|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d x}x}}y )NuK   come on answer me

(voice: loud, urgent — read his tone; don't parrot it)r   r   rF   r   r0   r   rI   rJ   z read his tone loud urgent parrotznear-exact repeat)not in)z3%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.reasons
}st2)r   r   r&   r-   rM   rW   rR   rO   rP   rQ   rS   rT   )	rL   rX   r0   r^   r\   r   re   rf   r  s	            r   ,test_voice_note_in_text_is_read_and_strippedr     s   uwqA	a -.2
4B"

"9
""""9
"""9""""""""""""
"""""""
q!7
>C1ckk1k1111k111111111c111c111k1111111r   c                     t               t               }} t               t               }}t        d      D ]   }t        | |dd      }t        ||ddd      }" j                  }j                  }||k  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }
t        j                  d      dz   d|
iz  }t        t        j                  |            d x}x}	}y )Nr   zdo the thing againr   laughingr   r   )zG%(py2)s
{%(py2)s = %(py0)s.level
} < %(py6)s
{%(py6)s = %(py4)s.level
}jgr   z"laughing along must cool the meterr   r:   )r   r   r   r&   r)   rM   rW   rO   rP   rQ   rR   rN   rS   rT   )grimcgjollycjr   r  r  r[   rg   rY   r   ra   s               r   test_laughter_ventsr     s    !57"D "EG2E1Xr/50#JG  77BQWWB7WBBB7WBBBBBB1BBB1BBB7BBBBBBQBBBQBBBWBBBBBBBBBBBr   __main__test_zPASS  r   zFAIL  
/z passed)+r   builtinsrO   _pytest.assertion.rewrite	assertionrewriterM   r}   voice.frustrationr   r   r   r   r&   rl   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   	tracebackr   globalsitems
startswithfnsfailsfnprint	Exception	print_excr   
SystemExit)kvs   00r   <module>r(     sp    	 : 9: 9	:,,S$( DI	'Q*P	O#2C z	 12
L2Aall76K12
LCE	"DF2;;-()  
Bs3x% #c(7
34
%Q
''Q
'' 
L  	"QJEF2;;-()I!	"s   C;C;.D0D43D4