def declarations_in_exactly_one_if_else_branch_are_not_definitely_bound(): _assert_name_is_not_definitely_bound(lambda generate: nodes.if_(nodes.bool_literal(True), [generate.assignment()], []) ) _assert_name_is_not_definitely_bound(lambda generate: nodes.if_(nodes.bool_literal(True), [], [generate.assignment()]) )
def if_else_has_child_names_resolved(): _assert_children_resolved( lambda ref: nodes.if_(ref, [], []), ) _assert_children_resolved( lambda ref: nodes.if_(nodes.bool_literal(True), [nodes.expression_statement(ref)], []), ) _assert_children_resolved( lambda ref: nodes.if_(nodes.bool_literal(True), [], [nodes.expression_statement(ref)]), )
def test_parse_if_else_statement(): expected = nodes.if_( nodes.ref("b"), [nodes.ret(nodes.ref("x"))], [nodes.ret(nodes.ref("y"))], ) _assert_statement_parse(expected, "if b:\n return x\nelse:\n return y")
def has_unconditional_return_is_false_if_only_false_branch_of_if_statement_returns(): assert not returns.has_unconditional_return([ nodes.if_( nodes.int_literal(1), [], [nodes.ret(nodes.int_literal(2))], ) ])
def has_unconditional_return_is_true_if_both_branches_of_if_statement_return(): assert returns.has_unconditional_return([ nodes.if_( nodes.int_literal(1), [nodes.ret(nodes.int_literal(1))], [nodes.ret(nodes.int_literal(2))], ) ])
def if_statement_has_false_body_type_checked(): assert_statement_is_type_checked( lambda bad_statement: nodes.if_( nodes.int_literal(1), [], [bad_statement], ) )
def potentially_bound_variable_becomes_definitely_bound_after_being_assigned_in_both_branches_of_if_else(): target_node = nodes.ref("x") node = nodes.if_( nodes.bool_literal(True), [nodes.assign([target_node], nodes.none())], [] ) bindings = _updated_bindings(node) assert not bindings.is_definitely_bound(target_node) node = nodes.if_( nodes.bool_literal(True), [nodes.assign([target_node], nodes.none())], [nodes.assign([target_node], nodes.none())] ) bindings = _updated_bindings(node) assert bindings.is_definitely_bound(target_node)
def if_statement_has_condition_type_checked(): ref_node = nodes.ref("y") node = nodes.if_(ref_node, [], []) try: update_context(node) assert False, "Expected error" except errors.TypeCheckError as error: assert_equal(ref_node, error.node)
def variable_remains_definitely_bound_after_being_reassigned_in_one_branch_of_if_else(): target_node = nodes.ref("x") node = nodes.if_( nodes.bool_literal(True), [nodes.assign([target_node], nodes.none())], [] ) bindings = _updated_bindings(node, is_definitely_bound={"x": True}) assert bindings.is_definitely_bound(target_node)
def children_of_if_else_are_checked(): _assert_child_expression_is_checked(lambda generate: nodes.if_( generate.unbound_ref(), [], [] ) ) _assert_child_statement_is_checked(lambda generate: nodes.if_( nodes.bool_literal(True), [generate.unbound_ref_statement()], [] ) ) _assert_child_statement_is_checked(lambda generate: nodes.if_( nodes.bool_literal(True), [], [generate.unbound_ref_statement()] ) )
def test_condition_is_transformed_using_bool_builtin(self): _assert_transform( nodes.if_( nodes.ref("x"), [nodes.ret(nodes.ref("y"))], [nodes.ret(nodes.ref("z"))], ), cc.if_( cc.call(cc.builtin("bool"), [cc.ref("x")]), [cc.ret(cc.ref("y"))], [cc.ret(cc.ref("z"))], ) )
def only_values_that_are_definitely_bound_are_exported(): module_node = nodes.module([ nodes.if_( nodes.bool_literal(True), [ nodes.assign(["x"], nodes.str_literal("one")), nodes.assign(["y"], nodes.str_literal("two")), ], [ nodes.assign(["y"], nodes.str_literal("three")), ] ) ]) module, type_lookup = _check(LocalModule(None, module_node)) assert_equal(None, module.attrs.get("x")) assert_equal(types.str_type, module.attrs.type_of("y"))
def test_condition_is_not_transformed_using_bool_builtin_if_already_a_bool(self): condition_node = nodes.ref("x") _assert_transform( nodes.if_( condition_node, [nodes.ret(nodes.ref("y"))], [nodes.ret(nodes.ref("z"))], ), cc.if_( cc.ref("x"), [cc.ret(cc.ref("y"))], [cc.ret(cc.ref("z"))], ), type_lookup=[ (condition_node, types.bool_type), ], )
def test_function_without_explicit_return_on_all_paths_returns_none_at_end(self): _assert_transform( nodes.func( name="f", args=nodes.args([]), body=[ nodes.if_( nodes.ref("x"), [nodes.ret(nodes.bool_literal(True))], [] ), ], type=None ), cc.func("f", [], [ cc.if_( cc.call(cc.builtin("bool"), [cc.ref("x")]), [cc.ret(cc.true)], ), cc.ret(cc.none), ]), )
def declarations_in_both_if_else_branches_are_definitely_bound(): _assert_name_is_definitely_bound(lambda generate: nodes.if_(nodes.bool_literal(True), [generate.assignment()], [generate.assignment()]) )