use Test::More tests => 18;
use Forks::Super;
use strict;
use warnings;

# exercise the tied scalar behaviors of some Forks::Super::Queue variables.

$Forks::Super::MAIN_PID = $$;
Forks::Super::Queue::init();

SKIP: {

  if ($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR) {
    skip "queue monitor disabled", 18;
  }

  # $Forks::Super::Queue::QUEUE_MONITOR_FREQ
  #    1. may be assigned any value
  #    2. but fetched value is a positive integer
  #    3. on change, restarts the queue monitor

  $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 30;
  ok(tied $Forks::Super::Queue::QUEUE_MONITOR_FREQ,
     "\$QUEUE_MONITOR_FREQ is tied");
  ok($Forks::Super::Queue::QUEUE_MONITOR_FREQ == 30, 
     "\$QUEUE_MONITOR_FREQ init");

  $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 10;
  ok($Forks::Super::Queue::QUEUE_MONITOR_FREQ == 10, 
     "\$QUEUE_MONITOR_FREQ change");

  $Forks::Super::Queue::QUEUE_MONITOR_FREQ = -50;
  ok($Forks::Super::Queue::QUEUE_MONITOR_FREQ > 0,
     "\$QUEUE_MONITOR_FREQ is positive");
  $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 30;

  ok(!defined $Forks::Super::Queue::QUEUE_MONITOR_PID,
     "\$QUEUE_MONITOR_PID not defined");

  my $start_after = 5 + Time::HiRes::time();
  my $job = Forks::Super::Job->new({ 
				  queue_priority => 0,
				  style => 'sub',
				  sub => sub { sleep 5 },
				  start_after => $start_after });
  Forks::Super::Queue::queue_job($job);

  ok(defined $Forks::Super::Queue::QUEUE_MONITOR_PID,
     "\$QUEUE_MONITOR_PID defined after job put on queue");

  my $qmpid = $Forks::Super::Queue::QUEUE_MONITOR_PID;
  $Forks::Super::Queue::QUEUE_MONITOR_FREQ = 60;
  ok(defined $Forks::Super::Queue::QUEUE_MONITOR_PID,         ### 6 ###
     "Queue monitor still running after \$QUEUE_MONITOR_FREQ change");
  ok($qmpid eq 'setitimer' 
         || $Forks::Super::Queue::QUEUE_MONITOR_PID != $qmpid,
     "Queue monitor restarted after \$QUEUE_MONITOR_FREQ change");

  $qmpid = $Forks::Super::Queue::QUEUE_MONITOR_PID;

  # $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR
  #    1. takes on boolean values
  #    2. on change to true, kills queue monitor

  ok($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 0
     || $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 1,
     "\$INHIBIT_QUEUE_MONITOR has a boolean value");
  ok(tied $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR,
     "\$INHIBIT_QUEUE_MONITOR is tied");

  @Forks::Super::Queue::QUEUE = ();
  $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR = "";
  ok($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 0,
     "\$INHIBIT_QUEUE_MONITOR has a boolean value");
  Forks::Super::Queue::queue_job($job);

  $qmpid = $Forks::Super::Queue::QUEUE_MONITOR_PID;
  ok(defined($qmpid), 
     "Queue monitor started when \$INHIBIT_QUEUE_MONITOR disabled");

  $Forks::Super::Queue::INHIBIT_QUEUE_MONITOR = 5;
  ok($Forks::Super::Queue::INHIBIT_QUEUE_MONITOR == 1,
     "\$INHIBIT_QUEUE_MONITOR has a boolean value");
  ok(!defined($Forks::Super::Queue::QUEUE_MONITOR_PID),
     "queue monitor disabled when \$INHIBIT_QUEUE_MONITOR enabled");

  # $Forks::Super::QUEUE_INTERRUPT
  #    0. inherits from Forks::Super::Tie::Enum
  #    1. may only be assigned from valid signal names
  #    2. on change, restarts the queue monitor

  if (0 == keys %SIG) {
    skip "\%SIG not initialized. Can't test \$Forks::Super::QUEUE_INTERRUPT",
      4;
  }

  if ($Forks::Super::SysInfo::CONFIG{'setitimer'}) {
    ok(1, "# \$Forks::Super::QUEUE_INTERRUPT not used in setitimer mode");
  } else {
    ok(defined($SIG{$Forks::Super::QUEUE_INTERRUPT}),
       "\$QUEUE_INTERRUPT set to a valid signal name");
  }

  my @sig = keys %SIG;

  my $qi = $Forks::Super::QUEUE_INTERRUPT;
  $Forks::Super::QUEUE_INTERRUPT = $sig[0];
  ok($Forks::Super::QUEUE_INTERRUPT eq $sig[0],
     "\$QUEUE_INTERRUPT set to $sig[0]");

  $Forks::Super::QUEUE_INTERRUPT = 'not a signal name';
  ok($Forks::Super::QUEUE_INTERRUPT eq $sig[0],
     "\$QUEUE_INTERRUPT not set to bogus signal name");
  ok(tied $Forks::Super::QUEUE_INTERRUPT,
     "\$QUEUE_INTERRUPT is tied");


  
}  # end SKIP

waitall;
