def test_depth_first_xhallenge_example():

    graph = Graph()

    a = graph.add_node('a')
    b = graph.add_node('b')
    c = graph.add_node('c')
    d = graph.add_node('d')
    e = graph.add_node('e')
    f = graph.add_node('f')
    g = graph.add_node('g')
    h = graph.add_node('h')

    graph.add_edge(a, b)
    graph.add_edge(b, c)
    graph.add_edge(b, d)
    graph.add_edge(c, g)
    graph.add_edge(a, d)
    graph.add_edge(d, e)
    graph.add_edge(d, h)
    graph.add_edge(d, f)

    graph.add_edge(f, h)

    vertices_lst = graph.depth_first(a)

    assert vertices_lst == [a.value, b.value, c.value, g.value, d.value, e.value, h.value, f.value]
def test_to_nodes_dict():
    graph = Graph()

    amman = graph.add_node("amman")
    zarqa = graph.add_node("zarqa")
    irbid = graph.add_node("irbid")
    salt = graph.add_node("salt")
    aqaba = graph.add_node("aqaba")
    damanhur = graph.add_node("damanhur")

    graph.add_edge(amman, irbid, 150)
    graph.add_edge(amman, zarqa, 82)
    graph.add_edge(irbid, zarqa, 99)
    graph.add_edge(zarqa, salt, 105)
    graph.add_edge(irbid, salt, 42)
    graph.add_edge(zarqa, aqaba, 37)
    graph.add_edge(zarqa, damanhur, 26)
    graph.add_edge(damanhur, damanhur, 250)
    graph.add_edge(salt, damanhur, 73)

    nodes_dict = to_nodes_dict(graph.get_nodes())

    assert nodes_dict == {
        "amman": amman,
        "zarqa": zarqa,
        "irbid": irbid,
        "salt": salt,
        "aqaba": aqaba,
        "damanhur": damanhur
    }
def test_size():
    graph = Graph()
    graph.add_node('batool')
    assert graph.size() == 1

    graph.add_node('malkawi')
    assert graph.size() == 2
def test_size():

    g = Graph()

    a = g.add_node('a')
    b = g.add_node('b')
    c = g.add_node('c')

    assert g.size() == 3
def test_get_nodes():

    g = Graph()

    a = g.add_node('a')
    b = g.add_node('b')
    c = g.add_node('c')

    assert len(g.get_nodes()) == 3
def test_add_edge():
    graph = Graph()
    end = graph.add_node('batool')
    start = graph.add_node('malkawi')
    graph.add_edge(start, end)
    assert graph.adjacency_list[start][0] == (end, 1)
    assert graph.get_neighbors(start) == [(end, 1)]
    graph.add_edge(end, start)
    assert graph.get_neighbors(end) == [(start, 1)]
def test_get_neighbors():
    graph = Graph()
    banana = graph.add_node('banana')
    apple = graph.add_node('apple')
    graph.add_edge(apple, banana, 5)
    neighbors = graph.get_neighbors(apple)
    assert len(neighbors) == 1
    assert neighbors[0][0].value == 'banana'
    assert isinstance(neighbors[0][0], Node)
    assert neighbors[0][1] == 5
def test_depth_first__node_not_in_graph():
    graph = Graph()
    a = graph.add_node('a')
    b = graph.add_node('b')
    c = graph.add_node('c')
    d = Node('d')
    graph.add_edge(a, b)
    graph.add_edge(b, c)

    with pytest.raises(ValueError):
        nodes_list = graph.depth_first(d)
def test_get_neighbors():
    g = Graph()

    a = g.add_node('a')
    b = g.add_node('b')
    c = g.add_node('c')
    
    g.add_edge(a,b,4)
    neighbors = g.get_neighbors(a)
    assert neighbors[0][0].value == 'b'
    assert len(neighbors) == 1
    assert neighbors[0][1] == 4
def test_depth_first_given_vertex_not_in_graph():

    graph = Graph()

    a = graph.add_node('a')
    b = graph.add_node('b')
    c = graph.add_node('c')
    d = Node('d')

    graph.add_edge(a, b)
    graph.add_edge(b, c)

    with pytest.raises(ValueError):
        vertices_lst = graph.depth_first(d)
def test_depth_first():
    graph = Graph()
    banana = graph.add_node('banana')
    apple = graph.add_node('apple')
    strawberry = graph.add_node('strawberry')
    tomato = graph.add_node('tomato')
    graph.add_edge(banana, apple)
    graph.add_edge(apple, strawberry)
    graph.add_edge(banana, tomato)
    nodes_list = graph.depth_first(banana)

    assert nodes_list == [
        banana.value, tomato.value, apple.value, strawberry.value
    ]
def test_breadth_first_one_element():

    graph = Graph()

    amman = graph.add_node('Amman')
    lst = graph.breadth_first(amman)
    assert lst == [amman]
def test_edge_end_node_not_in_graph():
    graph = Graph()
    end = Node('end')
    start = graph.add_node('start')

    with pytest.raises(KeyError):
        graph.add_edge(start, end)
def test_to_neighbors_dict():
    graph = Graph()

    a = graph.add_node("a")
    b = graph.add_node("b")
    c = graph.add_node("c")
    d = graph.add_node("d")
    graph.add_edge(a, b, 150)
    graph.add_edge(a, c, 100)
    graph.add_edge(a, d, 50)

    neighbors_dict = to_neighbors_dict(graph.get_neighbors(a))

    assert neighbors_dict == {
        "b": (b, 150),
        "c": (c, 100),
        "d": (d, 50),
    }
def test_depth_first():
    graph = Graph()

    a = graph.add_node('a')
    b = graph.add_node('b')
    c = graph.add_node('c')
    d = graph.add_node('d')
    e = graph.add_node('e')
    f = graph.add_node('f')

    graph.add_edge(a, b)
    graph.add_edge(a, c)
    graph.add_edge(a, d)
    graph.add_edge(c, e)
    graph.add_edge(e, f)

    vertices_lst = graph.depth_first(a)

    assert vertices_lst == [a.value, b.value, c.value, e.value, f.value, d.value]
def my_graph():
    graph = Graph()
    amman = graph.add_node("amman")
    zarqa = graph.add_node("zarqa")
    irbid = graph.add_node("irbid")
    salt = graph.add_node("salt")
    aqaba = graph.add_node("aqaba")
    damanhur = graph.add_node("damanhur")

    graph.add_edge(amman, irbid, 150)
    graph.add_edge(amman, zarqa, 82)
    graph.add_edge(irbid, zarqa, 99)
    graph.add_edge(zarqa, salt, 105)
    graph.add_edge(irbid, salt, 42)
    graph.add_edge(zarqa, aqaba, 37)
    graph.add_edge(zarqa, damanhur, 26)
    graph.add_edge(damanhur, damanhur, 250)
    graph.add_edge(salt, damanhur, 73)

    return graph
def test_get_edges_one_vertex():
    g = Graph()
    v1 = g.add_node('Pandora')
    v2 = g.add_node('Mordor')
    v3 = g.add_node('Monstropolis')
    v4 = g.add_node('Metroville')
    v5 = g.add_node('Naboo')
    v6 = g.add_node('Narnia')
    g.add_nondirectional_edge(v1, v2, 110)
    g.add_nondirectional_edge(v2, v3, 50)
    g.add_nondirectional_edge(v2, v4, 12)
    g.add_nondirectional_edge(v3, v5, 43)
    g.add_nondirectional_edge(v4, v5, 23)
    g.add_nondirectional_edge(v4, v6, 14)
    g.add_nondirectional_edge(v5, v6, 21)
    actual = g.get_edge(['Mordor'])
    expected = (True, '$0')
    assert actual == expected
def test_to_neighbors_dict_no_neighbors():
    graph = Graph()
    a = graph.add_node("a")
    neighbors_dict = to_neighbors_dict(graph.get_neighbors(a))
    assert neighbors_dict == {}
def test_get_neighbors_no_neighbors():
    graph = Graph()
    banana = graph.add_node('banana')
    neighbors = graph.get_neighbors(banana)
    assert len(neighbors) == 0
    assert neighbors == []
def test_get_nodes():
    graph = Graph()
    banana = graph.add_node('banana')
    apple = graph.add_node('apple')
    dog = graph.add_node('dog')
    assert len(graph.get_nodes()) == 3
def test_add_one_edge():
    graph = Graph()
    end = graph.add_node('end')
    start = graph.add_node('start')
    graph.add_edge(start, end)
def test_add_node():

    graph = Graph()

    assert graph.add_node('a').value == 'a'
def test_is_path_bfs_true():
    graph = Graph()
    n1 = graph.add_node(1)
    n2 = graph.add_node(2)
    graph.add_edge(n1, n2)
    assert (graph.isPathBFS(n1, n2)) == True
def test_add_node():
    graph = Graph()
    assert graph.add_node('batool').value == 'batool'
def test_is_path_bfs_false():
    graph = Graph()
    n1 = graph.add_node(1)
    n2 = graph.add_node(2)
    graph.add_edge(n1, n2)
    assert (graph.isPathBFS(n2, n1)) == False