def test_given_tu_with_two_functions__get_calls_of_returns_one_callable():
    manager = CallTreeManager()
    with generate_file('file.cpp',
                       'void f();\nvoid g() { f(); }') as file_name:
        manager.open(file_name)
        manager.select_tu(file_name)
    unexpected_children = manager.get_calls_of('f()')
    expected_children = manager.get_calls_of('g()')
    assert len(unexpected_children) == 0
    assert len(expected_children) == 1
def test_given_tu_with_tree_three_functions_deep__tree_of_select_root_on_middle_function_has_depth_two(
):
    manager = CallTreeManager()
    content = 'void f();\nvoid g() { f(); }\nvoid h() { g(); }\n'
    with generate_file('file.cpp', content) as file_name:
        manager.open(file_name)
        manager.select_tu(file_name)
        root = manager.select_root('g()')
    children = manager.get_calls_of(root.name)
    assert len(children) == 1
    grand_children = manager.get_calls_of(children[0].name)
    assert len(grand_children) == 0
def test_given_tu_referencing_function_in_other_tu__load_definition_grows_call_tree(
):
    manager = CallTreeManager()
    with generate_file('g.cpp',
                       'extern void f();\nvoid g() { f(); }') as file_name:
        manager.open(file_name)
        manager.select_tu(file_name)
        root = manager.select_root('g()')
    with generate_file('f.cpp', 'void f() { f(); }\n') as file_name:
        manager.state_ = CallTreeManagerState.READY_TO_SELECT_TU
        manager.open(
            file_name)  # TODO(KNR): a hack, use a compilation DB instead
        manager.load_definition('f()')
    children = manager.get_calls_of(root.name)
    grand_children = manager.get_calls_of(children[0].name)
    assert len(grand_children) == 1