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;