NAME

Test::MockTime::DateCalc -- fake time for Date::Calc functions

SYNOPSIS

 use Test::MockTime;
 use Test::MockTime::DateCalc; # before Date::Calc loads
 # ...
 use My::Module::Using::Date::Calc;

DESCRIPTION

Test::MockTime::DateCalc arranges for the functions in Date::Calc to follow the Perl level time() function (see perlfunc) and in particular any fake date/time set there by Test::MockTime. The following Date::Calc functions are changed

    System_Clock
    Today
    Now
    Today_and_Now
    This_Year

    Gmtime
    Localtime
    Timezone
    Time_to_Date

Gmtime, Localtime, Timezone and Time_to_Date are made to default to the Perl-level current time(). When called with an explicit time argument, they're unchanged.

Module Load Order

Test::MockTime or similar fakery must be loaded first, before anything with a time() call, which includes Test::MockTime::DateCalc. This is the same as for any CORE::GLOBAL override, see "OVERRIDING CORE FUNCTIONS" in CORE.

Test::MockTime::DateCalc must be loaded before Date::Calc. If Date::Calc is already loaded then its functions might have been imported into other modules and such imports are not affected by the redefinitions made. For that reason, Test::MockTime::DateCalc demands it be the one to load Date::Calc for the first time. Usually this simply means having Test::MockTime::DateCalc at the start of a test script, before the things you're going to test.

    use strict;
    use warnings;
    use Test::MockTime ':all';
    use Test::MockTime::DateCalc;

    use My::Foo::Bar;

    set_fixed_time('1981-01-01T00:00:00Z');
    is (My::Foo::Bar::something(), 1981);
    restore_time();

In a test script, it's often good to have your own modules early to check they correctly load their pre-requisites. You might want a separate test script for that so as not to accidentally rely on Test::MockTime::DateCalc loading Date::Calc.

Other Faking Modules

Test::MockTime::DateCalc can be used with other modules which mangle the Perl-level time too. For example Time::Fake,

    use Time::Fake;                # fakery first
    use Test::MockTime::DateCalc;

Or Time::Mock,

    use Time::Mock;                # fakery first
    use Test::MockTime::DateCalc;

Time::Warp (as of version 0.5) only exports a new time, it's not a core override and so can't be used with Test::MockTime::DateCalc.

SEE ALSO

Date::Calc, Test::MockTime, Time::Fake, Time::Mock

faketime(1)

HOME PAGE

http://user42.tuxfamily.org/test-mocktime-datecalc/index.html

COPYRIGHT

Copyright 2009, 2010, 2011, 2019 Kevin Ryde

Test-MockTime-DateCalc 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 3, or (at your option) any later version.

Test-MockTime-DateCalc 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 Test-MockTime-DateCalc. If not, see <http://www.gnu.org/licenses/>.