1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
use Test::More;
use Test::LMU;
SCOPE:
{
my @list = ();
is(0, (binsert { $_ cmp "Hello" } "Hello", @list), "Inserting into empty list");
is(1, (binsert { $_ cmp "world" } "world", @list), "Inserting into one-item list");
}
my @even = map { $_ * 2 } 1 .. 100;
my @odd = map { $_ * 2 - 1 } 1 .. 100;
my (@expected, @in);
@in = @even;
@expected = mesh @odd, @even;
foreach my $v (@odd)
{
binsert { $_ <=> $v } $v, @in;
}
is_deeply(\@in, \@expected, "binsert odd elements into even list succeeded");
@in = @even;
@expected = mesh @odd, @even;
foreach my $v (reverse @odd)
{
binsert { $_ <=> $v } $v, @in;
}
is_deeply(\@in, \@expected, "binsert odd elements reversely into even list succeeded");
@in = @odd;
foreach my $v (@even)
{
binsert { $_ <=> $v } $v, @in;
}
is_deeply(\@in, \@expected, "binsert even elements into odd list succeeded");
@in = @odd;
foreach my $v (reverse @even)
{
binsert { $_ <=> $v } $v, @in;
}
is_deeply(\@in, \@expected, "binsert even elements reversely into odd list succeeded");
@in = @even;
@expected = map { $_, $_ } @in;
foreach my $v (@even)
{
binsert { $_ <=> $v } $v, @in;
}
is_deeply(\@in, \@expected, "binsert existing even elements into even list succeeded");
@in = @even;
@expected = map { $_, $_ } @in;
foreach my $v (reverse @even)
{
binsert { $_ <=> $v } $v, @in;
}
is_deeply(\@in, \@expected, "binsert existing even elements reversely into even list succeeded");
leak_free_ok(
'binsert random' => sub {
my @list = map { $_ * 2 } 1 .. 100;
my $elem = int(rand(100)) + 1;
binsert { $_ <=> $elem } $elem, @list;
},
'binsert existing random' => sub {
my @list = map { $_ * 2 } 1 .. 100;
my $elem = 2 * (int(rand(100)) + 1);
binsert { $_ <=> $elem } $elem, @list;
},
'binsert odd into even' => sub {
my @list = @even;
foreach my $elem (@odd)
{
binsert { $_ <=> $elem } $elem, @list;
}
},
'binsert even into odd' => sub {
my @list = @odd;
foreach my $elem (@even)
{
binsert { $_ <=> $elem } $elem, @list;
}
},
'binsert odd into odd' => sub {
my @list = @odd;
foreach my $elem (@odd)
{
binsert { $_ <=> $elem } $elem, @list;
}
},
'binsert even into even' => sub {
my @list = @even;
foreach my $elem (@even)
{
binsert { $_ <=> $elem } $elem, @list;
}
},
);
leak_free_ok(
'binsert random with stack-growing' => sub {
my @list = map { $_ * 2 } 1 .. 100;
my $elem = int(rand(100)) + 1;
binsert { grow_stack(); $_ <=> $elem } $elem, @list;
},
'binsert odd with stack-growing' => sub {
my @list = @even;
foreach my $elem (@odd)
{
binsert { grow_stack(); $_ <=> $elem } $elem, @list;
}
},
'binsert even with stack-growing' => sub {
my @list = @odd;
foreach my $elem (@even)
{
binsert { grow_stack(); $_ <=> $elem } $elem, @list;
}
},
);
leak_free_ok(
'binsert with stack-growing and exception' => sub {
my @list = map { $_ * 2 } 1 .. 100;
my $elem = int(rand(100)) + 1;
eval {
binsert { grow_stack(); $_ <=> $elem or die "Goal!"; $_ <=> $elem } $elem, @list;
};
}
);
is_dying('binsert without sub' => sub { &binsert(42, @even); });
done_testing;
|