o
    ,wi̹                     @   s  d 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 ddl	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dd Zdd Zd,ddZG dd de
jZG dd de
jZejZejZdd Zejd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 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ejZ$e%d+kre&  dS dS )-zTests for fiddle.diffing.    N)Any)absltest)parameterized)daglish)testing)diffingc                   @   s&   e Zd ZU eed< eed< eed< dS )SimpleClassxyzN__name__
__module____qualname__r   __annotations__ r   r   U/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/fiddle/_src/diffing_test.pyr       s   
 r   c                   @   s.   e Zd ZU eed< eed< eed< eed< dS )AnotherClassr	   r
   abNr   r   r   r   r   r   '   s
   
 r   c                 C   s   | |fS Nr   )firstsecondr   r   r   	make_pair/   s   r   c                 C   s
   | ||fS r   r   r   r   thirdr   r   r   make_triple3   s   
r   c                 C   s   | | || |dS )Nr   r   cr   arg1arg2kwarg1kwarg2r   r   r   basic_fn7   s   r$   c                   @      e Zd ZdZdS )GreenTagFiddle tag for testing.Nr   r   r   __doc__r   r   r   r   r&   ;       r&   c                   @   r%   )BlueTagr'   Nr(   r   r   r   r   r+   ?   r*   r+   c                 C   s$   |  D ]\}}t| || q| S )zAUpdates `fdl_configs` to have the specified tags, and returns it.)itemsfdlset_tags)
fdl_configparameter_tagsparamtagsr   r   r   config_with_tagsJ   s   r3   T)frozenc                   @   s    e Zd Zedd Zdd ZdS )UnsupportedPathElementc                 C   s   dS )Nz<unsupported>r   selfr   r   r   <lambda>S       zUnsupportedPathElement.<lambda>c                 C   s   |S r   r   )r7   	containerr   r   r   r8   T   r9   N)r   r   r   propertycodefollowr   r   r   r   r5   Q   s    r5   c                   @   sD   e Z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 )DiffAlignmentTestc              
   C   s   t tt tdddt tddd}t tt tddddt jtdd}t||}| |	  | |
  | || | || | |jd	 | |jd
 | t|d | t|d d S )N                     r   oldnewz8<DiffAlignment from 'old' to 'new': 0 object(s) aligned>z'DiffAlignment:
    (no objects aligned))r-   Configr   r   r$   Partialr   DiffAlignmentassertEmptyaligned_valuesaligned_value_idsassertFalseis_old_value_alignedis_new_value_alignedassertEqualold_namenew_namereprstr)r7   rG   rH   empty_alignmentr   r   r   test_constructorY   s(   z"DiffAlignmentTest.test_constructorc              
   C   s  t tt tddddgt tddd}t tt tddddt jtdd	gd
}t||}||| ||j	|j	 ||j	j
|jj
 | ||| | ||| | ||j	|j	 | ||j	|j	 | ||j	j
|jj
 | ||jj
|j	j
 | d5 | }tt|t|tt|j	t|j	tt|j	j
t|jj
g}| || W d    n1 sw   Y  | d9 | }t||t|j	|j	t|j	j
|jj
g}|jdd d |jdd d | || W d    n	1 sw   Y  | d | t|d W d    n	1 s,w   Y  | d | t|dg d W d    d S 1 sPw   Y  d S )Nr?   r@   rA   rB   rC   rD      rE      rF   rN   rM   c                 S   
   t | jS r   id	old_valuepr   r   r   r8         
 z.DiffAlignmentTest.test_align.<locals>.<lambda>)keyc                 S   r[   r   r\   r_   r   r   r   r8      ra   __repr__z8<DiffAlignment from 'old' to 'new': 3 object(s) aligned>__str__
)zDiffAlignment:z    old -> newz    old.first -> new.firstz    old.first.z -> new.second.z)r-   rI   r   r   r$   rJ   r   rK   alignr   r   r   assertIsnew_from_oldold_from_newsubTestrN   AlignedValueIdsr]   assertCountEqualrM   AlignedValuessortrR   rU   rV   join)r7   rG   rH   	alignmentrN   expected_aligned_value_idsrM   expected_aligned_valuesr   r   r   
test_aligno   sZ   	
$zDiffAlignmentTest.test_alignc              	   C   s  dhdhg}dhdhg}t ||}| d< | ||d |d  | ||d |d  | ||d |d  | ||d |d  W d    n1 sVw   Y  | d ||d |d  | ||d |d  W d    n1 sw   Y  | d2 | 	t j
d ||d |d  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr?   r@   	can_alignr   zalign equal valueszalign non-equal valuesz7Values of type .* may only be aligned if they are equal)r   rK   rj   rO   rt   
assertTruerf   rg   rh   assertRaisesRegexAlignmentErrorr7   rG   rH   rp   r   r   r   7test_only_align_nontraversable_values_if_they_are_equal   s.   "zIDiffAlignmentTest.test_only_align_nontraversable_values_if_they_are_equalc              
   C   s  t tt tdgdgdgt tddd}t tt tdgdgddt jtddgd	}t||}||j	j
|j	j | d
' | tjd ||j|j W d    n1 s]w   Y  W d    n1 slw   Y  | d) | tjd ||j	j
|j	j W d    n1 sw   Y  W d    n1 sw   Y  | d) | tjd ||j	j|j	j W d    n1 sw   Y  W d    n1 sw   Y  | d) | tjd ||j	j|jj W d    n1 sw   Y  W d    n	1 sw   Y  | d* | tjd ||jj|jj W d    n	1 s7w   Y  W d    n	1 sGw   Y  | d3 | tjd ||j	j|j	j W d    n1 sow   Y  W d    d S W d    d S 1 sw   Y  d S )Nr?   r@   rA   rB   rC   rD   rE   rZ   rF   z"type(old_value) != type(new_value)z.* different types .*zold_value already alignedz4An alignment has already been added for old value .*znew_value already alignedz4An alignment has already been added for new value .*z len(old_value) != len(new_value)z.* different lengths .*znon-memoizable old_valuez;old_value=4 may not be aligned because it is not memoizableznon-memoizable new_valuez;new_value=3 may not be aligned because it is not memoizable)r-   rI   r   r   r$   rJ   r   rK   rf   r   r	   r    rj   rv   rw   r   r!   r
   r   r"   rx   r   r   r   test_alignment_errors   sz    $z'DiffAlignmentTest.test_alignment_errorsc              
   C   s   t tt tddddgt tddd}t t|jt jt|jjd}t	||}| 
| t|jj|jjt|j|jg d S )	Nr?   r@   rA   rB   rC   rD   rY   rF   )r-   rI   r   r   r$   r   rJ   r   r   align_by_idrl   rM   rm   r   rx   r   r   r   test_align_by_id   s   


z"DiffAlignmentTest.test_align_by_idc                 C   s  t t}t jtdd}t jtt jtddtddt jttdggd|ddgdgd	}t jtt jtd|d
ddt jttdggtd|dddgdd
dggd	}t	||}| 
| t|jj|jjt||t|j|jt|jj|jjt|jj|jjg d S )Nbopr	   r?   r@   
   r	   r
   r   rC   )r    r!   r"   r   rA   rB   r      )r-   rI   r   r   ranger$   setrJ   r   align_heuristicallyrl   rM   rm   r   r"   r   r!   r    r   )r7   r   drG   rH   rp   r   r   r   test_align_heuristically   s0   

z*DiffAlignmentTest.test_align_heuristicallyc                 C   s   |  td tg i  W d    n1 sw   Y  |  td tdgddg W d    n1 s6w   Y  |  td ttdddtddd W d    d S 1 s[w   Y  d S )	Nzdifferent typeszdifferent lengthsr?   r@   rA   z%may only be aligned if they are equalrB   rC   )rv   
ValueErrorr   r   r   r6   r   r   r   7test_align_heuristically_fails_if_roots_cant_be_aligned
  s   "zIDiffAlignmentTest.test_align_heuristically_fails_if_roots_cant_be_alignedN)
r   r   r   rX   rs   ry   rz   r|   r   r   r   r   r   r   r>   W   s    3-r>   c                   @   s   e Zd Zdd ZdS )ReferenceTestc                 C   s8   t dtdtdtdf}| t|d d S )NrG   foor?   barz<Reference: old.foo[1]['bar']>)r   	Referencer   AttrIndexKeyrR   rU   )r7   	referencer   r   r   	test_repr  s   zReferenceTest.test_reprN)r   r   r   r   r   r   r   r   r     s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
DiffTestc                 C   s   t jt tddt tdtddt tdt tdtdd	t td
dtdd	ifddtddgfd}td}| 	t
|| d S )N.foo[1]r@   .foo[2]rG   .bar.bar.x.bar.ynew_shared_values[0].bar.zr   r?   changesr   aS      Diff(changes=(
             ModifyValue(target=(Attr(name='foo'), Index(index=1)), new_value=2),
             SetValue(target=(Attr(name='foo'), Index(index=2)), new_value=<Reference: old.bar>),
             DeleteValue(target=(Attr(name='bar'), Attr(name='x'))),
             ModifyValue(target=(Attr(name='bar'), Attr(name='y')), new_value=<Reference: new_shared_values[0]>),
             SetValue(target=(Attr(name='bar'), Attr(name='z')), new_value={'a': <Reference: new_shared_values[0]>}),
         ),
         new_shared_values=(
             [1, 2, <Reference: old.bar>],
         )))r   DiffModifyValue
parse_pathSetValueparse_referenceDeleteValuetextwrapdedentrR   rV   )r7   cfg_diffexpected_strr   r   r   test_str  s(   

zDiffTest.test_strc                 C   s$   |  |j|j | |j|j d S r   )rl   r   rR   r   )r7   diff1diff2r   r   r   assertDiffEqual;  s   zDiffTest.assertDiffEqualc                 C   s  t jt tddt tdtddt tdt tdtdd	t td
dtdd	ifddtddgfd}dt jdtfdd}|	|}t jt tddt tdtddt tdtdd	t td
dtdd	ifddtddgfd}| 
|| d S )Nr   r@   r   rG   r   r   r   r   r   r   r   r?   r   diff_opreturnc                 S   s   t | tjS r   )
isinstancer   r   )r   r   r   r   ignore_deletionsO  s   z6DiffTest.test_ignore_changes.<locals>.ignore_deletions)r   r   r   r   r   r   r   DiffOperationboolignoring_changesr   )r7   r   r   expected_diffr   r   r   test_ignore_changes?  sL   


zDiffTest.test_ignore_changesc                 C   s  t jt tddt tdtddt tdt tdtdd	t td
dtdd	ifddtddgfd}| dJ |tdg}t jt tdtddt tdt tdtdd	t td
dtdd	ifddtddgfd}| 	|| W d    n1 sw   Y  | d6 |tdg}t jt tddt tdtddfddtddgfd}| 	|| W d    d S 1 sw   Y  d S )Nr   r@   r   rG   r   r   r   r   r   r   r   r?   r   zignore array elementzignore all subpath)
r   r   r   r   r   r   r   rj   ignoring_pathsr   )r7   r   r   r   r   r   r   r   test_ignore_fieldsc  sd   
"zDiffTest.test_ignore_fieldsN)r   r   r   r   r   r   r   r   r   r   r   r     s
    $r   c                   @   s   e Zd Z		d1d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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&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0S )2DiffFromAlignmentBuilderTestr   c                 C   s,   t ||}| |j| | |j| dS )a  Checks that building a Diff generates the expected values.

    Builds a diff using a heuristic alignment between `old` and `new`, and
    then checks that `diff.changes` and `diff.new_shared_values` have the
    indicated values.

    Args:
      old: The `old` value for the diff.
      new: The `new` value for the diff.
      expected_changes: Tuple of DiffOperation.  Order is ignored.
      expected_new_shared_values: Tuple of value
    N)r   
build_diffrl   r   rR   r   )r7   rG   rH   expected_changesexpected_new_shared_valuesr   r   r   r   
check_diff  s   z'DiffFromAlignmentBuilderTest.check_diffc                 C   s   t t}t tt tddddgt tdgddg|}t tt td|ddt td	gd
ddg}t||t|j|jt|j	j
|j	j
t|j	j|jjt|jj|j	jg}t||}|D ]
}||j|j qet|S )z3Returns a DiffBuilder that can be used for testing.r?   r@   rA   rB   rC   rD   rY         @r   	   )r-   rI   r   r   r$   rJ   r   rm   r   r   r    r"   r!   r   rK   rf   r^   	new_value_DiffFromAlignmentBuilder)r7   r   rG   rH   rM   rp   aligned_valuer   r   r   make_test_diff_builder  s"   


z3DiffFromAlignmentBuilderTest.make_test_diff_builderc                 C   sn   t tt tddd}t|}t |t t |jt t	t
dtt	t
dtf}| ||| d S )Nr?   r@   rA   .__fn_or_cls__.x.__fn_or_cls__)r-   rI   r   r   copydeepcopyupdate_callabler	   r   r   r   r   r7   rG   rH   r   r   r   r   test_modify_buildable_callable  s   
z;DiffFromAlignmentBuilderTest.test_modify_buildable_callablec              	   C   sb   t tdt tdd}t|}d|_d|j_t	t
ddt	t
ddf}| ||| d S )Nr?   r@   rA         .x.y.x)r-   rI   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   test_modify_buildable_argument     
z;DiffFromAlignmentBuilderTest.test_modify_buildable_argumentc                 C   sh   t tdddgg}t|}d|jd< d|jd d< ttddttddf}| 	||| d S )	Nr?   r@   rA   r   r   !   .x[0]z.x[2][0]
r-   rI   r   r   r   r	   r   r   r   r   r   r   r   r   test_modify_sequence_element  s   

z9DiffFromAlignmentBuilderTest.test_modify_sequence_elementc                 C   sl   t tddddid}t|}d|jd< d|jd	 d< ttd
dttddf}| 	||| d S )Nr@   rB   r   rY   r   r   r   r   r   .x['a'].x['c']['d']r   r   r   r   r   test_modify_dict_item     

z2DiffFromAlignmentBuilderTest.test_modify_dict_itemc              	   C   sb   t tdt tdd}t|}d|_d|j_t	
tddt	
tddf}| ||| d S )Nr?   r@   rA   r   r   .zz.y.a)r-   rI   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   test_set_buildable_argument  r   z8DiffFromAlignmentBuilderTest.test_set_buildable_argumentc                 C   sl   t tddddid}t|}d|jd< d|jd	 d
< ttddttddf}| 	||| d S )Nr@   rB   r   rY   r   r   r   r   r   r   z	.x['foo']z.x['c']['bar'])
r-   rI   r   r   r   r	   r   r   r   r   r   r   r   r   test_set_dict_item  r   z/DiffFromAlignmentBuilderTest.test_set_dict_itemc              	   C   st   t tdt tddt td}t|}|`|j`|`t	
tdt	
tdt	
tdf}| ||| d S )Nr?   r@   rA   rB   r   r   r   )r-   rI   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   test_delete_buildable_argument  s   

z;DiffFromAlignmentBuilderTest.test_delete_buildable_argumentc                 C   sx   t tdi ddid}t|}|jd= |jd= |jd d= ttdttd	ttd
f}| 	||| d S )Nr@   r   rY   r   r   r   r   r   z.x['b']r   )
r-   rI   r   r   r   r	   r   r   r   r   r   r   r   r   test_delete_dict_item  s   
z2DiffFromAlignmentBuilderTest.test_delete_dict_itemc                 C   s  t jtdt jtdddgdt jtddd}t|}ddddg|jjg|_|j|j_dg|j_t t|jd |jj|j_ddgddtd	d
tddgdgf}t	
tdtd	dt	
tdtd	dt	
tdtd	dt	tdt ttd	d
td	df}| |||| d S )Nr?   r@   rA   rE   r   rB   r~   c   r   r   rG   .y.zr   [1]r   z.y.y[2]z.z.y)r-   rI   r   r   r   r
   r   r	   r   r   r   r   r   r   )r7   rG   rH   r   r   r   r   r   test_add_shared_new_objects	  sF   



z8DiffFromAlignmentBuilderTest.test_add_shared_new_objectsc                 C   s   |    }ttdtttdttdttdttddttdtdd	ttd
dttddttdt	
ttdddtddttddf
}| |j| | |jd d S )Nz.first.__fn_or_cls__z.first.xz.first.yz.first.zz.first.arg1r?   z.first.arg2rG   z.second.kwarg1z.first.kwarg1rA   z.first.kwarg2r   z.secondz.second.arg1r   z.second.arg1[0]r   r   )r   r   r   r   r   r$   r   r   r   r-   rJ   rl   r   rR   r   )r7   r   r   r   r   r   test_multiple_modifications+  s*   

z8DiffFromAlignmentBuilderTest.test_multiple_modificationsc                 C   s(  t ddd}| dI tjt |d|dgd}t|}t ddd|jd< | |j|jd  | 	|j|jd  t
tdt dddf}| ||| W d    n1 sWw   Y  | d	) tjt d
d|dgd}t|}t ddd|jd< | ||i  W d    d S 1 sw   Y  d S )Nr?   r@   rA   zwith sharingrB   rC   r	   r
   .y[1]zwithout sharingr   )r   rj   r-   rI   r   r   r
   rR   r	   assertIsNotr   r   r   r   )r7   r   rG   rH   r   r   r   r   $test_replace_object_with_equal_value@  s$   

"zADiffFromAlignmentBuilderTest.test_replace_object_with_equal_valuec                 C   s   t jtdddd}t jtdddd}t |dt t |dt t |dt t |dt | ||tt	dttt	d	tt
t	d	tt
t	d
th d S )Nr?   r@   rA   r   r	   r
   r   r   .yr   )r-   rI   r   add_tagr+   r&   r   r   	RemoveTagr   AddTag)r7   rG   rH   r   r   r   test_modify_tagsX  s   z-DiffFromAlignmentBuilderTest.test_modify_tagsc              
   C   s   t jttdgtdgttdgd}t jttdgtdgttddid}ttdtt	tdtt
tddt
td	ddif}| ||| d S )
Nr?   rC      r   rD   r@   r   z.y[0]r   )r-   rI   r   r&   rH   r+   r   r   r   r   r   r   r   r   r   r   test_modify_tagged_valuesg  s$   



z6DiffFromAlignmentBuilderTest.test_modify_tagged_valuesc                 C   sX   t d}| j|jg|gttd|fd | j|g|jgttd|jfd d S )NrC   r   )rG   rH   r   )r+   rH   r   r2   r   r   r   )r7   tagged_valuer   r   r   test_replace_value_with_tagsz  s   



z9DiffFromAlignmentBuilderTest.test_replace_value_with_tagsc              	   C   s   t dg}tt}tjt||d}ttdt ttdt ttdt	ddttdt	ddf}dgf}| 
|||| d S )Nr   r   r   r   r   r   )r+   rH   r-   rI   r   r   r   r   r   r   r   )r7   r   rG   rH   r   r   r   r   r   test_shared_new_tags  s   
z1DiffFromAlignmentBuilderTest.test_shared_new_tagsc                 C   sJ   t dg}tdg}ttdt ttdtf}| ||| d S )Nr?   z.value)r&   rH   r+   r   r   r   r   r   r   r   r   r   test_modify_root_tag  s   z1DiffFromAlignmentBuilderTest.test_modify_root_tagc                 C   sJ   |   }|  | td |  W d    d S 1 sw   Y  d S )Nz(build_diff should be called at most once)r   r   rv   r   )r7   diff_builderr   r   r   4test_diff_from_alignment_builder_can_only_build_once  s   
"zQDiffFromAlignmentBuilderTest.test_diff_from_alignment_builder_can_only_build_oncec                 C   s   |   }|jj}|jj}| ||| | ||j|j | ||jj|jj | ||j	j
|jj | ||j	|j	 | ||jj|jj | ||j	|j	 | ||jjd |jj d S )Nr?   )r   rp   rG   rH   ru   aligned_or_equalr   r	   r    r   r"   r!   rO   r   r#   )r7   r   rG   rH   r   r   r   test_aligned_or_equal  s   z2DiffFromAlignmentBuilderTest.test_aligned_or_equalc                 C   s8   | j tdggtdggttdtdgfd d S )NrC   rD   r   )r   )r   r   r   r   r   r6   r   r   r   test_replace_set  s
   
z-DiffFromAlignmentBuilderTest.test_replace_setc                 C   sH   g dd d}g dd d}t t||}t t||}| || d S )N)r?   r@   rA   )kv)r-   rI   r   r   )r7   r   r   r	   r
   r   r   r   :test_align_heuristically_identical_configs_w_different_ids  s
   zWDiffFromAlignmentBuilderTest.test_align_heuristically_identical_configs_w_different_idsc                 C   sx   t tddd}t tddd}t||}| || | td t	| W d    d S 1 s5w   Y  d S )Nr?   r@   rA   rB   rC   rD   z#The root objects .* must be aligned)
r-   rI   r   r   rK   rO   rP   rv   r   r   rx   r   r   r   test_root_must_be_aligned  s   "z6DiffFromAlignmentBuilderTest.test_root_must_be_alignedN)r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s4    
					"	r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ResolveDiffReferencesTestc                 C   sz   t jtdgd}tjttdtddfd}t||}|j	d }| 
|jtd | |tj | |j|j d S )Nr?   r~   r   rG   r   r   r   )r-   rI   r   r   r   r   r   r   resolve_diff_referencesr   rR   targetassertIsInstancerg   r   r	   )r7   rG   r   resolved_diffdiff_zr   r   r   #test_resolve_ref_from_change_to_old  s   
z=ResolveDiffReferencesTest.test_resolve_ref_from_change_to_oldc                 C   s   t jtdgd}ttdtddf}dgf}t||}t||}|j	d }| 
|jtd | |tj | |j|jd  d S )Nr?   r~   r   r   r   r   r-   rI   r   r   r   r   r   r   r   r   rR   r   r   rg   r   r   r7   rG   r   r   r   r   r   r   r   r   0test_resolve_ref_from_change_to_new_shared_value  s   
zJResolveDiffReferencesTest.test_resolve_ref_from_change_to_new_shared_valuec                 C   s   t jtdgd}ttdtddf}tddgf}t||}t||}|j	d }| 
|jtd | |tj | |j|jd  | |jd d |j d S )	Nr?   r~   r   r   r   rG   r   r   )r-   rI   r   r   r   r   r   r   r   r   rR   r   r   rg   r   r   r	   r  r   r   r   -test_resolve_ref_from_new_shared_value_to_old  s   
zGResolveDiffReferencesTest.test_resolve_ref_from_new_shared_value_to_oldc                 C   s   t jtdgd}ttdtddtddgf}dgtddgf}t||}t||}|j	d }| 
|jtd | |tj | |jd |jd  | |jd |jd  | |jd d |jd  d S )Nr?   r~   r   r   r   r   r   r  r  r   r   r   :test_resolve_ref_from_new_shared_value_to_new_shared_value  s$   
zTResolveDiffReferencesTest.test_resolve_ref_from_new_shared_value_to_new_shared_valuec           
      C   sL  dgdgdgdt jtdddgg}tjttdtd	d
ttd
td	dttdtd	dttdtddttdtddttdtddftd	dgtd	dtddgfd}t	||}|j
d }| |jtd | |tj | |j|d d  |j
d }| |jtd
 | |tj | |j|d d  |j
d }| |jtd | |tj | |j|d  |j
d }| |jtd | |tj | |j|jd  |j
d }| |jtd | |tj | |j|jd  |j
d }	| |	jtd | |	tj | |	j|jd  d S )Nr?   r@   rA   r   rB   rF   rC   [1]['x']rG   [1]['y'][1]['z']r   [2].xr   r   z[2].y[2].zr   [3]r   r   r
   r	   )r-   rI   r   r   r   r   r   r   r   r   r   rR   r   r   rg   r   r   )
r7   rG   r   r   diff_1_xdiff_1_ydiff_1_zdiff_2_xdiff_2_ydiff_2_zr   r   r   %test_resolve_diff_multiple_references  sr   $









z?ResolveDiffReferencesTest.test_resolve_diff_multiple_referencesc                 C   sn   t jtdgd}tjttdtddfd}| t	d t
|| W d    d S 1 s0w   Y  d S )Nr?   r~   r   r   r   r   zUnexpected Reference.root)r-   rI   r   r   r   r   r   r   rv   r   r   r7   rG   r   r   r   r   $test_error_unexpected_reference_rootF  s   "z>ResolveDiffReferencesTest.test_error_unexpected_reference_rootN)	r   r   r   r   r  r  r  r  r  r   r   r   r   r     s    9r   c                   @   s   e Z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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#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-S ).ApplyDiffTestc                 C   sL   t jtddd}tttdf}t|| | |t jtdd d S )NrC   r@   r   r   r
   	r-   rI   r   r   r   r   r   
apply_diffrR   r  r   r   r   r   Q  s   z,ApplyDiffTest.test_delete_buildable_argumentc                 C   sP   t jtddd}tttddf}t|| | |t jtddd d S )NrC   r@   r   r   rD   	r-   rI   r   r   r   r   r   r  rR   r  r   r   r   r   W  s   z,ApplyDiffTest.test_modify_buildable_argumentc              	   C   sR   t jtddd}tttddf}t|| | |t jtdddd d S )NrC   r@   r   r   rD   r   	r-   rI   r   r   r   r   r   r  rR   r  r   r   r   r   ]  s   z)ApplyDiffTest.test_set_buildable_argumentc                 C   sj   t jtddd}tttdtttdt	tddf}t
|| | |t jtddd d S )	NrC   r@   )r	   r   r   r   z.arA   )r	   r   )r-   rI   r   r   r   r   r   r   r   r   r  rR   r  r   r   r   r   c  s   z,ApplyDiffTest.test_modify_buildable_callablec                 C   sN   t jtddid}tttdf}t|| | |t jti d d S )N1r@   r~   .x["1"]r  r  r   r   r   r   m  s   z#ApplyDiffTest.test_delete_dict_itemc                 C   sT   t jtddid}tttddf}t|| | |t jtddid d S )Nr  r@   r~   r  rD   r  r  r   r   r   r   s     z#ApplyDiffTest.test_modify_dict_itemc                 C   sV   t jtddid}tttddf}t|| | |t jtdddd d S )Nr  r@   r~   z.x["2"]rD   )r  2r  r  r   r   r   r   y  s    z ApplyDiffTest.test_set_dict_itemc                 C   sT   t jtddgd}tttddf}t|| | |t jtddgd d S )Nr?   r@   r~   r   r   r  r  r   r   r   test_modify_list_item  r  z#ApplyDiffTest.test_modify_list_itemc              	   C   sz   t tdt tdg}tttdtddttdtddf}t	|| | 
|t tdt tdg d S )Nr?   r@   r   rG   r   )r-   rI   r   r$   r   r   r   r   r   r  rR   r  r   r   r   test_swap_siblings  s   $z ApplyDiffTest.test_swap_siblingsc              
   C   s   t t}t jt|d}|g}tttdtddt	tdt
tdtddf}t|| | |t jtt tdg | |d | | |d j| d S )Nr~   r   rG   z[0].xz[0].x.xr   )r-   rI   r   r   r   r   r   r   r   r   r   r  rR   rg   r	   )r7   original_childoriginal_parentrG   r   r   r   r   test_swap_child_and_parent  s"   
z(ApplyDiffTest.test_swap_child_and_parentc                 C   s4  dgdgdgdt jtdddgg}tjttdtd	d
ttd
td	dttdtd	dttdtddttdtddftd	dtd	dtddgfd}t	
|}|d d |d d |d d< |d d< |d |d d< |d |d _|d |d g|d _t|| | || d S )Nr?   r@   rA   r   rB   rF   rC   r  rG   r  r  r   r	  r   r   r
  r   r  r   r
   r	   r   r   )r-   rI   r   r   r   r   r   r   r   r   r   r	   r   r  rR   )r7   rG   r   rH   r   r   r   (test_apply_diff_with_multiple_references  sD   $


*z6ApplyDiffTest.test_apply_diff_with_multiple_referencesc                 C   sd   t jtddgd}ttddf}| td t|| W d    d S 1 s+w   Y  d S )Nr?   r@   r~   r   r   z6Modifying the root `structure` object is not supported)	r-   rI   r   r   r   r   rv   r   r  r  r   r   r   test_error_modify_root  s   "z$ApplyDiffTest.test_error_modify_rootc                 C   h   t jtddgd}tttddf}| td t	|| W d    d S 1 s-w   Y  d S )Nr?   r@   r~   r   r   zparent does not exist
r-   rI   r   r   r   r   r   rv   r   r  r  r   r   r    test_error_parent_does_not_exist  
   "z.ApplyDiffTest.test_error_parent_does_not_existc                 C   r&  )Nr?   r@   r~   .x.yr   zparent has unexpected typer'  r  r   r   r    test_error_wrong_child_path_type  r)  z.ApplyDiffTest.test_error_wrong_child_path_typec                 C   f   t jtddgd}tttdf}| td t	|| W d    d S 1 s,w   Y  d S )Nr?   r@   r~   r   zvalue not found\.
r-   rI   r   r   r   r   r   rv   r   r  r  r   r   r   !test_error_delete_value_not_found  s
   "z/ApplyDiffTest.test_error_delete_value_not_foundc                 C   r&  )Nr?   r@   r~   r   rC   zvalue not found; use SetValuer'  r  r   r   r   !test_error_modify_value_not_found  r)  z/ApplyDiffTest.test_error_modify_value_not_foundc                 C   r&  )Nr?   r@   r~   r   rC   z1already has a value; use ModifyValue to overwrite
r-   rI   r   r   r   r   r   rv   r   r  r  r   r   r   &test_error_set_value_already_has_value  s   "z4ApplyDiffTest.test_error_set_value_already_has_valuec                 C   s   t jtddgd}tttddttddttdf}| 	t
d	g d
 t|| W d    d S 1 s?w   Y  d S )Nr?   r@   r~   r   rC   r*  rA   z.x.zre   )zUnable to apply diff:z6  \* For <root>.x.y=ModifyValue\(.*, new_value=3\): .*z)  \* For <root>.x.z=DeleteValue\(.*\): .*z3  \* For <root>.y.z=SetValue\(.*, new_value=5\): .*)r-   rI   r   r   r   r   r   r   r   rv   r   ro   r  r  r   r   r   test_error_multiple_errors  s   "z(ApplyDiffTest.test_error_multiple_errorsc                 C   r,  )Nr?   r@   r~   r   z"DeleteValue does not support Indexr-  r  r   r   r   test_error_delete_index  s   "z%ApplyDiffTest.test_error_delete_indexc                 C   r&  )Nr?   r@   r~   .x[2]rC   zSetValue does not support Indexr0  r  r   r   r   test_error_set_index  r)  z"ApplyDiffTest.test_error_set_indexc                 C   sH   |  td tddg t  W d    d S 1 sw   Y  d S )Nz3ModifyValue does not support UnsupportedPathElementr   rC   )rv   r   r   r   applyr5   r6   r   r   r   &test_error_modify_unsupported_path_elt  s
   "z4ApplyDiffTest.test_error_modify_unsupported_path_eltc                 C   s@   |  td tg t  W d    d S 1 sw   Y  d S )Nz/Unsupported PathElement: UnsupportedPathElement)rv   r   r   _child_has_valuer5   r6   r   r   r   /test_error_child_has_value_unsupported_path_elt  s
   "z=ApplyDiffTest.test_error_child_has_value_unsupported_path_eltN)r   r   r   r   r   r   r   r   r   r   r  r   r#  r$  r%  r(  r+  r.  r/  r1  r2  r3  r5  r7  r9  r   r   r   r   r  O  s.    
	!r  c                   @   sP  e Zd Zeejeedfde	e
 e
 ggejeedfdee
 dgejeedfdeje e
 dgejeedefdee gejeedfdee
 dgejeeddfdi gejeed	dfdei dgejeed
dfde	e
 e
 e
 ggejeeddfdee
 dgejeedefdeje e
 dgejeedefdeeje e
 ddehigejeedfdeje de
 idgejeedfdeje eje e
 ddgejeeddfdeje e	e
 e
 e
 gdgejeedefdeje ee dgejeedeeddeedeeddfdeje eje e
 de	e
 ee e
 gde
 idggdd ZdS )SkeletonFromDiffTestr   r   z["a"])r   r   r~   r   r?   z
["a"]["b"]r   r	   z.x["a"]r   r*  r  r4  rC   r   z.y[1].qrA   z	.z["foo"]z.y[2]r   r   c                 C   s.   t |}| t|t| | || d S r   )r   skeleton_from_diffrR   rU   assertDagEqual)r7   r   expectedactualr   r   r   test_skeleton_from_diff  s   
gz,SkeletonFromDiffTest.test_skeleton_from_diffN)r   r   r   r   
parametersr   r   r   r   
ListPrefixAnyValuedictr-   rI   AnyCallabler   r$   r   r   r&   r   r3   r?  r   r   r   r   r:    s    
		
	
fr:  __main__)r   N)'r)   r   dataclassesr   typingr   absl.testingr   r   fiddler-   r   r   fiddle._srcr   	dataclassr   r   r   r   r$   Tagr&   r+   r   r   r3   PathElementr5   TestCaser>   r   r   r   r   r  r:  r   mainr   r   r   r   <module>   sN   

 ?s  Gz @n