use Test::More tests => 103; BEGIN { use_ok('Geo::Lookup::ByTime'); } package Point; sub new { my $class = shift; my $self = shift; return bless($self, $class); } sub latitude { return $_[0]->{lat}; } sub longitude { return $_[0]->{lon}; } sub time { return $_[0]->{time}; } package main; my $init_time = time(); my $init_lat = 54.0; my $init_lon = -2.0; my ($time, $lat, $lon); sub restart { ($time, $lat, $lon) = ($init_time, $init_lat, $init_lon); } # Iterator sub iter { return if $lat >= 55.0; my $pt = { lat => $lat, lon => $lon, time => $time }; $lat += 0.01; $lon += 0.02; $time--; return $pt; } restart(); my @p1 = reverse map { iter() } 1 .. 10; my @p2 = map { iter() } 1 .. 10; my @p3 = map { Point->new(iter()) } 1 .. 10; my $lookup = Geo::Lookup::ByTime->new(@p1); is_deeply($lookup->get_points(), \@p1, 'array to constructor'); # Add points by passing an array ref, an array and an iterator $lookup->add_points(\@p3, @p2, \&iter); restart(); my @pall = (); while (my $pt = iter()) { unshift @pall, $pt; } my $pts = $lookup->get_points(); delete $_->{orig} for @{$pts}; is_deeply($pts, \@pall, 'added all points'); # Time ascends? my $last_time = undef; for (@{$pts}) { if (defined($last_time)) { ok($last_time < $_->{time}, 'time ascends'); } $last_time = $_->{time}; }