File: accuracy.t

package info (click to toggle)
libgis-distance-perl 0.20-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 204 kB
  • sloc: perl: 587; makefile: 2
file content (52 lines) | stat: -rwxr-xr-x 1,670 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env perl
use 5.008001;
use strictures 2;
use Test2::V0;

use GIS::Distance;

my $test_cases = {
    'Canoga Park to San Francisco' => [ 34.202361, -118.601875,  37.752258, -122.441254,   524.347542197146, 'km'],
    'Egypt to Anchorage'           => [ 26.185018,   30.047607,  61.147543, -149.81575,  10324.656666156,    'km'],
    'London to Sydney'             => [ 51.497736,   -0.115356, -33.81966,   151.169472, 16982.5402359324,   'km'],
    'Santiago to Rio de Janeiro'   => [-33.446339,  -70.63591,  -22.902981,  -43.213177,  2923.66733201558,  'km'],
    'Beirut to Dimashq'            => [ 33.863146,   35.52824,   33.516496,   36.287842, 80241.1054436632,   'm' ],
};
my $test_case_count = @{[ keys %$test_cases ]} + 0;

my $formulas = [qw( ALT Cosine GreatCircle Haversine MathTrig Vincenty )];

foreach my $formula (@$formulas) {
    subtest "run $formula" => sub {
        test_formula( $formula );
        done_testing;
    };
}

done_testing;

sub test_formula {
    my ($formula) = @_;
    my $gis = GIS::Distance->new( "GIS::Distance::$formula" );
    foreach my $title (keys %$test_cases) {
        my $case     = $test_cases->{$title};
        my $unit     = $case->[5];
        my $distance = $case->[4];

        my $length = $gis->distance( $case->[0], $case->[1], $case->[2], $case->[3] )->$unit();

        is_close( $length, $distance, $title );
    }
}

sub is_close {
    my ($num1, $num2, $description) = @_;
    my $lossy = $num2 * 0.00189;
    if (($num1 > $num2 + $lossy) or ($num1 < $num2 - $lossy)) {
        fail( "$description - $num1 != $num2" );
    }
    else {
        pass( "$description - $num1 =~ $num2" );
    }
}