def foo()

in Extractors/Python/extractor/tests.py [0:0]


def foo():
    'Interesting function'
    pass''')

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Comment='Interesting function']")
        assert functionDefinitionNode != None

    def testFunctionDefSimpleArgs(self):
        root =  createTree('''def foo(self, banana): pass''')

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        # There are no parameters:
        argumentsNode = functionDefinitionNode.find("Arguments")
        assert argumentsNode != None

        argumentNode = argumentsNode.find("Argument[@Name='self']")
        assert argumentNode != None

        argumentNode = argumentsNode.find("Argument[@Name='banana']")
        assert argumentNode != None

    def testFunctionDefNoArgsWithReturn(self):
        root = createTree('''def foo() ->None: pass''')

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        # There are no parameters:
        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']/Arguments")
        assert functionDefinitionNode != None

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']/Arguments/*")
        assert functionDefinitionNode is None

        # The return annotation is 'None'
        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']/Returns/NameConstant[@Name='None']")
        assert functionDefinitionNode != None

    def testFunctionDefDefaultArgs(self):
        root =  createTree('''def foo(self, banana=1, orange=""): pass''')

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        # There are no parameters:
        argumentsNode = functionDefinitionNode.find("Arguments")
        assert argumentsNode != None

        argumentNode = argumentsNode.find("Argument[@Name='self']")
        assert argumentNode != None

        argumentNode = argumentsNode.find("Argument[@Name='banana']/NumberLiteral[@Value='1']")
        assert argumentNode != None

        argumentNode = argumentsNode.find("Argument[@Name='orange']/StringLiteral[@Value='']")
        assert argumentNode != None

    def testFunctionDefStarredArgs(self):
        root =  createTree('''def foo(self, *arg1, **arg2): pass''')
        # In this syntax, the *arg means that all the positional parameters should
        # be passed as a list, while the **args causes the keyword parameters to be
        # collected in a dictionary (in the args2 parameter).

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        argumentsNode = functionDefinitionNode.find("Arguments")
        assert argumentsNode != None

        argumentNode = argumentsNode.find("Argument[@Name='self']")
        assert argumentNode != None

        argumentNode = argumentsNode.find("Vararg/Argument[@Name='arg1']")
        assert argumentNode != None

        argumentNode = argumentsNode.find("KeywordArg/Argument[@Name='arg2']")
        assert argumentNode != None

    def testFunctionDefAnnotatedArgs(self):
        root = createTree('''def foo(self: int, banana: str) -> str: pass''')

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        # There are no parameters:
        argumentsNode = functionDefinitionNode.find("Arguments")
        assert argumentsNode != None

        argumentNode = argumentsNode.find("Argument[@Name='self']")
        assert argumentNode != None
        parameterAnnotationNode = argumentNode.find("Annotation")
        assert parameterAnnotationNode != None

        argumentNode = argumentsNode.find("Argument[@Name='banana']")
        assert argumentNode != None
        parameterAnnotationNode = argumentNode.find("Annotation")
        assert parameterAnnotationNode != None

        functionDefinitionNode = root.find("Statements/FunctionDefinition[@Name='foo']/Returns/Name[@Id='str']")
        assert functionDefinitionNode != None

    def testAsyncFunctionDefWithPredefReturnNone(self):
        root = createTree('''async def foo() -> None: pass''')

        functionDefinitionNode = root.find("Statements/AsyncFunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        # There are no parameters:
        argumentsNode = functionDefinitionNode.find("Arguments")
        assert argumentsNode != None

        functionDefinitionNode = root.find("Statements/AsyncFunctionDefinition[@Name='foo']/Returns/NameConstant[@Name='None']")
        assert functionDefinitionNode != None

    def testAsyncFunctionDefWithPredefReturnStr(self):
        root = createTree('''async def foo() -> str: pass''')

        functionDefinitionNode = root.find("Statements/AsyncFunctionDefinition[@Name='foo']")
        assert functionDefinitionNode != None

        # There are no parameters:
        argumentsNode = functionDefinitionNode.find("Arguments")
        assert argumentsNode != None

        functionDefinitionNode = root.find("Statements/AsyncFunctionDefinition[@Name='foo']/Returns/Name[@Id='str']")
        assert functionDefinitionNode != None