
    ?gc                       S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSK	J
r
  SSK	Jr  SSKJs  Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"  SSK#r#\ S   " 5       r$S,S jr%S-S jr&0 r'SSS/0\'S'   S/ SQ0\'S'   \'S   RQ                  5       \'S'   \&" \'S   \'S   5        \'S   \'S'    " S S5      r)      S.S  jr*\#RV                  S/S! j5       r,\#RV                  S/S" j5       r-S0S# jr.\#RV                  " S$S%9S/S& j5       r/S1S' jr0S2S( jr1S2S) jr2S3S* jr3 " S+ S5      r4g)4a  Report test results in JUnit-XML format, for use with Jenkins and build
integration servers.

Based on initial code from Ross Lawley.

Output conforms to
https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
    )annotations)datetime)timezoneN)Callable)Match)nodes)timing)ExceptionRepr)ReprFileLocation)Config)filename_arg)Parser)FixtureRequest)
TestReport)StashKey)TerminalReporterLogXMLc                P    SS jnSn[         R                  " X![        U 5      5      $ )a  Visually escape invalid XML characters.

For example, transforms
    'hello\aworld\b'
into
    'hello#x07world#x08'
Note that the #xABs are *not* XML escapes - missing the ampersand &#xAB.
The idea is to escape visually for the user rather than for XML itself.
c                X    [        U R                  5       5      nUS::  a  SUS 3$ SUS 3$ )N   z#x02X04X)ordgroup)matchobjis     2/usr/lib/python3/dist-packages/_pytest/junitxml.pyreplbin_xml_escape.<locals>.repl3   s6     !9#w<#w<    u    [^	
 -~-퟿-�က0-ჿff])r   z
Match[str]returnstr)resubr"   )argr   illegal_xml_res      r   bin_xml_escaper'   (   s)      	W  66.C11r    c                    0 nU R                  5        HM  u  p4UR                  5        H4  u  pV[        U[        5      (       d  [        [	        U5      5      eXF-   X#'   M6     MO     U R                  U5        g N)items
isinstancelist	TypeErrortypeupdate)leftrightresultklvlkrvrs          r   merge_familyr7   C   s^    F**,kkmFBb$''R))FJ $ 
 	KKr    testcase	classnamename_base)filelineurl_base_legacyxunit1xunit2c                      \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SSS
 jjrSS jrSS jrS S jrSS jrSS jrSS jrSS jrSS jrSS jrS!S jrSrg	)"_NodeReporterY   c                    Xl         X l        U R                  R                  U l        U R                  R                  U l        SU l        / U l        / U l        0 U l        g )N        )idxml	add_statsfamilyduration
propertiesr   attrs)selfnodeidrH   s      r   __init___NodeReporter.__init__Z   sH    ++hhoo13')
%'
r    c                    U R                   R                  UR                  5        U R                  R	                  U5        g r)   )rH   rI   tagr   append)rN   nodes     r   rT   _NodeReporter.appendd   s*    488$

$r    c                b    U R                   R                  [        U5      [        U5      45        g r)   )rL   rT   r"   r'   rN   r:   values      r   add_property_NodeReporter.add_propertyh   s"    D	>%+@ABr    c                F    [        U5      U R                  [        U5      '   g r)   )r'   rM   r"   rX   s      r   add_attribute_NodeReporter.add_attributek   s     .u 5

3t9r    c           	         U R                   (       aQ  [        R                  " S5      nU R                    H)  u  p#UR                  [        R                  " SX#S95        M+     U$ gz9Return a Junit node containing custom properties, if any.rL   propertyr:   rY   N)rL   ETElementrT   rN   rL   r:   rY   s       r   make_properties_node"_NodeReporter.make_properties_noden   sI    ??L1J#!!"**Zd"PQ  /r    c                   [        UR                  5      nU R                  nUS S nU R                  R                  (       a&  UR                  SU R                  R                  5        SR                  U5      [        US   5      UR                  S   S.nUR                  S   b  [        UR                  S   5      US'   [        US5      (       a  UR                  US'   XPl        U R                  R                  U5        U R                  S:X  a  g 0 nU R                   H0  nU[        U R                     S	   ;   d  M  U R                  U   Xg'   M2     X`l        g )
Nr   .)r9   r:   r<      r=   r>   r@   r8   )mangle_test_addressrO   rM   rH   prefixinsertjoinr'   locationr"   hasattrr>   r/   rJ   families)rN   
testreportnamesexisting_attrs
classnamesrM   
temp_attrskeys           r   record_testreport_NodeReporter.record_testreportw   s%   #J$5$563BZ
88??a1*-"59-''*!

 q!-
 3 3A 67E&M:u%%%>>E%L


.) ;;(" 
::Cht{{+J77"&**S/
   
r    c                    [         R                  " SU R                  U R                  S S9nU R	                  5       nUb  UR                  U5        UR                  U R                  5        U$ )Nr8   .3f)time)rc   rd   rM   rK   rf   rT   extendr   )rN   r8   rL   s      r   to_xml_NodeReporter.to_xml   sV    ::j$**dmmC=PR..0
!OOJ'

#r    Nc                n    [         R                  " XS9n[        U5      Ul        U R	                  U5        g )N)messagerc   rd   r'   textrT   )rN   rS   r   datarU   s        r   _add_simple_NodeReporter._add_simple   s(    zz#/"4(	Dr    c                t   U R                   R                  (       d  UR                  (       a  g UR                  nUR                  nUR
                  nU R                   R                  S:X  a  g SnU R                   R                  S;   a  U R                  US5      nU R                   R                  S;   a(  XPR                  US5      -  nU R                  XS5        SnU R                   R                  S;   a(  XPR                  US	5      -  nU R                  XS
5        SnU(       a  U R                  XS5        g g )Nno )logallz Captured Log )
system-outout-errr   z Captured Out r   )
system-errr   r   z Captured Err r   )	rH   log_passing_testspassed	capstdoutcaplog	capstderrlogging_prepare_content_write_content)rN   reportcontent_outcontent_logcontent_errcontent_alls         r   write_captured_output#_NodeReporter.write_captured_output   s
   xx))fmm&&mm&&88t#88~-//=MNK88??00>NOOK\BK88??00>NOOK\BK\B r    c                J    SR                  UR                  SS5      US/5      $ )N
P   -r   )ro   center)rN   contentheaders      r   r   _NodeReporter._prepare_content   s#    yy&--C0'2>??r    c                r    [         R                  " U5      n[        U5      Ul        U R	                  U5        g r)   r   )rN   r   r   jheaderrS   s        r   r   _NodeReporter._write_content   s(    jj!!'*Cr    c                &    U R                  S5        g )Nr   )rI   rN   r   s     r   append_pass_NodeReporter.append_pass   s    x r    c                D   [        US5      (       a  U R                  SS5        g UR                  c   e[        UR                  SS 5      nUb  UR                  nO[        UR                  5      n[        U5      nU R                  SU[        UR                  5      5        g )Nwasxfailskippedz%xfail-marked test passes unexpectedly	reprcrashfailure)rq   r   longreprgetattrr   r"   r'   )rN   r   r   r   s       r   append_failure_NodeReporter.append_failure   s    6:&&Y(OP??...18d2I $#++foo.$W-GYV__1EFr    c                n    UR                   c   eU R                  SS[        UR                   5      5        g )Nerrorzcollection failure)r   r   r"   r   s     r   append_collect_error"_NodeReporter.append_collect_error   s.    ***"6FOO8LMr    c                P    U R                  SS[        UR                  5      5        g )Nr   zcollection skipped)r   r"   r   r   s     r   append_collect_skipped$_NodeReporter.append_collect_skipped   s    $8#foo:NOr    c                2   UR                   c   e[        UR                   SS 5      nUb  UR                  nO[        UR                   5      nUR                  S:X  a  SU S3nOSU S3nU R                  S[        U5      [        UR                   5      5        g )Nr   teardownzfailed on teardown with ""zfailed on setup with "r   )r   r   r   r"   whenr   r'   )rN   r   r   reasonmsgs        r   append_error_NodeReporter.append_error   s    ***-4V__kSW-X	 &&F)F;;*$-fXQ7C*6(!4C."5s6??7KLr    c                &   [        US5      (       aZ  UR                  nUR                  S5      (       a  USS  n[        U5      n[        R
                  " SSUS9nU R                  U5        g [        UR                  [        5      (       d   eUR                  u  pEnUR                  S5      (       a  USS  nU S	U S
U 3n[        R
                  " SS[        U5      S9n[        U5      Ul
        U R                  U5        U R                  U5        g )Nr   zreason:    r   zpytest.xfail)r.   r   z	Skipped: 	   :z: zpytest.skip)rq   r   
startswithr'   rc   rd   rT   r+   r   tupler   r   )rN   r   xfailreasonr   filenamelineno
skipreasondetailss           r   append_skipped_NodeReporter.append_skipped   s    6:&& //K%%j11)!"o(5KjjUGKK foou5555+1??(Hj$$[11'^
!
!F82j\:Gjj~j7QG *'2GLKK &&v.r    c                p   ^ U R                  5       mU R                  R                  5         U4S jU l         g )Nc                    > T $ r)    )r   s   r   <lambda>(_NodeReporter.finalize.<locals>.<lambda>  s    dr    )r   __dict__clear)rN   r   s    @r   finalize_NodeReporter.finalize   s'    {{} #r    )	rI   rM   rK   rJ   rG   r   rL   r   rH   )rO   zstr | TestReportrH   r   r!   None)rU   
ET.Elementr!   r   r:   r"   rY   objectr!   r   r!   zET.Element | None)rs   r   r!   r   )r!   r   r)   )rS   r"   r   r"   r   
str | Noner!   r   r   r   r!   r   )r   r"   r   r"   r!   r"   )r   r   r   r"   r   r"   r!   r   r!   r   )__name__
__module____qualname____firstlineno__rP   rT   rZ   r]   rf   ry   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r    r   rC   rC   Y   sc    ( C6 <
C.@
!G N
PM/,#r    rC   c                    SSK Jn  U R                  R                  R	                  [
        S5      nUbC  UR                  S;  a2  U R                  R                  U" U SUR                   S35      5        ggg)z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )PytestWarningN)r@   legacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	_pytest.warning_typesr   configstashgetxml_keyrJ   rU   warn)requestfixture_namer   rH   s       r   !_warn_incompatibility_with_xunit2r     sl     4
..


"
"7D
1C
3::-AA. DSZZLPlm	
 Br    c                0   ^  [        T S5        SU 4S jjnU$ )aN  Add extra properties to the calling test.

User properties become part of the test report and are available to the
configured reporters, like JUnit XML.

The fixture is callable with ``name, value``. The value is automatically
XML-encoded.

Example::

    def test_function(record_property):
        record_property("example_key", 1)
record_propertyc                R   > TR                   R                  R                  X45        g r)   )rU   user_propertiesrT   )r:   rY   r   s     r   append_property(record_property.<locals>.append_property(  s    $$++TM:r    r   )r   )r   r   s   ` r   r   r     s     &g/@A; r    c                6   SSK Jn  U R                  R                  U" S5      5        [	        U S5        SS jnUnU R
                  R                  R                  [        S5      nUb1  UR                  U R                  R                  5      nUR                  nU$ )zAdd extra xml attributes to the tag for the calling test.

The fixture is callable with ``name, value``. The value is
automatically XML-encoded.
r   )PytestExperimentalApiWarningz/record_xml_attribute is an experimental featurerecord_xml_attributec                    g r)   r   rb   s     r   add_attr_noop+record_xml_attribute.<locals>.add_attr_noop>  s    r    Nr   )r   r   rU   r   r   r   r   r   r   node_reporterrO   r]   )r   r   r   	attr_funcrH   r  s         r   r   r   .  s     CLL$%VW &g/EF I
..


"
"7D
1C
))',,*=*=>!//	r    c                    Sn[        U[        5      (       d.  Sn[        UR                  U [	        U5      R
                  S95      eg)z_Used by record_testsuite_property to check that the given parameter name is of the proper
type.Tz5{param} parameter needs to be a string, but {g} given)paramgN)r+   r"   r-   formatr.   r   )r  v__tracebackhide__r   s       r   _check_record_param_typer	  K  sC     aE

$q'2B2B
CDD r    session)scopec                    SnSS jnU R                   R                  R                  [        S5      nUb  UR                  nU$ )a  Record a new ``<property>`` tag as child of the root ``<testsuite>``.

This is suitable to writing global information regarding the entire test
suite, and is compatible with ``xunit2`` JUnit family.

This is a ``session``-scoped fixture which is called with ``(name, value)``. Example:

.. code-block:: python

    def test_foo(record_testsuite_property):
        record_testsuite_property("ARCH", "PPC")
        record_testsuite_property("STORAGE_TYPE", "CEPH")

:param name:
    The property name.
:param value:
    The property value. Will be converted to a string.

.. warning::

    Currently this fixture **does not work** with the
    `pytest-xdist <https://github.com/pytest-dev/pytest-xdist>`__ plugin. See
    :issue:`7767` for details.
Tc                     Sn[        SU 5        g)zFNo-op function in case --junit-xml was not passed in the command-line.Tr:   N)r	  )r:   rY   r  s      r   record_func.record_testsuite_property.<locals>.record_funcp  s      .r    Nr   )r   r   r   r   add_global_property)r   r  r  rH   s       r   record_testsuite_propertyr  T  sC    4 /
 ..


"
"7D
1C
--r    c                T   U R                  S5      nUR                  SSSSS[        R                  " [        SS9S SS	9  UR                  S
SSSS SS9  U R                  SSSS9  U R                  SSSS9  U R                  SSSSS9  U R                  SSSS9  U R                  SSS S9  g )!Nzterminal reportingz
--junitxmlz--junit-xmlstorexmlpathpath)optnamez0Create junit-xml style report file at given path)actiondestmetavarr.   defaulthelpz--junitprefixz--junit-prefixr"   z0Prepend prefix to classnames in junit-xml output)r  r  r  r  junit_suite_namez Test suite name for JUnit reportpytest)r  junit_loggingz\Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|allr   junit_log_passing_testsz;Capture log information for passing tests to JUnit report: boolT)r.   r  junit_duration_reportz*Duration time to report: one of total|calltotaljunit_familyz0Emit XML for schema: one of legacy|xunit1|xunit2rA   )getgroup	addoption	functoolspartialr   addini)parserr   s     r   pytest_addoptionr*  {  s    OO01E	OO|\B?  	 
OO?   MM>   MM	:	   MM!E	   MM4  
 MM:  r    c                   U R                   R                  nU(       a  [        U S5      (       d  U R                  S5      n[	        UU R                   R
                  U R                  S5      U R                  S5      U R                  S5      UU R                  S5      5      U R                  [        '   U R                  R                  U R                  [           5        g g g )Nworkerinputr#  r  r  r!  r  )
optionr  rq   getinir   junitprefixr   r   pluginmanagerregister)r   r  r#  s      r   pytest_configurer2    s    mm##Gwv}55}}^4 &MM%%MM,-MM/*MM12MM34!
W 	%%fll7&;< 6wr    c                    U R                   R                  [        S 5      nU(       a-  U R                   [        	 U R                  R	                  U5        g g r)   )r   r   r   r0  
unregister)r   rH   s     r   pytest_unconfigurer5    s@    
,,

7D
)C
LL!'', r    c                    U R                  S5      u  pnUR                  S5      nUS   R                  [        R                  S5      US'   [
        R                  " SSUS   5      US'   US==   X#-   -  ss'   U$ )N[z::r   rj   z\.py$r   ri   )	partitionsplitreplacer   SEPr#   r$   )addressr  possible_open_bracketparamsrt   s        r   rl   rl     st    *1*;*;C*@'DJJtEQx		3/E!HvvhE!H-E!H	"I&//ILr    c                      \ rS rSr     S           SS jjrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSrg)r   i  c                   [         R                  R                  [         R                  R                  U5      5      n[         R                  R	                  [         R                  R                  U5      5      U l        X l        X0l        X@l	        Xpl
        XPl        X`l        [        R                  / SQS5      U l        0 U l        / U l        / U l        / U l        SU l        U R                  S:X  a  SU l        g g )N)r   r   r   r   r   r   r@   )osr  
expanduser
expandvarsnormpathabspathlogfilerm   
suite_namer   r   report_durationrJ   dictfromkeysstatsnode_reportersnode_reporters_orderedglobal_propertiesopen_reportscnt_double_fail_tests)rN   rF  rm   rG  r   rH  rJ   r   s           r   rP   LogXML.__init__  s     ''$$RWW%7%7%@Aww''(@A$!2.%)]]5q&

 UW;=#8: /1%&" ;;(""DK #r    c                    [        USU5      n[        USS 5      nU R                  R                  X#45      nUR                   H   u  pVUR	                  U[        U5      5        M"     Ub  UR                  5         g g NrO   rU   )r   rL  popr   rZ   r"   r   )rN   r   rO   
workernodereporterpropname	propvalues          r   r   LogXML.finalize  sw    62VVT2
&&**F+?@#)#9#9H!!(C	N; $:   r    c                    [        USU5      n[        USS 5      nX#4nX@R                  ;   a  U R                  U   $ [        X 5      nXPR                  U'   U R                  R	                  U5        U$ rS  )r   rL  rC   rM  rT   )rN   r   rO   rU  rx   rV  s         r   r  LogXML.node_reporter  st    #*68V#DVVT2
 %%%&&s++ .#+C ##**84r    c                R    XR                   ;   a  U R                   U==   S-  ss'   g g )Nrk   )rK  )rN   rx   s     r   rI   LogXML.add_stats  s#    **JJsOq O r    c                J    U R                  U5      nUR                  U5        U$ r)   )r  ry   rN   r   rV  s      r   _opentestcaseLogXML._opentestcase  s%    %%f-""6*r    c                ~  ^^^ SnTR                   (       a4  TR                  S:X  a"  U R                  T5      nUR                  T5        GO?TR                  (       a  TR                  S:X  ai  [        TSS5      m[        TSS5      m[        UUU4S jU R                   5       S5      nU(       a&  U R                  U5        U =R                  S-  sl	        U R                  T5      nTR                  S:X  aO  UR                  T5        U R                  R                  T5        U R                  (       d  UR                  T5        OEUR                  T5        O3TR                  (       a"  U R                  T5      nUR!                  T5        U R#                  T5        TR                  S:X  a  U R                  T5      nUR                  T5        U R                  T5        [        TSS5      m[        TSS5      m[        UUU4S jU R                   5       S5      nU(       a  U R                  R%                  U5        ggg)	a  Handle a setup/call/teardown report, generating the appropriate
XML tags as necessary.

Note: due to plugins like xdist, this hook may be called in interlaced
order with reports from other nodes. For example:

Usual call order:
    -> setup node1
    -> call node1
    -> teardown node1
    -> setup node2
    -> call node2
    -> teardown node2

Possible call order in xdist:
    -> setup node1
    -> call node1
    -> setup node2
    -> call node2
    -> teardown node2
    -> teardown node1
Ncallr   	worker_id
item_indexc              3     >#    U  HI  nUR                   TR                   :X  d  M  [        US S5      T:X  d  M2  [        USS5      T:X  d  ME  Uv   MK     g7fre  Nrd  rO   r   .0repr   	report_ii
report_wids     r   	<genexpr>2LogXML.pytest_runtest_logreport.<locals>.<genexpr>8  sZ      #4CJJ&--7  !(\4 @I M	 
 !([$ ?: M #4   AAA	Ark   c              3     >#    U  HI  nUR                   TR                   :X  d  M  [        US S5      T:X  d  M2  [        USS5      T:X  d  ME  Uv   MK     g7frg  rh  ri  s     r   rn  ro  ]  sZ      0

fmm3  $Ct<	I	 
 $Cd;zI C0rp  )r   r   r`  r   failedr   nextrO  r   rP  r   rT   r   r   r   r   r   update_testcase_durationremove)rN   r   close_reportrV  rl  rm  s    `  @@r   pytest_runtest_logreportLogXML.pytest_runtest_logreport  s   . =={{f$--f5$$V,]]{{j($V[$?
#FL$?	##'#4#4     MM,/..!3.))&1H{{f$''/!!((0--226:%%f-^^))&1H##F+%%f-;;*$))&1H**62MM&! d;Jd;I#00 L !!((6 ' %r    c                    U R                   SUR                  1;   a2  U R                  U5      nU=R                  [	        USS5      -  sl        gg)z{Accumulate total duration for nodeid from given report and update
the Junit.testcase with the new total if already created.r"  rK   rF   N)rH  r   r  rK   r   r_  s      r   rt  LogXML.update_testcase_durationk  sJ     GV[[#99))&1HS!AA :r    c                    UR                   (       dF  U R                  U5      nUR                  (       a  UR                  U5        g UR	                  U5        g g r)   )r   r`  rr  r   r   r_  s      r   pytest_collectreportLogXML.pytest_collectreportr  sA    }}))&1H}}--f5//7 r    c                    U R                  S5      nUR                  R                  SSS9  UR                  SS[	        U5      5        g )Ninternalr  )r9   r:   r   zinternal error)r  rM   r/   r   r"   )rN   excreprrV  s      r   pytest_internalerrorLogXML.pytest_internalerrorz  s@    %%j1zBW&6GEr    c                8    [         R                  " 5       U l        g r)   )r	   r}   suite_start_time)rN   s    r   pytest_sessionstartLogXML.pytest_sessionstart  s     &r    c                   [         R                  R                  [         R                  R                  U R                  5      5      n[         R
                  " USS9  [        U R                  SSS9 n[        R                  " 5       nX0R                  -
  nU R                  S   U R                  S   -   U R                  S   -   U R                  S	   -   U R                  -
  nUR                  S
5        [        R                  " SU R                  [!        U R                  S	   5      [!        U R                  S   5      [!        U R                  S   5      [!        U5      US ["        R$                  " U R                  [&        R(                  5      R+                  5       R-                  5       [.        R0                  " 5       S9	nU R3                  5       nUb  UR5                  U5        U R6                   H"  nUR5                  UR9                  5       5        M$     [        R                  " S5      n	U	R5                  U5        UR                  [        R:                  " U	SS95        S S S 5        g ! , (       d  f       g = f)NT)exist_okwzutf-8)encodingr   r   r   r   z&<?xml version="1.0" encoding="utf-8"?>	testsuiter|   )r:   errorsfailuresr   testsr}   	timestamphostname
testsuitesunicode)rA  r  dirnamerE  rF  makedirsopenr	   r}   r  rK  rP  writerc   rd   rG  r"   r   fromtimestampr   utc
astimezone	isoformatplatformrU   _get_global_properties_noderT   rM  r   tostring)
rN   r  rF  suite_stop_timesuite_time_deltanumtests
suite_noderN  r  r  s
             r   pytest_sessionfinishLogXML.pytest_sessionfinish  s   ''//"''//$,,"?@
Gd+$,,g6'$kkmO.1F1FF 

8$**Y'(**Y'( **W%& ,,	-  MMBC__4::g./TZZ	23DJJy12(m(-"001F1FU!J !% @ @ B ,!!"34!%!<!<!!-"6"6"89 "=L1Jj)MM"++j9EFC 766s   1G1I++
I9c                B    UR                  SSU R                   35        g )Nr   zgenerated xml file: )	write_seprF  )rN   terminalreporters     r   pytest_terminal_summaryLogXML.pytest_terminal_summary  s    ""3*>t||n(MNr    c                l    Sn[        SU5        U R                  R                  U[        U5      45        g )NTr:   )r	  rN  rT   r'   )rN   r:   rY   r  s       r   r  LogXML.add_global_property  s0      .%%t^E-B&CDr    c           	         U R                   (       aQ  [        R                  " S5      nU R                    H)  u  p#UR                  [        R                  " SX#S95        M+     U$ gr`   )rN  rc   rd   rT   re   s       r   r  "LogXML._get_global_properties_node  sM    !!L1J#55!!"**Zd"PQ  6r    )rP  rJ   rN  r   rF  r   rL  rM  rO  rm   rH  rK  rG  r  N)r  r   r"  r@   T)rm   r   rG  r"   r   r"   rH  r"   r   r   r!   r   r   )r   zTestReport | strr!   rC   )rx   r"   r!   r   )r   r   r!   rC   )r  r
   r!   r   r   )r  r   r!   r   r   r   )r   r   r   r   rP   r   r  rI   r`  rw  rt  r|  r  r  r  r  r  r  r   r   r    r   r   r     s    
 #&"&# # 	#
 # #  # 
#B
 $!
S7jB8F
.&GPOE
r    )r%   r   r!   r"   r   )r   r   r   r"   r!   r   )r   r   r!   zCallable[[str, object], None])r  r"   r  r"   r!   r   )r)  r   r!   r   )r   r   r!   r   )r<  r"   r!   z	list[str])5__doc__
__future__r   r   r   r&  rA  r  r#   typingr   r   xml.etree.ElementTreeetreeElementTreerc   _pytestr   r	   _pytest._code.coder
   r   _pytest.configr   r   _pytest.config.argparsingr   _pytest.fixturesr   _pytest.reportsr   _pytest.stashr   _pytest.terminalr   r  r   r'   r7   rr   copyrC   r   fixturer   r   r	  r  r*  r2  r5  rl   r   r   r    r   <module>r     ss   #    	  	   " "   , / ! ' , + & " -  8

26 +v!67 &(?@  g&++-  Xh.!9 : g& l# l#^

+.
	
  ,  8E i # !#L,^="-l lr    