def test_parse_mypy_result_multiple(self):
        """Test if the parse_mypy_result method returns the correct types."""
        mypy_result = "<string>:1: note: Revealed type is 'builtins.int'"
        mypy_result += "\n<string>:2: note: Revealed type is 'builtins.str'"

        result = TypeInference.parse_mypy_result(mypy_result)
        assert result == [(1, "builtins.int"), (2, "builtins.str")]
    def test_add_reveal_type_calls_block(self):
        """Test if the reveal_type() call is added to the body of a block statement."""
        code = "y = ''\nfor x in y.join([]):\n\tpass"
        nodes = [astroid.parse(code).body[1].iter]

        result = TypeInference.add_reveal_type_calls(
            code, nodes, lambda node: node.func.expr.name)
        assert result == "y = ''\nfor x in y.join([]):\n\tpass; reveal_type(y)"
    def test_add_reveal_type_calls(self):
        """Test the add_reveal_type_calls() method with a single expression."""
        code = "a = b.c(d)"
        nodes = [astroid.parse(code).body[0].value]

        result = TypeInference.add_reveal_type_calls(
            code, nodes, lambda node: node.func.expr.name)
        assert result == "a = b.c(d); reveal_type(b)"
    def test_infer_types(self):
        """Test the infer_types method."""
        code = "a = 'b'; a.join([])"
        module_node = astroid.parse(code)
        node_type = astroid.Call
        result = TypeInference.infer_types(module_node, node_type,
                                           lambda x: x.func.expr.name)

        assert result == {module_node.body[1].value: "builtins.str"}
    def test_type_inference_in_for_loop_definition(self):
        """Test if type inference works for Calls inside for loop definitions."""
        code = "y = ''\nfor x in y.join([]):\n\tpass"
        module_node = astroid.parse(code)
        node_type = astroid.Call
        result = TypeInference.infer_types(module_node, node_type,
                                           lambda x: x.func.expr.name)

        assert result == {module_node.body[1].iter: "builtins.str"}
    def test_add_reveal_type_calls_multiple(self):
        """Test the add_reveal_type_calls() method with multiple expressions."""
        code = "a = b.c(d)\nx = 5 \ne = f.g()"
        tree = astroid.parse(code)
        nodes = [tree.body[0].value, tree.body[2].value]

        result = TypeInference.add_reveal_type_calls(
            code, nodes, lambda node: node.func.expr.name)
        assert result == "a = b.c(d); reveal_type(b)\nx = 5 \ne = f.g(); reveal_type(f)"
Example #7
0
    def visit_module(self, node: astroid.Module):
        """
        When an Module node is visited, scan for Call nodes and get type the function is called on.

        :param node: Node which is visited.
        """
        try:
            # noinspection PyTypeChecker
            self._call_types = TypeInference.infer_types(node, astroid.Call, lambda x: x.func.expr.name)
        except:  # pylint: disable=bare-except
            ExceptionHandler.handle(self, node)
 def test_combine_nodes_with_inferred_types(self):
     """Test if combine_nodes_with_inferred_types returns a correct dict on a single line."""
     nodes = [astroid.extract_node("a.b()")]
     types = [(1, "builtins.str")]
     result = TypeInference.combine_nodes_with_inferred_types(nodes, types)
     assert result == {nodes[0]: types[0][1]}
 def test_parse_mypy_result(self):
     """Test if the parse_mypy_result method returns the correct type."""
     mypy_result = "<string>:1: note: Revealed type is 'builtins.int'"
     assert TypeInference.parse_mypy_result(mypy_result) == [
         (1, "builtins.int")
     ]
 def test_run_mypy_error(self):
     """Test if mypy returns an error when code is incorrect."""
     result = TypeInference.run_mypy("a: str = 5")
     assert result.splitlines(
     )[1] == "Found 1 error in 1 file (checked 1 source file)"
 def test_run_mypy_success(self):
     """Test if mypy is ran successfully on some correct code."""
     result = TypeInference.run_mypy("a = 5")
     assert result == "Success: no issues found in 1 source file\n"