The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
# -*- encoding: utf-8; indent-tabs-mode: nil -*-
#
#     Test script for Astro::Sunrise
#     Copyright (C) 2015, 2017 Ron Hill and Jean Forget
#
#     This program is distributed under the same terms as Perl 5.16.3:
#     GNU Public License version 1 or later and Perl Artistic License
#
#     You can find the text of the licenses in the F<LICENSE> file or at
#     L<http://www.perlfoundation.org/artistic_license_1_0>
#     and L<https://www.gnu.org/licenses/gpl-1.0.html>.
#
#     Here is the summary of GPL:
#
#     This program is free software; you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation; either version 1, or (at your option)
#     any later version.
#
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with this program; if not, write to the Free Software Foundation,
#     Inc., <https://www.fsf.org/>.
#
use strict;
use warnings;
use Astro::Sunrise(qw(:DEFAULT :constants));
use Test::More;

BEGIN {
  eval "use DateTime;";
  if ($@) {
    plan skip_all => "DateTime needed";
    exit;
  }
}
plan(tests => 4);

my $sunrise_5 = sun_rise({ lon => -118, lat => 33, time_zone =>'America/Los_Angeles', });
my $sunrise_6 = sun_rise({ lon => -118, lat => 33, time_zone =>'America/Los_Angeles',
                           alt => DEFAULT, offset => 0, upper_limb => 0, precise => 0 });

is( $sunrise_5, $sunrise_6 , "Comparing basic parameters with all parameters");

my $sunset_5 = sun_set({ lon => -118, lat => 33, time_zone =>'America/Los_Angeles', });
my $sunset_6 = sun_set({ lon => -118, lat => 33, time_zone =>'America/Los_Angeles',
                         alt => DEFAULT, offset => 0, upper_limb => 0, precise => 0 });

is($sunset_5, $sunset_6, "Comparing basic parameters with all parameters");

my $then = DateTime->today ( time_zone =>'America/Los_Angeles', )->set_hour(12);
my $offset = ($then->offset) /60 /60;
my ($sunrise, $sunset) = sunrise($then->year, $then->mon, $then->mday,
                              -118, 33, $offset, 0);
is ($sunrise, $sunrise_6, "Test DateTime sunrise interface");
is ($sunset,  $sunset_6,  "Test DateTime sunset interface");


__END__

=encoding utf-8

=head1 NAME

08timezone.t -- test script for Astro::Sunrise and its interface with DateTime

=head1 SYNOPSIS

  prove t/08timezone.t

=head1 DESCRIPTION

This test scripts checks the L<Astro::Sunrise> module when used with L<DateTime>.

=head1 BUGS

In version 0.96, this test script would fail on two days each year: on America/Los_Angeles
spring-forward day and on America/Los_Angeles fall-back day. This happens no matter
where the computer is located and no matter how it is configured, because the
timezone name is hard-coded.

Explanation of the bug: the script computes the sunrise and sunset of the current day in
Los Angeles and returns them as L<DateTime> objects. Then it extracts the timezone offset
at midnight (that is, 0 hours in the morning, not 24h in the evening) and compares it with
the timezone offset of the sunrise L<DateTime> object and with the timezone offset of the
sunset L<DateTime> object. The problem is that DST has been put into effect or removed
between 0h and sunrise, so the offsets are different.

In 2017, the bug-inducing dates are 2017-03-12 and 2017-11-05.

=head1 USAGE

To check the bug fix, I need to change the computer's internal date. I do not dare
change it on my physical computer, so I use a VM. So, on the command line in the VM:

  scp jf@192.168.x.y:/path/to/Astro-Sunrise/Astro-Sunrise-0.96.tar.gz .
  tar -zxvf Astro-Sunrise-0.96.tar.gz
  cd Astro-Sunrise-0.96
  perl Makefile.PL
  make
  make test
  sudo date 031216302017
  make test
  sudo date 110512152017
  make test

And you can choose other dates to check the script a bit more thoroughly.

=head1 AUTHOR

Jean Forget (JFORGET at cpan dot org)

=head1 COPYRIGHT and LICENSE

This program is distributed under the same terms as Perl 5.16.3:
GNU Public License version 1 or later and Perl Artistic License

You can find the text of the licenses in the F<LICENSE> file or at
L<http://www.perlfoundation.org/artistic_license_1_0>
and L<https://www.gnu.org/licenses/gpl-1.0.html>.

Here is the summary of GPL:

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., L<https://www.fsf.org/>.

=head1 SEE ALSO

perl(1).

L<Astro::Sunrise>

=cut