#!/usr/bin/perl -w use Test::More; use strict; BEGIN { plan tests => 74; chdir 't' if -d 't'; use lib '../lib'; use_ok ("Graph::Easy") or die($@); }; ############################################################################# my $graph = Graph::Easy->new(); is (ref($graph), 'Graph::Easy'); is ($graph->error(), '', 'no error yet'); is ($graph->nodes(), 0, '0 nodes'); is ($graph->edges(), 0, '0 edges'); is (join (',', $graph->edges()), '', '0 edges'); my $html = $graph->as_html(); like ($html, qr/new( name => 'Bonn' ); my $berlin = Graph::Easy::Node->new( 'Berlin' ); my $edge = $graph->add_edge ($bonn, $berlin); $html = $graph->as_html(); like ($html, qr/Bonn/, 'contains Bonn'); like ($html, qr/Berlin/, 'contains Berlin'); ############################################################################# # with some nodes with attributes $bonn->set_attribute( 'autotitle' => 'name' ); $html = $graph->as_html(); like ($html, qr/title='Bonn'/, 'contains title="Bonn"'); unlike ($html, qr/title=['"]Berlin['"]/, "doesn't contain title Berlin"); ############################################################################# # edges do not have a name, will fallback to the label $edge->set_attribute( 'autotitle' => 'name' ); $html = $graph->as_html(); like ($html, qr/title='Bonn'/, 'contains title="Bonn"'); unlike ($html, qr/title=['"]Berlin['"]/, "doesn't contain title Berlin"); unlike ($html, qr/title=['"]['"]/, "no empty title"); $edge->set_attribute( 'label' => 'my edge' ); $html = $graph->as_html(); like ($html, qr/title="my edge"/, 'contains title="my edge"'); ############################################################################# # check that "shape:" does not appear in CSS or HTML $bonn->set_attribute( 'shape' => 'circle' ); $graph->set_attribute ( 'node', 'shape', 'ellipse' ); my $css = $graph->css(); $html = $graph->as_html(); unlike ($css, qr/shape/, 'shape does not appear in CSS'); unlike ($html, qr/shape/, 'shape does not appear in HTML'); ############################################################################# # "shape: invisible" should result in an empty td tag w/ "border: none" $bonn->set_attribute( 'shape' => 'invisible' ); $css = $graph->css(); $html = $graph->as_html(); unlike ($html, qr/display:\s*none/, 'shape invisible is not display: none'); like ($html, qr/td.*border:\s*none/, 'shape invisible results in border: none'); ############################################################################# # label colors $graph->set_attribute( 'edge', 'label-color' => 'blue' ); $edge->set_attribute( 'label-color' => 'red' ); $css = $graph->css(); $html = $graph->as_html(); unlike ($html, qr/border-bottom:.*;\s*color: #0000ff/, 'no edge is green'); like ($html, qr/border-bottom:.*;\s*color: #ff0000/, 'some edge is red'); ############################################################################# # edge color vs. label colors $edge->set_attribute( 'color' => 'green' ); $html = $graph->as_html(); unlike ($html, qr/border-bottom:.*#0000ff/, 'no edge got blue'); unlike ($html, qr/border-bottom:.*;\s*color: #0000ff/, 'no edge got blue'); like ($html, qr/border-bottom:.*#008000.*;\s*color: #ff0000/, 'color green, label-color red'); ############################################################################# # caption from label $graph->set_attribute( 'graph', 'label' => 'My Graph Label' ); $html = $graph->as_html(); like ($html, qr/
My Graph Label<\/td>/, 'graph caption from label'); ############################################################################# # caption with label-pos $graph->set_attribute( 'graph', 'label' => 'My Graph Label' ); $graph->set_attribute( 'graph', 'label-pos' => 'bottom' ); $html = $graph->as_html(); like ($html, qr/My Graph Label<\/td>/, 'graph caption from label'); ############################################################################# # html_file includes and charset: $html = $graph->as_html_file(); my $charset = quotemeta('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'); like ($html, qr/$charset/, 'html_file includes charset definition'); like ($html, qr/<title>My Graph Label<\/title>/, 'html_file includes <title>'); ############################################################################# # egdes with links, titles and colors $graph = Graph::Easy->new(); $edge = $graph->add_edge('Friedrichshafen', 'Immenstaad'); $edge->set_attribute('title', 'Vrooom!'); $edge->set_attribute('color', 'orange'); $edge->set_attribute('text-style', 'none'); $edge->set_attribute('font-size', '1.5em'); $edge->set_attribute('link', 'http://bloodgate.com'); $edge->set_attribute('label', 'Schiff'); # This tests edge->as_html(), which will not be called for normal operations, # in these cases we would convert the single edge cells to HTML. my $edge_html = <<EDGE <td colspan=4 rowspan=4 class='edge' title='Vrooom!'><a href='http://bloodgate.com' style="color: #ffa500; text-decoration: none; font-size: 1.5em">Schiff</a></td> EDGE ; is ($edge->as_html(), $edge_html, 'edge->as_html()'); # entire graph as html $html = $graph->as_html(); $edge_html = <<EDGE_CELL <td colspan=2 rowspan=2 class="edge lh" style="border-bottom: solid 2px #ffa500;" title="Vrooom!"><a href='http://bloodgate.com' style='color: #ffa500; text-decoration: none; font-size: 1.5em;'>Schiff</a></td> EDGE_CELL ; my $like = quotemeta($edge_html); like ($html, qr/$like/, 'graph->as_html() contains proper edge html'); ############################################################################# # edge style double, double-dash, bold etc $graph = Graph::Easy->new(); $edge = $graph->add_edge('Friedrichshafen', 'Immenstaad'); $edge->set_attribute('style', 'double'); $edge_html = <<EDGE_2 <td colspan=4 rowspan=4 class='edge'></td> EDGE_2 ; is ($edge->as_html(), $edge_html, 'edge->as_html()'); $edge_html = <<EDGE_CELL <td colspan=2 rowspan=2 class="edge lh" style="border-bottom: double #000000;"> </td> EDGE_CELL ; $like = quotemeta($edge_html); $html = $graph->as_html(); like ($html, qr/$like/, 'edge->as_html()'); $edge->set_attribute('style', 'double-dash'); $edge_html = <<EDGE_CELL <td colspan=2 rowspan=2 class="edge lh" style="border-bottom: double #000000;"> </td> EDGE_CELL ; $like = quotemeta($edge_html); $html = $graph->as_html(); like ($html, qr/$like/, 'edge->as_html()'); ############################################################################# # edge color and label-color $edge->set_attribute('label-color', 'blue'); $edge_html = <<EDGE_CELL <td colspan=2 rowspan=2 class="edge lh" style="border-bottom: double #000000;color: #0000ff;"> </td> EDGE_CELL ; $like = quotemeta($edge_html); $html = $graph->as_html(); like ($html, qr/$like/, 'edge->as_html()'); ############################################################################# # a node with a link and a fill color at the same time my $f = $graph->node('Friedrichshafen'); $f->set_attribute('link', 'http://bloodgate.com'); $f->set_attribute('fill', 'red'); $html = $f->as_html(); is ($html, <<EOF <td colspan=4 rowspan=4 class='node' style="background: #ff0000"><a href='http://bloodgate.com'>Friedrichshafen</a></td> EOF , 'fill is on the TD, not the A HREF'); ############################################################################# # a node with a link and a border at the same time $f->set_attribute('border', 'orange'); $html = $f->as_html(); is ($html, <<EOF <td colspan=4 rowspan=4 class='node' style="background: #ff0000;border: solid 1px #ffa500"><a href='http://bloodgate.com'>Friedrichshafen</a></td> EOF , 'border is on the TD, not the A HREF'); ############################################################################# # as_html_file() includes the proper classes $html = $graph->as_html_file(); for my $c (qw/eb lh lv va el sh shl/) { like ($html, qr/table.graph \.$c/, "includes '$c'"); } ############################################################################# # group labels are left-aligned $graph = Graph::Easy->new(); my $group = $graph->add_group('Cities'); my ($A,$B) = $graph->add_edge('Krefeld', 'Düren'); $group->add_nodes($A,$B); $css = $graph->css(); like ($css, qr/group[^\}]*text-align: left;/, 'contains text-align: left'); ############################################################################# # setting a graph color does not override nodes/edges/groups $graph->set_attribute('color', 'red'); $css = $graph->css(); for my $e (qw/node_anon edge group_anon/) { unlike ($css, qr/table.graph\s+\.$e\s+\{[^\}]*[^-]color: #ff0000;/m, "contains not $e color red"); } ############################################################################# # setting a graph font/fill does not override nodes/edges/groups $graph->set_attribute('font', 'times'); $graph->set_attribute('fill', 'blue'); $graph->set_attribute('font-size', '8em'); $graph->set_attribute('align', 'left'); $css = $graph->css(); unlike ($css, qr/table.graph\s+\{[^\}]*font-family: /m, "doesn't contain font-family"); unlike ($css, qr/table.graph\s+\{[^\}]*fill: /m, "doesn't contain fill"); unlike ($css, qr/table.graph\s+\{[^\}]*color: /m, "doesn't contain color"); unlike ($css, qr/table.graph\s+\{[^\}]*background[^\}]*background/m, "doesn't contain two times background"); unlike ($css, qr/table.graph\s+\{[^\}]*text-align/m, "doesn't contain font-size"); unlike ($css, qr/table.graph\s+\{[^\}]*font-size/m, "doesn't contain text-align"); ############################################################################# # multiline labels with \c, \r, and \l in them $graph = Graph::Easy->new(); ($A,$B) = $graph->add_edge('Köln', 'Rüdesheim'); $A->set_attribute('label', 'Köln\r(am Rhein)\l(NRW)\c(Deutschland)'); $html = $graph->as_html_file(); like ($html, qr/class='node'>Köln<br><span class="r">\(am Rhein\)<\/span><br><span class="l">\(NRW\)<\/span><br>\(Deutschland\)</, 'Köln with multiline text'); $A->set_attribute('align', 'right'); $html = $graph->as_html_file(); like ($html, qr/class='node' style="text-align: center"><span class="r">Köln<\/span><br><span class="r">\(am Rhein\)<\/span><br><span class="l">\(NRW\)<\/span><br>\(Deutschland\)</, 'Köln with multiline text'); ############################################################################# # multiline labels with "textwrap: N;" $graph = Graph::Easy->new(); ($A,$B) = $graph->add_edge('Köln', 'Rüdesheim'); $A->set_attribute('label', 'Köln\r(am Rhein)\l(NRW)\c(Deutschland)'); $A->set_attribute('textwrap', 10); #print join (" ", $A->_label_as_html() ); $html = $graph->as_html_file(); like ($html, qr/class='node'>Köln \(am<br>Rhein\)<br>\(NRW\)<br>\(Deutschland\)</, 'Köln with multiline text'); ############################################################################# # invisible edges $graph = Graph::Easy->new(); ($A,$B,$edge) = $graph->add_edge('Hamm', 'Hagen'); $edge->set_attribute('style','invisible'); $edge->set_attribute('label','foobarbaz'); $edge->set_attribute('color','red'); $html = $graph->as_html_file(); unlike ($html, qr/invisible/, 'no border on invisible edges'); unlike ($html, qr/#ff0000/, 'no color on invisible edges'); unlike ($html, qr/foobarbaz/, 'no label on invisible edges'); ############################################################################# # inheritance of attributes via classes $graph = Graph::Easy->new(); ($A,$B,$edge) = $graph->add_edge('green', 'blue.foo'); $graph->set_attribute('color','red'); $graph->set_attribute('node','color','blue'); $graph->set_attribute('node.foo','color','inherit'); $graph->set_attribute('node.bar','color','green'); $graph->set_attribute('edge','color','inherit'); $graph->set_attribute('edge.foo','color','inherit'); $A->set_attribute('class','bar'); $B->set_attribute('class','foo'); $edge->set_attribute('class','foobar'); # no color set my ($C,$D,$E) = $graph->add_edge('blue','red'); $E->set_attribute('class','foo'); # inherits red $D->set_attribute('color','inherit'); # inherits red from graph is ($A->attribute('color'),'green', 'node.bar is green'); is ($B->attribute('color'),'blue', 'node.foo inherits blue from node'); is ($C->attribute('color'),'blue', 'node is just blue'); is ($D->attribute('color'),'red', 'inherits red from graph'); is ($edge->attribute('color'),'black', 'no color set, so defaults to black'); is ($E->attribute('color'),'red', 'inherit red from graph'); ############################################################################# # comments $graph = Graph::Easy->new(); ($A,$B,$edge) = $graph->add_edge('green', 'blue.foo'); $graph->set_attribute('comment', 'My comment --> graph'); $A->set_attribute('comment', 'My comment --> A'); $edge->set_attribute('comment', 'My comment --> edge'); $html = $graph->as_html_file(); like ($html, qr/<!-- My comment --> graph -->/, 'graph comment'); like ($html, qr/<!-- My comment --> A -->/, 'node comment'); like ($html, qr/<!-- My comment --> edge -->/, 'edge comment'); ############################################################################# # colorscheme and class attributes $graph = Graph::Easy->new(); ($A,$B,$edge) = $graph->add_edge('A', 'B'); $graph->set_attribute('colorscheme', 'pastel19'); $graph->set_attribute('node.yellow', 'fill', '1'); $graph->set_attribute('node.yellow', 'color', 'silver'); $A->set_attribute('class', 'yellow'); $html = $graph->as_html_file(); like ($html, qr/node_yellow(.|\n)*background: #fbb4ae;/, 'background is not 1'); like ($html, qr/node_yellow(.|\n)*color: silver;/, 'color is silver'); ############################################################################# # support for \N, \E, \H, \T, \G in titles and labels $graph = Graph::Easy->new(); ($A,$B,$edge) = $graph->add_edge('A', 'B'); $graph->set_attribute('label', 'My Graph'); $graph->set_attribute('node', 'title', 'My \N in \G'); $graph->set_attribute('edge', 'title', 'My \E in \G (\T => \H)'); $html = $graph->as_html_file(); like ($html, qr/title='My A in My Graph'/, 'title with \N and \G'); like ($html, qr/title='My B in My Graph'/, 'title with \N and \G'); like ($html, qr/title="My A->B in My Graph \(A => B\)"/, 'title with \E, \H, \T'); # support for \L in titles $graph->set_attribute('node', 'label', 'labeled "My \N"'); $graph->set_attribute('node', 'title', 'My \L'); $html = $graph->as_html_file(); like ($html, qr/title='My labeled "My A"'/, 'title with \L');