def test_is_start_of_sequence(self):
     node_list = [PatternConstructor.build_node_desc('newline'), PatternConstructor.build_node_desc('space')]
     seq = ast.SequencePattern(node_list)
     root = ParseTreeConstructor.add_root_to_siblings('newline', 'space', 'space')
     is_match, nodes = self.matcher.is_start_of_sequence(seq, root.value[0])
     assert is_match
     assert len(nodes) == 1
    def test_find_parent_child_pattern_ancestor(self):
        parent = PatternConstructor.build_node_desc('root')
        child = PatternConstructor.build_node_desc('newline')
        relations = ast.NodeRelations()
        relations.register_relation(parent, ast.IsAncestorOf(child))
        pattern = ast.PatternDescriptor(parent, [parent, child], relations)

        result = self.matcher.find_pattern_in_tree(self.tree, pattern)
        assert len(result) == 2
    def test_find_double_pattern(self):
        parent = PatternConstructor.build_node_desc('ruleset')
        child1 = PatternConstructor.build_node_desc('declaration')
        child2 = PatternConstructor.build_node_desc('declaration')
        relations = ast.NodeRelations()
        relations.register_relation(parent, ast.IsParentOf(child1))
        relations.register_relation(parent, ast.IsParentOf(child2))
        pattern = ast.PatternDescriptor(parent, [parent, child1, child2], relations)

        result = self.matcher.find_pattern_in_tree(self.tree, pattern)
        assert len(result) == 3
    def test_is_variation_between_nodes(self):
        variation = ast.WhitespaceVariation([
            ast.SequencePattern([PatternConstructor.build_node_desc('newline')]),
            ast.SequencePattern([PatternConstructor.build_node_desc('space'), PatternConstructor.build_node_desc('newline')])])
        root = ParseTreeConstructor.add_root_to_siblings('comment', 'newline', 'comment')
        present = self.matcher.is_variation_between_nodes(variation, root.value[0], root.value[2])
        assert present

        root = ParseTreeConstructor.add_root_to_siblings('comment', 'space', 'newline', 'comment')
        present = self.matcher.is_variation_between_nodes(variation, root.value[0], root.value[3])
        assert present
 def test_is_sequence_exact_nodes_match_more(self):
     node_list = [PatternConstructor.build_node_desc('newline'), PatternConstructor.build_node_desc('space')]
     seq = ast.SequencePattern(node_list)
     is_match = self.matcher._is_sequence_exact_nodes_match(seq, [self.node0, self.node1, self.node1])
     assert not is_match
 def test_handle_min_more(self):
     desc = PatternConstructor.build_seq_desc(ast.Repeater(lower=2))
     is_matched, rem_nodes = self.matcher._handle_range(desc, [self.node0, self.node1, self.node3])
     assert is_matched
     assert not rem_nodes
 def test_handle_min_split(self):
     desc = PatternConstructor.build_seq_desc_type('newline', ast.Repeater(lower=2))
     is_matched, rem_nodes = self.matcher._handle_range(desc, [self.node0, self.node0, self.node1])
     assert is_matched
     assert len(rem_nodes) == 1
 def test_handle_max_more(self):
     desc = PatternConstructor.build_seq_desc(ast.Repeater(upper=3))
     is_matched, rem_nodes = self.matcher._handle_range(desc, [self.node0, self.node1, self.node2, self.node3])
     assert is_matched
     assert len(rem_nodes) == 1
     assert rem_nodes[0] == self.node3
 def test_handle_max_exact(self):
     desc = PatternConstructor.build_seq_desc(ast.Repeater(upper=3))
     is_matched, rem_nodes = self.matcher._handle_range(desc, [self.node0, self.node1, self.node2])
     assert is_matched
     assert not rem_nodes
 def test_handle_range_less(self):
     desc = PatternConstructor.build_seq_desc(ast.Repeater(1, 2))
     is_matched, rem_nodes = self.matcher._handle_range(desc, [])
     assert not is_matched
 def test_not_is_lower_matched(self):
     desc = PatternConstructor.build_seq_desc(ast.Repeater(lower=2, upper=2))
     is_matched, rem_nodes = self.matcher._is_lower_matched(desc, [self.node0])
     assert not is_matched
 def test_is_lower_matched(self):
     desc = PatternConstructor.build_seq_desc(ast.Repeater(lower=2, upper=2))
     is_matched, rem_nodes = self.matcher._is_lower_matched(desc, [self.node0, self.node1, self.node2])
     assert is_matched
     assert len(rem_nodes) == 1
     assert rem_nodes[0] == self.node2
 def test_find_single_pattern_in_descendants(self):
     pattern = PatternConstructor.single_node('declaration')
     result = self.matcher.find_pattern_in_tree(self.tree, pattern)
     assert len(result) == 3
 def test_is_sequence_exact_nodes_match_multi_two(self):
     rep_node = PatternConstructor.build_seq_desc_type('newline', ast.Repeater(lower=2, upper=3))
     node_list = [PatternConstructor.build_node_desc('space'), rep_node]
     seq = ast.SequencePattern(node_list)
     is_match = self.matcher._is_sequence_exact_nodes_match(seq, [self.node1, self.node0, self.node0])
     assert is_match