
    ~itK                       d Z ddlm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mZmZmZ ddlmZ e
j"                  j%                  d e ee      j+                         j,                  j,                               ddlmZ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%m&Z&m'Z'm(Z( d dZ)d!d"d	Z*d#d
Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d Z:d Z;d Z<d Z=d Z>d$dZ?e@dk(  r e
j                   e?              yy)%a  
Smoke tests for persistence/state_store.py (schema v2).

Covers:
  - Fresh defaults and per-dataclass roundtrip (DailyCounters, BrainCounters,
    BiasEntry, BiasCache, CooldownState, ActiveTrade)
  - SessionState save/load roundtrip with full payload
  - Atomic save: .prev.json backup created on existing file
  - Schema migration v1 (flat) -> v2 (nested)
  - Migration loud failure on unknown / future version
  - load_state RESUME (existing + missing) and FRESH (timestamped archive)
  - auto_daily_reset on stale date in LIVE-style flow
  - Corrupt JSON raises loud RuntimeError

Run:
    cd ~/apex_v16
    python -m tests.test_state_store
    )annotationsN)datetime	timedeltatimezone)Path)
TradeEntryTradeRuntimeutc_now)ActiveTrade	BiasCache	BiasEntryBrainCountersCooldownStateDailyCountersEntryEvalCacheSCHEMA_VERSIONSessionStateStateLoadMode
StateStore_migrate
load_statec                     t        d|         y )Nz  ok  )print)labels    -/home/work/apex_v16/tests/test_state_store.py_okr   0   s    	F5'
    c                    t        di d| dddddddd	d
ddddt               ddddddddddddddddS ) Nsymbol
brain_nameTF	directionBUY	contracts   entry_priceg     @sl_priceg    @tp_priceg     @	opened_atrsi_m5_at_entryg     K@rsi_h1_at_entryg      M@rsi_h4_at_entryg      N@atr_ratio_at_entryg?market_structure_at_entryBULLISH_EXPANSIONregime_at_entryTRENDINGh1_compat_at_entryg?confidence_at_entryN    )r   r
   )r   s    r   _make_entryr6   4   s       	
    )     #6 #   ! r   c                      t        dddd      S )N      (@gzG?g     B@F)minutes_openprogress_pctnet_profit_usdpartial_done)r	   r5   r   r   _make_runtimer=   I   s    	 r   c                    t               } | j                  }|t        k(  }d}t        |k(  }|r|st        j                  d||fd|t        |f      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  }dd|iz  }t        t        j                  |            d x}x}x}}| j                  }i }||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}}| j                  }t        |t              }	|	s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  }
t        t        j                  |
            d x}}	| j                  }t        |t               }	|	s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  }
t        t        j                  |
            d x}}	| j"                  }t        |t$              }	|	s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  }
t        t        j                  |
            d x}}	| j&                  }t        |t(              }	|	s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  }
t        t        j                  |
            d x}}	| j*                  }t        |t,              }	|	s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  }
t        t        j                  |
            d x}}	| j                  }|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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}	}| j                  }|j0                  }d}||u }	|	st        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                  }|j2                  }d}||u }	|	st        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                  }|j4                  }d!}||k(  }	|	st        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&                  }|j6                  }i }||k(  }	|	st        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}	}| j8                  }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}}| 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  }t        t        j                  |            d x}x}}t=        d&       y )'N   )==r@   )6%(py2)s
{%(py2)s = %(py0)s.schema_version
} == %(py5)sz%(py5)s == %(py7)ssr   )py0py2py5py7assert %(py9)spy9r@   z5%(py2)s
{%(py2)s = %(py0)s.active_trades
} == %(py5)srC   rD   rE   assert %(py7)srF   zPassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.daily
}, %(py4)s)
}
isinstancer   )rC   py1py3py4py6zPassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.brain
}, %(py4)s)
}r   zUassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.bias_cache
}, %(py4)s)
}r   z[assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.entry_eval_cache
}, %(py4)s)
}r   zSassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.cooldown
}, %(py4)s)
}r           zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.daily_pnl
} == %(py7)srC   rD   rP   rF   Fisz[%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.daily_loss_hard_stop_hit
} is %(py7)szT%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.profit_target_hit
} is %(py7)sr   zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.brain
}.bias_calls_count
} == %(py7)szW%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.entry_eval_cache
}.last_eval
} == %(py7)sz3%(py2)s
{%(py2)s = %(py0)s.session_pnl
} == %(py5)sz.%(py2)s
{%(py2)s = %(py0)s.halted
} is %(py5)sz0fresh SessionState defaults are sane (v3 nested))r   schema_versionr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationactive_tradesdailyrM   r   brainr   
bias_cacher   entry_eval_cacher   cooldownr   	daily_pnldaily_loss_hard_stop_hitprofit_target_hitbias_calls_count	last_evalsession_pnlhaltedr   )rB   @py_assert1@py_assert3@py_assert6@py_assert4@py_format8@py_format10@py_format6@py_assert2@py_assert5@py_format7s              r   !test_fresh_session_state_defaultsr}   V   s   A2~222~22222~22222212221222222222~222~2222222222?? b ?b    ?b      1   1   ?   b       gg-:g}--------:---:------a---a---g------}---}----------gg-:g}--------:---:------a---a---g------}---}----------ll.:lI........:...:......a...a...l......I...I..........((9:(.99999999:999:999999a999a999(999999.999.9999999999jj0:j-00000000:000:000000a000a000j000000-000-000000000077#7############1###1###7#############7747++4u4+u4444+u444444144414447444+444u444444477-7$$--$----$------1---1---7---$----------77(7##(q(#q((((#q((((((1(((1(((7(((#(((q(((((((-''-2-'2----'2------1---1------'---2-------==C=C=C11=C88u8u8u118u:;r   c            	        t        ddddddd      } | j                         }t        j                  |      }|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  }t        t	        j                  |            d 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  }dd|iz  }t        t	        j                  |            d 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}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}}t        d       y )N
2026-04-28g     0qFT   r?      daterl   rm   rn   approved_countexecuted_countrejected_countrU   )z9%(py2)s
{%(py2)s = %(py0)s.profit_target_hit
} is %(py5)sdc2rK   rL   rF   )z@%(py2)s
{%(py2)s = %(py0)s.daily_loss_hard_stop_hit
} is %(py5)sg     0q@rI   )z2%(py2)s
{%(py2)s = %(py0)s.daily_pnl
} == -%(py5)sassert %(py8)spy8)z6%(py2)s
{%(py2)s = %(py0)s.executed_count
} == %(py5)sz4DailyCounters roundtrip preserves V16 explicit flags)r   to_dict	from_dictrn   r^   r_   r`   ra   rb   rc   rd   re   rm   rl   r   r   )dcdr   rs   rv   rt   ry   rw   ru   r|   @py_format9s              r   #test_daily_counters_flags_roundtripr   m   s   	!&
B 	

A

!
!!
$C  (D( D(((( D((((((3(((3((( (((D(((((((''050'50000'500000030003000'00050000000=="U"UF"=F""""=F""""""3"""3"""="""U"""""""""""""""""""3"""3""""""""""""">?r   c                    t        ddddd      } t        j                  | j                               }|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}}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}}t!        d       y )Nr?   r%      r   *   mr_wins	mr_lossestf_wins	tf_lossesro   rI   )z8%(py2)s
{%(py2)s = %(py0)s.bias_calls_count
} == %(py5)sbc2rK   rL   rF   )z/%(py4)s
{%(py4)s = %(py2)s.mr_wins
} == %(py7)s)rD   rP   rF   z%(py9)srH   )z5%(py13)s
{%(py13)s = %(py11)s.tf_losses
} == %(py16)s)py11py13py16z%(py18)spy18r   zassert %(py21)spy21z-BrainCounters roundtrip with bias_calls_count)r   r   r   ro   r^   r_   r`   ra   rb   rc   rd   re   r   r   append_format_boolopr   )bcr   rs   rv   rt   ry   rw   ru   r{   @py_assert0@py_assert12@py_assert15@py_assert14rx   @py_format17@py_format19@py_format20@py_format22s                     r   .test_brain_counters_bias_calls_count_roundtripr      s   	QQ
B
 
!
!"**,
/C%2%2%%%%2%%%%%%3%%%3%%%%%%2%%%%%%%23;;2!2;!222 22222;!22222232223222;222!22222222222222222222222222222222222278r   c                 z   t        dddt               j                               } d}	 d| _        |s{t        j                  d      d	z   d
dt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            t        j                  | j                               }|| k(  }|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z  }dd|iz  }t        t        j                  |            d }t!        d       y # t        $ r d}Y w xY w)Nr#   H   z(EMA20>EMA50, RSI4h=58, structure bullish)r"   
confidence	rationalecomputed_atFc   TzBiasEntry must be frozenz
>assert %(py0)srC   raisedrI   )z%(py0)s == %(py2)sbe2be)rC   rD   zassert %(py4)srP   z"BiasEntry frozen + roundtrip equal)r   r
   	isoformatr   	Exceptionr^   _format_assertmsgr`   ra   rb   rc   rd   re   r   r   r_   r   )r   r   @py_format1r   rs   @py_format3@py_format5s          r   $test_bias_entry_frozen_and_roundtripr      s   	B<I'')
B F ---------6---6-----


bjjl
+C"93"33"",-  s   F+ +F:9F:c            	        t               j                         } t        t        ddd|       t        ddd|       d      }t        j                  |j                               }|j                  }t        |      }d	d
h}||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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}|j                  d	   }	|	j                   }d}
||
k(  }|st        j                  d|fd||
f      t        j                  |	      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}	x}x}}
|j                  d
   }	|	j"                  }d}
||
k(  }|st        j                  d|fd||
f      t        j                  |	      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}	x}x}}
t%        d       y )Nr#   F   ztrend upSELLA   z
trend down)MESMNQ)entriesr   r   rI   )zM%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.entries
})
} == %(py8)ssetcache2)rC   rN   rO   rE   r   assert %(py10)spy10)z1%(py3)s
{%(py3)s = %(py1)s.direction
} == %(py6)srN   rO   rQ   r   r   z2%(py3)s
{%(py3)s = %(py1)s.confidence
} == %(py6)sz BiasCache multi-symbol roundtrip)r
   r   r   r   r   r   r   r   r^   r_   r`   ra   rb   rc   rd   re   r"   r   r   )nowcacher   rz   rv   @py_assert7ru   r   @py_format11r   r{   r|   s               r   &test_bias_cache_multi_symbol_roundtripr      s   
)


CJ4\37 E   1F~~03~05%.0.0000.00000030003000000v000v000~000000.0000000>>% 3 **3e3*e3333*e333 333*333e3333333>>% 1 ++1r1+r1111+r111 111+111r1111111*+r   c                 X   t               j                         } t               t        d      z   j                         }t        | | dd|i      }t        j                  |j                               }|j                  d   }|| k(  }|st        j                  d|fd|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndd	z  }d
d|iz  }t        t        j                  |            d x}}|j                  d   }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            d 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}}t!        d       y )N   )minutesr   6Er   last_trade_close_atcooldown_untilrI   )z%(py1)s == %(py3)sr   )rN   rO   assert %(py5)srE   laterr   )not in)z:%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.cooldown_until
}cs2rN   rO   rE   rL   rF   z+CooldownState roundtrip preserves both maps)r
   r   r   r   r   r   r   r^   r_   rc   r`   ra   rb   rd   re   r   r   )
r   r   csr   r   rz   @py_format4ry   rv   rw   s
             r   test_cooldown_state_roundtripr      s   
)


CY2..99;E	$'s3u~
B 
!
!"**,
/C""5)0)S0000)S000)000000S000S0000000e$-$----$---$----------------)s)))4)))))4))))4))))))s)))s)))))))))))56r   c            
     |   t        j                         5 } t        t        |       dz        }t	               }|j                  |       |j                         }d }||u}|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}}|j                  }|t         k(  }|st        j                  d|fd	|t         f      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
dz  }	dd|	iz  }
t        t        j                  |
            d x}}|j"                  }i }||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}}|j$                  }|j&                  }|j$                  }|j&                  }||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t        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}x}}d d d        t)        d       y # 1 sw Y   xY w)N
state.jsonis notz%(py0)s is not %(py3)ss2rC   rO   r   rE   rI   z6%(py2)s
{%(py2)s = %(py0)s.schema_version
} == %(py4)sr   rC   rD   rP   assert %(py6)srQ   rJ   rK   rL   rF   )z~%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.date
} == %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.daily
}.date
}rB   )rC   rD   rP   rQ   r   r   zassert %(py12)spy12z%empty SessionState roundtrip via disk)tempfileTemporaryDirectoryr   r   r   saveloadr^   r_   r`   ra   rb   rc   rd   re   r]   r   rf   rg   r   r   )tmpstorerB   r   rz   rs   r   ry   rt   r   r|   rv   rw   r   @py_assert9r{   r   @py_format13s                     r   "test_session_state_roundtrip_emptyr      sc   		$	$	& -#49|34N

1ZZ\r~rrr  2 N2222 N222222r222r222 222222N222N2222222%2%2%%%%2%%%%%%r%%%r%%%%%%2%%%%%%%xx,x}},,,},,,,},,,,,,r,,,r,,,x,,,},,,,,,,,,,,,,,,,,,,,,,- /0- -s   P	P22P;c                    t        j                         5 } t        t        |       dz        }t	               }t        t               t                     |j                  d<   d|j                  _
        d|j                  _        d|j                  _        d|j                  _        t        dddt!               j#                               |j$                  j&                  d<   t!               j#                         |j(                  j*                  d<   d	|j,                  j.                  d<   d
|j,                  j.                  d<   d|_        |j3                  |       |j5                         }d }||u}|st7        j8                  d|fd||f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      dz  }dd|iz  }tC        t7        jD                  |            d x}}d}|j                  }	||	v }|st7        j8                  d|fd||	f      t7        j@                  |      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |	      dz  }dd|iz  }
tC        t7        jD                  |
            d x}x}}	|j                  d   }|jF                  }|jH                  }	d}|	|k(  }|st7        j8                  d|fd|	|f      t7        j@                  |      t7        j@                  |      t7        j@                  |	      t7        j@                  |      dz  }dd|iz  }tC        t7        jD                  |            d x}x}x}	x}}|j                  d   }|jJ                  }|jL                  }	d}|	|u }|st7        j8                  d|fd|	|f      t7        j@                  |      t7        j@                  |      t7        j@                  |	      t7        j@                  |      dz  }dd|iz  }tC        t7        jD                  |            d x}x}x}	x}}|j                  }|j                  }d}||k(  }|st7        j8                  d|fd ||f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      t7        j@                  |      t7        j@                  |      d!z  }
d"d#|
iz  }tC        t7        jD                  |            d x}x}x}}|j                  }|j                  }d}||k(  }|st7        j8                  d|fd$||f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      t7        j@                  |      t7        j@                  |      d!z  }
d"d#|
iz  }tC        t7        jD                  |            d x}x}x}}|j                  }|j                  }d}||k(  }|st7        j8                  d|fd%||f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      t7        j@                  |      t7        j@                  |      d!z  }
d"d#|
iz  }tC        t7        jD                  |            d x}x}x}}|j                  }|j                  }d}||k(  }|st7        j8                  d|fd&||f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      t7        j@                  |      t7        j@                  |      d!z  }
d"d#|
iz  }tC        t7        jD                  |            d x}x}x}}|j$                  j&                  d   }|jN                  }d}||k(  }	|	st7        j8                  d|	fd'||f      t7        j@                  |      t7        j@                  |      t7        j@                  |      d(z  }d)d*|iz  }tC        t7        jD                  |            d x}x}x}	}d}|j(                  }	|	j*                  }||v }|st7        j8                  d|fd+||f      t7        j@                  |      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |	      t7        j@                  |      d,z  }
d"d#|
iz  }tC        t7        jD                  |            d x}x}x}	}|j,                  j.                  d   }d	}||k(  }|slt7        j8                  d|fd-||f      t7        j@                  |      t7        j@                  |      d.z  }d/d0|iz  }tC        t7        jD                  |            d x}x}}|j,                  j.                  d   }d
}||k(  }|slt7        j8                  d|fd-||f      t7        j@                  |      t7        j@                  |      d.z  }d/d0|iz  }tC        t7        jD                  |            d x}x}}|j0                  }d}	||	k(  }|st7        j8                  d|fd1||	f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      t7        j@                  |	      d2z  }dd|iz  }
tC        t7        jD                  |
            d x}x}}	d d d        tQ        d3       y # 1 sw Y   xY w)4Nr   r   g     @_@      r#   K   testg   ՋAg   vՋAr   r   r   r   r   r   rE   inz5%(py1)s in %(py5)s
{%(py5)s = %(py3)s.active_trades
}r   rL   rF   r%   rI   )zL%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.entry
}.contracts
} == %(py8)s)rN   rO   rE   r   r   r   FrU   )zQ%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.runtime
}.partial_done
} is %(py8)srS   rT   rG   rH   zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.executed_count
} == %(py7)szJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.brain
}.tf_wins
} == %(py7)srY   r   r   r   r   )zY%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.cooldown
}.last_trade_close_at
})rN   rO   rE   rF   z%(py1)s == %(py4)srN   rP   r   rQ   r[   rK   z7SessionState full roundtrip preserves all nested fields))r   r   r   r   r   r   r6   r=   rf   rg   rl   r   rh   r   ro   r   r
   r   ri   r   rk   r   rj   rp   rq   r   r   r^   r_   r`   ra   rb   rc   rd   re   entryr$   runtimer<   r   r   )r   r   rB   r   rz   rs   r   ry   r   rv   rw   r   ru   r   r   rt   r{   rx   r|   r   s                       r   .test_session_state_roundtrip_with_active_trader      s>   		$	$	& '#49|34N!,[]MO!L!!"#$ &/2vwy224'
U# 18	0C0C0E

&&u-.:$$U+.:$$T*

1ZZ\r~rrr((((u(((((u((((u((((((((((((((((((((&;&,,;,66;!;6!;;;;6!;;;&;;;,;;;6;;;!;;;;;;;&D&..D.;;DuD;uDDDD;uDDD&DDD.DDD;DDDuDDDDDDDxx*x!!*U*!U****!U******r***r***x***!***U*******xx+x&&+!+&!++++&!++++++r+++r+++x+++&+++!+++++++xx$x$1$1$$$$1$$$$$$r$$$r$$$x$$$$$$1$$$$$$$xx-x((-A-(A----(A------r---r---x---(---A-------}}$$U+<+66<"<6"<<<<6"<<<+<<<6<<<"<<<<<<<77777u77777u7777u77777777777777777777777"",,U3C|C3|CCCC3|CCC3CCC|CCCCCCC"",,T2C|C2|CCCC2|CCC2CCC|CCCCCCC~~&&~&&&&~&&&&&&r&&&r&&&~&&&&&&&&&&;'< AB=' 's   nn::oc                    t        ddd      } t        j                  | j                               }|j                  }| j                  }||k(  }|st	        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  }d
d|iz  }t        t	        j                  |            d x}x}}t        d       y )Ng    dAg   kdAr   )rp   rI   )zP%(py2)s
{%(py2)s = %(py0)s.last_eval
} == %(py6)s
{%(py6)s = %(py4)s.last_eval
}r   r   rC   rD   rP   rQ   r   r   z=EntryEvalCache roundtrip preserves per-symbol candle_time map)r   r   r   rp   r^   r_   r`   ra   rb   rc   rd   re   r   )r   r   rs   r{   rt   r|   r   s          r   test_entry_eval_cache_roundtripr    s    \%NOE%%emmo6F.u...........6...6.........u...u..........GHr   c                 $	   dddi ddddddddd	dd
ddddi ii i ddddi d} t        j                  |       }|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}}|j                  }|j                  }i }||k(  }|st        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(  }|st        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(  }|st        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(  }|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}}t#        d!       y)"zAv2 payload (no entry_eval_cache) migrates to v3 with empty cache.r%   z2026-04-29T08:00:00+00:00z2026-04-29T08:30:00+00:00z
2026-04-29rR   Fr   r   r   r?   r   r   r   r   r   r8    )r]   
started_atsaved_atrf   rg   rh   ri   rk   rq   rr   halt_reasonmetadatarI   rA   rB   rK   rL   rF   NrZ   rT   rG   rH   r   rY   r[   z@_migrate_v2_to_v3 adds empty entry_eval_cache, preserves v2 data)r   r   r]   r^   r_   r`   ra   rb   rc   rd   re   rj   rp   rh   r   ro   rq   r   )

v2_payloadrB   rs   rv   rt   ry   rw   ru   r{   rx   s
             r   +test_migrate_v2_to_v3_adds_entry_eval_cacher
    s    11 s(-E1
 qQQ !
 !"o,."EuR#J& 	z*A q q    q      1   1      q       -''-2-'2----'2------1---1------'---2-------777??a?a?a117?a77(7##(q(#q((((#q((((((1(((1(((7(((#(((q(((((((== D =D    =D      1   1   =   D       JKr   c                    t        j                         5 } t        t        |       dz        }t	               }d|_        |j                  |       |j                  }|j                  } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}x}x}}d|_        |j                  |       |j                  }|j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            d x}x}}|j                  j!                         5 }	t#        j$                  |	      }
d d d        
d   }d}||k(  }|slt        j&                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d d d        t)        d       y # 1 sw Y   xY w# 1 sw Y   !xY w)Nr   g      $@zfassert not %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.backup_file
}.exists
}()
}r   r   g      4@zbassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.backup_file
}.exists
}()
}rq   rI   r   r   r   rQ   zAsave() writes .prev.json backup of previous file before overwrite)r   r   r   r   r   rq   r   backup_fileexistsr`   ra   r^   rb   rc   rd   re   openjsonr   r_   r   )r   r   rB   rs   rt   r{   r   rw   r|   fprevr   rz   r   s                 r   .test_save_creates_prev_backup_on_existing_filer  .  s   		$	$	& +#49|34N

1$$-$++-+-----------5---5---$---+----------

1  ) '')'))))))))u)))u))) )))'))))))))))##% 	 99Q<D	 M"*d*"d****"d***"***d*******+ KL	  	 + +s%   HKK,BKK	KKc                 !   i dddddddi dd	d
ddddddddddddddddddddddddi} t        j                  |       }|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}}|j                  }|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                  |      t        j                  |      d'z  }d(d)|iz  }	t        t        j                  |	            d x}x}x}}|j                  }|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                  |      t        j                  |      d'z  }d(d)|iz  }	t        t        j                  |	            d x}x}x}}|j                  }|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                  |      t        j                  |      d'z  }d(d)|iz  }	t        t        j                  |	            d x}x}x}}|j                  }|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                  |      t        j                  |      d'z  }d(d)|iz  }	t        t        j                  |	            d x}x}x}}|j                  }|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                  |      t        j                  |      d'z  }d(d)|iz  }	t        t        j                  |	            d x}x}x}}|j                  }|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                  |      t        j                  |      d'z  }d(d)|iz  }	t        t        j                  |	            d x}x}x}}|j                  }|j$                  }d}||u }|st        j                  d.|fd0||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}}g }|j&                  }|j(                  }d}
||
k(  }|}|r!|j&                  }|j*                  }d}||k(  }|}|st        j                  d |fd1||
f      d"t        j                         v st        j                  |      rt        j                  |      nd"t        j                  |      t        j                  |      t        j                  |
      d2z  }	d3d4|	iz  }|j-                  |       |rt        j                  d fd5f      d"t        j                         v st        j                  |      rt        j                  |      nd"t        j                        t        j                  |      t        j                  |      d6z  }d7d8|iz  }|j-                  |       t        j.                  |d9      i z  }d:d;|iz  }t        t        j                  |            d x}x}x}x}x}x}
x}x}x}}g }|j&                  }|j0                  }d}
||
k(  }|}|r!|j&                  }|j2                  }d}||k(  }|}|st        j                  d |fd<||
f      d"t        j                         v st        j                  |      rt        j                  |      nd"t        j                  |      t        j                  |      t        j                  |
      d2z  }	d3d4|	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                  |      t        j                  |      d6z  }d7d8|iz  }|j-                  |       t        j.                  |d9      i z  }d:d;|iz  }t        t        j                  |            d x}x}x}x}x}x}
x}x}x}}|j&                  }|j4                  }d9}||k(  }|st        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}}|j6                  }|j8                  }i }||k(  }|st        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<                  }i }||k(  }|st        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@                  }i }||k(  }|st        j                  d |fdA||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}}|jB                  }d}||k(  }|st        j                  d |fdB||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}}|jD                  }ddi}||k(  }|st        j                  d |fdC||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}}tG        dD       y )ENr]   r   r  z2026-04-28T08:00:00+00:00r  z2026-04-28T15:00:00+00:00rf   r   r   r   r?   r   r   r   r%   r   r   r   r   rq   g      V@rl   daily_pnl_dater   rr   Fr  r  r  notez	v1 samplerI   r  rB   rK   rL   rF   rS   rT   rG   rH   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.date
} == %(py7)s)zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.approved_count
} == %(py7)sr   )zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.rejected_count
} == %(py7)srU   rW   rX   )zJ%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.brain
}.mr_wins
} == %(py9)s)rD   rP   rQ   rH   z%(py11)sr   )zR%(py17)s
{%(py17)s = %(py15)s
{%(py15)s = %(py13)s.brain
}.mr_losses
} == %(py20)s)r   py15py17py20z%(py22)spy22r   zassert %(py25)spy25)zJ%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.brain
}.tf_wins
} == %(py9)s)zR%(py17)s
{%(py17)s = %(py15)s
{%(py15)s = %(py13)s.brain
}.tf_losses
} == %(py20)srY   )zO%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.bias_cache
}.entries
} == %(py7)s)zY%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.cooldown
}.last_trade_close_at
} == %(py7)srZ   r[   )z0%(py2)s
{%(py2)s = %(py0)s.metadata
} == %(py5)sz>_migrate_v1_to_v2 maps flat fields into nested sub-dataclasses)$r   r   r]   r^   r_   r`   ra   rb   rc   rd   re   rg   rl   r   r   r   r   rm   rn   rh   r   r   r   r   r   r   ro   ri   r   rk   r   rj   rp   rq   r  r   )
v1_payloadrB   rs   rv   rt   ry   rw   ru   r{   rx   @py_assert8r   r   r   @py_assert16@py_assert19@py_assert18@py_format12@py_format21@py_format23@py_format24@py_format26s                         r   (test_migrate_v1_to_v2_preserves_all_datar%  B  sB
   !1 	/ 		
 	! 	! 	" 	1 "1 	1 "1 	t 	T 	, 	% 	r 	V[)J" 	z*A q q    q      1   1      q       77$7$$$$$$$$$$$$1$$$1$$$7$$$$$$$$$$$$$77'7<<'<'<<''''<<''''''1'''1'''7'''<'''<'''''''77&7!!&Q&!Q&&&&!Q&&&&&&1&&&1&&&7&&&!&&&Q&&&&&&&77&7!!&Q&!Q&&&&!Q&&&&&&1&&&1&&&7&&&!&&&Q&&&&&&&77'7!!'R'!R''''!R''''''1'''1'''7'''!'''R'''''''7747++4u4+u4444+u444444144414447444+444u444444477-7$$--$----$------1---1---7---$----------:177:7??:a:?a:AGG:G$5$5::$5$:::::?a::::::1:::1:::7:::?:::a:::::::$5::::::A:::A:::G:::$5:::::::::::::::::::177:7??:a:?a:AGG:G$5$5::$5$:::::?a::::::1:::1:::7:::?:::a:::::::$5::::::A:::A:::G:::$5::::::::::::::::::77(7##(q(#q((((#q((((((1(((1(((7(((#(((q(((((((<<%<%2%2%%%%2%%%%%%1%%%1%%%<%%%%%%2%%%%%%%::/:))/R/)R////)R//////1///1///:///)///R///////-''-2-'2----'2------1---1------'---2-------== D =D    =D      1   1   =   D       ::.&+..:.....:.......1...1...:...........HIr   c                 N   d} 	 t        ddi       | sedddt        j                         v st        j                  |       rt        j                  |       ndiz  }t        t        j                  |            t        d       y # t        $ r}dt        |      v } Y d }~d }~ww xY w)	NFr]   r   zUnknown migration pathassert %(py0)srC   r   z6_migrate raises ValueError on unknown schema_version=0)r   
ValueErrorstrr`   ra   r^   rb   rc   rd   re   r   r   er   s      r   #test_migrate_unknown_version_raisesr,  s  sf    F4"A&' MMMMM6MMM6MMMMM@A  4)SV34s   B 	B$BB$c                 \   d} 	 t        dt        dz   i       | sedddt	        j
                         v st        j                  |       rt        j                  |       ndiz  }t        t        j                  |            t        d       y # t        $ r}dt        |      v } Y d }~d }~ww xY w)	NFr]   r   z
newer thanr'  rC   r   z=_migrate raises ValueError on schema_version > SCHEMA_VERSION)r   r   r(  r)  r`   ra   r^   rb   rc   rd   re   r   r*  s      r   "test_migrate_future_version_raisesr.    sk    F("NQ$678 MMMMM6MMM6MMMMMGH  (Q'(s   B 	B+B&&B+c                    t        j                         5 } t        t        |       dz        }t	               }d|_        d|j                  _        |j                  |       t        |t        j                        }|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}}|j                  }|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"                  |      t        j"                  |	      dz  }dd|iz  }t%        t        j&                  |            d x}x}x}
}	d d d        t)        d       y # 1 sw Y   xY w)Nr   g     R@r   moderI   r[   r   rK   rL   rF   r   rT   rG   rH   z0load_state RESUME loads existing state from disk)r   r   r   r   r   rq   rh   r   r   r   r   RESUMEr^   r_   r`   ra   rb   rc   rd   re   r   )r   r   rB   r   rs   rv   rt   ry   rw   ru   r{   rx   s               r   %test_load_state_resume_loads_existingr3    sl   		$	$	& %#49|34N

1M$8$89~~%%~%%%%~%%%%%%r%%%r%%%~%%%%%%%%%%xx$x$1$1$$$$1$$$$$$r$$$r$$$x$$$$$$1$$$$$$$% :;% %s   HII
c                    t        j                         5 } t        t        |       dz        }|j                  } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}x}}t        |t        j                        }|j                  }|t         k(  }|st        j"                  d|fd|t         f      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	dz  }d
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  }dd|iz  }
t        t        j                  |
            d x}x}}	d d d        t'        d       y # 1 sw Y   xY w)Nr   Eassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   r   r0  rI   r   rB   r   r   rQ   rR   r[   rK   rL   rF   z9load_state RESUME returns fresh SessionState when no file)r   r   r   r   r  r`   ra   r^   rb   rc   rd   re   r   r   r2  r]   r   r_   rq   r   )r   r   rs   rt   r{   ry   rB   r   r|   rv   rw   s              r   )test_load_state_resume_fresh_when_missingr6    s   		$	$	& $#49|34<<!<>!>!!!!!!!!5!!!5!!!<!!!>!!!!!!u=#7#781>1111>111111q111q111111111>111>1111111}}##}####}######q###q###}##########$ CD$ $s   J'KKc                 Z	   t        j                         5 } t        t        |       dz        }t	               }d|_        |j                  |       |j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}t        |t         j"                        }|j                  } |       }| }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d 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}}	t'        t        |       j)                  d            }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}	}|d   j/                         5 }t1        j2                  |      }d d d        d   }d}||k(  }|slt        j$                  d	|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d d d        t5        d       y # 1 sw Y   xY w# 1 sw Y   !xY w)Nr   g     8@zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   r   r0  r5  rR   rI   r[   r   rK   rL   rF   zstate.deleted-*.jsonr   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenarchives)rC   rN   rO   rQ   zexpected 1 archive, found z
>assert %(py8)sr   r   rq   r   r   r   rQ   z>load_state FRESH archives existing file to .deleted-<UTC>.json)r   r   r   r   r   rq   r   r  r`   ra   r^   rb   rc   rd   re   r   r   FRESHr_   listglobr8  r   r  r  r   r   )r   r   rB   rs   rt   r   r   r{   ry   rv   rw   r9  rz   r|   r   r  archivedr   s                     r   ,test_load_state_fresh_archives_existing_filer>    s   		$	$	& 0#49|34N

1|||~~uu|~M$7$78<<!<>!>!!!!!!!!5!!!5!!!<!!!>!!!!!!~~$$~$$$$~$$$$$$r$$$r$$$~$$$$$$$$$$S	'=>?8}JJ}!JJJ}JJJJJJsJJJsJJJJJJ8JJJ8JJJ}JJJJJJ%?z#JJJJJJJJa[ 	$1yy|H	$&/%/&%////&%///&///%///////!0" HI	$ 	$0 0s%   OR!#R9BR!R	R!!R*c                 D   t        j                         5 } t        t        |       dz        }t	               }t               t        d      z
  j                         j                         }t        |ddd      |_
        d|_        d|_        d|_        t        t               t!                     |j"                  d	<   |j%                  |       t'        |t(        j*                  d
      }t               j                         j                         }|j                  }|j                  }||k(  }|st-        j.                  d|fd||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      dt1        j2                         v st-        j4                  |      rt-        j6                  |      nddz  }	dd|	iz  }
t9        t-        j:                  |
            d x}x}}|j                  }|j<                  }d}||k(  }|st-        j.                  d|fd||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      t-        j6                  |      dz  }dd|iz  }t9        t-        j:                  |            d x}x}x}}|j                  }|j>                  }d}||u }|st-        j.                  d|fd||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      t-        j6                  |      dz  }dd|iz  }t9        t-        j:                  |            d x}x}x}}|j                  }|j@                  }d}||k(  }|st-        j.                  d|fd||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      t-        j6                  |      dz  }dd|iz  }t9        t-        j:                  |            d x}x}x}}|j                  }d}||u }|st-        j.                  d|fd||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      dz  }dd|iz  }t9        t-        j:                  |            d x}x}}|j                  }d }||k(  }|st-        j.                  d|fd!||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      dz  }dd|iz  }t9        t-        j:                  |            d x}x}}|j                  }d"}| }||k(  }|st-        j.                  d|fd#||f      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      t-        j6                  |      dz  }	dd|	iz  }
t9        t-        j:                  |
            d x}x}x}}d	}|j"                  }||v }|st-        j.                  d$|fd%||f      t-        j6                  |      dt1        j2                         v st-        j4                  |      rt-        j6                  |      ndt-        j6                  |      d&z  }dd|iz  }t9        t-        j:                  |            d x}x}}d d d        tC        d'       y # 1 sw Y   xY w)(Nr   r   )daysg     @T   )r   rl   rn   r   yesterday_loss_stopr   )r1  auto_daily_resetrI   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.daily
}.date
} == %(py6)sr   todayr   r   r   rR   rS   rT   rG   rH   FrU   rX   r   r   r\   rK   rL   rF   r  )z3%(py2)s
{%(py2)s = %(py0)s.halt_reason
} == %(py5)sg     @@)z4%(py2)s
{%(py2)s = %(py0)s.session_pnl
} == -%(py5)sr   r   r   zLload_state auto_daily_reset zeros daily + halt, preserves session_pnl/trades)"r   r   r   r   r   r
   r   r   r   r   rg   rr   r  rq   r   r6   r=   rf   r   r   r   r2  r^   r_   r`   ra   rb   rc   rd   re   rl   rn   r   r   )r   r   rB   	yesterdayr   rD  rs   rt   r{   r|   r   ru   rw   rx   rv   ry   r   rz   s                     r   .test_load_state_auto_daily_reset_on_stale_daterF    s   		$	$	& )#49|34NY!2288:DDF	"	
 -!,[]MO!L

1M$8$84P	 **,xx%x}}%}%%%%}%%%%%%r%%%r%%%x%%%}%%%%%%%%%%%%%%%%xx(x!!(S(!S((((!S((((((r(((r(((x(((!(((S(((((((xx2x))2U2)U2222)U222222r222r222x222)222U2222222xx+x&&+!+&!++++&!++++++r+++r+++x+++&+++!+++++++yy!E!yE!!!!yE!!!!!!r!!!r!!!y!!!E!!!!!!!~~##~####~######r###r###~##########~~'%'%'~''''~''''''r'''r'''~'''%'''''''((((u(((((u((((u((((((((((((((((((((=)> VW?) )s   _-``c                    t        j                         5 } t        |       dz  }|j                  dd       t	        |      }d}	 |j                          |seddd	t        j                         v st        j                  |      rt        j                  |      nd	iz  }t        t        j                  |            	 d d d        t!        d
       y # t        $ r%}dt        |      j                         v }Y d }~d }~ww xY w# 1 sw Y   FxY w)Nr   z{ not valid jsonzutf-8)encodingFcorruptr'  rC   r   z9load() raises RuntimeError on corrupt JSON (loud failure))r   r   r   
write_textr   r   RuntimeErrorr)  lowerr`   ra   r^   rb   rc   rd   re   r   )r   pathr   r   r+  r   s         r   test_load_corrupt_json_raisesrN    s    		$	$	& 	#Cy<'*W=4 	1JJL vvv	 CD  	1#a&,,.0F	1	 	s6   /DCA'D	C?C:5D:C??DDc                    t        d       t                t                t                t	                t                t                t                t                t                t                t                t                t                t                t                t!                t#                t%                t'                t        d       y)Nztest_state_store.pyzALL 19 TESTS PASSEDr   )r   r}   r   r   r   r   r   r   r   r  r
  r  r%  r,  r.  r3  r6  r>  rF  rN  r5   r   r   mainrP     s    	
 %'')24(**,!#&(24#%/124,.')&()+-/0224!#	
 r   __main__)r   r)  returnNone)r   )r   r)  rR  r   )rR  r	   )rR  int)B__doc__
__future__r   builtinsr`   _pytest.assertion.rewrite	assertionrewriter^   r  sysr   r   r   r   pathlibr   rM  insertr)  __file__resolveparentcore.contractsr   r	   r
   persistence.state_storer   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r=   r}   r   r   r   r   r   r   r   r  r
  r  r%  r,  r.  r3  r6  r>  rF  rN  rP  __name__exitr5   r   r   <module>re     s  & #    
  2 2  3tH~--/66==> ? < <   "*<.@.	9 .,
,"7$
1"CLILFM(*JbBI
<"EJ2 XNE$2 zCHHTV r   