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())