def check(self, free_vars, code_text): tree = parse_statement(code_text) global_vars, all_bindings = varbindings.annotate(tree) self.assertEquals(set(global_vars.iterkeys()), set(free_vars)) logged = pycheck.check(tree, all_bindings) assert_sets_equal( sorted([(error, node.lineno) for error, node in logged]), sorted(find_expected_errors(code_text)) )
def check_find_assigned(self, expected_assigned_vars, code_text): tree = parse_statement(code_text) assert_sets_equal(varbindings.find_assigned(tree), set(expected_assigned_vars)) global_vars, bindings = varbindings.annotate(tree) assigned_vars = set(var_name for var_name, binding in global_vars.iteritems() if binding.is_assigned) assert_sets_equal(assigned_vars, set(expected_assigned_vars))
def match_up_bindings(self, source): tree = parse_statement(source) varbindings.annotate(tree) got_vars = list(find_actual_bindings(tree)) expected = list(find_expected_bindings(source)) # Check that lines refer to the expected variable names. expected_var_lines = [(var_name, line_index + 1) for line_index, var_map in enumerate(expected) for var_name in var_map.keys()] actual_var_lines = [(binding.name, lineno) for binding, lineno in got_vars] assert_sets_equal(sorted(set(actual_var_lines)), sorted(set(expected_var_lines))) # Check 1-1 mapping. relation = [] for binding, lineno in got_vars: var_id = expected[lineno - 1][binding.name] relation.append((var_id, binding)) self.check_isomorphism(relation)
def test_listing_variable_references(self): source = """ x = 1 print x """ tree = parse_statement(source) global_vars, bindings = varbindings.annotate(tree) self.assertEquals(global_vars.keys(), ["x"]) refs = global_vars["x"].references self.assertEquals(len(refs), 2) self.assertEquals(refs[0].is_assignment, True) self.assertEquals(refs[0].is_read, False) self.assertEquals(refs[0].node.lineno, 2) self.assertEquals(refs[1].is_assignment, False) self.assertEquals(refs[1].is_read, True) self.assertEquals(refs[1].node.lineno, 3)
def test_read_variables(self): source = """ print read1 w1 = 1 readwrite += 1 del w2 def w3(): return read2 class w4: pass import w5 from xx import w6 """ global_vars, bindings = varbindings.annotate(parse_statement(source)) assert_sets_equal(sorted(global_vars.iterkeys()), ["read1", "read2", "readwrite", "w1", "w2", "w3", "w4", "w5", "w6"]) assert_sets_equal([var for var, binding in global_vars.iteritems() if binding.is_assigned], ["readwrite", "w1", "w2", "w3", "w4", "w5", "w6"]) assert_sets_equal([var for var, binding in global_vars.iteritems() if binding.is_read], ["readwrite", "read1", "read2"])
def free_vars(text): global_vars, bindings = varbindings.annotate(parse_statement(text)) return set(global_vars.iterkeys())