o
    qoi5_                     @   sL  d 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mZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ejG dd dZejG dd dZG dd de	ZG dd dejZd>ddZ	d?dddddZ ejG dd dZ!ejG dd dZ"d@de
ej# fdd Z$ejG d!d" d"Z%d#e%fd$d%Z&ej'e%e(e(e(e&d& G d'd( d(ej)Z*G d)d* d*ej)Z+G d+d, d,ej)Z,G d-d. d.ej)Z-d/d0 d1d0 d2d0 gZ.G d3d4 d4ej)Z/G d5d6 d6ej)Z0d7d8 Z1G d9d: d:ej)Z2G d;d< d<ej)Z3e4d=kr$e5  dS dS )AzTests for daglish.    N)AnyList
NamedTupleOptionalTuplecast)absltest)parameterized)daglish)history)dataclasses)nested_values)	test_utilc                   @      e Zd ZU eed< eed< dS )FoobarbazN__name__
__module____qualname__r   __annotations__ r   r   L/home/ubuntu/.local/lib/python3.10/site-packages/fiddle/_src/daglish_test.pyr   #      
 r   c                   @   s   e Zd ZU eed< dS )Foo2bloopNr   r   r   r   r   r   )   s   
 r   c                   @   r   )SampleNamedTuplefizzbuzzNr   r   r   r   r   r   .   s   
 r   c                   @   s   e Zd ZdZdS )	SampleTagz`fdl.Tag` to use for testing.N)r   r   r   __doc__r   r   r   r   r    3   s    r    testc                 C   s   | |fS Nr   )argkwargr   r   r   	sample_fn7   s   r&      )kwarg1karg2c               O   s   t  S r#   )locals)abcr(   r)   argskwargsr   r   r   fn_with_position_args;   s   r0   c                   @   sl   e Zd ZU ejedZee e	d< ejedZ
ee e	d< ejedZee e	d< d	deej fddZdS )
TraversalLoggingMapFunctiondefault_factory	call_argssome_path_argsall_path_argsNstatec                 C   sF   |pt j| |}| j| | j|j | j|  |	|S r#   )
r
   MemoizedTraversalbeginr4   appendr5   current_pathr6   get_all_pathsmap_childrenselfvaluer7   r   r   r   __call__G   s
   
z$TraversalLoggingMapFunction.__call__r#   )r   r   r   r   fieldlistr4   r   r   r   r5   r6   r   r
   StaterA   r   r   r   r   r1   A   s
   
 r1   c                   @   s>   e Zd ZU ejedZeee	e	f  e
d< dejfddZdS )NonRecursingLoggingFunctionr2   values_and_pathsr7   c                 C   s   | j ||jf d S r#   )rF   r:   r;   r>   r   r   r   rA   U   s   z$NonRecursingLoggingFunction.__call__N)r   r   r   r   rB   rC   rF   r   r   r   r   r
   rD   rA   r   r   r   r   rE   O   s
   
 rE   r7   c                 C   sJ   |pt jt| }|| } t| tjrt| S t| t	j
r#t| S | S )zReplaces buildables with their arguments dictionary.

  Args:
    value: Nested configuration structure.
    state: Traversal state.

  Returns:
    `value` with buildables replaced by their arguments dictionary.
  )r
   r8   r9   switch_buildables_to_argsr=   
isinstancefdl	Buildableordered_argumentsenumEnumstrr@   r7   r   r   r   rG   Y   s   


rG   c                   @   r   )MyRangestartendN)r   r   r   intr   r   r   r   r   rP   n   r   rP   myrangec                 C   s   dd t | j| jD S )Nc                 s   s"    | ]}d |it |fV  qdS )r@   Nr
   Index.0ir   r   r   	<genexpr>u   s
    
z0myrange_flatten_with_paths_fn.<locals>.<genexpr>)rangerQ   rR   )rT   r   r   r   myrange_flatten_with_paths_fnt   s   r\   )
flatten_fnunflatten_fnpath_elements_fnflatten_with_paths_fnc                   @   sb   e Zd Zeedddddedddddeddddded	ddd
dedddd
ddd ZdS )PathTestexact_matchz.foo.barT)testcase_nameprefix_pathcontaining_pathexpectedprefixz.foo.bar.bazprefix_with_indexz.foo.bar[0]
not_prefixFnot_prefix_with_indexc                 C   s,   t |}t |}| t||| d S r#   )r   
parse_pathassertEqualr
   	is_prefix)r?   rd   re   rf   r   r   r   test_is_prefix   s   

zPathTest.test_is_prefixN)r   r   r   r	   named_parametersdictrn   r   r   r   r   ra      sD    ra   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
PathElementTestc                 C   s`   t jddt jddt jddt jddt jddt  g}d	d
d |D }| |d d S )Nr'   indexr+   keyfoo)name   r    c                 s   s    | ]}|j V  qd S r#   )code)rX   xr   r   r   rZ      s    z5PathElementTest.test_path_fragment.<locals>.<genexpr>z![1]['a'].foo[2].bar.__fn_or_cls__)r
   rV   KeyAttrBuildableFnOrClsjoinrl   )r?   pathpath_strr   r   r   test_path_fragment   s   




z"PathElementTest.test_path_fragmentc                 C   s   g i dg}|  td||d  g i dd}|  td||d  tg i }|  td||j t	t}|  t
 |t d S )Nr   r'   )r+   r,   r-   r+   r   )assertIsr
   rV   followr}   r   r~   r   rI   Configr   )r?   r|   yzcfgr   r   r   test_follow   s   


zPathElementTest.test_followc                 C   sL  dt ddtdddddtt gg}tdtd	tdf}| t	||d td
tdf}| t	||d tdtdtdf}| t	||d d}| 
t	||| td
f}| 
t	|||d
  tdtd	f}| 
t	|||d d	  td
td
t f}| 
t	||t|d
 d
  td	tdf}	| td t	||	 W d    n1 sw   Y  td
tdf}
| td t	||
 W d    n1 sw   Y  tdtd	tdf}| td t	|| W d    d S 1 sw   Y  d S )Nr'   r   r   r   r   r+   r,         r+   ry   r   r,   r   z-Key\(key='a'\) is not compatible with root=.*z<Key\(key='b'\) is not compatible with root\[2\]=\[3, 4, .*\]bamz=Attr\(name='bam'\) is not compatible with root\[1\]\['a'\]=.*)r   r   rI   r   r
   rV   r}   r~   rl   follow_pathr   r   get_callableassertRaisesRegex
ValueError)r?   rootpath1path2path3path4path5path6path7
bad_path_1
bad_path_2
bad_path_3r   r   r   test_follow_path   sP   $z PathElementTest.test_follow_pathc                 C   s:   t d}t d}t d}| || | || d S )Nr   r'   r+   )r
   r~   rV   r}   
assertLess)r?   r+   r,   r-   r   r   r   test_path_elements_order   s
   


z(PathElementTest.test_path_elements_orderN)r   r   r   r   r   r   r   r   r   r   r   rr      s
    /rr   c                   @   s   e Zd Zedejedddfdejedddddd	d
dd	fde	
 fdeddfdg dfddedddfdejedgdgdfgdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)S )*TraverserRegistryTestconfigr'   ry   r   r   positional_configr   r   r            r(   
var_kwarg1
var_kwarg2tagged_value
namedtupler+   r,   rC   r'   ry   r   )tupler   rp   r   defaultdictc                 C   sb   t t|}| | tt j|}||\}}|||}| t|t| | 	|| d S r#   )
r
   find_node_traversertypeassertIsNotNoner   NodeTraverserflatten	unflattenr   rl   )r?   r@   	traverservaluesmetadataunflattened_valuer   r   r   test_unflatten_flatten   s   
z,TraverserRegistryTest.test_unflatten_flattenc                 C   s   |  tt d S r#   )assertIsNoner
   r   r   r?   r   r   r   test_unknown_node_type  s   z,TraverserRegistryTest.test_unknown_node_typec                 C   s@   |  t tttd W d    d S 1 sw   Y  d S )N*   )assertRaises	TypeErrorr
   r   r   r   r   r   r   r   'test_find_node_traverser_non_type_error  s   "z=TraverserRegistryTest.test_find_node_traverser_non_type_errorc                 C   sz   t jdd}| |t |jtdd dd dd d | t t |t}| | | d|td	d
 d S )NFuse_fallbackc                 S      | j | jfd fS r#   r   r|   r   r   r   <lambda>'      zHTraverserRegistryTest.test_custom_traverser_registries.<locals>.<lambda>c                 S      t |  S r#   r   r   _r   r   r   r   (      c                 S      t dt dfS Nr   r   r
   r~   r   r   r   r   r   )      r]   r^   r_   r'   ry   Nr'   ry   )	r
   NodeTraverserRegistryr   r   r   register_node_traverserr   rl   r   r?   registryfoo_traverserr   r   r    test_custom_traverser_registries"  s   

z6TraverserRegistryTest.test_custom_traverser_registriesc                 C   s,   t t j}| | | |t t d S r#   )r
   r   NamedTupleTyper   r   r   )r?   namedtuple_traverserr   r   r   test_namedtuple_special_casing/  s
   
z4TraverserRegistryTest.test_namedtuple_special_casingc                 C   sT   |  t tjttddd dd dd d W d    d S 1 s#w   Y  d S )Nr   c                 S      t | d fS r#   r   r   r   r   r   r   9      zSTraverserRegistryTest.test_register_node_traverser_non_type_error.<locals>.<lambda>c                 S      t | S r#   rC   r|   r   r   r   r   r   :  r   c                 S      dd t t| D S )Nc                 s       | ]}t |V  qd S r#   rU   rW   r   r   r   rZ   ;      zfTraverserRegistryTest.test_register_node_traverser_non_type_error.<locals>.<lambda>.<locals>.<genexpr>r[   lenr   r   r   r   r   ;      r   )r   r   r
   r   r   r   r   r   r   r   +test_register_node_traverser_non_type_error5  s   "zATraverserRegistryTest.test_register_node_traverser_non_type_errorc                 C   sN   |  t tjtdd dd dd d W d    d S 1 s w   Y  d S )Nc                 S   r   r#   r   r   r   r   r   r   A  r   z`TraverserRegistryTest.test_register_node_traverser_existing_registration_error.<locals>.<lambda>c                 S   r   r#   r   r   r   r   r   r   B  r   c                 S   r   )Nc                 s   r   r#   rU   rW   r   r   r   rZ   C  r   zsTraverserRegistryTest.test_register_node_traverser_existing_registration_error.<locals>.<lambda>.<locals>.<genexpr>r   r   r   r   r   r   C  r   r   )r   r   r
   r   rC   r   r   r   r   8test_register_node_traverser_existing_registration_error=  s   "zNTraverserRegistryTest.test_register_node_traverser_existing_registration_errorc                 C   s   t jdd}| |t | |t |jtdd dd dd d | t t |t}| | | d|	td	d
 d S )NTr   c                 S   r   r#   r   r   r   r   r   r   K  r   zRTraverserRegistryTest.test_node_traverser_registry_with_fallback.<locals>.<lambda>c                 S   r   r#   r   r   r   r   r   r   L  r   c                 S   r   r   r   r   r   r   r   r   M  r   r   r   r'   ry   )
r
   r   r   r   rp   r   r   r   rl   r   r   r   r   r   *test_node_traverser_registry_with_fallbackE  s   

z@TraverserRegistryTest.test_node_traverser_registry_with_fallbackc                 C   s   t jdd}|jtdd dd dd d t j|d}|jtdd d	d d
d d | t t | t t | |t | |t | |t | |t | |t | |t d S )NTr   c                 S   r   r#   r   r   r   r   r   r   W  r   zZTraverserRegistryTest.test_stacked_node_traverser_registry_with_fallback.<locals>.<lambda>c                 S   r   r#   r   r   r   r   r   r   X  r   c                 S   r   r   r   r   r   r   r   r   Y  r   r   c                 S   s   | j fd fS r#   )r   r   r   r   r   r   ^  r   c                 S   r   r#   r   r   r   r   r   r   _  r   c                 S   s   t dfS )Nr   r   r   r   r   r   r   `  r   )	r
   r   r   r   r   r   r   r   rp   )r?   	registry1	registry2r   r   r   2test_stacked_node_traverser_registry_with_fallbackS  s,   zHTraverserRegistryTest.test_stacked_node_traverser_registry_with_fallbackN)r   r   r   r	   ro   rI   r   r   r0   r    newr   rp   collectionsr   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s@    


	r   c                   @   s  e Zd Zdd Zdd Zedddggdd	ddgdgejd
dfgejddfggdddd dgddgejd
dfgejd
dejd
dfejd
dejddfgejd
dejd
dejd
dfejd
dejddejd
dfgejd
dejd
dfejd
dejddfgejd
dejd
dejd
dfejd
dejddejd
dfgejddfggddd Z	dd Z
dS )BasicStructuredMappingTestc                 C   s~   t  }||g}t }|| | |j||g|g | |jdtjddfg | |jdgtjddftjddfgg d S Nr   r   rs   r'   )objectr1   rl   r4   r5   r
   rV   r6   r?   shareddiamondfcnr   r   r   test_memoizes_basic_diamondp  s   
z6BasicStructuredMappingTest.test_memoizes_basic_diamondc              	   C   s   t  }||g}t }||tj|| | |j||g||g | |jdtjddftjddfg | |j	dgtjddftjddfgtjddftjddfgg d S r   )
r   r1   r
   BasicTraversalr9   rl   r4   r5   rV   r6   r   r   r   r   test_non_memoized_basic_diamond|  s   
z:BasicStructuredMappingTest.test_non_memoized_basic_diamondbasicr   r   )rc   r@   expected_pathstwo_primitivesr   rs   r'   r   c                 C   s   | | gdgS )Nr   r   r   r   r   r   r     r   z#BasicStructuredMappingTest.<lambda>r   c                 C   sz   t  }||tj|| | |j| | d t  }tj|| | |j| W d   dS 1 s6w   Y  dS )zBPrimitive values should not be seen as shared, but containers are.zrun() classmethod aliasN)r1   r
   r   r9   rl   r6   subTestrun)r?   r@   r   r   r   r   r   test_all_paths  s   4"z)BasicStructuredMappingTest.test_all_pathsc                 C   s   t t}d|_d|_t |}| |jd d jj|jd d jj | |jd d j	d | |jd d j	d | |jd d j
tjj d S )Nr   r   r   r   r'   )rI   r   r   r   r1   rl   __argument_history__locationline_number	new_valuekindr   
ChangeKind	NEW_VALUE)r?   r   copiedr   r   r   test_argument_history  s   

z0BasicStructuredMappingTest.test_argument_historyN)r   r   r   r   r   r	   ro   r
   rV   r  r  r   r   r   r   r   n  sZ    




2r   c                 C   
   |  |S r#   r=   r7   objr   r   r   r        
 r   c                 C   s   t | |S r#   )rC   yield_map_child_valuesr  r   r   r   r     s    c                 C   r  r#   )flattened_map_childrenr  r   r   r   r     r  c                   @   sJ   e Zd Zeedd Zeedd Zeedd Zdd Z	d	S )
StateApiTestc                 C   s`   ddd}t  }t||}| }||| | |jdtjddffdtjddffg d S )Nr'   ry   r   r+   ru   r,   )rE   r
   r   initial_staterl   rF   r}   r?   map_fnr  	log_calls	traversalr7   r   r   r   test_map_dict  s   

"zStateApiTest.test_map_dictc              	   C   sj   d}t  }t||}| }||| | |jdtjddffdtjddffdtjddffg d S )	N)r   r   r   r   r   rs   r   r'   r   ry   )rE   r
   r   r  rl   rF   rV   r  r   r   r   test_map_tuple  s   
zStateApiTest.test_map_tuplec                 C   s\   ddi}|||g}t  }t||}| }||| | |jdditjddffg d S )Nrw   {   r   rs   )rE   r
   r8   r  rl   rF   rV   )r?   r  r   r  r  r  r7   r   r   r   test_map_memoized  s   

zStateApiTest.test_map_memoizedc              
   C   s   t dd}t }t||}| }||D ]}q| |jdditjddffdditjddffdditjddffdditjddffg d S )Nr   r   r@   rs   r   r   r   )	rP   rE   r
   r8   r  r  rl   rF   rV   )r?   r  r  r  r7   r   r   r   r   &test_fast_map_calls_flatten_with_paths	  s   
z3StateApiTest.test_fast_map_calls_flatten_with_pathsN)
r   r   r   r	   
parameters_eager_map_fnsr  r  r  r  r   r   r   r   r    s    


r  c                   @   s   e Zd Zdd ZdS )ArgsSwitchingFuzzTestc              	   C   sh   t dD ]-}| d|  t|}t|}t|}t| W d    n1 s,w   Y  qd S )Nd   z	rng_seed=)	r[   r   randomRandomr   generate_nested_valuerG   jsondumps)r?   rng_seedrng	structureresultr   r   r   	test_fuzz  s   

zArgsSwitchingFuzzTest.test_fuzzN)r   r   r   r,  r   r   r   r   r!    s    r!  c                  O   s   dd t j| i |D S )Nc                 S   s   g | ]\}}|t |fqS r   r
   r   )rX   r@   r   r   r   r   
<listcomp>+  s    z)_iterate_path_strings.<locals>.<listcomp>)r
   iterate)r.   r/   r   r   r   _iterate_path_strings*  s   r0  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )IterateTestc              	   C   sN   t td}|d |fdd}| t||df|d |fdf|dfddd	g d S )
Nr$   r   r   rS   rz   	['tuple']['tuple'][0]r$   z['tuple'][0].argNz['tuple'][1]r   z['int']rI   r   r&   rl   r0  r?   r   r   r   r   r   test_basic_walking1  s   zIterateTest.test_basic_walkingc                 C   sZ   t td}|d |fdd}| t|dd|df|d |fdf|dfd	d
|dfddg d S )Nr$   r   r2  F)memoizedrz   r3  r4  r5  r6  z['tuple'][2])r$   z['tuple'][2].argr7  r8  r9  r   r   r   test_basic_walking_non_memoized>  s   
z+IterateTest.test_basic_walking_non_memoizedc                 C   s:   dt dttdi}| t||df|d dfg d S )N	dataclassr   r$   rz   ['dataclass'])r   rI   r   r&   rl   r0  r?   r   r   r   r   %test_walk_dataclass_default_traverserM  s   
z1IterateTest.test_walk_dataclass_default_traverserc              
   C   sR   dt dttdi}| t|tjd|df|d dfdttddfd	g d S )
Nr=  r   r$   )r   rz   r>  )r   z['dataclass'].barz['dataclass'].baz)r$   z['dataclass'].baz.arg)r   rI   r   r&   rl   r0  fdl_dcdaglish_dataclass_registryr?  r   r   r   -test_walk_dataclass_dataclass_aware_traverserU  s   
z9IterateTest.test_walk_dataclass_dataclass_aware_traverserc                 C   s~   t jtddddddddd		}| t||d
f|d df|d df|jdf|d df|d df|jdf|jdf|jdfg	 d S )Nr   r'   ry   r   r   r   r   r   r   rz   z[0]z[1]z.cz[3]z[4]z.kwarg1z.var_kwarg1z.var_kwarg2)	rI   r   r0   rl   r0  r-   r(   r   r   r?  r   r   r   test_walk_positional_argumentsd  s0   



z*IterateTest.test_walk_positional_argumentsN)r   r   r   r:  r<  r@  rC  rD  r   r   r   r   r1  /  s    r1  c                   @   rq   )
MemoizedTraversalTestc                 C   s6   dt jfdd}t j|ttd}| |d d S )Nr7   c                 S   sp   t | tjr	| jS t | tr0d}| D ]}tjt|d d| d d}|||t	|7 }q|S t
dt|  )Nr   r'   ry   r   zShould not be reached, got )rH   rI   rJ   r   rC   r   r   callr
   r}   AssertionErrorrN   )r@   r7   r+  rY   to_visitr   r   r   traverse  s   
zPMemoizedTraversalTest.test_unique_traversals_for_different_ids.<locals>.traversei'  i)r
   rD   r8   r  rC   r[   rl   )r?   rI  r+  r   r   r   (test_unique_traversals_for_different_ids  s   z>MemoizedTraversalTest.test_unique_traversals_for_different_idsc                 C   sb   dt jfdd}g d}|| | td t j|| W d    d S 1 s*w   Y  d S )Nr7   c                 S   s
   | | S r#   r  rO   r   r   r   rI    s   
z<MemoizedTraversalTest.test_cycle_detection.<locals>.traverser   zSFiddle detected a cycle while traversing a value: <root>\[3\] is <root>\[3\]\[3\]\.)r
   rD   r:   r   r   r8   r  )r?   rI  r|   r   r   r   test_cycle_detection  s   
"z*MemoizedTraversalTest.test_cycle_detectionc                 C   sX   t jtt td}||j_| td t | W d    d S 1 s%w   Y  d S )N)r   zXFiddle detected a cycle while traversing a value: <root>\.bar is <root>\.bar\.bar\.bar\.)rI   r   r   r   r   r   build)r?   r   r   r   r   !test_cycle_detection_in_fdl_build  s   "z7MemoizedTraversalTest.test_cycle_detection_in_fdl_buildc              	   C   s   dt dttdi}|d j|d< dtjfdd}t||tj	}|||
 }| |dd	d
dd
gdgddd
gdgd d S )Nr=  r   r$   altr7   c                 S   s:   | | rddd |jddD t|| dS dS )Nz, c                 s   r   r#   r-  )rX   r   r   r   r   rZ     s
    
zaMemoizedTraversalTest.test_get_all_paths_dataclass_traverser.<locals>.traverse.<locals>.<genexpr>T)allow_cachingpaths
sub_values
leaf value)is_traversabler   r<   rC   r  rO   r   r   r   rI    s   


zNMemoizedTraversalTest.test_get_all_paths_dataclass_traverser.<locals>.traverserz   r>  rS  z['dataclass'].baz, ['alt']rP  )r   rI   r   r&   r   r
   rD   r8   rA  rB  r  assertDictEqual)r?   r   rI  r   r+  r   r   r   &test_get_all_paths_dataclass_traverser  s.   z<MemoizedTraversalTest.test_get_all_paths_dataclass_traverserN)r   r   r   rJ  rK  rM  rV  r   r   r   r   rE    s
    
rE  __main__)r"   )r'   r#   )6r!   r   r   rL   r&  r#  typingr   r   r   r   r   r   absl.testingr   r	   fiddlerI   r
   r   fiddle._src.experimentalrA  fiddle._src.testingr   r   r=  r   r   r   Tagr    r&   r0   r1   rE   rD   rG   rP   r\   r   NotImplementedTestCasera   rr   r   r   r   r  r!  r0  r1  rE  r   mainr   r   r   r   <module>   sr    
		#Ruk<Q
]