def test_DependencyGraph_Multi_Root():
    from rosdep2.dependency_graph import DependencyGraph
    # Multi root, shared dependency: A-B-C, D-C
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = []
    dg['D']['installer_key'] = 'd_installer'
    dg['D']['install_keys'] = ['d']
    dg['D']['dependencies'] = ['C']
    result = dg.get_ordered_dependency_list()
    # TODO: The expected might also have a different order, for example it might be:
    # [('c_installer', ['c']), ('d_installer', ['d']), ('b_installer', ['b']), ('a_installer', ['a'])]
    # But that wont invalidate the order from a dependency graph stand point
    expected = [
        [('c_installer', ['c']), ('b_installer', ['b']),
         ('a_installer', ['a']), ('d_installer', ['d'])],
        [('c_installer', ['c']), ('d_installer', ['d']),
         ('b_installer', ['b']), ('a_installer', ['a'])],
    ]
    assert result in expected, 'Results did not match expectations: %s == %s' % (
        str(result), str(expected))
def test_DependencyGraph_Short_Cycle():
    from rosdep2.dependency_graph import DependencyGraph
    # Short cycle A-B-C-D-B-C-D-...
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = ['D']
    dg['D']['installer_key'] = 'd_installer'
    dg['D']['install_keys'] = ['d']
    dg['D']['dependencies'] = ['B']
    try:
        result = dg.get_ordered_dependency_list()
        assert False, "Doesn't fail, it should fail with an AssertionError because of the cycle."
    except AssertionError as e:
        if not str(e).startswith(
                'A cycle in the dependency graph occurred with key'):
            assert False, 'Throws AssertionError, but with the wrong message. Error was: %s: %s' % (
                type(e), str(e))
    except Exception as e:
        assert False, 'Throws and Exception, but not an AssertionError. Error was: %s: %s' % (
            type(e), str(e))
def test_DependencyGraph_Short_Cycle():
    from rosdep2.dependency_graph import DependencyGraph

    # Short cycle A-B-C-D-B-C-D-...
    dg = DependencyGraph()
    dg["A"]["installer_key"] = "a_installer"
    dg["A"]["install_keys"] = ["a"]
    dg["A"]["dependencies"] = ["B"]
    dg["B"]["installer_key"] = "b_installer"
    dg["B"]["install_keys"] = ["b"]
    dg["B"]["dependencies"] = ["C"]
    dg["C"]["installer_key"] = "c_installer"
    dg["C"]["install_keys"] = ["c"]
    dg["C"]["dependencies"] = ["D"]
    dg["D"]["installer_key"] = "d_installer"
    dg["D"]["install_keys"] = ["d"]
    dg["D"]["dependencies"] = ["B"]
    try:
        result = dg.get_ordered_dependency_list()
        assert False, "Doesn't fail, it should fail with an AssertionError because of the cycle."
    except AssertionError as e:
        if not str(e).startswith("A cycle in the dependency graph occurred with key"):
            assert False, "Throws AssertionError, but with the wrong message. Error was: %s: %s" % (type(e), str(e))
    except Exception as e:
        assert False, "Throws and Exception, but not an AssertionError. Error was: %s: %s" % (type(e), str(e))
def test_DependencyGraph_Multi_Root():
    from rosdep2.dependency_graph import DependencyGraph
    # Multi root, shared dependency: A-B-C, D-C
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = []
    dg['D']['installer_key'] = 'd_installer'
    dg['D']['install_keys'] = ['d']
    dg['D']['dependencies'] = ['C']
    result = dg.get_ordered_dependency_list()
    # TODO: The expected might also have a different order, for example it might be:
    # [('c_installer', ['c']), ('d_installer', ['d']), ('b_installer', ['b']), ('a_installer', ['a'])]
    # But that wont invalidate the order from a dependency graph stand point
    expected = [
        [('c_installer', ['c']), ('b_installer', ['b']), ('a_installer', ['a']), ('d_installer', ['d'])],
        [('c_installer', ['c']), ('d_installer', ['d']), ('b_installer', ['b']), ('a_installer', ['a'])],
    ]
    assert result in expected, 'Results did not match expectations: %s == %s' % (str(result), str(expected))
def test_DependencyGraph_Realworld():
    from rosdep2.dependency_graph import DependencyGraph
    # Real world example
    dg = DependencyGraph()
    dg['python-matplotlib']['installer_key'] = 'pip'
    dg['python-matplotlib']['install_keys'] = ['matplotlib']
    dg['python-matplotlib']['dependencies'] = ['pkg-config']
    dg['pkg-config']['installer_key'] = 'homebrew'
    dg['pkg-config']['install_keys'] = ['pkg-config']
    dg['pkg-config']['dependencies'] = []
    result = dg.get_ordered_dependency_list()
    expected = [('homebrew', ['pkg-config']), ('pip', ['matplotlib'])]
    assert result == expected, 'Results did not match expectations: %s == %s' % (str(result), str(expected))
def test_DependencyGraph_Realworld():
    from rosdep2.dependency_graph import DependencyGraph
    # Real world example
    dg = DependencyGraph()
    dg['python-matplotlib']['installer_key'] = 'pip'
    dg['python-matplotlib']['install_keys'] = ['matplotlib']
    dg['python-matplotlib']['dependencies'] = ['pkg-config']
    dg['pkg-config']['installer_key'] = 'homebrew'
    dg['pkg-config']['install_keys'] = ['pkg-config']
    dg['pkg-config']['dependencies'] = []
    result = dg.get_ordered_dependency_list()
    expected = [('homebrew', ['pkg-config']), ('pip', ['matplotlib'])]
    assert result == expected, 'Results did not match expectations: %s == %s' % (
        str(result), str(expected))
def test_DependencyGraph_Realworld():
    from rosdep2.dependency_graph import DependencyGraph

    # Real world example
    dg = DependencyGraph()
    dg["python-matplotlib"]["installer_key"] = "pip"
    dg["python-matplotlib"]["install_keys"] = ["matplotlib"]
    dg["python-matplotlib"]["dependencies"] = ["pkg-config"]
    dg["pkg-config"]["installer_key"] = "homebrew"
    dg["pkg-config"]["install_keys"] = ["pkg-config"]
    dg["pkg-config"]["dependencies"] = []
    result = dg.get_ordered_dependency_list()
    expected = [("homebrew", ["pkg-config"]), ("pip", ["matplotlib"])]
    assert result == expected, "Results did not match expectations: %s == %s" % (str(result), str(expected))
def test_DependencyGraph_Linear():
    from rosdep2.dependency_graph import DependencyGraph
    # Normal A-B-C
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = []
    result = dg.get_ordered_dependency_list()
    expected = [('c_installer', ['c']), ('b_installer', ['b']), ('a_installer', ['a'])]
    assert result == expected, 'Results did not match expectations: %s == %s' % (str(result), str(expected))
def test_DependencyGraph_Linear():
    from rosdep2.dependency_graph import DependencyGraph

    # Normal A-B-C
    dg = DependencyGraph()
    dg["A"]["installer_key"] = "a_installer"
    dg["A"]["install_keys"] = ["a"]
    dg["A"]["dependencies"] = ["B"]
    dg["B"]["installer_key"] = "b_installer"
    dg["B"]["install_keys"] = ["b"]
    dg["B"]["dependencies"] = ["C"]
    dg["C"]["installer_key"] = "c_installer"
    dg["C"]["install_keys"] = ["c"]
    dg["C"]["dependencies"] = []
    result = dg.get_ordered_dependency_list()
    expected = [("c_installer", ["c"]), ("b_installer", ["b"]), ("a_installer", ["a"])]
    assert result == expected, "Results did not match expectations: %s == %s" % (str(result), str(expected))
def test_DependencyGraph_Linear():
    from rosdep2.dependency_graph import DependencyGraph
    # Normal A-B-C
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = []
    result = dg.get_ordered_dependency_list()
    expected = [('c_installer', ['c']), ('b_installer', ['b']),
                ('a_installer', ['a'])]
    assert result == expected, 'Results did not match expectations: %s == %s' % (
        str(result), str(expected))
def test_DependencyGraph_Invalid_Key():
    from rosdep2.dependency_graph import DependencyGraph
    # Invalid graph A-B-C where C doesn't exist
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    try:
        result = dg.get_ordered_dependency_list()
        assert False, "Doesn't fail, it should fail with an KeyError because of the invalid rosdep key."
    except KeyError as e:
        if not str(e).endswith("does not exist in the dictionary of resolutions.'"):
            assert False, 'Throws KeyError, but with the wrong message. Error was: %s: %s' % (type(e), str(e))
    except Exception as e:
        assert False, 'Throws and Exception, but not an KeyError. Error was: %s: %s' % (type(e), str(e))
def test_DependencyGraph_Invalid_Key2():
    from rosdep2.dependency_graph import DependencyGraph

    # Invalid graph A-B-C where B doesn't exist
    dg = DependencyGraph()
    dg["A"]["installer_key"] = "a_installer"
    dg["A"]["install_keys"] = ["a"]
    dg["A"]["dependencies"] = ["B"]
    dg["C"]["installer_key"] = "c_installer"
    dg["C"]["install_keys"] = ["c"]
    dg["C"]["dependencies"] = []
    try:
        result = dg.get_ordered_dependency_list()
        assert False, "Doesn't fail, it should fail with an KeyError because of the invalid rosdep key."
    except KeyError as e:
        if not str(e).endswith("does not exist in the dictionary of resolutions.'"):
            assert False, "Throws KeyError, but with the wrong message. Error was: %s: %s" % (type(e), str(e))
    except Exception as e:
        assert False, "Throws and Exception, but not an KeyError. Error was: %s: %s" % (type(e), str(e))
def test_DependencyGraph_Invalid_Key2():
    from rosdep2.dependency_graph import DependencyGraph
    # Invalid graph A-B-C where B doesn't exist
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = []
    try:
        result = dg.get_ordered_dependency_list()
        assert False, "Doesn't fail, it should fail with an KeyError because of the invalid rosdep key."
    except KeyError as e:
        if not str(e).endswith(
                "does not exist in the dictionary of resolutions.'"):
            assert False, 'Throws KeyError, but with the wrong message. Error was: %s: %s' % (
                type(e), str(e))
    except Exception as e:
        assert False, 'Throws and Exception, but not an KeyError. Error was: %s: %s' % (
            type(e), str(e))
def test_DependencyGraph_Cycle():
    from rosdep2.dependency_graph import DependencyGraph
    # Full Loop A-B-C-A-...
    dg = DependencyGraph()
    dg['A']['installer_key'] = 'a_installer'
    dg['A']['install_keys'] = ['a']
    dg['A']['dependencies'] = ['B']
    dg['B']['installer_key'] = 'b_installer'
    dg['B']['install_keys'] = ['b']
    dg['B']['dependencies'] = ['C']
    dg['C']['installer_key'] = 'c_installer'
    dg['C']['install_keys'] = ['c']
    dg['C']['dependencies'] = ['A']
    try:
        result = dg.get_ordered_dependency_list()
        assert False, "Doesn't fail, it should fail with an AssertionError because of the cycle."
    except AssertionError as e:
        if not str(e).startswith('A cycle in the dependency graph occurred with key'):
            assert False, 'Throws AssertionError, but with the wrong message. Error was: %s: %s' % (type(e), str(e))
    except Exception as e:
        assert False, 'Throws and Exception, but not an AssertionError. Error was: %s: %s' % (type(e), str(e))
def test_DependencyGraph_Multi_Root():
    from rosdep2.dependency_graph import DependencyGraph

    # Multi root, shared dependency: A-B-C, D-C
    dg = DependencyGraph()
    dg["A"]["installer_key"] = "a_installer"
    dg["A"]["install_keys"] = ["a"]
    dg["A"]["dependencies"] = ["B"]
    dg["B"]["installer_key"] = "b_installer"
    dg["B"]["install_keys"] = ["b"]
    dg["B"]["dependencies"] = ["C"]
    dg["C"]["installer_key"] = "c_installer"
    dg["C"]["install_keys"] = ["c"]
    dg["C"]["dependencies"] = []
    dg["D"]["installer_key"] = "d_installer"
    dg["D"]["install_keys"] = ["d"]
    dg["D"]["dependencies"] = ["C"]
    result = dg.get_ordered_dependency_list()
    # TODO: The expected might also have a different order, for example it might be:
    # [('c_installer', ['c']), ('d_installer', ['d']), ('b_installer', ['b']), ('a_installer', ['a'])]
    # But that wont invalidate the order from a dependency graph stand point
    expected = [("c_installer", ["c"]), ("b_installer", ["b"]), ("a_installer", ["a"]), ("d_installer", ["d"])]
    assert result == expected, "Results did not match expectations: %s == %s" % (str(result), str(expected))