Algorithm-BinarySearch-Vec

 view release on metacpan or  search on metacpan

t/04_search.t  view on Meta::CPAN

# -*- Mode: CPerl -*-
# t/04_search.t; test search

use Test::More tests=>46;
use Algorithm::BinarySearch::Vec ':default';
no warnings 'portable';

my $NOKEY = $KEY_NOT_FOUND;
my $PKG   = 'Algorithm::BinarySearch::Vec';

##--------------------------------------------------------------
## utils

## $vec = makevec($nbits,\@vals);
sub makevec {
  my ($nbits,$vals) = @_;
  my $vec   = '';
  vec($vec,$_,$nbits)=$vals->[$_] foreach (0..$#$vals);
  return $vec;
}

## \@l = vec2list($vec,$nbits)
sub vec2list {
  use bytes;
  my ($vec,$nbits) = @_;
  return [map {vec($vec,$_,$nbits)} (0..(length($vec)*8/$nbits-1))];
}

## $str = n2str($n)
sub n2str {
  return !defined($_[0]) ? 'undef' : ($_[0]==$NOKEY ? 'NOKEY' : ($_[0]+0));
}

## $str = l2str(\@vlist)
sub l2str {
  return join(' ', map {n2str($_)} @{$_[0]});
}

## $str = h2str(\%i2j)
sub h2str {
  my $h = shift;
  no warnings 'numeric';
  return join(' ', map {(n2str($_).":".n2str($h->{$_}))} sort {$a<=>$b} keys %$h);
}

## $str = fstr("$func")
sub fstr {
  (my $func = shift) =~ s/^Algorithm::BinarySearch::Vec:://;
  return $func;
}

##======================================================================
## test: element-wise: generic

sub check_search {
  my ($func,$nbits,$l,$key,$want) = @_;
  my $label = "check_search: ".fstr($func)."(nbits=$nbits,key=$key,l=[".l2str($l)."]) == $want";
 SKIP: {
    skip("$label: XS support disabled", 1) if ($func =~ /\bXS\b/ && !$Algorithm::BinarySearch::Vec::HAVE_XS);
    my $code = eval "\\\&$func";
    my $v    = makevec($nbits,$l);
    my $i    = $code->($v,$key,$nbits); #, 0,$#$l);
    my $istr = n2str($i);
    my $wstr = n2str($want);
    is($istr, $wstr, $label);
    return ($istr eq $wstr);
  }
}

##--------------------------------------------------------------
## test: element-wise: bsearch: (0) +(5*2) = (1..10)
foreach my $func ("${PKG}::_vbsearch","${PKG}::XS::vbsearch") {
  my $l = [qw(1 2 4 8 16 32 64 128 256)];
  my $ls = l2str($l);
  check_search($func, 32,$l, 8=>3);
  check_search($func, 32,$l, 7=>$NOKEY);
  check_search($func, 32,$l, 0=>$NOKEY);
  check_search($func, 32,$l, 512=>$NOKEY);
  check_search($func, 32,[qw(0 1 1 1 2)], 1=>1);
  print "\n";
}

##--------------------------------------------------------------
## test: element-wise: bsearch_lb: (10) +(6*2) = (11..22)
foreach my $func ("${PKG}::_vbsearch_lb", "${PKG}::XS::vbsearch_lb") {
  my $l = [qw(1 2 4 8 16 32 64 128 256)];



( run in 0.642 second using v1.01-cache-2.11-cpan-140bd7fdf52 )