
    $/iT              
          d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZmZ e	j&                  j)                  d e ee      j.                  j.                  dz               ddlZ G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Ze dk(  r+	 ddlZ e	jB                   ejD                  eddg             yy# e#$ r  e$d       eeeeeeegZ%dZ&dZ'e%D ]  Z( e$de(j@                   d        e(       Z) e*e)      D ]X  Z+e+jY                  d      s	   e-e)e+               e$de+        e&dz  Z&5# e.$ rZ/ e$de+ de/        e'dz  Z'Y dZ/[/RdZ/[/ww xY w   e$d d!         e$d"e& d#e'         e	jB                  e'dk(  rdnd       Y yw xY w)$ax  
Genesis Memory Hardening Integration Tests
==========================================
Test suite for the hardened Genesis memory system.

Tests cover:
1. Security: Secrets management
2. Resilience: Circuit breaker, retry logic
3. Intelligence: Enhanced surprise detection
4. Performance: Atomic I/O, adaptive TTL

Run with: python -m pytest tests/test_memory_hardening.py -v
    N)Path)datetime)	MagicMockpatchcorec                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestSecretsManagementzTest secure credential loading.c                 X   ddl m}m} t        |      }|sd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        t        j                  |            d}t        |      }|sd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        t        j                  |            d}y)	z&Secrets loader module can be imported.r   )get_redis_configget_qdrant_config,assert %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}callabler   py0py1py3Nr   )secrets_loaderr   r   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation)selfr   r   @py_assert2@py_format4s        4/mnt/e/genesis-system/tests/test_memory_hardening.pytest_secrets_loader_importz0TestSecretsManagement.test_secrets_loader_import&   s    F())))))))x)))x))))))()))()))))))))))********x***x******)***)**********    c                    ddl m}  |       }|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                  }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                  }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}}	y
)z#Redis config has sensible defaults.r   r   	localhost==z,%(py2)s
{%(py2)s = %(py0)s.host
} == %(py5)sconfigr   py2py5assert %(py7)spy7Ni  z,%(py2)s
{%(py2)s = %(py0)s.port
} == %(py5)szNassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.ssl
}, %(py4)s)
}
isinstancebool)r   r   r   py4py6)r   r   hostr   _call_reprcomparer   r   r   r   r   r   portsslr.   r/   )r   r   r'   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r   @py_assert5@py_format7s              r   test_redis_config_defaultsz0TestSecretsManagement.test_redis_config_defaults,   s   3!#{{)k){k)))){k))))))v)))v))){)))k))))))){{"d"{d""""{d""""""v"""v"""{"""d""""""" **+z*d++++++++z+++z++++++&+++&+++*++++++d+++d++++++++++r    c                    ddl m} t        j                  t        j
                  ddd      5   |       }|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                  }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       y# 1 sw Y   yxY w)z$Redis config reads from environment.r   r"   z	test-host6380)GENESIS_REDIS_HOSTGENESIS_REDIS_PORTr$   r&   r'   r(   r+   r,   Ni  r-   )r   r   r   dictosenvironr2   r   r3   r   r   r   r   r   r   r4   )r   r   r'   r6   r7   r8   r9   r:   s           r   test_redis_config_from_envz0TestSecretsManagement.test_redis_config_from_env4   s   3ZZ

"-"(%
  	' &'F;;-+-;+----;+------6---6---;---+-------;;&$&;$&&&&;$&&&&&&6&&&6&&&;&&&$&&&&&&&	' 	' 	's   FGGc                    ddl m}  |       }d}t        ||      }|sd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        t        j                  |            dx}}d	}t        ||      }|sd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        t        j                  |            dx}}d
}t        ||      }|sd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        t        j                  |            dx}}y)z"Qdrant config has required fields.r   )r   r2   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrr'   )r   r   r   r*   Nr4   api_key)
r   r   rG   r   r   r   r   r   r   r   )r   r   r'   r   r7   r9   s         r   test_qdrant_config_structurez2TestSecretsManagement.test_qdrant_config_structure@   sx   4"$%&wvv&&&&&&&&w&&&w&&&&&&v&&&v&&&v&&&&&&&&&&%&wvv&&&&&&&&w&&&w&&&&&&v&&&v&&&v&&&&&&&&&&()wvy))))))))w)))w))))))v)))v)))y))))))))))r    c                    t        t              j                  j                  dz  }g d}|j                  d      D ]  }|j                  dv r|j                         }|D ]s  }| d|v s| d|v s|j                  d      }|D ]L  }||v sd|vsd	|vsd
|v sd|v sd|vs d|vs%t        j                  d|j                   d|dd         N u  y)z,Verify no hardcoded passwords in core files.r   )z	password=zapi_key=zsecret=z*.py)zsecrets_loader.py"'
z
os.environ_get_envz= "z= 'z""z''zPossible hardcoded secret in : NP   )	r   __file__parentglobname	read_textsplitpytestfail)r   core_dirpassword_patternspy_filecontentpatternlineslines           r   test_no_hardcoded_passwordsz1TestSecretsManagement.test_no_hardcoded_passwordsH   s   >((//&8@}}V, 	mG||44'')G, 
mYa=G+'!}/G#MM$/E % m"d?|4/GJ^bLb$}#'t#3D8H$*KK2OPWP\P\~]_`dehfh`i_j0k$lm
m	mr    N)	__name__
__module____qualname____doc__r   r=   rE   rI   r`    r    r   r	   r	   #   s    )+,
'*mr    r	   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestCircuitBreakerzTest circuit breaker pattern.c                    ddl m}m} 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}}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}}y)z Circuit breaker can be imported.r   CircuitBreakerCircuitStateNis notz%(py0)s is not %(py3)srj   r   r   assert %(py5)sr*   rk   )circuit_breakerrj   rk   r   r3   r   r   r   r   r   r   )r   rj   rk   r   r6   r   r9   s          r   test_circuit_breaker_importz.TestCircuitBreaker.test_circuit_breaker_importf   s    @%))~T))))~T))))))~)))~)))T)))))))#''|4''''|4''''''|'''|'''4'''''''r    c                 `   ddl m}m}  |dd      }|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}}|j                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        t        j                  |	            d}y)z'Circuit breaker starts in closed state.r   ri   test   )failure_thresholdr$   zI%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.CLOSED
}cbrk   r   r)   r0   r1   assert %(py8)spy8N0assert %(py2)s
{%(py2)s = %(py0)s.is_available
}r   r)   )rq   rj   rk   stateCLOSEDr   r3   r   r   r   r   r   r   is_available
r   rj   rk   rx   r6   r;   r8   r<   @py_format9@py_format3s
             r   test_circuit_starts_closedz-TestCircuitBreaker.test_circuit_starts_closedl   s    @Fa8xx.<...x.....x.......r...r...x......<...<...........rrr    c                    ddl m}m}  |ddd      }t        d      D ]  }|j	                  t        d|              ! |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}}|j                   }| }|sydd
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }
t        t        j                  |
            dx}}y)z/Circuit breaker opens after threshold failures.r   ri   rt   ru   <   rv   recovery_timeoutzfail r$   zG%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.OPEN
}rx   rk   ry   rz   r{   Nz4assert not %(py2)s
{%(py2)s = %(py0)s.is_available
}r}   )rq   rj   rk   rangerecord_failure	Exceptionr~   OPENr   r3   r   r   r   r   r   r   r   )r   rj   rk   rx   ir6   r;   r8   r<   r   r   s              r   !test_circuit_opens_after_failuresz4TestCircuitBreaker.test_circuit_opens_after_failuress   s$   @Fa"Mq 	6Ai%s45	6 xx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,,??"?""""""""2"""2"""?""""""r    c                    ddl m}m}  |ddd      }|j                  t	        d             |j                  t	        d             |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        j                   d       |j"                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        t        j                  |	            d}|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}}y)z7Circuit breaker transitions to half-open after timeout.r   ri   rt      皙?r   fail 1fail 2r$   r   rx   rk   ry   rz   r{   N333333?r|   r}   )zL%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.HALF_OPEN
})rq   rj   rk   r   r   r~   r   r   r3   r   r   r   r   r   r   timesleepr   	HALF_OPENr   s
             r   $test_circuit_half_open_after_timeoutz7TestCircuitBreaker.test_circuit_half_open_after_timeout~   s   @Fa#N 	)H-.
)H-.xx,<,,,x,,,,,x,,,,,,,r,,,r,,,x,,,,,,<,,,<,,,,,,,,,,, 	

4 rrxx1<111x11111x1111111r111r111x111111<111<11111111111r    c                    ddl m}m}  |dddd      }|j                  t	        d             |j                  t	        d	             t        j                  d
       |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}}y)z8Circuit breaker closes after success in half-open state.r   ri   rt   r   r      )rv   r   half_open_requestsr   r   r   r$   rw   rx   rk   ry   rz   r{   N)rq   rj   rk   r   r   r   r   r   record_successr~   r   r   r3   r   r   r   r   r   r   )
r   rj   rk   rx   _r6   r;   r8   r<   r   s
             r   !test_circuit_closes_after_successz4TestCircuitBreaker.test_circuit_closes_after_success   s    @Fa#bcd 	)H-.
)H-. 	

4OO 	xx.<...x.....x.......r...r...x......<...<...........r    c                 x   ddl m}  |d      } |d      } |d      }||u }|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}||u}|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}y)z+Circuit breaker registry manages instances.r   )get_circuit_breakerservice1service2is)z%(py0)s is %(py2)scb1cb2r}   assert %(py4)sr0   Nrl   )z%(py0)s is not %(py2)scb3)
rq   r   r   r3   r   r   r   r   r   r   )r   r   r   r   r   r6   r   @py_format5s           r   test_circuit_breaker_registryz0TestCircuitBreaker.test_circuit_breaker_registry   s    7!*-!*-!*-czscsscc#~s#ss##r    N)
ra   rb   rc   rd   rr   r   r   r   r   r   re   r    r   rg   rg   c   s#    '(	#2"/"r    rg   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestRetryLogicz$Test retry with exponential backoff.c                 \   ddl m}m}m} t	        |      }|sd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        t        j                  |            d}t	        |      }|sd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        t        j                  |            d}y)	zRetry utils can be imported.r   )retry
retry_callcalculate_delayr   r   r   r   Nr   )retry_utilsr   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   s         r   test_retry_utils_importz&TestRetryLogic.test_retry_utils_import   s    BBxx
########x###x######
###
##########r    c                 6   ddl m}  |ddd      } |ddd      } |ddd      }d}||k(  }|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}}d}||k(  }|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}}d}||k(  }|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}}y)zDelay grows exponentially.r   r         ?F)
base_delayjitterr   r   r$   z%(py0)s == %(py3)sd0ro   rp   r*   Ng       @d1g      @d2
r   r   r   r3   r   r   r   r   r   r   )	r   r   r   r   r   r   r6   r   r9   s	            r    test_calculate_delay_exponentialz/TestRetryLogic.test_calculate_delay_exponential   s9   / Q3u=Q3u=Q3u=rSyrSrrSrSyrSrrSrSyrSrrSr    c                 t   ddl m}  |dddd      }d}||k(  }|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}}y)zDelay is capped at max.r   r   
   r   g      $@F)r   	max_delayr   r$   r   dro   rp   r*   Nr   )r   r   r   r   r6   r   r9   s          r   test_calculate_delay_max_capz+TestRetryLogic.test_calculate_delay_max_cap   sm    /B3$uMqDyqDqqDr    c                    ddl m} dfd} ||d      }d}||k(  }|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}}d}|k(  }|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}}y)z!Retry call succeeds on first try.r   )r   c                       dz   y)Nr   okre   
call_counts   r   succeedz7TestRetryLogic.test_retry_call_success.<locals>.succeed   s    !OJr    ru   )max_attemptsr   r$   r   resultro   rp   r*   Nr   r   )
r   r   r   r3   r   r   r   r   r   r   )	r   r   r   r   r   r6   r   r9   r   s	           @r   test_retry_call_successz&TestRetryLogic.test_retry_call_success   s    *
	
 G!4v~vvvzQzQzzQr    c                   
 ddl m}m} d

fd} |dd      } |||      }d}||k(  }|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}}d}
|k(  }|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}}y)z#Retry call succeeds after failures.r   )r   RetryConfigc                  6     dz    dk  rt        d        y)Nr   ru   zAttempt r   )
ValueErrorr   s   r   fail_then_succeedzJTestRetryLogic.test_retry_call_eventual_success.<locals>.fail_then_succeed   s(    !OJA~ 8J<!899r       {Gz?r   r   r'   r   r$   r   r   ro   rp   r*   Nru   r   )r   r   r   r   r3   r   r   r   r   r   r   )r   r   r   r   r'   r   r   r6   r   r9   r   s             @r    test_retry_call_eventual_successz/TestRetryLogic.test_retry_call_eventual_success   s    7
	 !=-f=v~vvvzQzQzzQr    c                   	 ddl m}m} d	 | |dd            	fd       } |       }d}||k(  }|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}}d}	|k(  }|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}}y)zRetry decorator works.r   )r   r   ru   r   r   r   c                  0     dz    dk  rt        d      y)Nr   r   zFlaky!success)RuntimeErrorr   s   r   flaky_functionz;TestRetryLogic.test_retry_decorator.<locals>.flaky_function   s#     !OJA~"8,,r    r   r$   r   r   ro   rp   r*   Nr   r   )r   r   r   r   r3   r   r   r   r   r   r   )
r   r   r   r   r   r   r6   r   r9   r   s
            @r   test_retry_decoratorz#TestRetryLogic.test_retry_decorator   s    2
	kqTB	C	 
D	  !""v""""v""""""v"""v""""""""""zQzQzzQr    N)
ra   rb   rc   rd   r   r   r   r   r   r   re   r    r   r   r      s#    .$"r    r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestEnhancedSurprisez'Test embedding-based novelty detection.c                    ddl m}m} 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}}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}}y)z"Enhanced surprise can be imported.r   )EnhancedSurpriseDetectorSurpriseScoreNrl   rn   r   ro   rp   r*   r   )enhanced_surpriser   r   r   r3   r   r   r   r   r   r   )r   r   r   r   r6   r   r9   s          r   test_surprise_detector_importz2TestEnhancedSurprise.test_surprise_detector_import  s    M/33't3333't333333'333'333t3333333$((}D((((}D((((((}(((}(((D(((((((r    c                 T   ddl m} t        j                         5 } || d      }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                  }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  }dd|iz  }
t        t	        j                  |
            dx}x}	}ddd       y# 1 sw Y   yxY w)z!Surprise detector can be created.r   r   /test_vectors.jsonmemory_pathNrl   rn   detectorro   rp   r*   >)z2%(py2)s
{%(py2)s = %(py0)s.vector_size
} > %(py5)sr(   r+   r,   )r   r   tempfileTemporaryDirectoryr   r3   r   r   r   r   r   r   vector_size)r   r   tmpdirr   r   r6   r   r9   r7   r8   r:   s              r   test_surprise_detector_creationz4TestEnhancedSurprise.test_surprise_detector_creation
  s
   >((* 	,f/%h&89H $('84''''84''''''8'''8'''4'''''''''+!+'!++++'!++++++8+++8+++'+++!+++++++	, 	, 	,s   E:FF'c           	         ddl m} t        j                         5 } || d      }|j	                  ddd      }d}||v }|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}||v }|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}|d   d   }	||	k  }d}
|	|
k  }|r|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}x}	}
d}|d   d   }	||	k  }d}
|	|
k  }|r|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}x}	}
|d   }g d}||v }|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       y# 1 sw Y   yxY w)z)Surprise evaluation returns valid scores.r   r   r   r   z'This is a test message about technologyrt   techscoreinz%(py1)s in %(py3)sr   r   r   rp   r*   Ntiernoveltyr   )<=r   )z%(py1)s <= %(py5)sz%(py5)s <= %(py7)s)r   r*   r,   assert %(py9)spy9total)workingepisodicsemanticz%(py1)s in %(py4)sr   r0   assert %(py6)sr1   )r   r   r   r   evaluater   r3   r   r   r   r   r   r   )r   r   r   r   r   @py_assert0r   r   r9   r7   @py_assert6r8   r:   @py_format10r   r<   s                   r   test_surprise_evaluationz-TestEnhancedSurprise.test_surprise_evaluation  sN   >((* 	If/%h&89H &&9F $7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$#6V####6V###6######V###V#######7w	271277a72a7777712a77717772777a77777775w051055A50A5555510A55515550555A5555555&>H%HH>%HHHHH>%HHHH>HHH%HHHHHHHH	I 	I 	Is   L7MM$c                    ddl m} t        j                         5 } || d      }|j	                  ddd       |j                  ddd      }|j                  d	dd
      }|d   d   }|d   d   }||kD  }|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       y# 1 sw Y   yxY w)z6Novel content gets higher scores than similar content.r   r   r   r   z9Python is a programming language used for web developmentrt   r   z,Python is used for building web applicationsz<Quantum entanglement enables faster-than-light communicationphysicsr   r   r   )z%(py1)s > %(py4)sr  r  r1   N)r   r   r   r   add_to_memoryr  r   r3   r   r   r   )r   r   r   r   similar_resultnovel_resultr  r8   r   r   r<   s              r   test_surprise_novelty_detectionz4TestEnhancedSurprise.test_surprise_novelty_detection(  s    >((* 	Yf/%h&89H
 ""K &..>N $,,NL  (3XnW6Mi6XX36XXXXX36XXXX3XXX6XXXXXXXX7	Y 	Y 	Ys   CC33C<c                    ddl m} t        j                         5 } || d      }|j	                  ddd      }d}||v }|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dd       y# 1 sw Y   yxY w)z6MemorySystem wrapper maintains backward compatibility.r   )MemorySystemz
/test.json)persistence_pathztest contentsourcedomainr   r   r   r   r   rp   r*   N)r   r  r   r   r  r   r3   r   r   r   r   r   r   )	r   r  r   msr   r  r   r   r9   s	            r    test_memory_system_compatibilityz5TestEnhancedSurprise.test_memory_system_compatibilityH  s    2((* 	%f&/DEB[[8DF$7f$$$$7f$$$7$$$$$$f$$$f$$$$$$$	% 	% 	%s   CC))C2N)	ra   rb   rc   rd   r   r   r  r  r  re   r    r   r   r     s!    1),I(Y@%r    r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestAtomicIOzTest atomic file operations.c                    ddl m}m}m} t	        |      }|sd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        t        j                  |            d}t	        |      }|sd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        t        j                  |            d}t	        |      }|sd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        t        j                  |            d}y)
zAtomic I/O can be imported.r   )atomic_writeatomic_json_write	safe_readr   r   r  r   Nr  r  )	atomic_ior  r  r  r   r   r   r   r   r   r   r   )r   r  r  r  r   r   s         r   test_atomic_io_importz"TestAtomicIO.test_atomic_io_importX  s@   HH%%%%%%%%x%%%x%%%%%%%%%%%%%%%%%%%)********x***x******)***)**********	""""""""x"""x""""""	"""	""""""""""r    c                    ddl m}m} t        j                         5 }t        |      dz  } ||d      }|sedddt        j                         v st        j                  |      rt        j                  |      ndiz  }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}} ||      }
d}|
|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	t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}ddd       y# 1 sw Y   yxY w)zAtomic write creates file.r   r  r  test.txtzHello, World!assert %(py0)sr   r   Aassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}pathr   r)   r0   Nr$   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr  )r   r   r   r1   rz   r{   )r  r  r  r   r   r   r   r   r   r   r   r   r   existsr3   )r   r  r  r   r#  r   @py_format1r6   r8   r   r   r;   r7   r<   r   s                  r   test_atomic_write_creates_filez+TestAtomicIO.test_atomic_write_creates_file_  sF   5((* 	6f<*,D"49GNNNNN7NNN7NNNNN;; ;= =     4   4   ;   =      T?5o5?o5555?o55555595559555555T555T555?555o5555555	6 	6 	6s   H*IIc                    ddl m} t        j                         5 }t	        |      dz  } ||dd        ||dd       |j                  d      }|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}}|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       y# 1 sw Y   yxY w)z-Atomic write creates backup of existing file.r   )r  r   OriginalTbackupUpdatedz.txt.bakr"  backup_pathr$  Nr$   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py7)sr   r)   r0   r,   r   r   )r  r  r   r   r   with_suffixr%  r   r   r   r   r   r   r   rU   r3   )r   r  r   r#  r-  r6   r8   r   r  r;   r:   r  s               r    test_atomic_write_creates_backupz-TestAtomicIO.test_atomic_write_creates_backupi  sI   *((* 	9f<*,D z$7 y6 **:6K%%'%'''''''';''';'''%''''''''''((8(*8j8*j8888*j888888;888;888(888*888j8888888	9 	9 	9s   GG%%G.c                    ddl m}m} t        j                         5 }t        |      dz  }ddd} |||      }|seddd	t        j                         v st        j                  |      rt        j                  |      nd	iz  }t        t        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}	ddd       y# 1 sw Y   yxY w)zAtomic JSON write works.r   )r  safe_json_read	test.jsonvalue*   )keynumberr!  r   r   r$   )z%(py0)s == %(py2)sloadeddatar}   r   r0   N)r  r  r3  r   r   r   r   r   r   r   r   r   r   r3   )r   r  r3  r   r#  r:  r   r&  r9  r6   r   r   s               r   test_atomic_json_writez#TestAtomicIO.test_atomic_json_writez  s    ?((* 	"f<+-D"b1D'd3GNNNNN7NNN7NNNNN#D)FT>!!!6T!!!!!!6!!!6!!!!!!T!!!T!!!!!!!	" 	" 	"s   EFF
c                    ddl m}m} t        j                         5 }t        |      dz  } ||ddi       d } |||      }|sedddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            dd	l} |j                  |j                               }	|	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	       y	# 1 sw Y   y	xY w)z'Atomic update modifies file atomically.r   )r  atomic_updater4  countc                      | dxx   dz  cc<   | S )Nr>  r   re   )r:  s    r   	incrementz2TestAtomicIO.test_atomic_update.<locals>.increment  s    W"r    r!  r   r   Nr   r$   z%(py1)s == %(py4)sr  r  r1   )r  r  r=  r   r   r   r   r   r   r   r   r   r   jsonloadsrU   r3   )r   r  r=  r   r#  r@  r   r&  rB  r:  r  r8   r   r   r<   s                  r   test_atomic_updatezTestAtomicIO.test_atomic_update  s    >((* 	&f<+-D dWaL1 $D)4GNNNNN7NNN7NNNNN 4::dnn./D=%A%=A%%%%=A%%%=%%%A%%%%%%%#	& 	& 	&s   D1EE c                    ddl m} t        j                         5 }t	        |      dz  } ||      5 }|j                  d       ddd       |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}}|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       y# 1 sw Y   xY w# 1 sw Y   yxY w)z!AtomicFile context manager works.r   )
AtomicFiler   zContext manager testNr"  r#  r$  r$   r.  r/  r   r   )r  rF  r   r   r   writer%  r   r   r   r   r   r   r   rU   r3   )r   rF  r   r#  fr6   r8   r   r  r;   r:   r  s               r    test_atomic_file_context_managerz-TestAtomicIO.test_atomic_file_context_manager  sG   (((* 	>f<*,DD! 0Q./0 ;; ;= =     4   4   ;   =      >>=>#='==#'=====#'=======4===4===>===#==='========	> 	>0 0	> 	>s#   G-G FG- G*	%G--G6c                 
   ddl mm} t        j                         5 }t        |      dz  g fd}t        d      D cg c]  }t        j                  ||f       }}|D ]  }|j                           |D ]  }|j                            }|s~t        j                  d       dz   d	d
t        j                         v st        j                        rt        j                         nd
iz  }t#        t        j$                  |            d} |      }	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}}
d}||	v }
|
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dd       yc c}w # 1 sw Y   yxY w)z,Concurrent atomic writes don't corrupt file.r   r  zconcurrent.txtc                     	 t        d      D ](  } d|  d| d       t        j                  d       * y # t        $ r}j	                  |       Y d }~y d }~ww xY w)Nr   zWriter z iteration Fr*  gMbP?)r   r   r   r   append)nr   er  errorsr#  s      r   writerz:TestAtomicIO.test_concurrent_atomic_writes.<locals>.writer  sa    %"2Y *$TWQC{1#+FuU

5)* ! %MM!$$%s   6: 	AAAru   )targetargsz!Errors during concurrent writes: z
>assert not %(py0)sr   rO  Nrl   rn   r\   ro   rp   r*   Writerr   r   r   )r  r  r  r   r   r   r   	threadingThreadstartjoinr   _format_assertmsgr   r   r   r   r   r   r3   )r   r  r   rP  r   threadstr6   @py_format2r\   r   r   r9   r  r  rO  r#  s                 @@@r   test_concurrent_atomic_writesz*TestAtomicIO.test_concurrent_atomic_writes  s   5((* 	'f<"22DF% LQQR8Tay''vQDATGT 	  :K:KK!B6(KKKKKKKvKKKvKKKKKKoG"&&7$&&&&7$&&&&&&7&&&7&&&$&&&&&&&&8w&&&&8w&&&8&&&&&&w&&&w&&&&&&&-	' 	' U	' 	's   %I9I4$HI94I99JN)ra   rb   rc   rd   r  r'  r1  r;  rD  rI  r\  re   r    r   r  r  U  s(    &#69""&,
>'r    r  c                   "    e Zd ZdZd Zd Zd Zy)TestLoggingzTest structured logging.c                 \   ddl m}m}m} t	        |      }|sd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        t        j                  |            d}t	        |      }|sd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        t        j                  |            d}y)	zLogging config can be imported.r   )
get_loggerwith_contextJSONFormatterr   r   r`  r   Nra  )logging_configr`  ra  rb  r   r   r   r   r   r   r   r   )r   r`  ra  rb  r   r   s         r   test_logging_importzTestLogging.test_logging_import  s    JJ
########x###x######
###
##########%%%%%%%%x%%%x%%%%%%%%%%%%%%%%%%%r    c           	          ddl }ddlm}  |       }|j                  d|j                  ddddd	      }|j                  |      }t        j                  |      }|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}||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}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}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  }dd|iz  }t        t        j                  |            dx}}	y)z#JSON formatter produces valid JSON.r   N)rb  rt   ztest.pyr   zTest messagere   )rT   levelpathnamelinenomsgrR  exc_inforf  INFOr$   rA  r  r  r1   loggermessage	timestampr   r   parsedr   rp   r*   )loggingrc  rb  	LogRecordrk  formatrB  rC  r   r3   r   r   r   r   r   r   )r   rp  rb  	formatterrecordoutputro  r  r8   r   r   r<   r   r9   s                 r   test_json_formatterzTestLogging.test_json_formatter  s   0!O	"",, # 
 !!&)F#g(&(&((((&((((((&(((((((h)6)6))))6))))))6)))))))i 2N2 N2222 N222 222N2222222${f$$$${f$$${$$$$$$f$$$f$$$$$$$r    c                    ddl m}  |dd      5  ddl m}m} |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                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}x}}ddd       ddl m}m} |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                  } |       }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}}y# 1 sw Y   xY w)zLogging context manager works.r   )ra  ztest-123TestComponent)correlation_id	component)_correlation_id
_componentr$   zB%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get
}()
} == %(py7)sr{  r/  r   r   Nr|  r   )zB%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get
}()
} is %(py7)s)rc  ra  r{  r|  getr   r3   r   r   r   r   r   r   )
r   ra  r{  r|  r6   r8   r  r;   r:   r  s
             r   test_context_managerz TestLogging.test_context_manager  s@   /O 	7B"&&6&(6J6(J6666(J666666?666?666&666(666J6666666>>6>#66#6666#666666:666:666>666#6666666666		7 	?"","$,,$,,,,$,,,,,,,,,,,,",,,$,,,,,,,,,,~~'~'4'4''''4''''''z'''z'''~''''''4'''''''	7 	7s   GN==ON)ra   rb   rc   rd   rd  rv  r  re   r    r   r^  r^    s    "&%0(r    r^  c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestMetricszTest metrics collection.c                    ddl m}m}m}m} 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}}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}}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}}y)zMetrics can be imported.r   )CounterGauge	HistogramGenesisMetricsNrl   rn   r  ro   rp   r*   r  r  )metricsr  r  r  r  r   r3   r   r   r   r   r   r   )	r   r  r  r  r  r   r6   r   r9   s	            r   test_metrics_importzTestMetrics.test_metrics_import  s   EE""wd""""wd""""""w"""w"""d"""""""  uD    uD      u   u   D       %))~T))))~T))))))~)))~)))T)))))))r    c                 .   ddl m}  |dd      }|j                          |j                  d       |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}}y)zCounter increments correctly.r   r  test_counterzTest counterr      r$   r}  cr/  r   r   Nr  r  incr~  r   r3   r   r   r   r   r   r   )	r   r  r  r6   r8   r  r;   r:   r  s	            r   r  zTestMetrics.test_counter  s    #NN3		auuuw!w!|w!qquw!r    c                    ddl m}  |dd      }|j                  ddi       |j                  ddi       |j                  ddi       |j                  }ddi} ||      }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                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}x}x}}|j                  }ddi} ||      }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                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}x}x}}y)zCounter works with labels.r   r  r  TestmethodGET)labelsPOSTr   r$   )zP%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(labels=%(py4)s)
} == %(py9)sr  )r   r)   r0   r1   r   zassert %(py11)spy11Nr   r  )
r   r  r  r6   r8   r;   @py_assert8@py_assert7r  @py_format12s
             r   test_counter_with_labelsz$TestMetrics.test_counter_with_labels  s   #NF+	h&'	h'(	h&'uu3Xu-3u-.3!3.!3333.!333333q333q333u333-333.333!3333333uu4Xv.4u./414/14444/1444444q444q444u444.444/444144444444r    c                    ddl m}  |dd      }|j                  d       |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       |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       |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}}y)zGauge sets and changes value.r   )r  
test_gaugez
Test gauger   r$   r}  gr/  r   r   Nr      ru      )r  r  setr~  r   r3   r   r   r   r   r   r   r  dec)	r   r  r  r6   r8   r  r;   r:   r  s	            r   r  zTestMetrics.test_gauge  s   !,-	b	uuuw"w"}w"qquw"	auuuw"w"}w"qquw"	auuuw"w"}w"qquw"r    c                    ddl m}  |ddg d      }|j                  d       |j                  d       |j                  d	       |j                         }|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}||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}||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}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)zHistogram records observations.r   )r  test_histogramr  )r         ?r   )bucketsg?g333333?g?r>  ru   r$   rA  r  r  r1   Nr  r   r   r  r   r   )	r  r  observe	get_statsr   r3   r   r   r   )	r   r  hstatsr  r8   r   r   r<   s	            r   r  zTestMetrics.test_histogram&  s   %&H			$			#			#W~""~""""~"""~""""""""""Y$))$))))$)))$))))))))))Y$))$))))$)))$))))))))))Y$))$))))$)))$))))))))))r    c                    ddl m} |j                         }d}||v }|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}||v }|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}|d   }||v }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }	t        t        j                  |	            d
x}x}}y
)zGenesisMetrics snapshot works.r   )r  rn  r   r   snapshotr   rp   r*   Nr  genesis_memory_operations_totalr  r  r  r1   )r  r  r  r   r3   r   r   r   r   r   r   )
r   r  r  r  r   r   r9   r8   r   r<   s
             r   test_genesis_metrics_snapshotz)TestMetrics.test_genesis_metrics_snapshot4  s   *!**,&{h&&&&{h&&&{&&&&&&h&&&h&&&&&&&$yH$$$$yH$$$y$$$$$$H$$$H$$$$$$$0GHY4GG04GGGGG04GGGG0GGG4GGGGGGGGr    N)
ra   rb   rc   rd   r  r  r  r  r  r  re   r    r   r  r    s$    "*	5	*Hr    r  __main__z-vz
--tb=shortz,pytest not available, running basic tests...z
=== z ===test_z  [OK] r   z	  [FAIL] rO   rM   z(========================================zPassed: z
, Failed: )0rd   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rB  rC   sysr   r   rT  pathlibr   r   unittest.mockr   r   r#  insertstrrQ   rR   rW   r	   rg   r   r   r  r^  r  ra   exitmainImportErrorprinttest_classespassedfailed
test_classinstancedirrT   
startswithgetattrr   rN  re   r    r   <module>r     s     	 
      * 3tH~,,33f<= > 9m 9m@E EXK KdM% M%hm' m'h.( .(j<H <HF z#*hl;<=	 
   *<= " 
 & 	$JF:../t45!|HH $??7+$/$/1v./!$ $	$r!56!$$	$ 	6(m
6(34fkq)A *s=   )C6 6AGE/.G/F	4F	GF	8GG