#!/usr/bin/env perl
#
# Note: t/test.t searches for the next line.
# Annotation: Demonstrates calling circo instead of dot.

use strict;
use warnings;

use File::Spec;

use GraphViz2;

use IPC::Run3; # For run().

# Generate the dot input.

my($graph) = GraphViz2 -> new
(
	edge   => {color => 'grey'},
	global => {directed => 1},
	graph  => {rankdir => 'TB'},
	node   => {shape => 'oval'},
);

# Redundant.
#$graph -> add_node(name => 'Here');
#$graph -> add_node(name => 'There');
#$graph -> add_node(name => 'Everywhere');

$graph -> add_edge(from => 'Here', to => 'There');
$graph -> add_edge(from => 'There', to => 'Everywhere');
$graph -> add_edge(from => 'Everywhere', to => 'Here');

# Generate the dot output.

$graph -> run;

# Generate the circo output.

my($stdout, $stderr);

run3
	[
		'circo',
		'-Gpage=8.25,10.75',
		'-Grotate=90',
		'-Gmargin=0.125',
		'-Gsize=8.25,10.75'
	],
	\$graph -> dot_input,
	\$stdout,
	\$stderr;

die $stderr if ($stderr);

my($circo_output) = $stdout;

#print '-' x 50, "\n";
#print $circo_output;
#print '-' x 50, "\n";

# Generate the dot output.

if (@ARGV) {
  my($format)      = shift || 'svg';
  my($output_file) = shift || File::Spec -> catfile('html', "circo.$format");

  run3
          [
                  'dot',
                  "-T$format",
          ],
          \$circo_output,
          \$stdout,
          \$stderr;

  die $stderr if ($stderr);

  my($dot_output) = $stdout;

  #print '-' x 50, "\n";
  #print $dot_output;
  #print '-' x 50, "\n";

  open(OUT, '>', $output_file);
  print OUT $dot_output;
  close OUT;

  print "Wrote $output_file. \n";
} else {
  # run as a test
  require Test::More;
  require Test::Snapshot;
  $graph->run(format => 'dot');
  Test::Snapshot::is_deeply_snapshot($graph->dot_input, 'dot file');
  Test::More::done_testing();
}
