The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strictures 1;
use Test::More;
use Test::Deep;
use Test::Fatal;

use Log::Structured;

my $var;

my $l_s = Log::Structured->new({
  category => 'CORE',
  priority => 'DEBUG',
  log_line       => 1,
  log_file       => 1,
  log_package    => 1,
  log_subroutine => 1,
  log_category   => 1,
  log_priority   => 1,
});

$l_s->add_log_event_listener(sub { $var = $_[1] });

like exception { $l_s->add_log_event_listener(1) },
   qr/^log_event_listener must be a coderef!/,
   'add_log_event_listener is validated correctly';

like exception { $l_s->add_log_event_listener([]) },
   qr/^log_event_listener must be a coderef!/,
   'add_log_event_listener is validated correctly';

ok !exception { Log::Structured->new({ log_event_listeners => [sub {}] }) },
   'log_event_listener passes through correctly';

like exception { Log::Structured->new({ log_event_listeners => [sub {},1] }) },
   qr/each log_event_listener must be a coderef!/,
   'log_event_listener is validated correctly';

$l_s->log_event({
   message => 'frew',
});

cmp_deeply( $var, {
   line     => __LINE__ - 5,
   package  => __PACKAGE__,
   subroutine => 'Log::Structured::log_event',
   category => 'CORE',
   priority => 'DEBUG',
   message  => 'frew',
   file     => __FILE__,
}, 'simple log event works');

$l_s->log_event({
   message => 'frew',
   category => 'frew',
});

cmp_deeply( $var, {
   line     => __LINE__ - 6,
   package  => __PACKAGE__,
   subroutine => 'Log::Structured::log_event',
   category => 'frew',
   priority => 'DEBUG',
   message  => 'frew',
   file     => __FILE__,
}, 'overriding category works');

{
  my $v;
  my $more_stuff = Log::Structured->new({
    log_milliseconds_since_start => 1,
    log_milliseconds_since_last_log => 1,
    log_date => 1,
    log_host => 1,
    log_pid => 1,
    log_event_listeners => [ sub { $v = $_[1] } ],
  });

  $more_stuff->log_event({ message => 'frew' });

  cmp_deeply( $v, {
    date => [(ignore()) x 9],
    host => ignore(),
    message => 'frew',
    milliseconds_since_start => ignore(),
    milliseconds_since_last_log => ignore(),
    pid => $$,
  }, 'All extra keys are logged');
}

done_testing;