#!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' );