use strict; use Test; BEGIN { plan tests => 6 } use lib '../lib'; use File::SortedSeek; my $file = './test.file'; my ( $tell, $begin, $finish, $line, $got, $want, @data, @lines, @between ); File::SortedSeek::set_silent; #################### find_time tests #################### @data = (); my $time; for ( 0..3000 ) { # change time every 10 entries so we have 10 identical times $time = scalar gmtime($_) unless $_ % 10; push @data, $time; } write_file ( @data ); open TEST, "<$file" or die "Can't read from test file $!\n"; # basic seek on time string (exact match) $tell = File::SortedSeek::find_time( *TEST, 'Thu Jan 1 00:42:00 1970' ); chomp ( $line = ); ok( $line, 'Thu Jan 1 00:42:00 1970' ); # basic seek on time string (in between match) $tell = File::SortedSeek::find_time( *TEST, 'Thu Jan 1 00:42:42 1970' ); chomp ( $line = ); ok( $line, 'Thu Jan 1 00:42:50 1970' ); # basic seek on epoch time (exact match) $tell = File::SortedSeek::find_time( *TEST, 40 ); chomp ( $line = ); ok( $line, 'Thu Jan 1 00:00:40 1970' ); # basic seek on epoch time (in between match) $tell = File::SortedSeek::find_time( *TEST, 42 ); chomp ( $line = ); ok( $line, 'Thu Jan 1 00:00:50 1970' ); close TEST; # write a new test file for between to keep data set returned small @data = (); for ( 0..1000 ) { push @data, scalar gmtime($_) } write_file ( @data ); open TEST, "<$file" or die "Can't read from test file $!\n"; # check between two inexact epoch times (not in file) $begin = $tell = File::SortedSeek::find_time( *TEST, 41.5 ); $finish = $tell = File::SortedSeek::find_time( *TEST, 52.5 ); @between = File::SortedSeek::get_between( *TEST, $begin, $finish ); $got = join "\n", @between; $want = join "\n", @data[42..52]; ok( $got, $want ); # need to close and reopen FH now binmoded. close TEST; open TEST, "<$file" or die "Can't read from test file $!\n"; # look for date past EOF $tell = File::SortedSeek::find_time( *TEST, 'Thu Jan 1 00:00:00 1971' ); ok( !defined $tell ); close TEST; # write the test file with the data supplied in an array # we use the default system line ending. sub write_file { open TEST, ">$file" or die "Can't write test file $!\n"; print TEST "$_\n" for @_; close TEST; }