use Test::More; # waveunit must match sub wave_near { my ($wave1, $wave2, $precision, $name) = @_; my $pass = 1; if (!UNIVERSAL::isa($wave1, 'HASH') || !UNIVERSAL::isa($wave2,'HASH')) { ok(0); ok(0); ok(0); diag "\nnon-hash: $name\n"; return 0; } foreach my $field (qw(wavemin wavemax)) { my ($val1, $val2); $val1 = $wave1->{$field} if (exists($wave1->{$field})); $val2 = $wave2->{$field} if (exists($wave2->{$field})); do { $pass = 0; diag "\n$field mismatch\n"; } unless near ( $val1, $val2, $precision, $name." ".$field ); } do { $pass = 0; diag "\nwaveunit mismatch\n"; } unless is ( $wave1->{'waveunit'}, $wave2->{'waveunit'}, $name.' waveunit' ); return $pass; } # waveunit doesn't need to match. sub wave_equiv { my ( $wave1, $wave2 ) = ( shift, shift ); require Physics::Solar::VSO::QueryManipulate; ($wave1, $wave2) = Physics::Solar::VSO::QueryManipulate::AlignSpectralUnits( $wave1, $wave2 ); return wave_near( $wave1, $wave2, @_ ); } sub near { my ($val1, $val2, $precision, $name) = @_; # diag ( sprintf ( "\nnear called : %s : %s : %s : %s\n\n", $val1||'', $val2||'', $precision||'', $name||'') ); if (!defined($precision)) { $precision = 0.999999 } elsif ( $precision < 0.5 ) { $precision = 1 - $precision; } elsif ( $precision >= 1 ) { $precision = 1 - ( 10 ** -$precision ); } elsif ( $precision <= 0 ) { $precision = 1 - ( 10 ** $precision ); } return ok (1) if (!defined($val1) and !defined($val2)); if (!defined($val1) or (!defined($val2))) { diag "$name : undefined comparison\n"; return ok (0); } ($val1, $val2) = ($val2, $val1) if ($val1 > $val2); return cmp_ok( ($val1), '>=', $precision*$val2, $name ); }