use strict;
use Test::More qw(no_plan);
use DBI;

BEGIN{ use_ok( 'Geo::Distance' ); }

my $geo = eval{ return Geo::Distance->new() };
ok(!$@,'create a Geo::Distance object');

my $dist;

$dist = eval{ $geo->distance( 'mile', "-81.044","35.244", "-80.8272","35.1935" ) };
ok( (not($@) and int($dist)==12), 'measure a distance by mile' );

SKIP: {
	eval{ require DBD::SQLite };
	skip "DBD::SQLite not installed" if $@;
	
	my $dbh = eval{ return DBI->connect( "dbi:SQLite:dbname=test.db", "", "", {AutoCommit => 0} ) };
	ok( !$@, 'connect/create SQLite test.db' );
	eval{ load_zips( $dbh ) };
	ok( !$@, 'populate test.db with sample zip code locations' );
	
	eval{ $geo->closest( dbh=>$dbh, table=>'zips', lon=>'-80.7881', lat=>'35.22', unit=>'mile', distance=>'5' ) };
	ok( !$@, 'run closest' );
	
	my $locations;
	
	$locations = $geo->closest( dbh=>$dbh, table=>'zips', lon=>'-80.7881', lat=>'35.22', unit=>'mile', distance=>'5' );
	ok( (@$locations==11), 'found correct number of locations by mile' );
	$locations = $geo->closest( dbh=>$dbh, table=>'zips', lon=>'-80.8577', lat=>'35.1316', unit=>'kilometer', distance=>'5' );
	ok( (@$locations==2), 'found correct number of locations by kilometer' );
	$locations = $geo->closest( dbh=>$dbh, table=>'zips', lon=>'-80.8577', lat=>'35.1316', unit=>'mile', distance=>'5', count=>3 );
	ok( (@$locations==3), 'found correct number of locations limited by count' );
	
	$dbh->disconnect;
	unlink('test.db');
}

sub load_zips {
	my $dbh = shift;
	
	$dbh->do(q{
		CREATE TABLE zips (
			zip CHAR(5),
			lon DECIMAL(13,3),
			lat DECIMAL(13,3)
		)
	});
	
	my $sth = $dbh->prepare(q{ INSERT INTO zips (lon,lat,zip) VALUES (?,?,?) });
	
	$sth->execute("-81.044","35.244","28012");
	$sth->execute("-81.0306","35.3119","28120");
	$sth->execute("-81.0079","35.0972","28217");
	$sth->execute("-80.9604","35.1467","28278");
	$sth->execute("-80.9586","35.026","29715");
	$sth->execute("-80.9571","35.2731","28214");
	$sth->execute("-80.8967","35.1596","28273");
	$sth->execute("-80.8964","35.2358","28208");
	$sth->execute("-80.8858","35.0709","28134");
	$sth->execute("-80.8702","35.2834","28216");
	$sth->execute("-80.8647","35.422","28078");
	$sth->execute("-80.8583","35.2081","28203");
	$sth->execute("-80.8577","35.1316","28210");
	$sth->execute("-80.8559","35.1796","28209");
	$sth->execute("-80.8419","35.229","28202");
	$sth->execute("-80.8272","35.1935","28207");
	$sth->execute("-80.8265","35.2522","28206");
	$sth->execute("-80.8232","35.2132","28204");
	$sth->execute("-80.8209","35.2886","28269");
	$sth->execute("-80.8167","35.0869","28226");
	$sth->execute("-80.8002","35.1345","28277");
	$sth->execute("-80.7932","35.1677","28211");
	$sth->execute("-80.7881","35.22","28205");
	$sth->execute("-80.776","35.2725","28262");
	$sth->execute("-80.7669","35.1355","28270");
	$sth->execute("-80.7501","35.3179","28213");
	$sth->execute("-80.7448","35.1908","28212");
	$sth->execute("-80.7387","35.244","28215");
	$sth->execute("-80.7279","34.9553","28173");
	$sth->execute("-80.7136","35.1219","28105");
	$sth->execute("-80.6846","35.1936","28227");
	$sth->execute("-80.6597","35.0831","28079");
	$sth->execute("-80.6594","35.3247","28075");
	$sth->execute("-80.6162","35.4141","28027");
	$sth->execute("-80.5319","35.2477","28107");
	$sth->execute("-80.53","35.3716","28025");
	
	$dbh->commit;
}



syntax highlighted by Code2HTML, v. 0.9.1