diff --git a/lib/Terminal/Graphing/BarChart/Horizontal.rakumod b/lib/Terminal/Graphing/BarChart/Horizontal.rakumod index a4e2822..b7f2b77 100644 --- a/lib/Terminal/Graphing/BarChart/Horizontal.rakumod +++ b/lib/Terminal/Graphing/BarChart/Horizontal.rakumod @@ -9,6 +9,7 @@ class Terminal::Graphing::BarChart::Horizontal is Terminal::Graphing::BarChart:: # has $.x_axis_labels = []; has $.bar_drawing_character = '▄'; + has $.x_axis_divider_character = '─'; method generate() returns Str { self.validate-or-die(); @@ -16,12 +17,18 @@ class Terminal::Graphing::BarChart::Horizontal is Terminal::Graphing::BarChart:: my $rows = self.generate-core-graph($.data, $.bar_length, $.bar_drawing_character); # 0x0 is top left - my $max_y_label = $.y_axis_labels.map({.chars}).max; + my $max_y_label = $.y_axis_labels.is-empty ?? 0 !! $.y_axis_labels.map({.chars}).max; my $max_x_label = $.x_axis_labels.is-empty ?? 0 !! 1; - #$.x_axis_labels.map({.Str.chars}).max; + #$.x_axis_labels.map({.Str.chars}).max; my $per_x_label_chars = $max_x_label > 0 ?? ($.bar_length / $.x_axis_labels.elems).Int !! 0; # guaranteed evenly divisible + my $divider_row = $max_x_label > 0 + ?? ((' ' x ($max_y_label) + 3) + ~ ($.x_axis_divider_character x $.bar_length)) + .split('', skip-empty=>True) + !! []; + my $padded_x_labels = $max_x_label > 0 ?? $.x_axis_labels.map({self.pad-with-space($_, $per_x_label_chars)}).Array !! []; @@ -46,8 +53,9 @@ class Terminal::Graphing::BarChart::Horizontal is Terminal::Graphing::BarChart:: } } if $max_x_label > 0 { + $rows.push( $divider_row ); $rows.push(self.pad-with-x-array( - " │ ", + " ", $max_y_label + 3, ' ', False @@ -55,6 +63,7 @@ class Terminal::Graphing::BarChart::Horizontal is Terminal::Graphing::BarChart:: .append($padded_x_labels.Array)); } } elsif $max_x_label > 0 { + $rows.push( $divider_row ); $rows.push($padded_x_labels.Array); } diff --git a/t/02-horizontal.rakutest b/t/02-horizontal.rakutest index c12351f..c669547 100644 --- a/t/02-horizontal.rakutest +++ b/t/02-horizontal.rakutest @@ -16,43 +16,44 @@ is $bare_graph.generate(), $expected_graph, 'bad bare graph'; -# my $x_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( -# data => $data, -# bar_length => 10, -# x_axis_labels => .Array -# ); -# throws-like { $x_axis_graph.generate }, Exception, message => /"bar_length must be evenly divisble"/; +my $x_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( + data => $data, + bar_length => 10, + x_axis_labels => .Array +); +throws-like { $x_axis_graph.generate }, Exception, message => /"bar_length must be evenly divisble"/; -# $x_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( -# data => $data, -# bar_length => 10, -# x_axis_labels => .Array -# ); +$x_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( + data => $data, + bar_length => 10, + x_axis_labels => .Array +); -# $expected_graph = -# " \n▄ \n▄▄ \n▄▄▄ \n▄▄▄▄ \n▄▄▄▄▄ \n▄▄▄▄▄▄ \n▄▄▄▄▄▄▄ \n▄▄▄▄▄▄▄▄ \n▄▄▄▄▄▄▄▄▄ \n▄▄▄▄▄▄▄▄▄▄\nabcdefghij"; -# is $x_axis_graph.generate, $expected_graph, 'bad x axis only graph'; +$expected_graph = +" \n▄ \n▄▄ \n▄▄▄ \n▄▄▄▄ \n▄▄▄▄▄ \n▄▄▄▄▄▄ \n▄▄▄▄▄▄▄ \n▄▄▄▄▄▄▄▄ \n▄▄▄▄▄▄▄▄▄ \n▄▄▄▄▄▄▄▄▄▄\n ──────────\nabcdefghij"; -# my $y_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( -# data => $data, -# bar_length => 10, -# y_axis_labels => .Array -# ); +is $x_axis_graph.generate, $expected_graph, 'bad x axis only graph'; -# $expected_graph = "a │ \nb │ ▄ \nc │ ▄▄ \nd │ ▄▄▄ \ne │ ▄▄▄▄ \nf │ ▄▄▄▄▄ \ng │ ▄▄▄▄▄▄ \nh │ ▄▄▄▄▄▄▄ \ni │ ▄▄▄▄▄▄▄▄ \nj │ ▄▄▄▄▄▄▄▄▄ \n │ ▄▄▄▄▄▄▄▄▄▄"; +my $y_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( + data => $data, + bar_length => 10, + y_axis_labels => .Array +); -# is $y_axis_graph.generate, $expected_graph, 'bad y axis only graph'; +$expected_graph = "a │ \nb │ ▄ \nc │ ▄▄ \nd │ ▄▄▄ \ne │ ▄▄▄▄ \nf │ ▄▄▄▄▄ \ng │ ▄▄▄▄▄▄ \nh │ ▄▄▄▄▄▄▄ \ni │ ▄▄▄▄▄▄▄▄ \nj │ ▄▄▄▄▄▄▄▄▄ \n │ ▄▄▄▄▄▄▄▄▄▄"; -# my $x_and_y_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( -# data => $data, -# bar_length => 10, -# x_axis_labels => .Array, -# y_axis_labels => <0 1 2 3 4 5 6 7 8 9>.Array -# ); +is $y_axis_graph.generate, $expected_graph, 'bad y axis only graph'; + +my $x_and_y_axis_graph = Terminal::Graphing::BarChart::Horizontal.new( + data => $data, + bar_length => 10, + x_axis_labels => .Array, + y_axis_labels => <0 1 2 3 4 5 6 7 8 9>.Array +); -# $expected_graph ="0 │ \n1 │ ▄ \n2 │ ▄▄ \n3 │ ▄▄▄ \n4 │ ▄▄▄▄ \n5 │ ▄▄▄▄▄ \n6 │ ▄▄▄▄▄▄ \n7 │ ▄▄▄▄▄▄▄ \n8 │ ▄▄▄▄▄▄▄▄ \n9 │ ▄▄▄▄▄▄▄▄▄ \n │ ▄▄▄▄▄▄▄▄▄▄\n │ abcdefghij"; +$expected_graph ="0 │ \n1 │ ▄ \n2 │ ▄▄ \n3 │ ▄▄▄ \n4 │ ▄▄▄▄ \n5 │ ▄▄▄▄▄ \n6 │ ▄▄▄▄▄▄ \n7 │ ▄▄▄▄▄▄▄ \n8 │ ▄▄▄▄▄▄▄▄ \n9 │ ▄▄▄▄▄▄▄▄▄ \n │ ▄▄▄▄▄▄▄▄▄▄\n ──────────\n abcdefghij"; -# is $x_and_y_axis_graph.generate, $expected_graph, 'bad x + y axis graph'; +is $x_and_y_axis_graph.generate, $expected_graph, 'bad x + y axis graph'; done-testing;