#!/usr/bin/perl -w
# test printing into a framebuffer
use Test::More;
use strict;
BEGIN
{
plan tests => 36;
chdir 't' if -d 't';
use lib '../lib';
use_ok ("Graph::Easy::Node") or die($@);
use_ok ("Graph::Easy") or die($@);
use_ok ("Graph::Easy::As_ascii") or die($@);
};
can_ok ("Graph::Easy::Node", qw/
as_ascii
_printfb
_printfb_ver
_draw_label
_framebuffer
_aligned_label
/);
#############################################################################
# general framebuffer tests
my $node = Graph::Easy::Node->new();
is (ref($node), 'Graph::Easy::Node');
is ($node->error(), '', 'no error yet');
my $fb = $node->_framebuffer(2,3);
is (join ("::", @$fb), " :: :: ", 'framebuffer set up');
$node->_printfb( $fb, 0,0, '+');
is (join ("::", @$fb), "+ :: :: ", 'print +');
$node->_printfb( $fb, 1,0, '+');
is (join ("::", @$fb), "++:: :: ", 'print +');
$node->_printfb( $fb, 1,2, '+');
is (join ("::", @$fb), "++:: :: +", 'print +');
$node->_printfb( $fb, 0,0, '--');
is (join ("::", @$fb), "--:: :: +", 'print --');
$node->_printfb( $fb, 0,1, "''");
is (join ("::", @$fb), "--::'':: +", "print ''");
#############################################################################
# multiline printing
$fb = $node->_framebuffer(2,5);
$node->_printfb( $fb, 0,3, "+", "+");
is (join ("::", @$fb), " :: :: ::+ ::+ ", 'print "+\n+"');
$node->_printfb( $fb, 0,2, "|", "|");
is (join ("::", @$fb), " :: ::| ::| ::+ ", 'print "\|\n\|"');
$fb = $node->_framebuffer(4,5);
is (join ("::", @$fb), " :: :: :: :: ", 'new fb set up');
$node->_printfb( $fb, 1,1, "01", "234");
is (join ("::", @$fb), " :: 01 :: 234:: :: ", 'new fb set up');
#############################################################################
# _draw_border() tests
$fb = $node->_framebuffer(12,6);
$node->{w} = 12;
$node->{h} = 6;
$node->_draw_border( $fb, 'solid', 'solid', 'solid', 'solid');
is (join ("::", @$fb),
'+----------+::| |::| |::| |::| |::+----------+',
'solid border');
$fb = $node->_framebuffer(8,4);
$node->{w} = 8;
$node->{h} = 4;
my @expect = (
' \n \n \n ',
'+------+\n| |\n| |\n+------+',
'........\n: :\n: :\n:......:',
'+ - - -+\n\' \'\n\' \'\n+ - - -+',
'+-.-.-.+\n! !\n! !\n+-.-.-.+',
'+.-..-.+\n| |\n: :\n+.-..-.+',
'########\n# #\n# #\n########',
'#======#\nH H\nH H\n#======#',
'# = = =#\n" "\n" "\n# = = =#',
'+~~~~~~+\n{ {\n} }\n+~~~~~~+',
);
my $i = 0;
for my $style (qw/ none solid dotted dashed dot-dash dot-dot-dash bold double double-dash wave/)
{
$node->_draw_border( $fb, $style, $style, $style, $style);
is (join ('\n', @$fb),
$expect[$i],
"$style border");
$i++;
}
#############################################################################
# _draw_border() tests with different styles
$fb = $node->_framebuffer(8,4);
$node->{w} = 8;
$node->{h} = 4;
$node->_draw_border( $fb, 'solid', 'dotted', 'solid', 'solid');
is (join ("::", @$fb),
'+------+::| |::| |:::......:',
'solid border, except bottom, which is dotted');
#############################################################################
# label alignments
$node->set_attribute('label', 'left\r right\l left\c center\n normal');
my ($lines,$aligns) = $node->_aligned_label();
is_deeply ( $lines, [ 'left', 'right', 'left', 'center', 'normal' ],
'lines are ok');
is_deeply ( $aligns, [ 'c', 'r', 'l', 'c', 'c', ], 'aligns is ok');
# empty lines at the are thrown away
$node->set_attribute('label', 'left\r right\l left\c center\n normal\c');
($lines,$aligns) = $node->_aligned_label();
is_deeply ( $lines, [ 'left', 'right', 'left', 'center', 'normal' ],
'lines are ok');
is_deeply ( $aligns, [ 'c', 'r', 'l', 'c', 'c', ], 'aligns is ok');
# start with alignment
$node->set_attribute('label', '\rleft\r right\l left\c center\n normal\c');
($lines,$aligns) = $node->_aligned_label();
is_deeply ( $lines, [ '', 'left', 'right', 'left', 'center', 'normal' ],
'lines are ok');
is_deeply ( $aligns, [ 'c', 'r', 'r', 'l', 'c', 'c', ], 'aligns is ok');
# start with alignment
$node->set_attribute('label', '\r\l\rleft\r right\l left\c center\n normal\c');
($lines,$aligns) = $node->_aligned_label();
is_deeply ( $lines, [ '','','','left', 'right', 'left', 'center', 'normal' ],
'lines are ok');
is_deeply ( $aligns, [ 'c','r','l','r', 'r', 'l', 'c', 'c', ], 'aligns is ok');