Skip to content

Commit

Permalink
added horizontal divider above x axis in horizontal graph
Browse files Browse the repository at this point in the history
  • Loading branch information
masukomi committed Feb 4, 2023
1 parent 342f0fd commit 357d3a5
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 32 deletions.
15 changes: 12 additions & 3 deletions lib/Terminal/Graphing/BarChart/Horizontal.rakumod
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,26 @@ 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();


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
!! [];
Expand All @@ -46,15 +53,17 @@ 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
)
.append($padded_x_labels.Array));
}
} elsif $max_x_label > 0 {
$rows.push( $divider_row );
$rows.push($padded_x_labels.Array);
}

Expand Down
59 changes: 30 additions & 29 deletions t/02-horizontal.rakutest
Original file line number Diff line number Diff line change
Expand Up @@ -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 => <a b c d e f g h i j k>.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 => <a b c d e f g h i j k>.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 => <a b c d e f g h i j>.Array
# );
$x_axis_graph = Terminal::Graphing::BarChart::Horizontal.new(
data => $data,
bar_length => 10,
x_axis_labels => <a b c d e f g h i j>.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 => <a b c d e f g h i j>.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 => <a b c d e f g h i j>.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 => <a b c d e f g h i j>.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 => <a b c d e f g h i j>.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;

0 comments on commit 357d3a5

Please sign in to comment.