def test_match(parse_ast_tree, data): def get_nodes_name(root): from collections import deque todo = deque([root]) while todo: node = todo.popleft() todo.extendleft(node.children) yield node.ast_node.name assert [ list(get_nodes_name(tree)) for tree in am.match(pattern=data.pattern, ast=parse_ast_tree(data.code)) ] == [ ['test_1', 'inner_1', 'inner3', 'inner4', 'inner_2', 'inner6'], ['test_1', 'inner_1', 'inner3', 'inner5', 'inner_2', 'inner6'], ['test_1', 'inner_1', 'inner4', 'inner5', 'inner_2', 'inner6'], ['test_1', 'inner_1', 'inner3', 'inner4', 'inner_2', 'inner7'], ['test_1', 'inner_1', 'inner3', 'inner5', 'inner_2', 'inner7'], ['test_1', 'inner_1', 'inner4', 'inner5', 'inner_2', 'inner7'], ]
def test_has_name_match_ok(parse_ast_tree, data): assert bool(am.match(pattern=data.pattern, ast=parse_ast_tree( data.code))) is True
def test_match_base_wrong(parse_ast_tree, data): assert bool(am.match(pattern=data.pattern, ast=parse_ast_tree( data.code))) is False
def inner9(): ... def inner4(): def inner10(): ... def inner5(): ... def inner_2(): def inner6(): ... def inner7(): ... ''' pattern = FunctionDef( FunctionDef( FunctionDef(), FunctionDef(), ), FunctionDef(FunctionDef(), ), ) matcher = match(pattern, ast.parse(dedent(code))) expected = [ ['inner_1', 'inner3', 'inner8', 'inner9', 'inner4', 'inner10'], ['test_1', 'inner_1', 'inner3', 'inner4', 'inner_2', 'inner6'], ['test_1', 'inner_1', 'inner3', 'inner5', 'inner_2', 'inner6'], ['test_1', 'inner_1', 'inner4', 'inner5', 'inner_2', 'inner6'], ['test_1', 'inner_1', 'inner3', 'inner4', 'inner_2', 'inner7'], ['test_1', 'inner_1', 'inner3', 'inner5', 'inner_2', 'inner7'], ['test_1', 'inner_1', 'inner4', 'inner5', 'inner_2', 'inner7'], ] assert expected == [list(get_nodes_name(tree)) for tree in matcher]