U
    M»{jê5  ã                   @   sJ   d dl mZ d dlZd dlZddlmZmZmZmZm	Z	 G dd„ dƒZ
dS )é    )ÚcontextmanagerNé   )ÚParserElementÚParseExceptionÚKeywordÚ__diag__Ú
__compat__c                   @   sf   e Zd ZdZG dd„ dƒZG dd„ dƒZedeej	e
 ej	e
 eeej	e ej	e ed	œ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   úP/var/www/html/bwave/python/venv/lib/python3.8/site-packages/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rRt 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>H   s     z?pyparsing_test.reset_pyparsing_context.save.<locals>.<dictcomp>r   Úcollect_all_And_tokensr   )r   ÚDEFAULT_WHITE_CHARSr   r   ÚDEFAULT_KEYWORD_CHARSZ_literalStringClassr   Ú_packratEnabledZpackrat_cacheÚsizeÚ_parseÚ_left_recursion_enabledr   Z
_all_namesr   r   r   r   r   r   Úsave2   s(    ÿÿ

ÿÿ ÿ
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 ]\}}|rht	j
nt	j|ƒ qVdt _| jd r–t  | 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   Zset_default_whitespace_charsr   r   r   ZinlineLiteralsUsingÚitemsr   ÚenableÚdisabler    Zenable_packratr"   r#   r   r   )r   r   Úvaluer   r   r   ÚrestoreR   s.    ÿÿÿÿ
ÿz.pyparsing_test.reset_pyparsing_context.restorec                 C   s   t | ƒƒ }|j | j¡ |S r
   )Útyper   Úupdate)r   Úretr   r   r   Úcopys   s    
z+pyparsing_test.reset_pyparsing_context.copyc                 C   s   |   ¡ S r
   )r$   r   r   r   r   Ú	__enter__x   s    z0pyparsing_test.reset_pyparsing_context.__enter__c                 G   s   |   ¡  d S r
   )r)   )r   Úargsr   r   r   Ú__exit__{   s    z/pyparsing_test.reset_pyparsing_context.__exit__N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r)   r-   r.   r0   r   r   r   r   Úreset_pyparsing_context   s    !r5   c                   @   sL   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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k	r| j || ¡ |d� |dk	r8| j || ¡ |d� 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)ZassertEqualÚas_listÚas_dict)r   ÚresultÚexpected_listÚexpected_dictr7   r   r   r   ÚassertParseResultsEqualsƒ   s    z?pyparsing_test.TestParseResultsAsserts.assertParseResultsEqualsTc                 C   s@   |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)Z	parse_all)r;   r7   N©Úparse_stringÚprintÚdumpr8   r=   )r   ÚexprÚtest_stringr;   r7   Úverboser:   r   r   r   ÚassertParseAndCheckList�   s
    z>pyparsing_test.TestParseResultsAsserts.assertParseAndCheckListc                 C   s@   |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.asDict()`` is equal to the ``expected_dict``.
            T)ZparseAll)r<   r7   Nr>   )r   rB   rC   r<   r7   rD   r:   r   r   r   ÚassertParseAndCheckDict�   s
    z>pyparsing_test.TestParseResultsAsserts.assertParseAndCheckDictc              
   C   s*  |\}}|dkr.| j ||dk	r"|ndd� dS dd„ t||ƒD ƒ}|D ]Â\}}}	tdd„ |	D ƒdƒ}
tdd„ |	D ƒdƒ}|dk	r®| j||
pŒ|d	�� t|tƒr¢|‚W 5 Q R X qFtd
d„ |	D ƒdƒ}tdd„ |	D ƒdƒ}||fdkrú| j||||
pò|d� qFtd|›�ƒ qF| j ||dk	�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)]
            Nzfailed runTestsr6   c                 S   s   g | ]\}}||f˜‘qS r   r   )r   ZrptÚexpectedr   r   r   Ú
<listcomp>¿   s   ÿzOpyparsing_test.TestParseResultsAsserts.assertRunTestResults.<locals>.<listcomp>c                 s   s   | ]}t |tƒr|V  qd S r
   )Ú
isinstanceÚstr©r   Úexpr   r   r   Ú	<genexpr>Ç   s     
 zNpyparsing_test.TestParseResultsAsserts.assertRunTestResults.<locals>.<genexpr>c                 s   s&   | ]}t |tƒrt|tƒr|V  qd S r
   )rI   r*   Ú
issubclassÚ	ExceptionrK   r   r   r   rM   É   s   
 
þ)Úexpected_exceptionr7   c                 s   s   | ]}t |tƒr|V  qd S r
   )rI   ÚlistrK   r   r   r   rM   Ø   s     
 c                 s   s   | ]}t |tƒr|V  qd S r
   )rI   ÚdictrK   r   r   r   rM   Û   s     
 )NN)r;   r<   r7   zno validation for )Z
assertTrueÚzipÚnextÚassertRaisesrI   rO   r=   r@   )r   Zrun_tests_reportZexpected_parse_resultsr7   Zrun_test_successZrun_test_resultsZmergedrC   r:   rG   Zfail_msgrP   r;   r<   r   r   r   ÚassertRunTestResults«   sZ     ÿþþú ÿ
 ÿ ÿü ÿz;pyparsing_test.TestParseResultsAsserts.assertRunTestResultsc              	   c   sd   |d k	r@t |tƒrt |¡}| j|||d��}|V  W 5 Q R X n | j||d��}|V  W 5 Q R X d S )Nr6   )rI   rJ   ÚreÚescapeÚassertRaisesRegexrU   )r   Úexc_typeZexpected_msgr7   Úctxr   r   r   ÚassertRaisesParseExceptioní   s    

zApyparsing_test.TestParseResultsAsserts.assertRaisesParseException)NNN)NT)NT)NN)r1   r2   r3   r4   r=   rE   rF   rV   r   r   r\   r   r   r   r   ÚTestParseResultsAsserts~   s&        ÿ
   ÿ
   ÿ
   ÿ
B  ÿr]   NTú|)ÚsÚ
start_lineÚend_lineÚexpand_tabsÚeol_markÚmark_spacesÚmark_controlÚreturnc                    s4  |r|   ¡ } |dk	ršt t|¡}|dkr`dd„ ttddƒtddƒƒD ƒ}d	|d
< t |¡}d‰ n0t|ƒ‰t ‡fdd„ttddƒƒd
g D ƒ¡}|  	|¡} |dk	rÚ|dkrÚ|dkrÎt dddœ¡}|  	|¡} n|  
d|¡} |dkræd}|dkröt| ƒ}t|t| ƒƒ}ttd|ƒ|ƒ}|dk�r4|  ¡ |d |… }	n dd„ |  d¡|d |… D ƒ}	|	�s^d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   rh   )Úord_mark_controlr   r   r   %  s      é    ú i	$  i#$  )é	   rn   r   c                 S   s   g | ]}|d  ‘qS )õ   â�Šr   ©r   Úliner   r   r   rH   8  s     z4pyparsing_test.with_line_numbers.<locals>.<listcomp>rq   c                 s   s   | ]}t |ƒV  qd S r
   )Úlenrr   r   r   r   rM   =  s     z3pyparsing_test.with_line_numbers.<locals>.<genexpr>éc   c                 s   s"   | ]}d › |d d › �V  qdS )zc                                                                                                   r   éd   Nr   ©r   Úir   r   r   rM   B  s   ÿrv   Ú
c                 s   s    | ]}d |d d › �V  qdS )z	         r   é
   Nr   rw   r   r   r   rM   M  s     rz   Z
1234567890c                 3   s,   | ]$\}}|ˆ› d �›d|› ˆ › �V  qdS )Údú:Nr   )r   rx   rs   )rc   Úlineno_widthr   r   rM   T  s   ÿ)Ústart)Ú
expandtabsÚtypingÚcastrJ   rS   ÚrangeÚ	maketransÚordrQ   Ú	translateÚreplacert   ÚminÚmaxÚ
splitlinesÚsplitÚjoinÚ	enumerate)r_   r`   ra   rb   rc   rd   re   Ztranstable_mapZtblZs_linesZmax_line_lenZleadZheader0Zheader1Zheader2r   )rc   r}   rm   r   Úwith_line_numbersû   s€    ÿ
 ÿ

 

þÿûÿ	ÿþýÿÿ
þþúÿz pyparsing_test.with_line_numbers)NNTr^   NN)r1   r2   r3   r4   r5   r]   ÚstaticmethodrJ   r€   ÚOptionalÚintÚboolr�   r   r   r   r   r	      s(   h}      ùør	   )Ú
contextlibr   rW   r€   Úcorer   r   r   r   r   r	   r   r   r   r   Ú<module>   s   	