relateby-pattern 0.4.2

Core pattern data structures
Documentation
�

��}iu��"�dZddlZddlmcmZddlZd�Zd�Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zedkr]e��e	��e
��e��e��e
��e��e��ed��dSdS)
zu
Tests for Pattern.para() - paramorphism operation

Validates structure-aware fold with access to pattern structure.
�Nc���tj�d��}|�d���}d}||k}|s�t	jd|fd||f��dt
j��vst	j|��rt	j	|��ndt	j	|��d�z}t	j
d|����dzd	|iz}tt	j|�����d
x}}d
S)zATest para on atomic pattern - receives empty element_results list�c�0�|jt|��zS�N��value�sum��p�rss  �c/Users/akollegger/Developer/gram-data/gram-rs/crates/pattern-core/tests/python/test_paramorphism.py�<lambda>z*test_para_atomic_pattern.<locals>.<lambda>s��q�w��R���'8����==�z%(py0)s == %(py3)s�result��py0�py3zExpected 5, got �
>assert %(py5)s�py5N)
�pattern_core�Pattern�point�para�
@pytest_ar�_call_reprcompare�@py_builtins�locals�_should_repr_global_name�	_saferepr�_format_assertmsg�AssertionError�_format_explanation)�atomicr�@py_assert2�@py_assert1�@py_format4�@py_format6s      r
�test_para_atomic_patternr+
s��
�
!�
'�
'��
*�
*�F��[�[�8�8�
9�
9�F��3�6�Q�;�3�3�3�3�3�3�3�3�3�6�Q�3�3�3�3�3�3�3�3�3�3�3�3�6�3�3�3�3�3�6�3�3�3�3�3�3�Q�3�3�3�3�3�3�3�3�3�6�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3rc�d�tj�dtj�d��tj�d��g��}|�d���}d}||k}|s�tjd|fd||f��dtj��vstj	|��rtj
|��ndtj
|��d	�z}tjd
|����dzd|iz}ttj
|�����d
x}}d
S)z0Test para on simple pattern with atomic elements���c�0�|jt|��zSrrr
s  r
rz*test_para_simple_pattern.<locals>.<lambda>�����#�b�'�'�(9�r�rrrrzExpected 6, got rrN�rr�patternrrrrrr r!r"r#r$r%�r4rr'r(r)r*s      r
�test_para_simple_patternr6sC���"�*�*�1���"�"�1�%�%���"�"�1�%�%�/���G��\�\�9�9�
:�
:�F��3�6�Q�;�3�3�3�3�3�3�3�3�3�6�Q�3�3�3�3�3�3�3�3�3�3�3�3�6�3�3�3�3�3�6�3�3�3�3�3�3�Q�3�3�3�3�3�3�3�3�3�6�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3rc
��tj�dtj�d��tj�dtj�d��g��g��}|�d���}d}||k}|s�tjd|fd||f��d	tj��vstj	|��rtj
|��nd	tj
|��d
�z}tjd|����dzd
|iz}ttj
|�����dx}}dS)z0Test para on nested pattern - depth-weighted sumr-r.r/�c�0�|jt|��zSrrr
s  r
rz*test_para_nested_pattern.<locals>.<lambda>8r1r�
rrrrzExpected 10, got rrNr3r5s      r
�test_para_nested_patternr;$s`���"�*�*�1���"�"�1�%�%���$�$�Q�� �&�&�q�)�)�)
�	�	�/���G��\�\�9�9�
:�
:�F��5�6�R�<�5�5�5�5�5�5�5�5�5�6�R�5�5�5�5�5�5�5�5�5�5�5�5�6�5�5�5�5�5�6�5�5�5�5�5�5�R�5�5�5�5�5�5�5�5�5�V�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5rc���tj�dtj�d��tj�d��tj�dtj�d��g��g��}|�d���}|�dd���}||k}|s�t
jd	|fd
||f��dtj	��vst
j
|��rt
j|��nddtj	��vst
j
|��rt
j|��ndd
�z}t
jd|�d|����dzd|iz}tt
j|�����d}d}||k}|s�t
jd	|fd||f��dtj	��vst
j
|��rt
j|��ndt
j|��d�z}t
jd|����dzd|iz}tt
j|�����dx}}dS)zGTest that para can replicate fold behavior for simple value aggregationr:���(�2c�0�|jt|��zSrrr
s  r
rz'test_para_fold_parity.<locals>.<lambda>Hs��Q�W�s�2�w�w�->�rrc��||zSr�)�acc�vs  r
rz'test_para_fold_parity.<locals>.<lambda>Ks
���q��rr)z%(py0)s == %(py2)s�para_result�fold_result)r�py2zPara z	 != Fold z
>assert %(py4)s�py4N�rrzExpected 150, got rr)rrr4rr�foldrrrr r!r"r#r$r%)	r4rFrGr(�@py_format3�@py_format5r'r)r*s	         r
�test_para_fold_parityrN=s����"�*�*�2���"�"�2�&�&���"�"�2�&�&���$�$�R�� �&�&�r�*�*�*
�	�	�0���G��,�,�>�>�?�?�K��,�,�q�"8�"8�9�9�K��+�%�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�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�R�R�R�R�R�R�R�R�R�R�R�R�R��A�;�#��A�A�A�A�A�A�A�A�A�;�#�A�A�A�A�A�A�A�A�A�A�A�A�;�A�A�A�A�A�;�A�A�A�A�A�A�#�A�A�A�A�A�A�A�A�A�K�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�Arc
��tj�dtj�d��tj�dtj�d��g��g��}d�}|�|��}d}||k}|s�tjd|fd||f��d	tj��vstj	|��rtj
|��nd	tj
|��d
�z}tjd|����dzd
|iz}ttj
|�����dx}}dS)zFTest computing multiple statistics (sum, count, max_depth) in one passr-r.r/r8c���|s
|jddfStd�|D����}td�|D����}td�|D����}|j|z}d|z}d|z}|||fS)zReturns (sum, count, max_depth)r-rc3�&K�|]}|dV��
dS)rNrC��.0�ss  r
�	<genexpr>zDtest_para_multi_statistics.<locals>.compute_stats.<locals>.<genexpr>hs&����3�3��q��t�3�3�3�3�3�3rc3�&K�|]}|dV��
dS)r-NrCrRs  r
rUzDtest_para_multi_statistics.<locals>.compute_stats.<locals>.<genexpr>is&����5�5�!��1��5�5�5�5�5�5rc3�&K�|]}|dV��
dS)r.NrCrRs  r
rUzDtest_para_multi_statistics.<locals>.compute_stats.<locals>.<genexpr>js&����9�9�a�Q�q�T�9�9�9�9�9�9r)rr	�max)r�
element_stats�elem_sum�
elem_count�elem_max_depth�	total_sum�total_count�	max_depths        r
�
compute_statsz1test_para_multi_statistics.<locals>.compute_statsas����	#��G�Q��?�"��3�3�]�3�3�3�3�3���5�5�}�5�5�5�5�5�
��9�9�=�9�9�9�9�9���G�h�&�	��*�n����&�	��;�	�2�2r)r:r8r.rrrrzExpected (10, 4, 2), got rrNr3)r4r`rr'r(r)r*s       r
�test_para_multi_statisticsraRsn���"�*�*�1���"�"�1�%�%���$�$�Q�� �&�&�q�)�)�)
�	�	�/���G�3�3�3�$�\�\�-�
(�
(�F� �E�6�Z��E�E�E�E�E�E�E�E�E�6�Z�E�E�E�E�E�E�E�E�E�E�E�E�6�E�E�E�E�E�6�E�E�E�E�E�E�Z�E�E�E�E�E�E�E�E�!E�V�!E�!E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�Erc
��tj�dtj�d��tj�dtj�d��g��g��}d�}|�|��}|j}d}||k}|s�t
jd|fd||f��dtj	��vst
j
|��rt
j|��ndt
j|��t
j|��d	�z}t
jd
|j����dzd|iz}tt
j|�����d
x}x}}|j}t!|��}d}	||	k}
|
�st
jd|
fd||	f��dtj	��vst
j
t ��rt
jt ��nddtj	��vst
j
|��rt
j|��ndt
j|��t
j|��t
j|	��d�z}t
jd��dzd|iz}tt
j|�����d
x}x}x}
}	|jd}
|
j}d}||k}|st
jd|fd||f��t
j|
��t
j|��t
j|��d�z}dd|iz}tt
j|�����d
x}
x}x}}|jd}
|
j}|��}|s`dt
j|
��t
j|��t
j|��d�z}tt
j|�����d
x}
x}}|jd}
|
j}d}||k}|st
jd|fd||f��t
j|
��t
j|��t
j|��d�z}dd|iz}tt
j|�����d
x}
x}x}}|jd}|j}t!|��}d}||k}	|	s�t
jd|	fd||f��dtj	��vst
j
t ��rt
jt ��ndt
j|��t
j|��t
j|��t
j|��d�z}dd|iz}tt
j|�����d
x}x}x}x}	}|jdjd}
|
j}d }||k}|st
jd|fd||f��t
j|
��t
j|��t
j|��d�z}dd|iz}tt
j|�����d
x}
x}x}}d
S)!z3Test structure-preserving transformation using parar-r.r/r8c��|jdz}|stj�|��Stj�||��S)z%Double the value, keep same structurer.)rrrrr4)r�transformed_elements�	new_values   r
�
double_valueszDtest_para_structure_preserving_transformation.<locals>.double_values�sI���G�a�K�	�#�	Q��'�-�-�i�8�8�8� �'�/�/�	�;O�P�P�Prr)z-%(py2)s
{%(py2)s = %(py0)s.value
} == %(py5)s�transformed)rrHrzRoot value should be 2, got z
>assert %(py7)s�py7N)zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.elements
})
} == %(py8)s�len)r�py1rr�py8zRoot should have 2 elementsz
>assert %(py10)s�py10r)z-%(py3)s
{%(py3)s = %(py1)s.value
} == %(py6)s)rjr�py6zassert %(py8)srkzDassert %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.is_atomic
}()
})rjrrr2)zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py2)s.elements
})
} == %(py9)s)rrHrIrm�py9zassert %(py11)s�py11�)rrr4rrrrrrr r!r"r#r$r%�elementsri�	is_atomic)r4rfrgr(�@py_assert4�@py_assert3r*�@py_format8r'�@py_assert7�@py_assert6�@py_format9�@py_format11�@py_assert0�@py_assert5�@py_format7�@py_assert8�@py_format10�@py_format12s                   r
�-test_para_structure_preserving_transformationr�ys	���"�*�*�1���"�"�1�%�%���$�$�Q�� �&�&�q�)�)�)
�	�	�/���G�Q�Q�Q��,�,�}�-�-�K���U��U���!�U�U�U�U�U�U�U�U�U���U�U�U�U�U�U�U�U�U�U�U�U�;�U�U�U�U�U�;�U�U�U�U�U�U��U�U�U�U��U�U�U�U�U�U�U�U�#U�+�BS�#U�#U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U��#�H�3�#�$�$�H��H�$��)�H�H�H�H�H�H�H�H�H�$��H�H�H�H�H�H�H�H�H�H�H�H�3�H�H�H�H�H�3�H�H�H�H�H�H�H�H�H�H�H�H�H�{�H�H�H�H�H�{�H�H�H�H�H�H�#�H�H�H�H�$�H�H�H�H��H�H�H�H�H�H�H�H�+H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H����"�-�"�(�-�A�-�(�A�-�-�-�-�-�-�-�-�-�-�(�A�-�-�-�-�-�"�-�-�-�-�(�-�-�-�-�A�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-����"�.�"�,�.�,�,�.�.�.�.�.�.�.�.�"�.�.�.�.�,�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.����"�-�"�(�-�A�-�(�A�-�-�-�-�-�-�-�-�-�-�(�A�-�-�-�-�-�"�-�-�-�-�(�-�-�-�-�A�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-��#�A�&�5�&�/�5�3�/�0�0�5�A�5�0�A�5�5�5�5�5�5�5�5�5�5�0�A�5�5�5�5�5�5�5�5�5�5�5�5�3�5�5�5�5�5�3�5�5�5�5�5�5�&�5�5�5�5�/�5�5�5�5�0�5�5�5�5�A�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5����"�+�A�.�9�.�4�9��9�4��9�9�9�9�9�9�9�9�9�9�4��9�9�9�9�9�.�9�9�9�9�4�9�9�9�9��9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9�9rc�8�tj�dtj�d��tj�d��g��}d�}|�|��}d}||k}|s�tjd|fd||f��dtj��vstj	|��rtj
|��ndtj
|��d	�z}d
d|iz}ttj|�����dx}}dS)
z<Test that para callback has access to full pattern structure�root�a�bc�
�d}t||��}|s�ddtj��vstjt��rtjt��nddtj��vstj|��rtj|��ndtj|��tj|��d�z}t
tj|�����dx}}d}t||��}|s�ddtj��vstjt��rtjt��nddtj��vstj|��rtj|��ndtj|��tj|��d�z}t
tj|�����dx}}d}t||��}|s�ddtj��vstjt��rtjt��nddtj��vstj|��rtj|��ndtj|��tj|��d�z}t
tj|�����dx}}d	}t||��}|s�ddtj��vstjt��rtjt��nddtj��vstj|��rtj|��ndtj|��tj|��d�z}t
tj|�����dx}}|jd
k�r�|j	}|��}|}|s�ddtj��vstj|��rtj|��ndtj|��tj|��d�z}t
tj|�����dx}x}}|j
}|��}d
}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}	dd|	iz}
t
tj|
�����dx}x}x}}�n�|j	}|��}|s�ddtj��vstj|��rtj|��ndtj|��tj|��d�z}t
tj|�����dx}}|j
}|��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}	dd|	iz}
t
tj|
�����dx}x}x}}dS)z&Verify we can access pattern structurerz5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}�hasattrr)rrjrrNrqrr�lengthr�zHassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_atomic
}()
})rrHrIr.r)zE%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.length
}()
} == %(py7)s)rrHrIrhzassert %(py9)srnzDassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_atomic
}()
}rr-)r�rr rr!r"r$r%rrrr�r)rrr'rsr*r(rtr{rwrur~rMs            r
�check_structurez>test_para_access_to_pattern_structure.<locals>.check_structure�s���"�"�w�q�'�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�w�"�"�"�"�"�w�"�"�"�"�"�"�"�"�"�"�"�"�"�q�"�"�"�"�"�q�"�"�"�"�"�"�'�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�%�%�w�q�*�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�w�%�%�%�%�%�w�%�%�%�%�%�%�%�%�%�%�%�%�%�q�%�%�%�%�%�q�%�%�%�%�%�%�*�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�&�&�w�q�+�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�w�&�&�&�&�&�w�&�&�&�&�&�&�&�&�&�&�&�&�&�q�&�&�&�&�&�q�&�&�&�&�&�&�+�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�&�"�#�w�q�(�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�w�#�#�#�#�#�w�#�#�#�#�#�#�#�#�#�#�#�#�#�q�#�#�#�#�#�q�#�#�#�#�#�#�(�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�
�7�f����{�$�{�{�}�}�$�}�$�$�$�$�$�$�$�$�$�$�$�$�$�$�q�$�$�$�$�$�q�$�$�$�$�$�$�{�$�$�$�$�}�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$��8�"�8�8�:�:�"��"�:��?�"�"�"�"�"�"�"�"�"�:��"�"�"�"�"�"�"�"�"�"�"�"�1�"�"�"�"�"�1�"�"�"�"�"�"�8�"�"�"�"�:�"�"�"�"��"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"��;� �;�;�=�=� �=� � � � � � � � � � � �1� � � � � �1� � � � � � �;� � � � �=� � � � � � � � � � � � � � � � � � � ��8�"�8�8�:�:�"��"�:��?�"�"�"�"�"�"�"�"�"�:��"�"�"�"�"�"�"�"�"�"�"�"�1�"�"�"�"�"�1�"�"�"�"�"�"�8�"�"�"�"�:�"�"�"�"��"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"�"��qrr-rrrrzassert %(py5)srN)
rrr4rrrrrr r!r"r$r%)r4r�rr'r(r)r*s       r
�%test_para_access_to_pattern_structurer��s2���"�*�*�6���"�"�3�'�'���"�"�3�'�'�4���G�
���0�\�\�/�
*�
*�F���6�Q�;����������6�Q�������������6������6�������Q���������������������������rc��tjddhdtj�d��i���}tjddhdtj�d��i���}tj�|tj�|��g��}d�}|�|��}d	}||k}|s�tj	d
|fd||f��dtj��vstj|��rtj
|��ndtj
|��d
�z}tjd|����dzd|iz}ttj|�����dx}}dS)z:Test para works with Pattern[Subject] (not PatternSubject)�alice�Person�ager>)�identity�labels�
properties�bob�c�b�|j�d��rdnd}|t|��zS)zCount how many Person subjectsr�r-r)r�	has_labelr	)r�counts�counts   r
�count_peoplez3test_para_with_subject_values.<locals>.count_people�s1���W�&�&�x�0�0�7���a���s�6�{�{�"�"rr.rrrrzExpected 2 people, got rrN)r�Subject�Value�intrr4rrrrrr r!r"r#r$r%)	r�r�r4r�rr'r(r)r*s	         r
�test_para_with_subject_valuesr��s���
� ���z��<�-�1�1�"�5�5�6�
�
�
�E��
���z��<�-�1�1�"�5�5�6����C��"�*�*�5���"�"�3�'�'�3���G�#�#�#�
�\�\�,�
'�
'�F��:�6�Q�;�:�:�:�:�:�:�:�:�:�6�Q�:�:�:�:�:�:�:�:�:�:�:�:�6�:�:�:�:�:�6�:�:�:�:�:�:�Q�:�:�:�:�:�:�:�:�:�&�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:�:r�__main__u"✓ All paramorphism tests passed!)�__doc__�builtinsr�_pytest.assertion.rewrite�	assertion�rewriterrr+r6r;rNrar�r�r��__name__�printrCrr
�<module>r�s]���������������������4�4�4�
4�
4�
4� 6�6�6�2B�B�B�*$F�$F�$F�N!:�!:�!:�H � � �F;�;�;�:�z������������������������� � � �1�1�3�3�3�)�)�+�+�+�!�!�#�#�#�	�E�
.�/�/�/�/�/��r