Skip to content

Commit 41f3042

Browse files
authored
binary-search-tree: perform tests for the sortedData test cases. (#434)
1 parent 68f9106 commit 41f3042

File tree

5 files changed

+153
-37
lines changed

5 files changed

+153
-37
lines changed
Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,82 @@
1-
subs: tree
1+
subs: tree treeSort
22
tests: |-
3-
for my $case (@test_cases) {
4-
is(
5-
tree($case->{input}{treeData}),
6-
$case->{expected},
7-
$case->{description},
8-
);
9-
}
3+
subtest data => sub {
4+
for my $case (grep {$_->{property} eq 'data'} @test_cases) {
5+
is(
6+
tree($case->{input}{treeData}),
7+
$case->{expected},
8+
$case->{description},
9+
);
10+
}
11+
};
1012
11-
example: |-
12-
use lib 'lib';
13-
use Exercism::QuickSolve;
13+
subtest sorting => sub {
14+
for my $case (grep {$_->{property} eq 'sortedData'} @test_cases) {
15+
is(
16+
treeSort($case->{input}{treeData}),
17+
$case->{expected},
18+
$case->{description},
19+
);
20+
}
21+
};
1422
23+
example: |-
1524
sub tree {
1625
my ($data) = @_;
26+
my $tree = leaf();
27+
insert($tree, $_) for @$data;
28+
return $tree;
29+
}
1730
18-
quicksolve(
19-
input => $data,
20-
input_key => 'treeData',
21-
);
31+
sub leaf {
32+
return {
33+
data => undef,
34+
left => undef,
35+
right => undef,
36+
};
37+
}
38+
39+
sub insert {
40+
my ($tree, $value) = @_;
41+
if (not defined $tree->{data}) {
42+
$tree->{data} = $value;
43+
}
44+
elsif ($value <= $tree->{data}) {
45+
$tree->{left} //= leaf();
46+
insert($tree->{left}, $value);
47+
}
48+
else {
49+
$tree->{right} //= leaf();
50+
insert($tree->{right}, $value);
51+
}
52+
return;
53+
}
54+
55+
sub treeSort {
56+
my ($data) = @_;
57+
my $tree = tree($data);
58+
my @values = ();
59+
walk($tree, sub {push @values, (shift)->{data}});
60+
return \@values;
61+
}
62+
63+
sub walk {
64+
my ($tree, $sub) = @_;
65+
walk($tree->{left}, $sub) if defined $tree->{left};
66+
$sub->($tree);
67+
walk($tree->{right}, $sub) if defined $tree->{right};
68+
return;
2269
}
2370
2471
stub: |-
2572
sub tree {
2673
my ($data) = @_;
2774
return undef;
2875
}
76+
77+
# You are expected to create a tree and then do an in-order walk.
78+
# Using the sort() function is cheating!
79+
sub treeSort {
80+
my ($data) = @_;
81+
return undef;
82+
}

exercises/practice/binary-search-tree/.meta/solutions/BinarySearchTree.pm

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,53 @@ package BinarySearchTree;
22
use strict;
33
use warnings;
44
use Exporter qw<import>;
5-
our @EXPORT_OK = qw<tree>;
6-
7-
use lib 'lib';
8-
use Exercism::QuickSolve;
5+
our @EXPORT_OK = qw<tree treeSort>;
96

107
sub tree {
118
my ($data) = @_;
9+
my $tree = leaf();
10+
insert( $tree, $_ ) for @$data;
11+
return $tree;
12+
}
13+
14+
sub leaf {
15+
return {
16+
data => undef,
17+
left => undef,
18+
right => undef,
19+
};
20+
}
21+
22+
sub insert {
23+
my ( $tree, $value ) = @_;
24+
if ( not defined $tree->{data} ) {
25+
$tree->{data} = $value;
26+
}
27+
elsif ( $value <= $tree->{data} ) {
28+
$tree->{left} //= leaf();
29+
insert( $tree->{left}, $value );
30+
}
31+
else {
32+
$tree->{right} //= leaf();
33+
insert( $tree->{right}, $value );
34+
}
35+
return;
36+
}
37+
38+
sub treeSort {
39+
my ($data) = @_;
40+
my $tree = tree($data);
41+
my @values = ();
42+
walk( $tree, sub { push @values, (shift)->{data} } );
43+
return \@values;
44+
}
1245

13-
quicksolve(
14-
input => $data,
15-
input_key => 'treeData',
16-
);
46+
sub walk {
47+
my ( $tree, $sub ) = @_;
48+
walk( $tree->{left}, $sub ) if defined $tree->{left};
49+
$sub->($tree);
50+
walk( $tree->{right}, $sub ) if defined $tree->{right};
51+
return;
1752
}
1853

1954
1;

exercises/practice/binary-search-tree/.meta/solutions/binary-search-tree.t

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,26 @@ use constant JSON => JSON::PP->new;
66
use FindBin qw<$Bin>;
77
use lib $Bin, "$Bin/local/lib/perl5";
88

9-
use BinarySearchTree qw<tree>;
9+
use BinarySearchTree qw<tree treeSort>;
1010

11-
our @test_cases = do { local $/; @{ JSON->decode(<DATA>) }; };
11+
my @test_cases = do { local $/; @{ JSON->decode(<DATA>) }; };
1212

13-
imported_ok qw<tree> or bail_out;
13+
imported_ok qw<tree treeSort> or bail_out;
1414

15-
for my $case (@test_cases) {
16-
is( tree( $case->{input}{treeData} ),
17-
$case->{expected}, $case->{description}, );
18-
}
15+
subtest data => sub {
16+
for my $case ( grep { $_->{property} eq 'data' } @test_cases ) {
17+
is( tree( $case->{input}{treeData} ),
18+
$case->{expected}, $case->{description}, );
19+
}
20+
};
21+
22+
subtest sorting => sub {
23+
for my $case ( grep { $_->{property} eq 'sortedData' } @test_cases )
24+
{
25+
is( treeSort( $case->{input}{treeData} ),
26+
$case->{expected}, $case->{description}, );
27+
}
28+
};
1929

2030
done_testing;
2131

exercises/practice/binary-search-tree/BinarySearchTree.pm

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@ package BinarySearchTree;
22
use strict;
33
use warnings;
44
use Exporter qw<import>;
5-
our @EXPORT_OK = qw<tree>;
5+
our @EXPORT_OK = qw<tree treeSort>;
66

77
sub tree {
88
my ($data) = @_;
99
return undef;
1010
}
1111

12+
# You are expected to create a tree and then do an in-order walk.
13+
# Using the sort() function is cheating!
14+
sub treeSort {
15+
my ($data) = @_;
16+
return undef;
17+
}
18+
1219
1;

exercises/practice/binary-search-tree/binary-search-tree.t

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,26 @@ use constant JSON => JSON::PP->new;
66
use FindBin qw<$Bin>;
77
use lib $Bin, "$Bin/local/lib/perl5";
88

9-
use BinarySearchTree qw<tree>;
9+
use BinarySearchTree qw<tree treeSort>;
1010

1111
my @test_cases = do { local $/; @{ JSON->decode(<DATA>) }; };
1212

13-
imported_ok qw<tree> or bail_out;
13+
imported_ok qw<tree treeSort> or bail_out;
1414

15-
for my $case (@test_cases) {
16-
is( tree( $case->{input}{treeData} ),
17-
$case->{expected}, $case->{description}, );
18-
}
15+
subtest data => sub {
16+
for my $case ( grep { $_->{property} eq 'data' } @test_cases ) {
17+
is( tree( $case->{input}{treeData} ),
18+
$case->{expected}, $case->{description}, );
19+
}
20+
};
21+
22+
subtest sorting => sub {
23+
for my $case ( grep { $_->{property} eq 'sortedData' } @test_cases )
24+
{
25+
is( treeSort( $case->{input}{treeData} ),
26+
$case->{expected}, $case->{description}, );
27+
}
28+
};
1929

2030
done_testing;
2131

0 commit comments

Comments
 (0)