import json

import pytest

import networkx as nx
from networkx.readwrite.json_graph import tree_data, tree_graph


def test_graph():
    G = nx.DiGraph()
    G.add_nodes_from([1, 2, 3], color="red")
    G.add_edge(1, 2, foo=7)
    G.add_edge(1, 3, foo=10)
    G.add_edge(3, 4, foo=10)
    H = tree_graph(tree_data(G, 1))
    nx.is_isomorphic(G, H)


def test_graph_attributes():
    G = nx.DiGraph()
    G.add_nodes_from([1, 2, 3], color="red")
    G.add_edge(1, 2, foo=7)
    G.add_edge(1, 3, foo=10)
    G.add_edge(3, 4, foo=10)
    H = tree_graph(tree_data(G, 1))
    assert H.nodes[1]["color"] == "red"

    d = json.dumps(tree_data(G, 1))
    H = tree_graph(json.loads(d))
    assert H.nodes[1]["color"] == "red"


def test_exceptions():
    with pytest.raises(TypeError, match="is not a tree."):
        G = nx.complete_graph(3)
        tree_data(G, 0)
    with pytest.raises(TypeError, match="is not directed."):
        G = nx.path_graph(3)
        tree_data(G, 0)
    with pytest.raises(TypeError, match="is not weakly connected."):
        G = nx.path_graph(3, create_using=nx.DiGraph)
        G.add_edge(2, 0)
        G.add_node(3)
        tree_data(G, 0)
    with pytest.raises(nx.NetworkXError, match="must be different."):
        G = nx.MultiDiGraph()
        G.add_node(0)
        tree_data(G, 0, ident="node", children="node")


# NOTE: To be removed when deprecation expires in 3.0
def test_attrs_deprecation(recwarn):
    G = nx.path_graph(3, create_using=nx.DiGraph)

    # No warnings when `attrs` kwarg not used
    data = tree_data(G, 0)
    H = tree_graph(data)
    assert len(recwarn) == 0

    # DeprecationWarning issued when `attrs` is used
    attrs = {"id": "foo", "children": "bar"}
    with pytest.warns(DeprecationWarning):
        data = tree_data(G, 0, attrs=attrs)
    with pytest.warns(DeprecationWarning):
        H = tree_graph(data, attrs=attrs)
