import test from 'ava';
import { Graph, GraphStyles, Color, NodeStyles, GraphLayouts } from '../lib';

const result = `digraph foo {
  subgraph cluster_foo_baz {
    color = #ff0000
    style = bold

    subgraph cluster_foo_baz_nested {
      color = #808080
      style = dotted

      subgraph cluster_foo_baz_nested_unnamed {
        color = #808080
        style = dotted
      }
    }

    foo_baz_asd [label="asd"]
    foo_baz_test [style="bold", color="#808080"]
  }

  foo_baz [label="baz"]
  foo_foo [label="foo"]

  foo_foo -> foo_baz
}`;

const non_directional = `graph foo {
  subgraph cluster_foo_bar {
    foo_bar_baz [label="baz"]
    foo_bar_asd [label="asd"]

    foo_bar_baz -- foo_bar_asd
  }

  foo_foo [label="foo"]

  foo_bar_baz -- foo_foo
}`;

const attributes = `digraph attr {
  color = #000000
  style = bold
  overlap = false
  splines = true
  layout = neato
}`;

test ('serialize', (t) => {
  const g = new Graph ('foo');

  t.is (g.full_name, 'foo');
  g.add_graph ((graph) => {
    graph.name = 'baz';
    graph.add_node ('asd');
    graph.add_node ((n) => {
      n.name = 'test';
      n.style = NodeStyles.bold;
      n.color = Color.gray;
    });

    // eslint-disable-next-line no-shadow
    graph.add_graph ((g) => {
      g.style = GraphStyles.dotted;
      g.color = Color.gray;
      g.name = 'nested';

      // eslint-disable-next-line no-shadow, max-nested-callbacks
      g.add_graph ((g) => {
        g.style = GraphStyles.dotted;
        g.color = Color.gray;
      });
    });
    graph.style = GraphStyles.bold;
    graph.color = Color.red;
  });

  const baz = g.add_node ('baz');
  const foo = g.add_node ('foo');

  g.add_edge (foo, baz);

  const serialized = g.toString ();

  t.is (serialized, result);
});

test ('non directional', (t) => {
  const g = new Graph ('foo');

  g.directional = false;

  let n = '';

  g.add_graph ((sub) => {
    sub.name = 'bar';
    n = sub.add_node ('baz');
    const n2 = sub.add_node ('asd');

    sub.add_edge (n, n2);
  });

  const f = g.add_node ('foo');

  g.add_edge (n, f);

  t.is (g.toString (), non_directional);
});

test ('attributes', (t) => {
  const g = new Graph ('attr');

  g.layout = GraphLayouts.neato;
  g.overlap = false;
  g.splines = true;
  g.color = Color.black;
  g.style = GraphStyles.bold;

  t.is (g.toString (), attributes);
});