The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use warnings;
use lib qw(lib lib/stripes) ;

use Test::More 'no_plan';

use Data::TreeDumper ;
use Hash::Slice 'slice' ;

#-----------------------------------------------------------------------------

use Readonly ;
Readonly my $QUOTE_GLYPH => "'" ;
Readonly my $DOT_GLYPH => '.' ;
Readonly my $MINUS_GLYPH => '-' ;
Readonly my $PIPE_GLYPH => '|' ;

for my $angled_arrow_test
		(
		# up, down, left, up, and origin are generic, angled arrow direction does not matter
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 0, END_Y => 0, DIRECTION => 'up-right', RENDERING => <<'EOR',
s
EOR
		},
		{
		ORIGIN => {X => 1, Y => 0}, END_X => -1, END_Y => 0, DIRECTION => 'up-right', RENDERING => <<'EOR',
es
EOR
		},
		{
		ORIGIN => {X => 2, Y => 0}, END_X => -2, END_Y => 0, DIRECTION => 'up-right', RENDERING => <<'EOR',
e1s
EOR
		},
		{
		ORIGIN => {X => 3, Y => 0}, END_X => -3, END_Y => 0, DIRECTION => 'up-right', RENDERING => <<'EOR',
e11s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 1, END_Y => 0, DIRECTION => 'up-right', RENDERING => <<'EOR',
se
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 2, END_Y => 0, DIRECTION => 'up-right', RENDERING => <<'EOR',
s1e
EOR
		},
		
		#----------------------------------------------------------
		
		{
		ORIGIN => {X => 0, Y => 2}, END_X => 2, END_Y => -2, DIRECTION => 'up-right', RENDERING => <<'EOR',
  c
 1
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 1}, END_X => 2, END_Y => -1, DIRECTION => 'up-right', RENDERING => <<'EOR',
 ce
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 1}, END_X => 1, END_Y => -1, DIRECTION => 'up-right', RENDERING => <<'EOR',
 c
s
EOR
		},
		
		#----------------------------------------------------------
		
		{
		ORIGIN => {X => 7, Y => 4}, END_X => -7, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
e22c
    1
     1
      1
       s
EOR
		},
		{
		ORIGIN => {X => 6, Y => 4}, END_X => -6, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
e2c
   1
    1
     1
      s
EOR
		},
		{
		ORIGIN => {X => 5, Y => 4}, END_X => -5, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
ec
  1
   1
    1
     s
EOR
		},
		{
		ORIGIN => {X => 4, Y => 4}, END_X => -4, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
c
 1
  1
   1
    s
EOR
		},
		{
		ORIGIN => {X => 3, Y => 4}, END_X => -3, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
c
 1
  1
   C
   s
EOR
		},
		{
		ORIGIN => {X => 2, Y => 4}, END_X => -2, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
c
 1
  C
  |
  s
EOR
		},
		{
		ORIGIN => {X => 1, Y => 4}, END_X => -1, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
c
 C
 |
 |
 s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 0, END_Y => -4, DIRECTION => 'up-left', RENDERING => <<'EOR',
e
1
1
1
s
EOR
		},
		
		#----------------------------------------------------------
		
		{
		ORIGIN => {X => 7, Y => 4}, END_X => -7, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
 1
  1
   1
    c22s
EOR
		},
		{
		ORIGIN => {X => 6, Y => 4}, END_X => -6, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
 1
  1
   1
    c2s
EOR
		},
		{
		ORIGIN => {X => 5, Y => 4}, END_X => -5, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
 1
  1
   1
    cs
EOR
		},
		{
		ORIGIN => {X => 4, Y => 4}, END_X => -4, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
 1
  1
   1
    c
EOR
		},
		{
		ORIGIN => {X => 3, Y => 4}, END_X => -3, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
C
 1
  1
   c
EOR
		},
		{
		ORIGIN => {X => 2, Y => 4}, END_X => -2, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
|
C
 1
  c
EOR
		},
		{
		ORIGIN => {X => 1, Y => 4}, END_X => -1, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
|
|
C
 c
EOR
		},
		{
		# dranw as 'up'
		ORIGIN => {X => 0, Y => 4}, END_X => 0, END_Y => -4, DIRECTION => 'left-up', RENDERING => <<'EOR',
e
1
1
1
s
EOR
		},
		
		#--------------------------------------------------------------------------------------		
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 7, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
    c22e
   1
  1
 1
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 6, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
    c2e
   1
  1
 1
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 5, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
    ce
   1
  1
 1
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 4, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
    c
   1
  1
 1
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 3, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
   c
  1
 1
C
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 2, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
  c
 1
C
|
s
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 1, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
 c
C
|
|
s
EOR
		},
		{
		# drawn as 'up'
		ORIGIN => {X => 0, Y => 4}, END_X => 0, END_Y => -4, DIRECTION => 'up-right', RENDERING => <<'EOR',
e
1
1
1
s
EOR
		},
		
		#--------------------------------------------------------------------------------------
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 7, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
       e
      1
     1
    1
s22c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 6, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
      e
     1
    1
   1
s2c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 5, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
     e
    1
   1
  1
sc
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 4, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
    e
   1
  1
 1
c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 3, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
   e
   C
  1
 1
c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 2, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
  e
  |
  C
 1
c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 4}, END_X => 1, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
 e
 |
 |
 C
c
EOR
		},
		{
		# drawn as 'up'
		ORIGIN => {X => 0, Y => 4}, END_X => 0, END_Y => -4, DIRECTION => 'right-up', RENDERING => <<'EOR',
e
1
1
1
s
EOR
		},
		#--------------------------------------------------------------------------------------
		
		{
		ORIGIN => {X => 7, Y => 0}, END_X => -7, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
       s
      1
     1
    1
e22c
EOR
		},
		{
		ORIGIN => {X => 6, Y => 0}, END_X => -6, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
      s
     1
    1
   1
e2c
EOR
		},
		{
		ORIGIN => {X => 5, Y => 0}, END_X => -5, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
     s
    1
   1
  1
ec
EOR
		},
		{
		ORIGIN => {X => 4, Y => 0}, END_X => -4, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
    s
   1
  1
 1
c
EOR
		},
		{
		ORIGIN => {X => 3, Y => 0}, END_X => -3, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
   s
   C
  1
 1
c
EOR
		},
		{
		ORIGIN => {X => 2, Y => 0}, END_X => -2, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
  s
  |
  C
 1
c
EOR
		},
		{
		ORIGIN => {X => 1, Y => 0}, END_X => -1, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
 s
 |
 |
 C
c
EOR
		},
		{
		# drawn as 'down'
		ORIGIN => {X => 0, Y => 0}, END_X => 0, END_Y => 4, DIRECTION => 'down-left', RENDERING => <<'EOR',
s
1
1
1
e
EOR
		},

		#--------------------------------------------------------------------------------------

		{
		ORIGIN => {X => 7, Y => 0}, END_X => -7, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
    c22s
   1
  1
 1
e
EOR
		},
		{
		ORIGIN => {X => 6, Y => 0}, END_X => -6, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
    c2s
   1
  1
 1
e
EOR
		},
		{
		ORIGIN => {X => 5, Y => 0}, END_X => -5, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
    cs
   1
  1
 1
e
EOR
		},
		{
		ORIGIN => {X => 4, Y => 0}, END_X => -4, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
    c
   1
  1
 1
e
EOR
		},
		{
		ORIGIN => {X => 3, Y => 0}, END_X => -3, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
   c
  1
 1
C
e
EOR
		},
		{
		ORIGIN => {X => 2, Y => 0}, END_X => -2, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
  c
 1
C
|
e
EOR
		},
		{
		ORIGIN => {X => 1, Y => 0}, END_X => -1, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
 c
C
|
|
e
EOR
		},
		{
		# drawn as 'down'
		ORIGIN => {X => 0, Y => 0}, END_X => 0, END_Y => 4, DIRECTION => 'left-down', RENDERING => <<'EOR',
s
1
1
1
e
EOR
		},
		#--------------------------------------------------------------------------------------		)

		{
		ORIGIN => {X => 0, Y => 0}, END_X => 7, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
 1
  1
   1
    c22e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 6, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
 1
  1
   1
    c2e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 5, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
 1
  1
   1
    ce
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 4, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
 1
  1
   1
    c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 3, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
C
 1
  1
   c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 2, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
|
C
 1
  c
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 1, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
|
|
C
 c
EOR
		},
		{
		# drawn as 'down'
		ORIGIN => {X => 0, Y => 0}, END_X => 0, END_Y => 4, DIRECTION => 'down-right', RENDERING => <<'EOR',
s
1
1
1
e
EOR
		},
		#--------------------------------------------------------------------------------------
		
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 7, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
s22c
    1
     1
      1
       e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 6, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
s2c
   1
    1
     1
      e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 5, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
sc
  1
   1
    1
     e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 4, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
c
 1
  1
   1
    e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 3, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
c
 1
  1
   C
   e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 2, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
c
 1
  C
  |
  e
EOR
		},
		{
		ORIGIN => {X => 0, Y => 0}, END_X => 1, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
c
 C
 |
 |
 e
EOR
		},
		{
		# drawn as 'down'
		ORIGIN => {X => 0, Y => 0}, END_X => 0, END_Y => 4, DIRECTION => 'right-down', RENDERING => <<'EOR',
s
1
1
1
e
EOR
		},		
		)
		{
		my ($text, $asciio, $new_element) = get_angled_arrow_text($angled_arrow_test) ;
		is
			(
			"\n$text", "\n$angled_arrow_test->{RENDERING}",
			DumpTree
				(
				scalar(slice($angled_arrow_test, qw[END_X END_Y DIRECTION])),
				'',
				DISPLAY_ADDRESS => 0,
				USE_ASCII => 0 ,
				) 
			)
			or do
				{
				diag DumpTree 
					(
					[split /\n/, $text],
					'got:',
					QUOTE_VALUES => 1,
					DISPLAY_ADDRESS => 0,
					USE_ASCII => 0 ,
					) ;

				diag DumpTree 
					(
					[split /\n/, $angled_arrow_test->{RENDERING}],
					'expected:',
					QUOTE_VALUES => 1,
					DISPLAY_ADDRESS => 0,
					USE_ASCII => 0 ,
					) ;

				#~ diag DumpTree 
					#~ (
					#~ $asciio,
					#~ 'asciio:',
					#~ QUOTE_VALUES => 1,
					#~ DISPLAY_ADDRESS => 1,
					#~ USE_ASCII => 0 ,
					#~ ) ;
					
				last ;
				}
		}

#-----------------------------------------------------------------------------

sub get_angled_arrow_text
{
my ($angled_arrow_definition) = @_ ;

use App::Asciio ;
use App::Asciio::stripes::angled_arrow;
my $asciio = new App::Asciio() ;
$asciio->set_character_size(8, 16) ;

my $new_element = new App::Asciio::stripes::angled_arrow
					({
					GLYPHS => 
						#name: => [$start, $body, $connection, $body_2, $end]
						{
						'origin' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'up'=> ['s', '1', 'c', '2', 'e', '|', 'C'],
						'down' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'left' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'upleft' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'leftup' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'downleft' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'leftdown' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'right' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'upright' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'rightup' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'downright' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						'rightdown' => ['s', '1', 'c', '2', 'e', '|', 'C'],
						},
					
					%{$angled_arrow_definition},
					RESIZABLE => 1,
					}) ;
					
@$new_element{'X', 'Y'} = ($angled_arrow_definition->{ORIGIN}{X}, $angled_arrow_definition->{ORIGIN}{Y}) ;

$asciio->add_elements($new_element) ;

return($asciio->transform_elements_to_ascii_buffer(), $asciio, $new_element) ;
}