AlignDB-IntSpan
view release on metacpan or search on metacpan
t/01.basic.t view on Meta::CPAN
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 8646;
BEGIN {
use_ok('AlignDB::IntSpan');
}
# Basic hash based set for testing
package TestSet;
sub new {
return bless {}, shift;
}
sub add {
my $self = shift;
$self->{$_} = 1 for @_;
}
sub add_range {
my $self = shift;
die unless ( @_ % 2 ) == 0;
while ( my ( $from, $to ) = splice( @_, 0, 2 ) ) {
die unless $from <= $to;
$self->add( $from .. $to );
}
}
sub remove {
my $self = shift;
delete $self->{$_} for @_;
}
sub remove_range {
my $self = shift;
die unless ( @_ % 2 ) == 0;
while ( my ( $from, $to ) = splice( @_, 0, 2 ) ) {
die unless $from <= $to;
$self->remove( $from .. $to );
}
}
sub as_array_ref {
my $self = shift;
return [ sort { $a <=> $b } map { 1 * $_ } keys %$self ];
}
# Extend AlignDB::IntSpan
package AlignDB::IntSpan;
sub as_array_ref {
my $self = shift;
return [ $self->as_array() ];
}
sub is_sane {
my $self = shift;
my $last = undef;
my $urk = 0;
my @ranges = $self->ranges();
while ( @ranges ) {
my $from = shift @ranges;
my $to = shift @ranges;
if ( $from > $to ) {
warn "elements out of order ($from, $to)";
$urk++;
}
if ( defined($last) && $from <= $last + 1 ) {
warn "runs overlap ($last, $from)";
$urk++;
}
( run in 1.462 second using v1.01-cache-2.11-cpan-39bf76dae61 )