B
    >¶†\"½  ã               @   st   d Z ddlmZ ddlmZ ddlmZmZm	Z	 G dd„ deƒZ
G dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZdS )z&
Tests for various Pyflakes behavior.
é    )Úversion_info)Úmessages)ÚTestCaseÚskipÚskipIfc               @   s.  e Zd Zdd„ Zdd„ Zeedkdƒdd„ ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zeedkdƒd!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"eed?k d@ƒdAdB„ ƒZ#eed?k d@ƒdCdD„ ƒZ$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+eedk dSƒdTdU„ ƒZ,eedk dSƒdVdW„ ƒZ-e.dXƒdYdZ„ ƒZ/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;eed?k d@ƒdsdt„ ƒZ<duS )vÚTestc             C   s   |   dtj¡ d S )Nzdef fu(bar, bar): pass)ÚflakesÚmZDuplicateArgument)Úself© r   ú7lib/python3.7/site-packages/pyflakes/test/test_other.pyÚtest_duplicateArgs   s    zTest.test_duplicateArgsc             C   s   |   dtjtj¡ d S )NzG
        a = 1
        def f():
            a; a=1
        f()
        )r   r	   ZUndefinedLocalÚUnusedVariable)r
   r   r   r   Ú$test_localReferencedBeforeAssignment   s    z)Test.test_localReferencedBeforeAssignment)é   z;in Python 3 list comprehensions execute in a separate scopec             C   sB   |   dtj¡ |   dtj¡ |   dtj¡ |   d¡ |   d¡ dS )zb
        Test that shadowing a variable in a list comprehension raises
        a warning.
        z8
        a = 1
        [1 for a, b in [(1, 2)]]
        zQ
        class A:
            a = 1
            [1 for a, b in [(1, 2)]]
        zQ
        def f():
            a = 1
            [1 for a, b in [(1, 2)]]
        zK
        [1 for a, b in [(1, 2)]]
        [1 for a, b in [(1, 2)]]
        zY
        for a, b in [(1, 2)]:
            pass
        [1 for a, b in [(1, 2)]]
        N)r   r	   ÚRedefinedInListComp)r
   r   r   r   Útest_redefinedInListComp   s    


zTest.test_redefinedInListCompc             C   s:   |   d¡ |   d¡ |   dtj¡ |   d¡ |   d¡ dS )z_
        Test that reusing a variable in a generator does not raise
        a warning.
        z8
        a = 1
        (1 for a, b in [(1, 2)])
        zU
        class A:
            a = 1
            list(1 for a, b in [(1, 2)])
        zQ
        def f():
            a = 1
            (1 for a, b in [(1, 2)])
        zK
        (1 for a, b in [(1, 2)])
        (1 for a, b in [(1, 2)])
        zY
        for a, b in [(1, 2)]:
            pass
        (1 for a, b in [(1, 2)])
        N)r   r	   r   )r
   r   r   r   Útest_redefinedInGenerator7   s    
zTest.test_redefinedInGeneratorc             C   s:   |   d¡ |   d¡ |   dtj¡ |   d¡ |   d¡ dS )zg
        Test that reusing a variable in a set comprehension does not raise
        a warning.
        z8
        a = 1
        {1 for a, b in [(1, 2)]}
        zQ
        class A:
            a = 1
            {1 for a, b in [(1, 2)]}
        zQ
        def f():
            a = 1
            {1 for a, b in [(1, 2)]}
        zK
        {1 for a, b in [(1, 2)]}
        {1 for a, b in [(1, 2)]}
        zY
        for a, b in [(1, 2)]:
            pass
        {1 for a, b in [(1, 2)]}
        N)r   r	   r   )r
   r   r   r   Ú test_redefinedInSetComprehensionT   s    
z%Test.test_redefinedInSetComprehensionc             C   s:   |   d¡ |   d¡ |   dtj¡ |   d¡ |   d¡ dS )zh
        Test that reusing a variable in a dict comprehension does not raise
        a warning.
        z<
        a = 1
        {1: 42 for a, b in [(1, 2)]}
        zU
        class A:
            a = 1
            {1: 42 for a, b in [(1, 2)]}
        zU
        def f():
            a = 1
            {1: 42 for a, b in [(1, 2)]}
        zS
        {1: 42 for a, b in [(1, 2)]}
        {1: 42 for a, b in [(1, 2)]}
        z]
        for a, b in [(1, 2)]:
            pass
        {1: 42 for a, b in [(1, 2)]}
        N)r   r	   r   )r
   r   r   r   Ú!test_redefinedInDictComprehensionq   s    
z&Test.test_redefinedInDictComprehensionc             C   s   |   dtj¡ dS )zf
        Test that shadowing a function definition with another one raises a
        warning.
        z5
        def a(): pass
        def a(): pass
        N)r   r	   ÚRedefinedWhileUnused)r
   r   r   r   Útest_redefinedFunctionŽ   s    zTest.test_redefinedFunctionc             C   s   |   d¡ dS )zq
        Test that shadowing a function definition named with underscore doesn't
        raise anything.
        z5
        def _(): pass
        def _(): pass
        N)r   )r
   r   r   r   Ú test_redefinedUnderscoreFunction˜   s    z%Test.test_redefinedUnderscoreFunctionc             C   s   |   dtj¡ dS )zQ
        Test that shadowing an underscore importation raises a warning.
        z;
        from .i18n import _
        def _(): pass
        N)r   r	   r   )r
   r   r   r   Ú#test_redefinedUnderscoreImportation¢   s    z(Test.test_redefinedUnderscoreImportationc             C   s   |   dtj¡ dS )zw
        Test that shadowing a function definition in a class suite with another
        one raises a warning.
        zN
        class A:
            def a(): pass
            def a(): pass
        N)r   r	   r   )r
   r   r   r   Útest_redefinedClassFunction«   s    z Test.test_redefinedClassFunctionc             C   s   |   d¡ dS )z{
        Test that shadowing a function definition twice in an if
        and else block does not raise a warning.
        z\
        if True:
            def a(): pass
        else:
            def a(): pass
        N)r   )r
   r   r   r   Útest_redefinedIfElseFunction¶   s    z!Test.test_redefinedIfElseFunctionc             C   s   |   dtj¡ dS )zh
        Test that shadowing a function definition within an if block
        raises a warning.
        zN
        if True:
            def a(): pass
            def a(): pass
        N)r   r	   r   )r
   r   r   r   Útest_redefinedIfFunctionÂ   s    zTest.test_redefinedIfFunctionc             C   s   |   d¡ dS )z{
        Test that shadowing a function definition twice in try
        and except block does not raise a warning.
        zZ
        try:
            def a(): pass
        except:
            def a(): pass
        N)r   )r
   r   r   r   Útest_redefinedTryExceptFunctionÍ   s    z$Test.test_redefinedTryExceptFunctionc             C   s   |   dtj¡ dS )zh
        Test that shadowing a function definition within a try block
        raises a warning.
        zk
        try:
            def a(): pass
            def a(): pass
        except:
            pass
        N)r   r	   r   )r
   r   r   r   Útest_redefinedTryFunctionÙ   s    zTest.test_redefinedTryFunctionc             C   s   |   d¡ dS )z‚
        Test that shadowing a variable in a list comprehension in
        an if and else block does not raise a warning.
        zY
        if False:
            a = 1
        else:
            [a for a in '12']
        N)r   )r
   r   r   r   Útest_redefinedIfElseInListCompæ   s    z#Test.test_redefinedIfElseInListCompc             C   s   |   dtj¡ dS )z{
        Test that shadowing a variable in a list comprehension in
        an else (or if) block raises a warning.
        zj
        if False:
            pass
        else:
            a = 1
            [a for a in '12']
        N)r   r	   r   )r
   r   r   r   Útest_redefinedElseInListCompò   s    z!Test.test_redefinedElseInListCompc             C   s   |   d¡ dS )z‡
        Test that shadowing a function definition with a decorated version of
        that function does not raise a warning.
        zi
        from somewhere import somedecorator

        def a(): pass
        a = somedecorator(a)
        N)r   )r
   r   r   r   Útest_functionDecorator  s    zTest.test_functionDecoratorc             C   s   |   d¡ dS )z˜
        Test that shadowing a function definition in a class suite with a
        decorated version of that function does not raise a warning.
        zS
        class A:
            def a(): pass
            a = classmethod(a)
        N)r   )r
   r   r   r   Útest_classFunctionDecorator  s    z Test.test_classFunctionDecoratorc             C   s   |   d¡ d S )Nzî
        class A:
            @property
            def t(self):
                pass
            @t.setter
            def t(self, value):
                pass
            @t.deleter
            def t(self):
                pass
        )r   )r
   r   r   r   Útest_modernProperty  s    zTest.test_modernPropertyc             C   s   |   d¡ dS )zDon't die on unary +.z+1N)r   )r
   r   r   r   Útest_unaryPlus&  s    zTest.test_unaryPlusc             C   s   |   dtj¡ dS )zn
        If a name in the base list of a class definition is undefined, a
        warning is emitted.
        z2
        class foo(foo):
            pass
        N)r   r	   ÚUndefinedName)r
   r   r   r   Útest_undefinedBaseClass*  s    zTest.test_undefinedBaseClassc             C   s   |   dtj¡ dS )z“
        If a class name is used in the body of that class's definition and
        the name is not already defined, a warning is emitted.
        z,
        class foo:
            foo
        N)r   r	   r%   )r
   r   r   r   Ú"test_classNameUndefinedInClassBody4  s    z'Test.test_classNameUndefinedInClassBodyc             C   s   |   d¡ dS )z®
        If a class name is used in the body of that class's definition and
        the name was previously defined in some other way, no warning is
        emitted.
        z?
        foo = None
        class foo:
            foo
        N)r   )r
   r   r   r   Útest_classNameDefinedPreviously>  s    z$Test.test_classNameDefinedPreviouslyc             C   s   |   dtj¡ dS )zW
        If a class is defined twice in the same module, a warning is emitted.
        zQ
        class Foo:
            pass
        class Foo:
            pass
        N)r   r	   r   )r
   r   r   r   Útest_classRedefinitionJ  s    zTest.test_classRedefinitionc             C   s   |   dtj¡ dS )zN
        If a function is redefined as a class, a warning is emitted.
        zQ
        def Foo():
            pass
        class Foo:
            pass
        N)r   r	   r   )r
   r   r   r   Útest_functionRedefinedAsClassU  s    z"Test.test_functionRedefinedAsClassc             C   s   |   dtj¡ dS )zN
        If a class is redefined as a function, a warning is emitted.
        zQ
        class Foo:
            pass
        def Foo():
            pass
        N)r   r	   r   )r
   r   r   r   Útest_classRedefinedAsFunction`  s    z"Test.test_classRedefinedAsFunctionc             C   s   |   dtj¡ dS )zK
        If a return is used inside a class, a warning is emitted.
        z7
        class Foo(object):
            return
        N)r   r	   ÚReturnOutsideFunction)r
   r   r   r   Útest_classWithReturnk  s    zTest.test_classWithReturnc             C   s   |   dtj¡ dS )zP
        If a return is used at the module level, a warning is emitted.
        z
        return
        N)r   r	   r,   )r
   r   r   r   Útest_moduleWithReturnt  s    zTest.test_moduleWithReturnc             C   s   |   dtj¡ dS )zJ
        If a yield is used inside a class, a warning is emitted.
        z6
        class Foo(object):
            yield
        N)r   r	   ÚYieldOutsideFunction)r
   r   r   r   Útest_classWithYield|  s    zTest.test_classWithYieldc             C   s   |   dtj¡ dS )zO
        If a yield is used at the module level, a warning is emitted.
        z
        yield
        N)r   r	   r/   )r
   r   r   r   Útest_moduleWithYield…  s    zTest.test_moduleWithYield)r   r   zPython >= 3.3 onlyc             C   s   |   dtj¡ dS )zO
        If a yield from is used inside a class, a warning is emitted.
        zE
        class Foo(object):
            yield from range(10)
        N)r   r	   r/   )r
   r   r   r   Útest_classWithYieldFrom  s    zTest.test_classWithYieldFromc             C   s   |   dtj¡ dS )zT
        If a yield from is used at the module level, a warning is emitted.
        z&
        yield from range(10)
        N)r   r	   r/   )r
   r   r   r   Útest_moduleWithYieldFrom—  s    zTest.test_moduleWithYieldFromc             C   sX   |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ d S )Nz
        continue
        z/
        def f():
            continue
        zQ
        while True:
            pass
        else:
            continue
        z
        while True:
            pass
        else:
            if 1:
                if 2:
                    continue
        zK
        while True:
            def f():
                continue
        zK
        while True:
            class A:
                continue
        )r   r	   ÚContinueOutsideLoop)r
   r   r   r   Útest_continueOutsideLoop   s    




zTest.test_continueOutsideLoopc             C   s@   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )Nz2
        while True:
            continue
        z:
        for i in range(10):
            continue
        zH
        while True:
            if 1:
                continue
        zP
        for i in range(10):
            if 1:
                continue
        z”
        while True:
            while True:
                pass
            else:
                continue
        else:
            pass
        z‘
        while True:
            try:
                pass
            finally:
                while True:
                    continue
        )r   )r
   r   r   r   Útest_continueInsideLoopÆ  s    zTest.test_continueInsideLoopc             C   s.   |   dtj¡ |   dtj¡ |   dtj¡ d S )Nzq
        while True:
            try:
                pass
            finally:
                continue
        z©
        while True:
            try:
                pass
            finally:
                if 1:
                    if 2:
                        continue
        zM
        try:
            pass
        finally:
            continue
        )r   r	   ÚContinueInFinally)r
   r   r   r   Útest_continueInFinallyð  s    

zTest.test_continueInFinallyc             C   sf   |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtj¡ d S )Nz
        break
        z,
        def f():
            break
        zN
        while True:
            pass
        else:
            break
        z~
        while True:
            pass
        else:
            if 1:
                if 2:
                    break
        zH
        while True:
            def f():
                break
        zH
        while True:
            class A:
                break
        zJ
        try:
            pass
        finally:
            break
        )r   r	   ÚBreakOutsideLoop)r
   r   r   r   Útest_breakOutsideLoop  s    





zTest.test_breakOutsideLoopc             C   sT   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ d S )	Nz/
        while True:
            break
        z7
        for i in range(10):
            break
        zE
        while True:
            if 1:
                break
        zM
        for i in range(10):
            if 1:
                break
        z‘
        while True:
            while True:
                pass
            else:
                break
        else:
            pass
        zŽ
        while True:
            try:
                pass
            finally:
                while True:
                    break
        zn
        while True:
            try:
                pass
            finally:
                break
        z¦
        while True:
            try:
                pass
            finally:
                if 1:
                    if 2:
                        break
        )r   )r
   r   r   r   Útest_breakInsideLoop9  s     zTest.test_breakInsideLoopc             C   s@   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ dS )a#  
        A default except block should be last.

        YES:

        try:
            ...
        except Exception:
            ...
        except:
            ...

        NO:

        try:
            ...
        except:
            ...
        except Exception:
            ...
        zS
        try:
            pass
        except ValueError:
            pass
        zt
        try:
            pass
        except ValueError:
            pass
        except:
            pass
        zH
        try:
            pass
        except:
            pass
        zr
        try:
            pass
        except ValueError:
            pass
        else:
            pass
        zg
        try:
            pass
        except:
            pass
        else:
            pass
        z“
        try:
            pass
        except ValueError:
            pass
        except:
            pass
        else:
            pass
        N)r   )r
   r   r   r   Útest_defaultExceptLastu  s    	zTest.test_defaultExceptLastc             C   sô   |   dtj¡ |   dtj¡ |   dtj¡ |   dtjtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtjtj¡ |   d	tj¡ |   d
tj¡ |   dtj¡ |   dtjtj¡ |   dtj¡ |   dtj¡ |   dtj¡ |   dtjtj¡ d S )Nzt
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        zi
        try:
            pass
        except:
            pass
        except:
            pass
        z•
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        zÁ
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        except ValueError:
            pass
        z“
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        else:
            pass
        zˆ
        try:
            pass
        except:
            pass
        except:
            pass
        else:
            pass
        z´
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        else:
            pass
        zà
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        except ValueError:
            pass
        else:
            pass
        z–
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        finally:
            pass
        z‹
        try:
            pass
        except:
            pass
        except:
            pass
        finally:
            pass
        z·
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        finally:
            pass
        zã
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        except ValueError:
            pass
        finally:
            pass
        zµ
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        else:
            pass
        finally:
            pass
        zª
        try:
            pass
        except:
            pass
        except:
            pass
        else:
            pass
        finally:
            pass
        zÖ
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        else:
            pass
        finally:
            pass
        a  
        try:
            pass
        except:
            pass
        except ValueError:
            pass
        except:
            pass
        except ValueError:
            pass
        else:
            pass
        finally:
            pass
        )r   r	   ZDefaultExceptNotLast)r
   r   r   r   Útest_defaultExceptNotLast¿  s@    

	
	
	

	
	




zTest.test_defaultExceptNotLastzPython 3 onlyc             C   sØ   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ |   d	¡ d
 dd„ tdƒD ƒ¡d }|   |¡ dd
 dd„ tdƒD ƒ¡ d }|   |¡ dd
 dd„ tdƒD ƒ¡ d }|   |¡ dS )z6
        Python 3 extended iterable unpacking
        z#
        a, *b = range(10)
        z#
        *a, b = range(10)
        z&
        a, *b, c = range(10)
        z%
        (a, *b) = range(10)
        z%
        (*a, b) = range(10)
        z(
        (a, *b, c) = range(10)
        z%
        [a, *b] = range(10)
        z%
        [*a, b] = range(10)
        z(
        [a, *b, c] = range(10)
        z, c             s   s   | ]}d | V  qdS )za%dNr   )Ú.0Úir   r   r   ú	<genexpr>²  s    z5Test.test_starredAssignmentNoError.<locals>.<genexpr>é€   z, *rest = range(1<<8)ú(c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   ¶  s    z, *rest) = range(1<<8)ú[c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   º  s    z, *rest] = range(1<<8)N)r   ÚjoinÚrange)r
   Úsr   r   r   Útest_starredAssignmentNoErrorˆ  s6    

z"Test.test_starredAssignmentNoErrorc             C   sŽ  d  dd„ tdƒD ƒ¡d }|  |tj¡ dd  dd„ tdƒD ƒ¡ d }|  |tj¡ d	d  d
d„ tdƒD ƒ¡ d }|  |tj¡ d  dd„ tdƒD ƒ¡d }|  |tj¡ dd  dd„ tdƒD ƒ¡ d }|  |tj¡ d	d  dd„ tdƒD ƒ¡ d }|  |tj¡ |  dtj¡ |  dtj¡ |  dtj¡ |  dtj¡ |  dtj¡ |  dtj¡ |  dtj¡ |  dtj¡ |  dtj¡ dS )zp
        SyntaxErrors (not encoded in the ast) surrounding Python 3 extended
        iterable unpacking
        z, c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   Å  s    z4Test.test_starredAssignmentErrors.<locals>.<genexpr>é   z, *rest = range(1<<8 + 1)rB   c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   É  s    z, *rest) = range(1<<8 + 1)rC   c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   Í  s    z, *rest] = range(1<<8 + 1)c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   Ñ  s    i   z, *rest = range(1<<8 + 2)c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   Õ  s    z, *rest) = range(1<<8 + 2)c             s   s   | ]}d | V  qdS )za%dNr   )r>   r?   r   r   r   r@   Ù  s    z, *rest] = range(1<<8 + 2)z'
        a, *b, *c = range(10)
        z*
        a, *b, c, *d = range(10)
        z(
        *a, *b, *c = range(10)
        z)
        (a, *b, *c) = range(10)
        z,
        (a, *b, c, *d) = range(10)
        z*
        (*a, *b, *c) = range(10)
        z)
        [a, *b, *c] = range(10)
        z,
        [a, *b, c, *d] = range(10)
        z*
        [*a, *b, *c] = range(10)
        N)rD   rE   r   r	   Z%TooManyExpressionsInStarredAssignmentZTwoStarredExpressions)r
   rF   r   r   r   Útest_starredAssignmentErrors¾  sH    







z!Test.test_starredAssignmentErrorsz<todo: Too hard to make this warn but other cases stay silentc             C   s   |   dtj¡ dS )zd
        If a variable is re-assigned to without being used, no warning is
        emitted.
        z'
        x = 10
        x = 20
        N)r   r	   r   )r
   r   r   r   Útest_doubleAssignment  s    zTest.test_doubleAssignmentc             C   s   |   d¡ dS )zc
        If a variable is re-assigned within a conditional, no warning is
        emitted.
        z<
        x = 10
        if True:
            x = 20
        N)r   )r
   r   r   r   Ú"test_doubleAssignmentConditionally  s    z'Test.test_doubleAssignmentConditionallyc             C   s   |   d¡ dS )zb
        If a variable is re-assigned to after being used, no warning is
        emitted.
        z9
        x = 10
        y = x * 2
        x = 20
        N)r   )r
   r   r   r   Útest_doubleAssignmentWithUse  s    z!Test.test_doubleAssignmentWithUsec             C   s   |   d¡ dS )z
        If a defined name is used on either side of any of the six comparison
        operators, no warning is emitted.
        z
        x = 10
        y = 20
        x < y
        x <= y
        x == y
        x != y
        x >= y
        x > y
        N)r   )r
   r   r   r   Útest_comparison'  s    	zTest.test_comparisonc             C   s   |   d¡ dS )zn
        If a defined name is used on either side of an identity test, no
        warning is emitted.
        zI
        x = 10
        y = 20
        x is y
        x is not y
        N)r   )r
   r   r   r   Útest_identity7  s    zTest.test_identityc             C   s   |   d¡ dS )zp
        If a defined name is used on either side of a containment test, no
        warning is emitted.
        zI
        x = 10
        y = 20
        x in y
        x not in y
        N)r   )r
   r   r   r   Útest_containmentC  s    zTest.test_containmentc             C   s   |   d¡ |   d¡ dS )z>
        break and continue statements are supported.
        z4
        for x in [1, 2]:
            break
        z7
        for x in [1, 2]:
            continue
        N)r   )r
   r   r   r   Útest_loopControlO  s    zTest.test_loopControlc             C   s   |   d¡ dS )z3
        Ellipsis in a slice is supported.
        z
        [1, 2][...]
        N)r   )r
   r   r   r   Útest_ellipsis\  s    zTest.test_ellipsisc             C   s   |   d¡ dS )z0
        Extended slices are supported.
        z+
        x = 3
        [1, 2][x,:]
        N)r   )r
   r   r   r   Útest_extendedSliced  s    zTest.test_extendedSlicec             C   s   |   d¡ dS )zh
        Augmented assignment of a variable is supported.
        We don't care about var refs.
        z*
        foo = 0
        foo += 1
        N)r   )r
   r   r   r   Útest_varAugmentedAssignmentm  s    z Test.test_varAugmentedAssignmentc             C   s   |   d¡ dS )zi
        Augmented assignment of attributes is supported.
        We don't care about attr refs.
        z7
        foo = None
        foo.bar += foo.baz
        N)r   )r
   r   r   r   Útest_attrAugmentedAssignmentw  s    z!Test.test_attrAugmentedAssignmentc             C   s   |   d¡ dS )zP
        A 'global' can be declared in one scope and reused in another.
        zV
        def f(): global foo
        def g(): foo = 'anything'; foo.is_used()
        N)r   )r
   r   r   r   Ú#test_globalDeclaredInDifferentScope  s    z(Test.test_globalDeclaredInDifferentScopec             C   s,   |   d¡ |   d¡ |   d¡ |   d¡ dS )z;
        Test to traverse ARG and ARGUMENT handler
        z1
        def foo(a, b):
            pass
        z6
        def foo(a, b, c=0):
            pass
        z=
        def foo(a, b, c=0, *args):
            pass
        zG
        def foo(a, b, c=0, *args, **kwargs):
            pass
        N)r   )r
   r   r   r   Útest_function_argumentsŠ  s    zTest.test_function_argumentsc             C   s   |   d¡ d S )NzL
        def foo(a, b, c=0, *args, d=0, **kwargs):
            pass
        )r   )r
   r   r   r   Útest_function_arguments_python3¢  s    z$Test.test_function_arguments_python3N)=Ú__name__Ú
__module__Ú__qualname__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.   r0   r1   r2   r3   r5   r6   r8   r:   r;   r<   r=   rG   rI   r   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   r   r   r   r   r      st   

	

		
	&*-<J J6H	

	r   c               @   sØ  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zed
ƒdd„ ƒZ	dd„ Z
dd„ Zeedk dƒdd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'dGdH„ Z(dIdJ„ Z)dKdL„ Z*dMdN„ Z+eedk dOƒdPdQ„ ƒZ,dRdS„ Z-dTdU„ Z.dVdW„ Z/dXdY„ Z0dZd[„ Z1d\d]„ Z2d^d_„ Z3d`da„ Z4dbdc„ Z5eeddk deƒdfdg„ ƒZ6eedhk diƒdjdk„ ƒZ7dlS )mÚTestUnusedAssignmentz5
    Tests for warning about unused assignments.
    c             C   s   |   dtj¡ dS )zc
        Warn when a variable in a function is assigned a value that's never
        used.
        z,
        def a():
            b = 1
        N)r   r	   r   )r
   r   r   r   Útest_unusedVariable¯  s    z(TestUnusedAssignment.test_unusedVariablec             C   s   |   d¡ dS )zh
        Don't warn when the magic "_" (underscore) variable is unused.
        See issue #202.
        zC
        def a(unused_param):
            _ = unused_param
        N)r   )r
   r   r   r   Útest_unusedUnderscoreVariable¹  s    z2TestUnusedAssignment.test_unusedUnderscoreVariablec             C   s   |   d¡ dS )zO
        Using locals() it is perfectly valid to have unused variables
        zH
        def a():
            b = 1
            return locals()
        N)r   )r
   r   r   r   Útest_unusedVariableAsLocalsÃ  s    z0TestUnusedAssignment.test_unusedVariableAsLocalsc             C   s   |   dtj¡ dS )zA
        Using locals() in wrong scope should not matter
        zq
        def a():
            locals()
            def a():
                b = 1
                return
        N)r   r	   r   )r
   r   r   r   Útest_unusedVariableNoLocalsÍ  s    z0TestUnusedAssignment.test_unusedVariableNoLocalszAtodo: Difficult because it doesn't apply in the context of a loopc             C   s   |   dtj¡ dS )zV
        Shadowing a used variable can still raise an UnusedVariable warning.
        zR
        def a():
            b = 1
            b.foo()
            b = 2
        N)r   r	   r   )r
   r   r   r   Útest_unusedReassignedVariableÙ  s    z2TestUnusedAssignment.test_unusedReassignedVariablec             C   s   |   d¡ dS )zt
        Shadowing a used variable cannot raise an UnusedVariable warning in the
        context of a loop.
        z^
        def a():
            b = True
            while b:
                b = False
        N)r   )r
   r   r   r   Útest_variableUsedInLoopå  s    z,TestUnusedAssignment.test_variableUsedInLoopc             C   s   |   d¡ dS )z—
        Assigning to a global and then not using that global is perfectly
        acceptable. Do not mistake it for an unused local variable.
        zO
        b = 0
        def a():
            global b
            b = 1
        N)r   )r
   r   r   r   Útest_assignToGlobalñ  s    z(TestUnusedAssignment.test_assignToGlobal)r   znew in Python 3c             C   s   |   d¡ dS )zš
        Assigning to a nonlocal and then not using that binding is perfectly
        acceptable. Do not mistake it for an unused local variable.
        zW
        b = b'0'
        def a():
            nonlocal b
            b = b'1'
        N)r   )r
   r   r   r   Útest_assignToNonlocalý  s    z*TestUnusedAssignment.test_assignToNonlocalc             C   s   |   d¡ dS )zº
        Assigning to a member of another object and then not using that member
        variable is perfectly acceptable. Do not mistake it for an unused
        local variable.
        zR
        class b:
            pass
        def a():
            b.foo = 1
        N)r   )r
   r   r   r   Útest_assignToMember
  s    z(TestUnusedAssignment.test_assignToMemberc             C   s   |   d¡ dS )zW
        Don't warn when a variable in a for loop is assigned to but not used.
        zO
        def f():
            for i in range(10):
                pass
        N)r   )r
   r   r   r   Útest_assignInForLoop  s    z)TestUnusedAssignment.test_assignInForLoopc             C   s   |   d¡ dS )zi
        Don't warn when a variable in a list comprehension is
        assigned to but not used.
        z@
        def f():
            [None for i in range(10)]
        N)r   )r
   r   r   r   Útest_assignInListComprehension#  s    z3TestUnusedAssignment.test_assignInListComprehensionc             C   s   |   d¡ dS )zk
        Don't warn when a variable in a generator expression is
        assigned to but not used.
        z@
        def f():
            (None for i in range(10))
        N)r   )r
   r   r   r   Útest_generatorExpression-  s    z-TestUnusedAssignment.test_generatorExpressionc             C   s   |   d¡ dS )zW
        Don't warn when a variable assignment occurs lexically after its use.
        z 
        def f():
            x = None
            for i in range(10):
                if i > 2:
                    return x
                x = i * 2
        N)r   )r
   r   r   r   Útest_assignmentInsideLoop7  s    z.TestUnusedAssignment.test_assignmentInsideLoopc             C   sF   |   d¡ |   dtjtj¡ |   d¡ |   dtj¡ |   dtj¡ dS )zñ
        Don't warn when a variable included in tuple unpacking is unused. It's
        very common for variables in a tuple unpacking assignment to be unused
        in good Python code, so warning will only create false positives.
        z6
        def f(tup):
            (x, y) = tup
        z4
        def f():
            (x, y) = 1, 2
        zq
        def f():
            (x, y) = coords = 1, 2
            if x > 1:
                print(coords)
        z=
        def f():
            (x, y) = coords = 1, 2
        z=
        def f():
            coords = (x, y) = 1, 2
        N)r   r	   r   )r
   r   r   r   Útest_tupleUnpackingD  s    
z(TestUnusedAssignment.test_tupleUnpackingc             C   s    |   d¡ |   dtjtj¡ dS )zR
        Don't warn when a variable included in list unpacking is unused.
        z6
        def f(tup):
            [x, y] = tup
        z6
        def f():
            [x, y] = [1, 2]
        N)r   r	   r   )r
   r   r   r   Útest_listUnpackinga  s    z'TestUnusedAssignment.test_listUnpackingc             C   s   |   d¡ dS )zN
        Don't warn when the assignment is used in an inner function.
        z~
        def barMaker():
            foo = 5
            def bar():
                return foo
            return bar
        N)r   )r
   r   r   r   Útest_closedOvern  s    z$TestUnusedAssignment.test_closedOverc             C   s   |   d¡ dS )z’
        Don't warn when the assignment is used in an inner function, even if
        that inner function itself is in an inner function.
        z
        def barMaker():
            foo = 5
            def bar():
                def baz():
                    return foo
            return bar
        N)r   )r
   r   r   r   Útest_doubleClosedOverz  s    z*TestUnusedAssignment.test_doubleClosedOverc             C   s   |   d¡ dS )z}
        Do not warn about unused local variable __tracebackhide__, which is
        a special variable for py.test.
        zL
            def helper():
                __tracebackhide__ = True
        N)r   )r
   r   r   r   Ú!test_tracebackhideSpecialVariableˆ  s    z6TestUnusedAssignment.test_tracebackhideSpecialVariablec             C   s*   |   d¡ |   dtj¡ |   dtj¡ dS )z9
        Test C{foo if bar else baz} statements.
        za = 'moo' if True else 'oink'za = foo if True else 'oink'za = 'moo' if True else barN)r   r	   r%   )r
   r   r   r   Ú
test_ifexp’  s    
zTestUnusedAssignment.test_ifexpc             C   s   |   d¡ dS )zƒ
        No warnings are emitted for using inside or after a nameless C{with}
        statement a name defined beforehand.
        z€
        from __future__ import with_statement
        bar = None
        with open("foo"):
            bar
        bar
        N)r   )r
   r   r   r   Útest_withStatementNoNamesš  s    z.TestUnusedAssignment.test_withStatementNoNamesc             C   s   |   d¡ dS )z
        No warnings are emitted for using a name defined by a C{with} statement
        within the suite or afterwards.
        zt
        from __future__ import with_statement
        with open('foo') as bar:
            bar
        bar
        N)r   )r
   r   r   r   Útest_withStatementSingleName§  s    z1TestUnusedAssignment.test_withStatementSingleNamec             C   s   |   d¡ dS )zn
        No warnings are emitted for using an attribute as the target of a
        C{with} statement.
        z€
        from __future__ import with_statement
        import foo
        with open('foo') as foo.bar:
            pass
        N)r   )r
   r   r   r   Útest_withStatementAttributeName³  s    z4TestUnusedAssignment.test_withStatementAttributeNamec             C   s   |   d¡ dS )zm
        No warnings are emitted for using a subscript as the target of a
        C{with} statement.
        z
        from __future__ import with_statement
        import foo
        with open('foo') as foo[0]:
            pass
        N)r   )r
   r   r   r   Útest_withStatementSubscript¿  s    z0TestUnusedAssignment.test_withStatementSubscriptc             C   s   |   dtj¡ dS )z‰
        An undefined name warning is emitted if the subscript used as the
        target of a C{with} statement is not defined.
        z
        from __future__ import with_statement
        import foo
        with open('foo') as foo[bar]:
            pass
        N)r   r	   r%   )r
   r   r   r   Ú$test_withStatementSubscriptUndefinedË  s    z9TestUnusedAssignment.test_withStatementSubscriptUndefinedc             C   s   |   d¡ dS )z”
        No warnings are emitted for using any of the tuple of names defined by
        a C{with} statement within the suite or afterwards.
        z…
        from __future__ import with_statement
        with open('foo') as (bar, baz):
            bar, baz
        bar, baz
        N)r   )r
   r   r   r   Útest_withStatementTupleNames×  s    z1TestUnusedAssignment.test_withStatementTupleNamesc             C   s   |   d¡ dS )z“
        No warnings are emitted for using any of the list of names defined by a
        C{with} statement within the suite or afterwards.
        z…
        from __future__ import with_statement
        with open('foo') as [bar, baz]:
            bar, baz
        bar, baz
        N)r   )r
   r   r   r   Útest_withStatementListNamesã  s    z0TestUnusedAssignment.test_withStatementListNamesc             C   s   |   d¡ dS )aq  
        If the target of a C{with} statement uses any or all of the valid forms
        for that part of the grammar (See
        U{http://docs.python.org/reference/compound_stmts.html#the-with-statement}),
        the names involved are checked both for definedness and any bindings
        created are respected in the suite of the statement and afterwards.
        z×
        from __future__ import with_statement
        c = d = e = g = h = i = None
        with open('foo') as [(a, b), c[d], e.f, g[h:i]]:
            a, b, c, d, e, g, h, i
        a, b, c, d, e, g, h, i
        N)r   )r
   r   r   r   Ú#test_withStatementComplicatedTargetï  s    z8TestUnusedAssignment.test_withStatementComplicatedTargetc             C   s   |   dtj¡ dS )z•
        An undefined name warning is emitted if the name first defined by a
        C{with} statement is used before the C{with} statement.
        zu
        from __future__ import with_statement
        bar
        with open('foo') as bar:
            pass
        N)r   r	   r%   )r
   r   r   r   Ú%test_withStatementSingleNameUndefinedÿ  s    z:TestUnusedAssignment.test_withStatementSingleNameUndefinedc             C   s   |   dtj¡ dS )z¹
        An undefined name warning is emitted if a name first defined by the
        tuple-unpacking form of the C{with} statement is used before the
        C{with} statement.
        z|
        from __future__ import with_statement
        baz
        with open('foo') as (bar, baz):
            pass
        N)r   r	   r%   )r
   r   r   r   Ú%test_withStatementTupleNamesUndefined  s    z:TestUnusedAssignment.test_withStatementTupleNamesUndefinedc             C   s   |   dtj¡ dS )z‘
        A redefined name warning is emitted if a name bound by an import is
        rebound by the name defined by a C{with} statement.
        z|
        from __future__ import with_statement
        import bar
        with open('foo') as bar:
            pass
        N)r   r	   r   )r
   r   r   r   Ú%test_withStatementSingleNameRedefined  s    z:TestUnusedAssignment.test_withStatementSingleNameRedefinedc             C   s   |   dtj¡ dS )z½
        A redefined name warning is emitted if a name bound by an import is
        rebound by one of the names defined by the tuple-unpacking form of a
        C{with} statement.
        zƒ
        from __future__ import with_statement
        import bar
        with open('foo') as (bar, baz):
            pass
        N)r   r	   r   )r
   r   r   r   Ú%test_withStatementTupleNamesRedefined$  s    z:TestUnusedAssignment.test_withStatementTupleNamesRedefinedc             C   s   |   dtj¡ dS )z’
        An undefined name warning is emitted if a name is used inside the
        body of a C{with} statement without first being bound.
        zh
        from __future__ import with_statement
        with open('foo') as bar:
            baz
        N)r   r	   r%   )r
   r   r   r   Ú!test_withStatementUndefinedInside1  s    z6TestUnusedAssignment.test_withStatementUndefinedInsidec             C   s   |   d¡ dS )z|
        A name defined in the body of a C{with} statement can be used after
        the body ends without warning.
        zy
        from __future__ import with_statement
        with open('foo') as bar:
            baz = 10
        baz
        N)r   )r
   r   r   r   Ú#test_withStatementNameDefinedInBody<  s    z8TestUnusedAssignment.test_withStatementNameDefinedInBodyc             C   s    |   dtj¡ |   dtj¡ dS )z‡
        An undefined name warning is emitted if a name in the I{test}
        expression of a C{with} statement is undefined.
        za
        from __future__ import with_statement
        with bar as baz:
            pass
        za
        from __future__ import with_statement
        with bar as bar:
            pass
        N)r   r	   r%   )r
   r   r   r   Ú'test_withStatementUndefinedInExpressionH  s    
z<TestUnusedAssignment.test_withStatementUndefinedInExpressionc             C   s   |   d¡ dS )z;
        Dict comprehensions are properly handled.
        z/
        a = {1: x for x in range(10)}
        N)r   )r
   r   r   r   Útest_dictComprehensionY  s    z+TestUnusedAssignment.test_dictComprehensionc             C   s   |   d¡ dS )z:
        Set comprehensions are properly handled.
        zB
        a = {1, 2, 3}
        b = {x for x in range(10)}
        N)r   )r
   r   r   r   Útest_setComprehensionAndLiterala  s    z4TestUnusedAssignment.test_setComprehensionAndLiteralc             C   s   |   d¡ |   d¡ d S )Nz<
        try: pass
        except Exception as e: e
        zc
        def download_review():
            try: pass
            except Exception as e: e
        )r   )r
   r   r   r   Útest_exceptionUsedInExceptj  s    z/TestUnusedAssignment.test_exceptionUsedInExceptzBIn Python 2 exception names stay bound after the exception handlerc             C   s   |   dtj¡ d S )Nz?
        try: pass
        except Exception as e: pass
        )r   r	   r   )r
   r   r   r   Útest_exceptionUnusedInExceptv  s    z1TestUnusedAssignment.test_exceptionUnusedInExceptc             C   s   |   dtj¡ d S )Nzf
        def download_review():
            try: pass
            except Exception as e: pass
        )r   r	   r   )r
   r   r   r   Ú&test_exceptionUnusedInExceptInFunction~  s    z;TestUnusedAssignment.test_exceptionUnusedInExceptInFunctionc             C   s   |   d¡ dS )zº
        Don't issue false warning when an unnamed exception is used.
        Previously, there would be a false warning, but only when the
        try..except was in a function
        zw
        import tokenize
        def foo():
            try: pass
            except tokenize.TokenError: pass
        N)r   )r
   r   r   r   Ú test_exceptWithoutNameInFunction…  s    z5TestUnusedAssignment.test_exceptWithoutNameInFunctionc             C   s   |   d¡ dS )z‡
        Don't issue false warning when an unnamed exception is used.
        This example catches a tuple of exception types.
        z‹
        import tokenize
        def foo():
            try: pass
            except (tokenize.TokenError, IndentationError): pass
        N)r   )r
   r   r   r   Ú%test_exceptWithoutNameInFunctionTuple’  s    z:TestUnusedAssignment.test_exceptWithoutNameInFunctionTuplec             C   s   |   d¡ dS )zt
        Consider a function that is called on the right part of an
        augassign operation to be used.
        zJ
        from foo import bar
        baz = 0
        baz += bar()
        N)r   )r
   r   r   r   Ú,test_augmentedAssignmentImportedFunctionCallž  s    zATestUnusedAssignment.test_augmentedAssignmentImportedFunctionCallc             C   s   |   d¡ dS )z,An assert without a message is not an error.z(
        a = 1
        assert a
        N)r   )r
   r   r   r   Útest_assert_without_message©  s    z0TestUnusedAssignment.test_assert_without_messagec             C   s   |   d¡ dS )z)An assert with a message is not an error.z-
        a = 1
        assert a, 'x'
        N)r   )r
   r   r   r   Útest_assert_with_message°  s    z-TestUnusedAssignment.test_assert_with_messagec             C   s   |   dtjtj¡ dS )z.An assert of a non-empty tuple is always True.z>
        assert (False, 'x')
        assert (False, )
        N)r   r	   ZAssertTuple)r
   r   r   r   Útest_assert_tuple·  s    z&TestUnusedAssignment.test_assert_tuplec             C   s   |   d¡ dS )z,An assert of an empty tuple is always False.z
        assert ()
        N)r   )r
   r   r   r   Útest_assert_tuple_empty¾  s    z,TestUnusedAssignment.test_assert_tuple_emptyc             C   s   |   d¡ dS )z,An assert of a static value is not an error.z.
        assert True
        assert 1
        N)r   )r
   r   r   r   Útest_assert_staticÄ  s    z'TestUnusedAssignment.test_assert_static)r   r   znew in Python 3.3c             C   s   |   dtj¡ dS )z.
        Test C{yield from} statement
        z9
        def bar():
            yield from foo()
        N)r   r	   r%   )r
   r   r   r   Útest_yieldFromUndefinedË  s    z,TestUnusedAssignment.test_yieldFromUndefined)r   é   znew in Python 3.6c             C   s   |   d¡ dS )z.Test PEP 498 f-strings are treated as a usage.z3
        baz = 0
        print(f'{4*baz}')
        N)r   )r
   r   r   r   Útest_f_stringÕ  s    z"TestUnusedAssignment.test_f_stringN)8rX   rY   rZ   Ú__doc__r\   r]   r^   r_   r   r`   ra   rb   r   r   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r€   r   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   r   r   r   r   r   r[   ª  sf   






	
r[   c               @   s  e Zd Zeedk dƒdd„ ƒZeedk dƒdd„ ƒZeedk dƒdd„ ƒZeedk dƒd	d
„ ƒZeedk dƒdd„ ƒZ	eedk dƒdd„ ƒZ
eedk dƒdd„ ƒZeedk dƒdd„ ƒZeedk dƒdd„ ƒZeedk dƒdd„ ƒZeedk dƒdd„ ƒZeedk dƒdd„ ƒZdd„ ZdS ) ÚTestAsyncStatements)r   é   znew in Python 3.5c             C   s   |   d¡ d S )Nz8
        async def bar():
            return 42
        )r   )r
   r   r   r   Útest_asyncDefà  s    z!TestAsyncStatements.test_asyncDefc             C   s   |   d¡ d S )NzS
        async def read_data(db):
            await db.fetch('SELECT ...')
        )r   )r
   r   r   r   Útest_asyncDefAwaitç  s    z&TestAsyncStatements.test_asyncDefAwaitc             C   s   |   dtj¡ d S )Nz;
        async def bar():
            return foo()
        )r   r	   r%   )r
   r   r   r   Útest_asyncDefUndefinedî  s    z*TestAsyncStatements.test_asyncDefUndefinedc             C   s   |   d¡ d S )Nz©
        async def read_data(db):
            output = []
            async for row in db.cursor():
                output.append(row)
            return output
        )r   )r
   r   r   r   Útest_asyncForõ  s    z!TestAsyncStatements.test_asyncForc             C   s   |   d¡ d S )NzY
        async def coro(it):
            async for _ in it:
                pass
        )r   )r
   r   r   r   Útest_asyncForUnderscoreLoopVarÿ  s    z2TestAsyncStatements.test_asyncForUnderscoreLoopVarc             C   s   |   d¡ |   d¡ d S )Nzë
        async def read_data(db):
            output = []
            async for row in db.cursor():
                if row[0] == 'skip':
                    continue
                output.append(row)
            return output
        zè
        async def read_data(db):
            output = []
            async for row in db.cursor():
                if row[0] == 'stop':
                    break
                output.append(row)
            return output
        )r   )r
   r   r   r   Útest_loopControlInAsyncFor  s    z.TestAsyncStatements.test_loopControlInAsyncForc             C   s    |   dtj¡ |   dtj¡ d S )NzÔ
        async def read_data(db):
            output = []
            async for row in db.cursor():
                output.append(row)
            else:
                continue
            return output
        zÑ
        async def read_data(db):
            output = []
            async for row in db.cursor():
                output.append(row)
            else:
                break
            return output
        )r   r	   r4   r9   )r
   r   r   r   Útest_loopControlInAsyncForElse  s    
z2TestAsyncStatements.test_loopControlInAsyncForElsec             C   s   |   dtj¡ d S )Nzø
        async def read_data(db):
            output = []
            async for row in db.cursor():
                try:
                    output.append(row)
                finally:
                    continue
            return output
        )r   r	   r7   )r
   r   r   r   Útest_continueInAsyncForFinally3  s    	z2TestAsyncStatements.test_continueInAsyncForFinallyc             C   s   |   d¡ d S )Nz‹
        async def commit(session, data):
            async with session.transaction():
                await session.update(data)
        )r   )r
   r   r   r   Útest_asyncWith@  s    z"TestAsyncStatements.test_asyncWithc             C   s   |   d¡ d S )NzÃ
        async def commit(session, data):
            async with session.transaction() as trans:
                await trans.begin()
                ...
                await trans.end()
        )r   )r
   r   r   r   Útest_asyncWithItemH  s    z&TestAsyncStatements.test_asyncWithItemc             C   s   |   d¡ d S )Nz9
        def foo(a, b):
            return a @ b
        )r   )r
   r   r   r   Útest_matmulR  s    zTestAsyncStatements.test_matmul)r   rŒ   znew in Python 3.6c             C   s   |   d¡ d S )NzE
        hi = 'hi'
        mom = 'mom'
        f'{hi} {mom}'
        )r   )r
   r   r   r   Útest_formatstringY  s    z%TestAsyncStatements.test_formatstringc             C   s4   |   d¡ |   d¡ |   dtj¡ |   dtj¡ d S )Nz;
        raise NotImplementedError("This is fine")
        z+
        raise NotImplementedError
        z?
        raise NotImplemented("This isn't gonna work")
        z&
        raise NotImplemented
        )r   r	   ZRaiseNotImplemented)r
   r   r   r   Útest_raise_notimplementeda  s    
z-TestAsyncStatements.test_raise_notimplementedN)rX   rY   rZ   r   r   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r   r   r   r   r   r   Þ  s   

r   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 )ÚTestIncompatiblePrintOperatorz@
    Tests for warning about invalid use of print function.
    c             C   s   |   d¡ d S )Nz 
        print("Hello")
        )r   )r
   r   r   r   Útest_valid_printx  s    z.TestIncompatiblePrintOperator.test_valid_printc             C   s4   |   dtj¡jd }|  |jd¡ |  |jd¡ d S )Nzn
        from __future__ import print_function
        import sys
        print >>sys.stderr, "Hello"
        r   é   )r   r	   ZInvalidPrintSyntaxr   ZassertEqualÚlinenoÚcol)r
   Úexcr   r   r   Ú,test_invalid_print_when_imported_from_future}  s    zJTestIncompatiblePrintOperator.test_invalid_print_when_imported_from_futurec             C   s   |   d¡ dS )zJ
        A valid assignment, tested for catching false positives.
        z`
        from __future__ import print_function
        log = print
        log("Hello")
        N)r   )r
   r   r   r   Útest_print_function_assignment‡  s    z<TestIncompatiblePrintOperator.test_print_function_assignmentc             C   s   |   d¡ d S )NzQ
        from __future__ import print_function
        a = lambda: print
        )r   )r
   r   r   r   Útest_print_in_lambda‘  s    z2TestIncompatiblePrintOperator.test_print_in_lambdac             C   s   |   d¡ d S )Nza
        from __future__ import print_function
        def a():
            return print
        )r   )r
   r   r   r   Útest_print_returned_in_function—  s    z=TestIncompatiblePrintOperator.test_print_returned_in_functionc             C   s   |   d¡ d S )NzN
        from __future__ import print_function
        if print: pass
        )r   )r
   r   r   r   Útest_print_as_condition_testž  s    z:TestIncompatiblePrintOperator.test_print_as_condition_testN)
rX   rY   rZ   rŽ   rŸ   r¤   r¥   r¦   r§   r¨   r   r   r   r   rž   s  s   

rž   N)rŽ   Úsysr   Zpyflakesr   r	   Zpyflakes.test.harnessr   r   r   r   r[   r   rž   r   r   r   r   Ú<module>   s*            (    8 