a XC?h@sddlZddlZddlmZddlZddlmZddlmZm Z ddl m Z ddl m Z mZmZmZmZmZmZmZmZmZmZdZejeZdeZdd d Zejaej Z!Gd d d e"Z#deZ$e#fddZ%Gddde"Z&Gdddej'Z(edkre)dS)N) OrderedDict)support) SomeClass is_instance)uncache) NonCallableMock CallableMixinsentinel MagicMockMockNonCallableMagicMockpatch_patchDEFAULTcall _get_targetbuiltinsz %s.PTModuleTcsBGfdddt}|s<fdd}fdd}||_||_|S)NcseZdZfddZdS)z_get_proxy..Proxycs t|SN)getattrselfnameobjE/opt/alt/python39/lib64/python3.9/unittest/test/testmock/testpatch.py __getattr__sz%_get_proxy..Proxy.__getattr__N)__name__ __module__ __qualname__rrrrrProxysr cst||dSr)setattrrrvaluerrr __setattr__ sz_get_proxy..__setattr__cst|dSr)delattrrrrr __delattr__"sz_get_proxy..__delattr__)objectr$r&)rget_onlyr r$r&rrr _get_proxys  r)c@sPeZdZddZddZddZdZedd Ze d d Z Gd d d e Z dS)FoocCsdSrrrarrr__init__/z Foo.__init__cCsdSrrr+rrrf0r.zFoo.fcCsdSrrrrrrg1r.zFoo.gbarcCsdSrrrrrr static_method4szFoo.static_methodcCsdSrr)clsrrr class_method7szFoo.class_methodc@seZdZddZdS)zFoo.BarcCsdSrrr0rrrr,;r.z Foo.Bar.aNrrrr,rrrrBar:sr7N) rrrr-r/r1foo staticmethodr3 classmethodr5r'r7rrrrr*.s  r*z%s.FoocCsdSrrr,brrrfunction@r.r=c@s4eZdZddZddZddZddZd d Zd S) ContainercCs i|_dSrvaluesr0rrrr-DszContainer.__init__cCs |j|Srr?rrrr __getitem__GszContainer.__getitem__cCs||j|<dSrr?r"rrr __setitem__JszContainer.__setitem__cCs |j|=dSrr?rrrr __delitem__MszContainer.__delitem__cCs t|jSr)iterr@r0rrr__iter__PszContainer.__iter__N)rrrr-rArBrCrErrrrr>Cs r>c@seZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@dAZ"dBdCZ#dDdEZ$dFdGZ%dHdIZ&dJdKZ'dLdMZ(dNdOZ)dPdQZ*dRdSZ+dTdUZ,dVdWZ-dXdYZ.dZd[Z/d\d]Z0d^d_Z1d`daZ2dbdcZ3dddeZ4dfdgZ5dhdiZ6djdkZ7dldmZ8dndoZ9dpdqZ:drdsZ;dtduZdzd{Z?d|d}Z@d~dZAddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVddZWddZXeYddddZZeYddddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZadd„ZbddĄZcddƄZdddȄZeddʄZfdd̄Zgdd΄ZhddЄZidd҄ZjddԄZkddքZldd؄ZmddڄZndd܄ZoddބZpdS) PatchTestTcCs<t}|s t}|t||t|||t|tdSr)r r assertRaises TypeError assertTruer assertFalser)rrmagic MockClassrrrassertNotCallableWs  zPatchTest.assertNotCallablecsJGdddttdtjfdd}|jtjddS)Nc@seZdZejZdS)z4PatchTest.test_single_patchobject..SomethingNrrrr Original attributerrrr SomethingbsrQrPcsjtjddSNZ unpatched assertEqualrPr PatchedrrQrrrtestesz/PatchTest.test_single_patchobject..testpatch not restoredr'r r rUrTrPrOrrWrrVrtest_single_patchobjectas z!PatchTest.test_single_patchobjectcCs@d}|t|tddWdn1s20YdS)Nz>'Something' must be the actual object to be patched, not a strrQZ do_something)ZassertRaisesRegexrHr r')rmsgrrr&test_patchobject_with_string_as_targetmsz0PatchTest.test_patchobject_with_string_as_targetcsHGdddttddfdd}|jtjddS)Nc@seZdZejZdS)z7PatchTest.test_patchobject_with_none..SomethingNrNrrrrrQssrQrPcsjddSrR) assertIsNonerPrrVrrrWvsz2PatchTest.test_patchobject_with_none..testrX)r'r rTrPr rOrZrrVrtest_patchobject_with_noners  z$PatchTest.test_patchobject_with_nonecslGdddttdtjtdtjfdd}|jtjdjtj ddS)Nc@seZdZejZejZdS)z6PatchTest.test_multiple_patchobject..SomethingNrrrr rOrP Original2next_attributerrrrrQsrQrPrbcs(jtjdjtjddSrR)rTrPr rUrbPatched2rrVrrrWs   z1PatchTest.test_multiple_patchobject..testrX) r'r r rUrcrTrPrOrbrarZrrVrtest_multiple_patchobjects  z#PatchTest.test_multiple_patchobjectcCsJt}tdttjdd}z"tja||ttjW|an|a0dS)N %s.somethingcSsdSrrrrrrrWsz8PatchTest.test_object_lookup_is_quite_lazy..test) somethingr rr Something2Zreplacement_valuerTroriginalrWrrr test_object_lookup_is_quite_lazys z*PatchTest.test_object_lookup_is_quite_lazycstdttjfdd}|tjtjdtdttjtdttjfdd}tjtjdtj tjd|tjtjdtj tjdt }tj |_ tdt |fdd}||t|ddS) NrecstjtjddSrR)rTPTModulerfr rgrr0rrrWs z"PatchTest.test_patch..testrXz%s.something_elsecs(tjtjdtjtjddSrR)rTrkrfr rgsomething_else SomethingElserr0rrrWs   %s.opencstddtjddS)Nfilenamerzopen not patched)rTopenr Handlerr0rrrWs)r rr rgrTrkrfrQrmrlr rr return_valuebuiltin_stringassertNotEqualrq)rrWmockrr0r test_patchs:      zPatchTest.test_patchcs6tdttjfdd}|tjjddS)Nz%s.SomeClass.class_attributecstjjtjddSrR)rTrkrclass_attributer ClassAttributerr0rrrWs z2PatchTest.test_patch_class_attribute..testrX)r rr ryr^rkrrxrZrr0rtest_patch_class_attributes z$PatchTest.test_patch_class_attributecsGdddttdfdd}|tdtdfdd}d|tjtj\|tjtjdS)Nc@seZdZejZejZdS)z:PatchTest.test_patchobject_with_default_mock..TestN)rrrr rOrfra something2rrrrTestsr|rfcs"|jd|tddS)N"Mock not passed into test function.patch with two arguments did not create a mock)rTrfassertIsInstancer rv)r|rrrrWs  z:PatchTest.test_patchobject_with_default_mock..testr{cs|tjd|tjd|jd|jd|td|td|d|d||fS)Nz0Patched function didn't receive initial argumentz/Patched function didn't receive second argumentr}z)Second Mock not passed into test functionr~zunexpected value for mock1) rTr this1this2r{rfrr ru)rrZmock1Zmock2r|Z outerMock1Z outerMock2rrrrWs*    )r'r r rrrZrrr"test_patchobject_with_default_mocks   z,PatchTest.test_patchobject_with_default_mockcs&tdttdfdd}|dS)N %s.SomeClassspeccs2t|ttjttdddS)NcSstjSrr not_wibblerrrrr.z>PatchTest.test_patch_with_spec..test..rTrrIrwibbler rGAttributeError MockSomeClassr0rrrWs z,PatchTest.test_patch_with_spec..test)r rrrZrr0rtest_patch_with_specszPatchTest.test_patch_with_speccs&tjtdtdfdd}|dS)Nrxrcs6tj|ttjjttdddS)NcSstjjSrrrxrrrrrrr.zDPatchTest.test_patchobject_with_spec..test.. rTrrxrIrrr rGrZ MockAttributer0rrrWs z2PatchTest.test_patchobject_with_spec..testr r'rrZrr0rtest_patchobject_with_spec sz$PatchTest.test_patchobject_with_speccs(tdtdgdfdd}|dS)Nrrrcs2t|ttjttdddS)NcSstjSrrrrrrrr.zFPatchTest.test_patch_with_spec_as_list..test..rrr0rrrWs z4PatchTest.test_patch_with_spec_as_list..testr rrZrr0rtest_patch_with_spec_as_listsz&PatchTest.test_patch_with_spec_as_listcs(tjtddgdfdd}|dS)Nrxrrcs6tj|ttjjttdddS)NcSstjjSrrrrrrr*r.zLPatchTest.test_patchobject_with_spec_as_list..test..rrr0rrrW$s z:PatchTest.test_patchobject_with_spec_as_list..testrrZrr0r"test_patchobject_with_spec_as_list#sz,PatchTest.test_patchobject_with_spec_as_listcs4tdttdtdgdfdd}|dS)Nrnrrrcs2t|ttjttdddS)NcSstjSrrrrrrr6r.zMPatchTest.test_nested_patch_with_spec_as_list..test..r)rZMockOpenr0rrrW1s z;PatchTest.test_nested_patch_with_spec_as_list..test)r rtrrZrr0r#test_nested_patch_with_spec_as_list/s z-PatchTest.test_nested_patch_with_spec_as_listcs&tdtddfdd}|dS)NrTrcs*tjtfdddS)NcsjSrrrrrrrAr.zIPatchTest.test_patch_with_spec_as_boolean..test..rTrrrGrrr0rrrW;s z7PatchTest.test_patch_with_spec_as_boolean..testrrZrr0rtest_patch_with_spec_as_boolean:sz)PatchTest.test_patch_with_spec_as_booleancs&tjtdddfdd}|dS)NrTrcs*tjtfdddS)NcsjSrrrrrrrMr.zPPatchTest.test_patch_object_with_spec_as_boolean..test..rrr0rrrWGs z>PatchTest.test_patch_object_with_spec_as_boolean..test)r r'rkrZrr0r&test_patch_object_with_spec_as_booleanFsz0PatchTest.test_patch_object_with_spec_as_booleancs&tdtddfdd}|dS)NrTrcs>t|t|jtfdddS)NcsjSrrrinstancerrr[r.zVPatchTest.test_patch_class_acts_with_spec_is_inherited..test..)rIrr rMrrGrrr0rrrWSs  zDPatchTest.test_patch_class_acts_with_spec_is_inherited..testrrZrr0r,test_patch_class_acts_with_spec_is_inheritedRs z6PatchTest.test_patch_class_acts_with_spec_is_inheritedcs:tdttjddfdd}|tdddS)N %s.froobleTcreatecsttjdSr)rTfroobler Frooblerr0rrrWaszLPatchTest.test_patch_with_create_mocks_non_existent_attributes..testcSstSrrrrrrrfr.zPPatchTest.test_patch_with_create_mocks_non_existent_attributes..)r rtr rrG NameErrorrZrr0r4test_patch_with_create_mocks_non_existent_attributes`sz>PatchTest.test_patch_with_create_mocks_non_existent_attributescs:tjtdtjddfdd}|ttddS)NrTrcstjtjdSr)rTrrr rrr0rrrWjszRPatchTest.test_patchobject_with_create_mocks_non_existent_attributes..test)r r'rr rrJhasattrrZrr0r:test_patchobject_with_create_mocks_non_existent_attributesiszDPatchTest.test_patchobject_with_create_mocks_non_existent_attributescCs\|t.tdttjdd}|Wdn1s>0Y|tdddS)NrcSsdSrrrrrrrWtsz9PatchTest.test_patch_wont_create_by_default..testcSstSrrrrrrrxr.z=PatchTest.test_patch_wont_create_by_default..)rGrr rtr rrrZrrr!test_patch_wont_create_by_defaultrs   $z+PatchTest.test_patch_wont_create_by_defaultcCs\|t.ttdtjdd}|Wdn1s>0Y|ttddS)NordcSsdSrrrrrrrW}sz?PatchTest.test_patchobject_wont_create_by_default..test) rGrr r'rr rrJrrZrrr'test_patchobject_wont_create_by_default{s   $z1PatchTest.test_patchobject_wont_create_by_defaultcCsHttddd}ttddd}||d||ddS) Nz.ordcSsd|_tdS)Nec)rsr)Zmock_ordrrrtest_ordsz>PatchTest.test_patch_builtins_without_create..test_ordz.opencSs*|j}d|j_td}|}||S)Nabcdzdoesnotexists.txt)rsreadrqclose)Z mock_openmZfobjdatarrr test_opens z?PatchTest.test_patch_builtins_without_create..test_openrrr rrT)rrrrrr"test_patch_builtins_without_creates     z,PatchTest.test_patch_builtins_without_createcsPGdddttdtddfdd}|tjdS)Nc@seZdZeddZdS)z5PatchTest.test_patch_with_static_methods..FoocSstjSr)r Staticrrrrwootsz:PatchTest.test_patch_with_static_methods..Foo.wootN)rrrr9rrrrrr*sr*rcSstjSr)r rUrrrrrr.z:PatchTest.test_patch_with_static_methods..cstjdSr)rTrr rUrr*rrr anonymoussz;PatchTest.test_patch_with_static_methods..anonymous)r'r r9rTrr r)rrrrrtest_patch_with_static_methodss z(PatchTest.test_patch_with_static_methodscs8tj}ttddfdd}|tj|dS)Nr*cstjddSNr*)rTr r*rr0rrrsz-PatchTest.test_patch_local..anonymous)r r*r r'rT)rr8rrr0rtest_patch_locals  zPatchTest.test_patch_localcsTGdddt}|tj_tddfdd}|jtjdS)Nc@seZdZdZdS)z'PatchTest.test_patch_slots..Foo)r*N)rrr __slots__rrrrr*sr*csjddSr)rTr*rr8rrrrsz-PatchTest.test_patch_slots..anonymous)r'r r*r rT)rr*rrrrtest_patch_slotss zPatchTest.test_patch_slotscsfGdddtGfdddt}tdtj|}|}||jtjddS)Nc@seZdZejZdS)z=PatchTest.test_patchobject_class_decorator..SomethingNrNrrrrrQsrQcs(eZdZfddZfddZdS)z7PatchTest.test_patchobject_class_decorator..FoocsjtjddSrRrS other_selfrVrr test_methods zCPatchTest.test_patchobject_class_decorator..Foo.test_methodcsjtjddSNznon-test method patched)rTrPr rOrrVrrnot_test_methods zGPatchTest.test_patchobject_class_decorator..Foo.not_test_methodN)rrrrrrrVrrr*sr*rPrX) r'r r rUrrrTrPrO)rr*r/rrVr test_patchobject_class_decorators z*PatchTest.test_patchobject_class_decoratorcsrGdddt}Gfdddt}tdt|}|}|||jtjdt j tj ddS)Nc@seZdZejZdS)z7PatchTest.test_patch_class_decorator..SomethingNrNrrrrrQsrQcs(eZdZdZfddZfddZdS)z1PatchTest.test_patch_class_decorator..FooZwhatevercstj|ddSrR)rTrkrf)rZmock_somethingr0rrrs z=PatchTest.test_patch_class_decorator..Foo.test_methodcstjtjddSr)rTrkrfr rQrr0rrrs zAPatchTest.test_patch_class_decorator..Foo.not_test_methodN)rrrZtest_class_attrrrrr0rrr*s r*rerX) r'r rrrrTrPr rOrkrfrQ)rrQr*r/rr0rtest_patch_class_decorators   z$PatchTest.test_patch_class_decoratorcsZGdddttdtjtdtjfdd}|jtjddS)Nc@seZdZejZejZdS)z3PatchTest.test_patchobject_twice..SomethingNr`rrrrrQsrQrPcsjtjddSrRrSrrVrrrWsz.PatchTest.test_patchobject_twice..testrXrYrZrrVrtest_patchobject_twices z PatchTest.test_patchobject_twicecstdd}tfdd}||tddifdd}||tdgfd d}||dS) Nrfinitialothercsdd<d=dd<dSNr,rsomething elserrrr8rrrWsz'PatchTest.test_patch_dict..testr,r<cs$tddddSNrr,r<rTlenrrrrrW sr;cs$tddddSrrrrrrrWsr'copyr dictrTrhrrrtest_patch_dicts    zPatchTest.test_patch_dictcsttd<dd<j}tfdd}|j|tddifdd}|j|dS) Nrrfrcsdd<d=dd<dSrrrrrrrW&sz=PatchTest.test_patch_dict_with_container_object..testr,r<cs&tjddddSr)rTrr@rrrrrW0sr>r'r@rr rrTrhrrr%test_patch_dict_with_container_objects  z/PatchTest.test_patch_dict_with_container_objectcstdd}tjddfdd}||tjddiddfd d}||tjd gddfd d}||dS) NrfrTclearcs idd<dd<dSNrr,rrrTrrrrrW>s z2PatchTest.test_patch_dict_with_clear..testr,r<csddidSNr,r<rrrrrrWHsr;csddidSrrrrrrrWPsrrhrrrtest_patch_dict_with_clear:s    z$PatchTest.test_patch_dict_with_clearcsttd<dd<j}tjddfdd}|j|tjdd iddfd d}|j|dS) NrrfrTrcs"jidd<dd<dSrrTr@rrrrrW`szGPatchTest.test_patch_dict_with_container_object_and_clear..testr,r<csjddidSrrrrrrrWjsrrhrrr/test_patch_dict_with_container_object_and_clearYs   z9PatchTest.test_patch_dict_with_container_object_and_clearcCsZddi}tj|dd }||ddiWdn1s<0Y||ddidS)Nr,r<r)r,)r rrT)rr8patchedrrr"test_patch_dict_as_context_managerss.z,PatchTest.test_patch_dict_as_context_managercCsZi}tdtttdttddtttt|dd}||jddS)NrTautospeccSsdSrrrrrr some_name}sz0PatchTest.test_name_preserved..some_namer)r rr'rrrT)rr8rrrrtest_name_preservedzs zPatchTest.test_name_preservedcCs\i}t|ddidd}|t|Wdn1sB0Y||idS)Nr,r<cSs tddS)NZKonradrrrrrrWsz1PatchTest.test_patch_with_exception..test)r rrGrrT)rr8rWrrrtest_patch_with_exceptions   $z#PatchTest.test_patch_with_exceptioncs&tdddifdd}|dS)Nz os.environ konrad_delongz some valuecsdtjdS)Nr)assertInosenvironrr0rrrWsz3PatchTest.test_patch_dict_with_string..test)r rrZrr0rtest_patch_dict_with_stringsz%PatchTest.test_patch_dict_with_stringcs`tj}tdddifdd}z,ddit_|tjddiW|t_n|t_0dS)Nz%unittest.test.testmock.support.targetr2BARcstjddddS)NBAZrr8r2)rTrtargetrr0rrrWsz.testr8r)rrrr rrTrhrr0r$test_patch_dict_decorator_resolutions  z.PatchTest.test_patch_dict_decorator_resolutioncCstdttdddd}|t|tjtdtdddd}|t|tdtddd d}|t|tjtdddd d}|t|dS) NrTrspec_setcSs d|_dSNr8zrLrrrrWsz+PatchTest.test_patch_spec_set..testrcSs d|_dSrrrrrrrWsrcSs d|_dSrrrrrrrWscSs d|_dSrrrrrrrWs)r rrrGrr'rrZrrrtest_patch_spec_sets       zPatchTest.test_patch_spec_setcCs(tdtdddd}|t|dS)NrTrcSs|}d|_dSrr)rLrrrrrWsz-PatchTest.test_spec_set_inherit..test)r rrGrrZrrrtest_spec_set_inherits zPatchTest.test_spec_set_inheritcCsdt}tdt}|t||}z$||||t|W|n |0|t|dS)Nre)rfr rassertIsstart assertIsNotstop)rripatcherrvrrrtest_patch_start_stops   zPatchTest.test_patch_start_stopcCsttdd}||dSNr2r)r foo_namer^rrrrrrtest_stop_without_starts z!PatchTest.test_stop_without_startcCs.ttdd}||||dSr)r rrrr^rrrrtest_stop_idempotents zPatchTest.test_stop_idempotentcCsft}ttdd}|t||}z$||d|t|W|n |0|t|dS)Nrfr8)rfr r'rkrrrTr)rrirZreplacedrrrtest_patchobject_start_stops  z%PatchTest.test_patchobject_start_stopcCsnddi}|}tj|dgdd}||||z||ddiW|n |0|||dS)Nr8r2spameggsTrr r )rr rrTrrrdrirrrrtest_patch_dict_start_stops z$PatchTest.test_patch_dict_start_stopcCs@ddi}|}tj|dgdd}|||||dS)Nr8r2r Tr)rr rrJrrTr rrr"test_patch_dict_stop_without_starts z,PatchTest.test_patch_dict_stop_without_startcs|ddi}Gfdddt}tjddidd|}|||}|||||||}||||||dS) Nr r cs(eZdZfddZfddZdS)z7PatchTest.test_patch_dict_class_decorator..TestcsddidSNr8r2rr0rthisrr test_firstszBPatchTest.test_patch_dict_class_decorator..Test.test_firstcsddidSrrr0rrr test_secondszCPatchTest.test_patch_dict_class_decorator..Test.test_secondN)rrrrrrrrrr|sr|r8r2Tr)rr'r rrTrr)rrir|rWrrrtest_patch_dict_class_decorator s     z)PatchTest.test_patch_dict_class_decoratorcsGdddt}Gddd}||||fD]X}t|tddfdd}|jd|jddjq,dS) Nc@seZdZdZdS)z0PatchTest.test_get_only_proxy..Somethingr8Nrrrr8rrrrrQ-srQc@seZdZdZdS)z4PatchTest.test_get_only_proxy..SomethingElser8Nrrrrrrm/srmr8r2csjddSNr2rTr8rproxyrrrrW5sz+PatchTest.test_get_only_proxy..testr'r)r rTr8Z assertNotIn__dict__rrQrmthingrWrrrtest_get_only_proxy,s zPatchTest.test_get_only_proxycsGdddt}Gddd}||||fD]\}t|ddtddfd d }|jd|jddjq,dS) Nc@seZdZdZdS)z6PatchTest.test_get_set_delete_proxy..Somethingr8NrrrrrrQ?srQc@seZdZdZdS)z:PatchTest.test_get_set_delete_proxy..SomethingElser8NrrrrrrmAsrmF)r(r8r2csjddSrrrrrrrWGsz1PatchTest.test_get_set_delete_proxy..testrrrrrtest_get_set_delete_proxy>s  z#PatchTest.test_get_set_delete_proxycCs^tdtd}ttfi|}|}||t|||j d| |jtdS)N!Z side_effectzfoo.bar.return_valuer8) KeyErrorr r rrrrGrTr8r2rrkwargsrrvrrrtest_patch_keyword_argsPs z!PatchTest.test_patch_keyword_argscCsbtdtd}tjtdfi|}|}||t|||j d| |j tdS)Nr"r#r/) r$r r r'r*rrrGrTr8r2rr%rrrtest_patch_object_keyword_args]s z(PatchTest.test_patch_object_keyword_argscCshddi}|}tj|dddd}|z"||tddddW|n |0|||dS)Nr8r2r)r8r2Zbaz)rr rrrTr)rrirrrrrtest_patch_dict_keyword_argsjsz&PatchTest.test_patch_dict_keyword_argscsGdddt}fddfddfdd}ttd d |}|}t||tjt}tj|d d d |}|}t||dS) Nc@s8eZdZddZddZddZdZGdd d eZd S) z$PatchTest.test_autospec..BoocSsdSrrr+rrrr-{r.z-PatchTest.test_autospec..Boo.__init__cSsdSrrr+rrrr/|r.z&PatchTest.test_autospec..Boo.fcSsdSrrr0rrrr1}r.z&PatchTest.test_autospec..Boo.gr2c@seZdZddZdS)z(PatchTest.test_autospec..Boo.BarcSsdSrrr0rrrr,r.z*PatchTest.test_autospec..Boo.Bar.aNr6rrrrr7sr7N) rrrr-r/r1r8r'r7rrrrBoozs r,cs"|d|dt|dSN)assert_called_withrGrHrr0rr_tests z&PatchTest.test_autospec.._testcs|d|jdt|j||jt|jdtt|d|j|jjtt|jd| |j |j |j j t|j j d| | j t| j dtt|j dtt| ddS)Nr.hr2r<) r/r/rGrHr1rrr8lowerr7r,rr0rr_test2s(         z'PatchTest.test_autospec.._test2cs,|||d|t|Sr-)rr*rr0r3rrrr=s   z)PatchTest.test_autospec..functionTrr*)r'r rrr*sysmodulesr)rr,r=rWrvmodulerr4r test_autospecys     zPatchTest.test_autospeccs&tdtddfdd}|dS)N %s.functionTrcstttjttjtdttjtdtttddtddtttt tddS)Nr.rr8) r=Zassert_not_calledrGAssertionErrorZ assert_calledZassert_called_oncer/rHrrrr0rrrWs    z.PatchTest.test_autospec_function..testrrZrr0rtest_autospec_functionsz PatchTest.test_autospec_functioncCs0tdtddddd}|}||ddS)Nr9Tr)rrscSs tddS)Nr.r:)r=)Z mock_functionrrrrWsz.PatchTest.test_autospec_keywords..testr)rrWresultrrrtest_autospec_keywordss   z PatchTest.test_autospec_keywordscCsDtdtdd }t|Wdn1s60YdS)Nz%s.Foo.static_methodTr)r rr*r3assert_called_once_withrmethodrrrtest_autospec_staticmethodsz$PatchTest.test_autospec_staticmethodcCsDtdtdd }t|Wdn1s60YdS)Nz%s.Foo.class_methodTr)r rr*r5r?r@rrrtest_autospec_classmethodsz#PatchTest.test_autospec_classmethodcCsNtdtddd}|t|jtjt}tj|dddd}|t|jdS)Nr9rT)newrr=)r rrGrHrr5r6r')rrr7rrrtest_autospec_with_news  z PatchTest.test_autospec_with_newcCsZGdddt}tt|d}|}z&|||||jtW|n |0dS)Nc@seZdZgZdS)z0PatchTest.test_autospec_with_object..BarN)rrrextrarrrrr7sr7r)r*r rrrrFlistr)rr7rrvrrrtest_autospec_with_objects  z#PatchTest.test_autospec_with_objectcCsPt}ttdd}|}z(|||||d|W|n |0dS)NTrr)r*r rrrr)rZFooClassrrvrrrtest_autospec_inheritss  z PatchTest.test_autospec_inheritscCs|ttdd}|}zX|dt||dt|j|dt|d|dt|djW|n |0dS)NTrz name='Foo'z name='Foo.f'z name='Foo()'z name='Foo().f')r rrrreprr/r)rrrvrrrtest_autospec_names zPatchTest.test_autospec_namecCsbttdtdd}z |Wnt}Yn0tddd}|||}|d|dS)Nr/cSstdSr)r;rrrrrWsz'PatchTest.test_tracebacks..testrzraise AssertionError) r r'r*r5exc_infounittestZTextTestResultZ_exc_info_to_stringr)rrWerrr= tracebackrrrtest_tracebackss   zPatchTest.test_tracebackscCsTtttd}|}||}||||||fD]}||q@dS)N new_callable)r rr rrrrMrrZm1Zm2rvrrrtest_new_callable_patch#s   z!PatchTest.test_new_callable_patchcCsXtjtdtd}|}||}||||||fD]}||qDdS)Nr/rQ)r r'r*r rrrrMrSrrrtest_new_callable_patch_object0s  z(PatchTest.test_new_callable_patch_objectcsnGfdddtttddd}|}z2|t||jtdddW| n | 0dS)NcseZdZdZfddZdS)z:PatchTest.test_new_callable_keyword_arguments..BarNcs |_dSrr&rr&r7rrr-@szCPatchTest.test_new_callable_keyword_arguments..Bar.__init__rrrr&r-rrXrrr7>sr7r.r:)rRarg1arg2)rZr[) r'r rrrtyperTr&rr)rrrrrXr#test_new_callable_keyword_arguments=sz-PatchTest.test_new_callable_keyword_argumentscsGfdddtttd}|z |jtdW|n |0ttd}|z |jtdW|n |0dS)NcseZdZdZfddZdS)z-PatchTest.test_new_callable_spec..BarNcs |_dSrrVrWrXrrr-Osz6PatchTest.test_new_callable_spec..Bar.__init__rYrrXrrr7Msr7rRrr)rRrr)r'r rrrTr&rrrrrXrtest_new_callable_specLsz PatchTest.test_new_callable_speccCsbdt}t|td}|t|jt|tdd}|}z|j|ddW|n |0dS)Nz %s.weeeeerQT)rRrF)rK)rr rrGrrrMr)rZnon_existent_attrprrrrtest_new_callable_createas z"PatchTest.test_new_callable_createcCs4|jtttttd|jttjtdttddS)N)rDrRr/)rG ValueErrorr rr'r r*r0rrr'test_new_callable_incompatible_with_newos z1PatchTest.test_new_callable_incompatible_with_newcCs0|jttttdd|jttjtdtdddS)NT)rRrr/)rGrbr rr r'r*r0rrr,test_new_callable_incompatible_with_autospecys z6PatchTest.test_new_callable_incompatible_with_autospecc CsGdddt}tttt|f}|D]`}dD]V}|di}ttfd|i|}|}z"|j}|t t |dW| q*| 0q*q"dS)Nc@s eZdZdS)z>PatchTest.test_new_callable_inherit_for_mocks..MockSubNrrrrrrrMockSubsrfrTrRx) r rr r r rrrsrGrrr) rrfZ MockClassesZKlassargr&r`rrrrr#test_new_callable_inherit_for_mockss z-PatchTest.test_new_callable_inherit_for_mockscCspGdddt}tt|dd}|}z,|t|||tt|dW| n | 0| |j t dS)Nc@seZdZddZdS)z>PatchTest.test_new_callable_inherit_non_mock..NotAMockcSs ||_dSrr)rrrrrr-szGPatchTest.test_new_callable_inherit_non_mock..NotAMock.__init__N)rrrr-rrrrNotAMocksrjTr^rs) r'r rrrIrrGrrrrTrr*)rrjr`rrrr"test_new_callable_inherit_non_mocksz,PatchTest.test_new_callable_inherit_non_mockcsR|tGfdddt}tttd|}|||tdS)Ncs*eZdZfddZddZddZdS)z>PatchTest.test_new_callable_class_decorating..SomeTestcs(tt|ttdSr)rr*rrrrZmock_foorirWrrr0s  zDPatchTest.test_new_callable_class_decorating..SomeTest._testcSs||dSrr0rlrrrtest_twoszGPatchTest.test_new_callable_class_decorating..SomeTest.test_twocSs||dSrrnrlrrrtest_oneszGPatchTest.test_new_callable_class_decorating..SomeTest.test_oneNrrrr0rorprrmrrSomeTestsrrrQ)r*r'r rrrpror)rrrrrmr"test_new_callable_class_decoratings   z,PatchTest.test_new_callable_class_decoratingc sttj}tj}tjtddd}tjtddd}||fD]t}|z4ttjdtjdW| n | 0ttj|tj|q8tjtdddfdd}|dS)Nr.r:)r/r1rr)cs,ttjdtjddS)Nrr))rr*rTr/r1r original_foorrrrWs z+PatchTest.test_patch_multiple..test) r*r/r1r multiplerrrrTr)r original_f original_gZpatcher1Zpatcher2rrWrrtrtest_patch_multiples$   zPatchTest.test_patch_multiplecCs$|ttjt|ttjtdSr)rGrbr rvrr*r0rrrtest_patch_multiple_no_kwargssz'PatchTest.test_patch_multiple_no_kwargscsVttj}tj}tjttdtdfdd}|tj|tj|dS)Nrr/r1r8csZttj|tjdtj|t|tt|tdSNr rr*r/rTr1r8rIrr )r/r8rtrrrWs  z8PatchTest.test_patch_multiple_create_mocks..testr*r/r1r rvrrrT)rrwrxrWrrtr test_patch_multiple_create_mockssz*PatchTest.test_patch_multiple_create_mockscsrtj}tj}ttdd}d|_ttdt}d|_|g|_|fdd}|tj|tj|dS)Nr/rr1cs tj|tjddSr|)rr*r1rTr/)r1r0rrrWszHPatchTest.test_patch_multiple_create_mocks_different_order..test) r*r/r1r r'attribute_nameradditional_patchersrT)rrwrxrrrWrr0r0test_patch_multiple_create_mocks_different_ordersz:PatchTest.test_patch_multiple_create_mocks_different_ordercsttj}tj}tjttdtjttdttdfdd}tjttdttdtjttdfdd}ttdtjttdtjttdfdd }fd d |||tj|tj|dS) N)r/rz.gcs|fi|dSrrr1r&rnrrtest1 sz?PatchTest.test_patch_multiple_stacked_decorators..test1cs|fi|dSrrrrnrrtest2sz?PatchTest.test_patch_multiple_stacked_decorators..test2cs|fi|dSrrrrnrrtest3sz?PatchTest.test_patch_multiple_stacked_decorators..test3cs|d}|d}|ttj|tj|tj|t|t t|t t|t dS)Nr/r8) poprJrr*r/r1r8rIrr )r1r&r/r8rtrrr0s    z?PatchTest.test_patch_multiple_stacked_decorators.._testr~)rrwrxrrrr)r0rurr&test_patch_multiple_stacked_decoratorss*          z0PatchTest.test_patch_multiple_stacked_decoratorscCst}tj}tj}tjttdtd}|}z||d}|d}|t |t ddg| t|| tj|| tj || t |t| t |tW|n |0|tj||tj|dS)Nrr{r/r8)r*r/r1r rvrrrrTsetrr8rIrr r)rrurwrxrr=r/r8rrr(test_patch_multiple_create_mocks_patcher3s" z2PatchTest.test_patch_multiple_create_mocks_patchercsv|ttj}tj}Gfdddt}tjttdtd|}|}|| | tj|| tj|dS)Ncs*eZdZfddZddZddZdS)z@PatchTest.test_patch_multiple_decorating_class..SomeTestcsZttj|tjdtj|t|tt|tdSr|r}rr/r8rurWrrr0Ts  zFPatchTest.test_patch_multiple_decorating_class..SomeTest._testcSs|||dSrrnrrrrro\szIPatchTest.test_patch_multiple_decorating_class..SomeTest.test_twocSs|||dSrrnrrrrrp^szIPatchTest.test_patch_multiple_decorating_class..SomeTest.test_oneNrqrrrrrrRsrrrr{) r*r/r1r'r rvrrrprorT)rrwrxrrrrrr$test_patch_multiple_decorating_classLsz.PatchTest.test_patch_multiple_decorating_classcCsntjtdd}|t|jtjtddd}|z|tjdW|n |0| t tddS)Nblam)rT)rr) r rvr*rGrrrTrrrJrrrrrtest_patch_multiple_createmsz$PatchTest.test_patch_multiple_createcCstjttddgd}|}zf|tj|dtjdtjdtjj dtjj d| t t tjddW| n | 0dS)Nr,r<)r8rr8r.r:r)r rvr*rrrTr8r,r<r/rGrr!r)rrr=rrrtest_patch_multiple_spec_set{s  z&PatchTest.test_patch_multiple_spec_setcCsGdddt}tjttt|d}|}z\|tj|d|tj|d| tj|| tj|| tjtjW| n | 0dS)Nc@s eZdZdS)z9PatchTest.test_patch_multiple_new_callable..ThingNrerrrrThingsr)r/r1rRr/r1) r'r rvr*rrrr/r1rrr)rrrr=rrr test_patch_multiple_new_callablesz*PatchTest.test_patch_multiple_new_callablecCstj}tj}ttddttddttdddd}ttddttddttdddd}ttddttddttddd d }|||fD],}|t||tj||tj|qdS) Nr1r.missingr/cSsdSrrrrrrthing1sz3PatchTest.test_nested_patch_failure..thing1cSsdSrrrrrrthing2sz3PatchTest.test_nested_patch_failure..thing2cSsdSrrrrrrthing3sz3PatchTest.test_nested_patch_failure..thing3)r*r/r1r r'rGrrT)rrwrxrrrfuncrrrtest_nested_patch_failures$          z#PatchTest.test_nested_patch_failurec Cstj}tj}tj}dd}ttddtjtd|dttdddd }tjtd|dttddttddd d }ttddttddtjtd|dd d }|||fD]:}|t||tj||tj||tj|qdS)NcSs tddSNcrasherrrrrrrsz4PatchTest.test_new_callable_failure..crasherr1r.r8rQr/cSsdSrrrrrrrsz3PatchTest.test_new_callable_failure..thing1cSsdSrrrrrrrsz3PatchTest.test_new_callable_failure..thing2cSsdSrrrrrrrsz3PatchTest.test_new_callable_failure..thing3) r*r/r1r8r r'rGrrT) rrwrxrurrrrrrrrtest_new_callable_failures*       z#PatchTest.test_new_callable_failurecCstj}tj}ttdd}d|_ttdd}d|_ttdd}d|_||g||gfD]>}||_|dd}|t|| tj|| tj|qXdS)Nr/r.r1rcSsdSrrrrrrrsz3PatchTest.test_patch_multiple_failure..func) r*r/r1r r'rrrGrrT)rrwrxrgoodbad additionalsrrrrtest_patch_multiple_failures  z%PatchTest.test_patch_multiple_failurec Cstj}tj}tj}dd}ttdd}d|_ttdd}d|_tjtd|d}d|_||g||gfD]L}||_|dd } |t | | tj|| tj|| tj|qhdS) NcSs tddSrrrrrrrszCPatchTest.test_patch_multiple_new_callable_failure..crasherr/r.r1r8rQcSsdSrrrrrrrsz@PatchTest.test_patch_multiple_new_callable_failure..func) r*r/r1r8r r'rrrGrrT) rrwrxrurrrrrrrrr(test_patch_multiple_new_callable_failures$  z2PatchTest.test_patch_multiple_new_callable_failurecsLtdtfddi}|tjddfdd}|jddS)Nr*fishZtasty nearly gone)rcsjddS)Nr)rTrrrrrrW sz=PatchTest.test_patch_multiple_string_subclasses..test)r\strr rvrTr)rr*rWrrr%test_patch_multiple_string_subclasses s  z/PatchTest.test_patch_multiple_string_subclasseszunittest.mock.patch.TEST_PREFIXr8cCslGdddt}t|dd|}|}||d||d||d||ddS)Nc@s0eZdZdZddZddZddZdd Zd S) z-PatchTest.test_patch_test_prefix..FooricSs|jSrrr0rrrfoo_onesz5PatchTest.test_patch_test_prefix..Foo.foo_onecSs|jSrrr0rrrfoo_twosz5PatchTest.test_patch_test_prefix..Foo.foo_twocSs|jSrrr0rrrrpsz6PatchTest.test_patch_test_prefix..Foo.test_onecSs|jSrrr0rrrrosz6PatchTest.test_patch_test_prefix..Foo.test_twoN)rrrrrrrprorrrrr*s r*rchangedri)r'r rTrrrprorr*r8rrrtest_patch_test_prefixs z PatchTest.test_patch_test_prefixr2csGfdddt}dditjdd|}|}||ddi||ddi||ddi||ddidS)Ncs<eZdZfddZfddZfddZfddZd S) z2PatchTest.test_patch_dict_test_prefix..FoocstSrrr0Zthe_dictrrbar_one.sz:PatchTest.test_patch_dict_test_prefix..Foo.bar_onecstSrrr0rrrbar_two0sz:PatchTest.test_patch_dict_test_prefix..Foo.bar_twocstSrrr0rrrrp2sz;PatchTest.test_patch_dict_test_prefix..Foo.test_onecstSrrr0rrrro4sz;PatchTest.test_patch_dict_test_prefix..Foo.test_twoN)rrrrrrprorrrrr*-s   r*keyrir)r)r'r rrTrrrprorrrrtest_patch_dict_test_prefix+s z%PatchTest.test_patch_dict_test_prefixc CsdD]}tdtfi|di}|}zT|dt||dt|j|dt||dt|jW|q|0qdS)NrrrrTz name='SomeClass'z! name='SomeClass.class_attribute'z name='SomeClass()'z# name='SomeClass().class_attribute')r rrrrJrxr)rrhr`rrrrtest_patch_with_spec_mock_reprAs z(PatchTest.test_patch_with_spec_mock_reprcCs^tddd>}|dt|j|dt|Wdn1sP0YdS)Nunittest.test.testmock.supportTrz" name='support.SomeClass.wibble()'z$ name='support.SomeClass().wibble()')r rrJrr)rrrrrtest_patch_nested_autospec_reprPs z)PatchTest.test_patch_nested_autospec_reprc Cs dD]}tdtfi|di}|}z|tg}||j|||j|||jjtg|}|t||j|||t||j|||jtg||jjtg||jtgW| q| 0qdS)NrrT) r rrrrrTZ mock_callsZ method_callsappendr)rrhr`rZkallsr=rrrtest_mock_calls_with_patchYs&   z$PatchTest.test_mock_calls_with_patchcCstd}|t|jtdDt}|tjd<d|_td}d|_|| Wdn1sh0Y| |jddS)N squizz.squozzsquizzr) r rG ImportErrorrrr r5r6ZsquozzrrT)rZp1rrrrtest_patch_imports_lazilyts  &z#PatchTest.test_patch_imports_lazilycsGdddGfdddtfdd}|ddd }td ,t}|tjd <|t|Wdn1sx0Y|jd t| jd d | jdddS)Nc@seZdZdZdS)z;PatchTest.test_patch_propagates_exc_on_exit..holder)NNNN)rrrrLrrrrholdersrcseZdZdfdd ZeZdS)zAPatchTest.test_patch_propagates_exc_on_exit..custom_patchNcs t|||||||f_dSr)r__exit__rL)retypevaltbrrrrszJPatchTest.test_patch_propagates_exc_on_exit..custom_patch.__exit__)NNN)rrrrrrrrr custom_patchsrc s$t|\}}||tdddddi S)NF)rr)rgetterrP)rrrwith_custom_patchs   zFPatchTest.test_patch_propagates_exc_on_exit..with_custom_patchrcSstdSr) RuntimeErrorrrrrrWsz9PatchTest.test_patch_propagates_exc_on_exit..testrrr.zexception value not propagatedr:z"exception traceback not propagated) rrr r5r6rGrrrLZassertIsNotNone)rrrWrr)rrr!test_patch_propagates_exc_on_exits     *  z+PatchTest.test_patch_propagates_exc_on_exitcCspdD]f}tdtfddi|di}|t|j|tddttfddi|di}||qdS)Nrrrz%s.doesnotexistrTcSstSr) doesnotexistrrrrrr.z1PatchTest.test_create_and_specs..)r rrGrHrrMODNAMEr)rkwargr`rrrtest_create_and_specsszPatchTest.test_create_and_specscCst}dD]6}ttfddi|di}|t|j|t|qdD]6}ttfddi|di}|t|j|t|qDdD]6}ttfddi|di}|t|j|t|qdS)Nrrrrrr)rrr)rkr rrGrHrr)rrirr`rrrtest_multiple_specsszPatchTest.test_multiple_specscCs@ttdddd}|}z|jd|_W|n |0dS)NFrr)r rrZdoes_not_existr)rr`rvrrr test_specs_false_instead_of_nones z*PatchTest.test_specs_false_instead_of_nonec CsRdD]H}ttfi|di}|}z|tt|dW|q|0qdS)NrrZ doesnotexit)r rrrGrrrrrr`rrrrtest_falsey_specs zPatchTest.test_falsey_specc CshdD]^}ttfddi|di}|}z.|tt|dd|tt|dW|q|0qdS)NrrTrrf)r rrrGrr!rrrrrrtest_spec_set_trues zPatchTest.test_spec_set_truecCsBd}tt|d}|}z|t|W|n |0dS)N)__call__r)r rrrIcallablerrrr`rrrrtest_callable_spec_as_lists  z$PatchTest.test_callable_spec_as_listcCsBd}tt|d}|}z|t|W|n |0dS)Nrr)r rrrJrrrrrrtest_not_callable_spec_as_lists  z(PatchTest.test_not_callable_spec_as_listcs^tjtjtj}tdttdttdfdd}|tj|dS)N os.unlinkos.chdirzos.pathcs6ttj|tjtjdSr)r stopallrrpathunlinkchdir)Z mock_pathrrrrrrsz-PatchTest.test_patch_stopall..patched) rrrrr rfrrlr)rrrrrrtest_patch_stopallszPatchTest.test_patch_stopallcsPgGdddtfddfdddDt|gddS) Nc@seZdZdZZZdS)z*PatchTest.test_stopall_lifo..thingN)rrronetwothreerrrrr src s8Gfdddtfddddddddi S)Ncs"eZdZfddZZS)z?PatchTest.test_stopall_lifo..get_patch..mypatchcst|Sr)rsuperrr0) __class__rPmypatchstoppedrrrs zDPatchTest.test_stopall_lifo..get_patch..mypatch.stop)rrrr __classcell__r)rPrr)rrrsrcsSrrrrrrrr.z@PatchTest.test_stopall_lifo..get_patch..F)r)rP)rr)rPrr get_patchs z.PatchTest.test_stopall_lifo..get_patchcsg|]}|qSr)r).0r)rrr r.z/PatchTest.test_stopall_lifo..)rrr)rrr)r'r rrTr0r)rrrrtest_stopall_lifo s zPatchTest.test_stopall_lifocsi}ddi}ddd|}|}}t|dddt|dd itfd d }|||||||||t||||||||dS) Nr.r,ABr.r:IIIr:r<cs d=dSr-rrZdic3rrr%sz2PatchTest.test_patch_dict_stopall..patched)rr rrrurTr)rdic1dic2origdic1origdic2Zorigdic3rrrrtest_patch_dict_stopalls$      z!PatchTest.test_patch_dict_stopallcCstj}tj}i}ddd}|}|}tdttdtt|dddt||d=| tj|| tj|| ||| ||t | tj|| tj|| ||| ||dS) Nrrrrrrrr.)rrrrr rfrrlrrrurrrT)rZoriginal_unlinkZoriginal_chdirrrrrrrr!test_patch_and_patch_dict_stopall5s(    z+PatchTest.test_patch_and_patch_dict_stopallcCsddd}t|dd||dWdn1s<0Y||d|j}t|dd||jdWdn1s0Y||j|t|d d ||jd Wdn1s0Y||jd t|d td g$||jtd gWdn1s.0Y||jtdddd}t|dtdg||dWdn1s0Y||ddS)NrcSs|S)ZTESTrrgrrrr8Osz)PatchTest.test_special_attrs..foo __defaults__)r.r.__doc__ZFUNrZ testpatch2z unittest.test.testmock.testpatch__annotations__)sr.rcWs|Srr)rgr,rrrr8cs__kwdefaults__)rgr.)r)r r'rTrrrr)rr8Zorig_docrrrtest_special_attrsNs$ ,,,4.zPatchTest.test_special_attrscCst}t|d<d|d<|}ttdtd}t||}t|t|$| t||Wdn1s|0Y| ||t||$| t||Wdn1s0Y| ||dS)Nr,Zpythonr<Zcdefghijklmnopqrstuvwxyz) rr'rrGziprangeitemsr rrT)rr8riZ update_valuesZpatched_valuesrrrtest_patch_orderdictis 2 2zPatchTest.test_patch_orderdictcCslddl}tdFtjd=tjd=tjd=tjd=tddd }|Wdn1s^0YdS) Nrz sys.modulesrzunittest.test.testmockz unittest.testrM unittest.test.testmock.support.XcSsdSrrrrrrrWsz9PatchTest.test_dotted_but_module_not_loaded..test)unittest.test.testmock.supportr rr5r6)rrMrWrrr!test_dotted_but_module_not_loaded|s  z+PatchTest.test_dotted_but_module_not_loadedc CsGddd}dd|fD]b}|j|dB|tt|Wdn1sT0YWdq1sr0YqdS)Nc@s eZdZdS)z*PatchTest.test_invalid_target..FooNrerrrrr*sr* )r)ZsubTestrGrHr )rr*rrrrtest_invalid_targets  zPatchTest.test_invalid_targetcCsLtdtdddd}|t|Wdn1s>0YdS)Nrr.)rDrgcSsdSrrrrrrrWsz@PatchTest.test_cant_set_kwargs_when_passing_a_mock..test)r r'rGrHrZrrr(test_cant_set_kwargs_when_passing_a_mocks  z2PatchTest.test_cant_set_kwargs_when_passing_a_mockN)T)qrrrrMr[r]r_rdrjrwrzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr rrrr r!r'r(r+r8r<r>rBrCrErHrIrKrPrTrUr]r_rarcrdrirkrsryrzrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrrr rrrrrFUs   + *           !        C         +!    "       rF__main__)T)*rr5 collectionsrrMZunittest.test.testmockrrrrZtest.test_importlib.utilrZ unittest.mockrrr r r r r rrrrrtr6rrkrr)rQrfrmrlr'r*rr=r>ZTestCaserFmainrrrrsD   4   Y