o
    ~#gL4                     @   sF   d dl mZ d dlmZ ddlmZmZmZmZm	Z	 G dd dZ
dS )    )contextmanager)Optional   )ParserElementParseExceptionKeyword__diag__
__compat__c                   @   sx   e Zd ZdZG dd dZG dd dZe						dd	ed
ee	 dee	 de
dedee dee defddZdS )pyparsing_testzB
    namespace class for classes useful in writing unit tests
    c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )z&pyparsing_test.reset_pyparsing_contexta  
        Context manager to be used when writing unit tests that modify pyparsing config values:
        - packrat parsing
        - bounded recursion parsing
        - default whitespace characters.
        - default keyword characters
        - literal string auto-conversion class
        - __diag__ settings

        Example::

            with reset_pyparsing_context():
                # test that literals used to construct a grammar are automatically suppressed
                ParserElement.inlineLiteralsUsing(Suppress)

                term = Word(alphas) | Word(nums)
                group = Group('(' + term[...] + ')')

                # assert that the '()' characters are not included in the parsed tokens
                self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def'])

            # after exiting context manager, literals are converted to Literal expressions again
        c                 C   s
   i | _ d S N)_save_contextself r   /var/www/static.ux5.de/https/Moving-Object-Detection-with-OpenCV/env/lib/python3.10/site-packages/pip/_vendor/pyparsing/testing.py__init__-   s   
z/pyparsing_test.reset_pyparsing_context.__init__c                 C   s   t j| jd< tj| jd< t j| jd< t j| jd< t j| jd< t jr)t jj	| jd< nd | jd< t j
| jd< t j| jd< d	d
 tjD | jd< dtji| jd< | S )Ndefault_whitespacedefault_keyword_charsliteral_string_classverbose_stacktracepackrat_enabledpackrat_cache_sizepackrat_parserecursion_enabledc                 S   s   i | ]}|t t|qS r   )getattrr   ).0namer   r   r   
<dictcomp>F   s    z?pyparsing_test.reset_pyparsing_context.save.<locals>.<dictcomp>r   collect_all_And_tokensr	   )r   DEFAULT_WHITE_CHARSr   r   DEFAULT_KEYWORD_CHARS_literalStringClassr   _packratEnabledpackrat_cachesize_parse_left_recursion_enabledr   
_all_namesr	   r   r   r   r   r   save0   s2   

z+pyparsing_test.reset_pyparsing_context.savec                 C   s   t j| jd krt | jd  | jd t _| jd t_t | jd  | jd  D ]\}}|r4t	j
nt	j| q+dt _| jd rKt | jd  n| jd	 t _| jd
 t _| jd t_| S )Nr   r   r   r   r   Fr   r   r   r   r	   )r   r   r   set_default_whitespace_charsr   r   r    inlineLiteralsUsingitemsr   enabledisabler"   enable_packratr%   r&   r	   r   )r   r   valuer   r   r   restoreP   s,   
z.pyparsing_test.reset_pyparsing_context.restorec                 C   s   t |  }|j| j |S r   )typer   update)r   retr   r   r   copyq   s   
z+pyparsing_test.reset_pyparsing_context.copyc                 C   s   |   S r   )r(   r   r   r   r   	__enter__v   s   z0pyparsing_test.reset_pyparsing_context.__enter__c                 G   s   |    d S r   )r0   )r   argsr   r   r   __exit__y   s   z/pyparsing_test.reset_pyparsing_context.__exit__N)
__name__
__module____qualname____doc__r   r(   r0   r4   r5   r7   r   r   r   r   reset_pyparsing_context   s     !r<   c                   @   sR   e Zd ZdZ	dddZ	dddZ	ddd	Z	dd
dZee	dfddZ
dS )z&pyparsing_test.TestParseResultsAssertszk
        A mixin class to add parse results assertion methods to normal unittest.TestCase classes.
        Nc                 C   s@   |dur| j || |d |dur| j || |d dS dS )z
            Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``,
            and compare any defined results names with an optional ``expected_dict``.
            Nmsg)assertEqualas_listas_dict)r   resultexpected_listexpected_dictr>   r   r   r   assertParseResultsEquals   s
   z?pyparsing_test.TestParseResultsAsserts.assertParseResultsEqualsTc                 C   @   |j |dd}|rt|  nt|  | j|||d dS )z
            Convenience wrapper assert to test a parser element and input string, and assert that
            the resulting ``ParseResults.asList()`` is equal to the ``expected_list``.
            T)	parse_all)rC   r>   Nparse_stringprintdumpr@   rE   )r   exprtest_stringrC   r>   verboserB   r   r   r   assertParseAndCheckList   
   z>pyparsing_test.TestParseResultsAsserts.assertParseAndCheckListc                 C   rF   )z
            Convenience wrapper assert to test a parser element and input string, and assert that
            the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``.
            T)parseAll)rD   r>   NrH   )r   rL   rM   rD   r>   rN   rB   r   r   r   assertParseAndCheckDict   rP   z>pyparsing_test.TestParseResultsAsserts.assertParseAndCheckDictc              	   C   s  |\}}|durdd t ||D }|D ]k\}}}	tdd |	D d}
tdd |	D d}|durR| j||
p7|d t|trB|W d   n1 sLw   Y  qtdd |	D d}td	d |	D d}||fd
krx| j||||
pt|d qtd| q| j||dur|ndd dS )ah  
            Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of
            list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped
            with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``.
            Finally, asserts that the overall ``runTests()`` success value is ``True``.

            :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests
            :param expected_parse_results (optional): [tuple(str, list, dict, Exception)]
            Nc                 S   s   g | ]\}}g ||R qS r   r   )r   rptexpectedr   r   r   
<listcomp>   s    zOpyparsing_test.TestParseResultsAsserts.assertRunTestResults.<locals>.<listcomp>c                 s       | ]
}t |tr|V  qd S r   )
isinstancestrr   expr   r   r   	<genexpr>       zNpyparsing_test.TestParseResultsAsserts.assertRunTestResults.<locals>.<genexpr>c                 s   s(    | ]}t |trt|tr|V  qd S r   )rW   r1   
issubclass	ExceptionrY   r   r   r   r[      s    
)expected_exceptionr>   c                 s   rV   r   )rW   listrY   r   r   r   r[      r\   c                 s   rV   r   )rW   dictrY   r   r   r   r[      r\   NN)rC   rD   r>   zno validation for {!r}zfailed runTestsr=   )	zipnextassertRaisesrW   r^   rE   rJ   format
assertTrue)r   run_tests_reportexpected_parse_resultsr>   run_test_successrun_test_resultsmergedrM   rB   rT   fail_msgr_   rC   rD   r   r   r   assertRunTestResults   sR   

z;pyparsing_test.TestParseResultsAsserts.assertRunTestResultsc                 c   s<    | j ||d d V  W d    d S 1 sw   Y  d S )Nr=   )re   )r   exc_typer>   r   r   r   assertRaisesParseException   s   "zApyparsing_test.TestParseResultsAsserts.assertRaisesParseException)NNN)NTrb   )r8   r9   r:   r;   rE   rO   rR   rn   r   r   rp   r   r   r   r   TestParseResultsAsserts|   s    



?rq   NT|s
start_lineend_lineexpand_tabseol_markmark_spacesmark_controlreturnc                    s  |r|   } durAdkr(tdd ttddtddD d	d
iB }d ntfddttddd	g D }| |} |dura|dkra|dkr[tddd}| |} n| d|} |du rgd}|du rot| }t	|t| }t	t
d||}dkr|  |d | }ndd | d|d | D }|sdS tt|t
dd |D }	dd  }
|	dkr|
ddd tt
|	d dD  d }nd}||
 ddd t|	 d  D  d }|
d|	 d    d }|| d fddt||d D  d S )!u	  
        Helpful method for debugging a parser - prints a string with line and column numbers.
        (Line and column numbers are 1-based.)

        :param s: tuple(bool, str - string to be printed with line and column numbers
        :param start_line: int - (optional) starting line number in s to print (default=1)
        :param end_line: int - (optional) ending line number in s to print (default=len(s))
        :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default
        :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|")
        :param mark_spaces: str - (optional) special character to display in place of spaces
        :param mark_control: str - (optional) convert non-printing control characters to a placeholding
                                 character; valid values:
                                 - "unicode" - replaces control chars with Unicode symbols, such as "␍" and "␊"
                                 - any single character string - replace control characters with given string
                                 - None (default) - string is displayed as-is

        :return: str - input string with leading line numbers and column number headers
        Nunicodec                 S   s   i | ]\}}||qS r   r   )r   cur   r   r   r     s    z4pyparsing_test.with_line_numbers.<locals>.<dictcomp>r   !   i $  i3$     i!$   c                    s   i | ]}| qS r   r   )r   r|   )ry   r   r   r     s         i	$  i#$  )	   r   r   c                 S   s   g | ]}|d  qS )   ␊r   r   liner   r   r   rU   '  s    z4pyparsing_test.with_line_numbers.<locals>.<listcomp>r   c                 s   s    | ]}t |V  qd S r   )lenr   r   r   r   r[   ,  s    z3pyparsing_test.with_line_numbers.<locals>.<genexpr>c   c                 s   s$    | ]}d  d|d d V  qdS )z{}{}zc                                                                                                   r   d   Nrf   r   ir   r   r   r[   1  s
    
r   
c                 s   s"    | ]}d  |d d V  qdS )z         {}r   
   Nr   r   r   r   r   r[   <  s
    
r   
1234567890c                 3   s$    | ]\}}d  || V  qdS )z{:{}d}:{}{}Nr   )r   r   r   )rw   lineno_widthr   r   r[   F  s
    
)start)
expandtabsrX   	maketransrc   ranger`   	translatereplacer   minmax
splitlinessplitjoin	enumerate)rs   rt   ru   rv   rw   rx   ry   tbls_linesmax_line_lenleadheader0header1header2r   )rw   r   ry   r   with_line_numbers   s    
 
	
	
z pyparsing_test.with_line_numbers)NNTrr   NN)r8   r9   r:   r;   r<   rq   staticmethodrX   r   intboolr   r   r   r   r   r
      s8    hqr
   N)
contextlibr   typingr   corer   r   r   r   r	   r
   r   r   r   r   <module>   s   	