The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;
use Test::More tests => 69;
use Geo::WeatherNWS;

sub num_close {
    my ( $a, $b ) = @_;

    # are two floating point numbers close enough?
    return ( abs( $a - $b ) < 0.0001 );
}

# Test decoding a static observation (no network required)
my $report1 = new_ok('Geo::WeatherNWS');
my $obs1 =
  "2002/02/25 12:00 NSFA 251200Z 00000KT 50KM FEW024 SCT150 27/25 Q1010";
my $decode1 = $report1->decodeobs($obs1);

is( $decode1->{cloudcover}, 'Partly Cloudy', 'decoded cloud cover' );
is( $decode1->{cloudlevel_arrayref}[0], 'FEW024', 'decoded cloud level 1' );
is( $decode1->{cloudlevel_arrayref}[1], 'SCT150', 'decoded cloud level 2' );
is( $decode1->{code},                   'NSFA',   'decoded code (station)' );
is( $decode1->{conditionstext},    'Fair', 'decoded conditions in text' );
is( $decode1->{day},               '25',   'decoded day' );
is( $decode1->{dewpoint_c},        25,     'decoded dewpoint Celius' );
is( $decode1->{dewpoint_f},        77,     'decoded dewpoint Fahrenheit' );
is( $decode1->{heat_index_c},      29,     'decoded heat index Celius' );
is( $decode1->{heat_index_f},      85,     'decoded heat index Fahrenheit' );
is( $decode1->{obs},               $obs1,  'obs matched original' );
is( $decode1->{pressure_mb},       1010,   'decoded pressure mb' );
is( $decode1->{pressure_mmhg},     757,    'decoded pressure mm Hg' );
is( $decode1->{relative_humidity}, 88,     'decoded relative humidity' );
is( $decode1->{station_type},  'Manual', 'decoded station type' );
is( $decode1->{temperature_c}, 27,       'decoded temperature Celius' );
is( $decode1->{temperature_f}, 80,       'decoded temperature Fahrenheit' );
is( $decode1->{time},          '1200',   'decoded time' );
is( $decode1->{windchill_c},   29,       'decoded windchill Celius' );
is( $decode1->{windchill_f},   85,       'decoded windchill Fahrenheit' );
is( $decode1->{winddirtext},   'Calm',   'decoded wind direction' );
is( $decode1->{winddir},       0,        'decoded wind dir' );
is( $decode1->{windgustkts},   0,        'decoded wind gust knots' );
is( $decode1->{windgustmph},   0,        'decoded wind gust mph' );
is( $decode1->{windspeedkts},  0,        'decoded wind speed knots' );
is( $decode1->{windspeedmph},  0,        'decoded wind speed mph' );

ok( num_close( $decode1->{pressure_inhg}, 29.83 ),
    'decoded pressure inches Hg' );
ok( num_close( $decode1->{pressure_kgcm}, 1.030077628 ),
    'decoded pressure kg cm' );
ok( num_close( $decode1->{pressure_lbin}, 14.65112382 ),
    'decoded pressure lb in' );

is(
    $decode1->{directory},
    '/data/observations/metar/stations',
    'expected directory'
);
is( $decode1->{password}, 'weather@cpan.org', 'expected password' );
is( $decode1->{username}, 'anonymous',        'expected username' );

my $report2 = Geo::WeatherNWS::new();
ok( defined($report2), 'Created second object' );

my $obs2 =
'2011/08/10 14:51 KSTL 101451Z 02003KT 10SM FEW080 SCT140 BKN200 24/16 A2991 RMK AO2 SLP115 T02440156 53005 ';
my $decode2 = $report2->decodeobs($obs2);

is( $decode2->{cloudcover}, 'Mostly Cloudy', 'decoded cloud cover' );
is( $decode2->{cloudlevel_arrayref}[0], 'FEW080', 'decoded cloud level 1' );
is( $decode2->{cloudlevel_arrayref}[1], 'SCT140', 'decoded cloud level 2' );
is( $decode2->{cloudlevel_arrayref}[2], 'BKN200', 'decoded cloud level 3' );
is( $decode2->{code},                   'KSTL',   'decoded code (station)' );
is( $decode2->{conditionstext},     'Fair', 'decoded conditions in text' );
is( $decode2->{day},                '10',   'decoded day' );
is( $decode2->{dewpoint_c},         16,     'decoded dewpoint Celius' );
is( $decode2->{dewpoint_f},         60,     'decoded dewpoint Fahrenheit' );
is( $decode2->{heat_index_c},       25,     'decoded heat index Celius' );
is( $decode2->{heat_index_f},       77,     'decoded heat index Fahrenheit' );
is( $decode2->{obs},                $obs2,  'obs matched original' );
is( $decode2->{pressure_mb},        1012,   'decoded pressure mb' );
is( $decode2->{pressure_mmhg},      759,    'decoded pressure mm Hg' );
is( $decode2->{relative_humidity},  60,     'decoded relative humidity' );
is( $decode2->{remark_arrayref}[0], 'RMK',  'decoded remark 1' );
is( $decode2->{remark_arrayref}[1], 'AO2',  'decoded remark 2' );
is( $decode2->{remark_arrayref}[2], '1011.5',    'decoded remark 3' );
is( $decode2->{remark_arrayref}[3], 'T02440156', 'decoded remark 4' );
is( $decode2->{remark_arrayref}[4], '53005',     'decoded remark 5' );
is( $decode2->{station_type},       'Automated', 'decoded station type' );
is( $decode2->{temperature_c},      24,          'decoded temperature Celius' );
is( $decode2->{temperature_f}, 75,      'decoded temperature Fahrenheit' );
is( $decode2->{time},          '1451',  'decoded time' );
is( $decode2->{windchill_c},   25,      'decoded windchill Celius' );
is( $decode2->{windchill_f},   77,      'decoded windchill Fahrenheit' );
is( $decode2->{winddirtext},   'North', 'decoded wind direction' );
is( $decode2->{winddir},       20,      'decoded wind dir' );
is( $decode2->{windgustkts},   0,       'decoded wind gust knots' );
is( $decode2->{windgustmph},   0,       'decoded wind gust mph' );
is( $decode2->{windspeedkts},  3,       'decoded wind speed knots' );
is( $decode2->{windspeedmph},  3,       'decoded wind speed mph' );

ok( num_close( $decode2->{pressure_inhg}, 29.91 ),
    'decoded pressure inches Hg' );
ok( num_close( $decode2->{pressure_kgcm}, 1.032840156 ),
    'decoded pressure kg cm' );
ok( num_close( $decode2->{pressure_lbin}, 14.69041614 ),
    'decoded pressure lb in' );