The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# vim: set sw=2 sts=2 ts=2 expandtab smarttab:
use strict;
use warnings;
use Test::More 0.96;
use lib 't/lib';
use ControlTime;
use TestHelpers -all;

# declare different 'time' sub in local namespace
# to test that Time::Stamp's time() isn't affected
use subs 'time';
sub time { 'silly' }

BEGIN {
  # tell TS that hires is *not* available (so that it just calls time())
  ControlTime->fake_have_hires(0);
}

use Time::Stamp gmstamp => { format => 'compact', us => 1, -as => 'stamp', tz => '' };

trap_warnings {
  is time(), 'silly', 'time() defined in local namespace';

  {
    package # no_index
      _Any_Other_Package;
    ::isnt time(), 'silly', 'time() is pure in another package';
  }

  my $time = 1357714248;
  my $ts = '20130109_065048.000000';

  my $re = qr/^\d{8}_\d{6}\.0{6}$/;

  {
    my $stamp = eval { stamp() };
    like $stamp, $re, 'stamp works before override';
    isnt $stamp, $ts, 'stamp got "real" time';
  }

  ControlTime->set($time);

  {
    is eval { stamp() }, $ts, 'stamp works with overridden time()';
    no_error_ok;
    no_warnings_ok;
  }

  {
    my $bad = eval { stamp('stinky') };

    like $bad, $re, 'stamp works when passed a non-number';
    is $bad, stamp(0), 'stamp returned epoch after numifying string';

    no_error_ok;
    warnings_like(
      qr/Argument "stinky" isn't numeric in gmtime/,
        'got warnings for getting bad value from time()'
    );
  }

  is time(), 'silly', 'time() still defined in local namespace';
};

done_testing;