#!./perl -w
use strict;
use Test::More;
use Config;
plan(skip_all => "POSIX is unavailable")
unless $Config{extensions} =~ /\bPOSIX\b/;
plan(skip_all => "sigemptyset is unavailable on $^O")
if $^O eq 'MSWin32' || $^O eq 'NetWare';
require POSIX;
POSIX->import();
my @signo;
my ($min, $max) = (~0, -1);
sub expected_signals {
my $sigset = shift;
my $desc = shift;
my %expected;
++$expected{$_} foreach @_;
local $Test::Builder::Level = $Test::Builder::Level + 1;
for my $sig ($min..$max) {
if ($expected{$sig}) {
cmp_ok($sigset->ismember($sig), '==', 1,
"$desc - sig $sig is a member");
} else {
cmp_ok($sigset->ismember($sig), '==', 0,
"$desc - sig $sig is not a member");
}
}
}
foreach (@POSIX::EXPORT) {
next unless /^SIG[A-Z0-9]+$/;
my $val = eval "POSIX::$_";
next unless defined $val;
$min = $val if $min > $val;
$max = $val if $max < $val;
push @signo, $val;
}
# Sanity check that we found something:
cmp_ok(scalar @signo, '>=', 6,
'found at least 6 signals (6 are named in the ANSI C spec)');
my $sigset = POSIX::SigSet->new();
isa_ok($sigset, 'POSIX::SigSet', 'checking the type of the object');
expected_signals($sigset, 'new object');
is($sigset->fillset(), '0 but true', 'fillset');
# because on some systems, not all integers are valid signals...
# so the only thing we can really be confident about is that all the signals
# with names are going to be present:
foreach (@signo) {
cmp_ok($sigset->ismember($_), '==', 1, "after fillset sig $_ is a member");
}
is($sigset->emptyset(), '0 but true', 'empyset');
expected_signals($sigset, 'after emptyset');
is($sigset->addset($signo[1]), '0 but true', 'addset');
expected_signals($sigset, 'after addset', $signo[1]);
is($sigset->addset($signo[2]), '0 but true', 'addset');
expected_signals($sigset, 'after addset', $signo[1], $signo[2]);
is($sigset->addset($signo[4]), '0 but true', 'addset');
expected_signals($sigset, 'after addset', $signo[1], $signo[2], $signo[4]);
is($sigset->addset($signo[2]), '0 but true', 'addset');
expected_signals($sigset, 'after addset', $signo[1], $signo[2], $signo[4]);
is($sigset->delset($signo[4]), '0 but true', 'delset');
expected_signals($sigset, 'after addset', $signo[1], $signo[2]);
is($sigset->addset($signo[0]), '0 but true', 'addset');
expected_signals($sigset, 'after addset', $signo[0], $signo[1], $signo[2]);
is($sigset->delset($signo[4]), '0 but true', 'delset');
expected_signals($sigset, 'after delset', $signo[0], $signo[1], $signo[2]);
is($sigset->delset($signo[1]), '0 but true', 'delset');
expected_signals($sigset, 'after delset', $signo[0], $signo[2]);
is($sigset->delset($signo[0]), '0 but true', 'delset');
expected_signals($sigset, 'after addset', $signo[2]);
is($sigset->delset($signo[2]), '0 but true', 'delset');
expected_signals($sigset, 'empty again');
foreach ([$signo[0]],
[$signo[2]],
[$signo[3]],
[@signo[2,3,6]],
) {
$sigset = POSIX::SigSet->new(@$_);
isa_ok($sigset, 'POSIX::SigSet', 'checking the type of the object');
local $" = ', ';
expected_signals($sigset, "new(@$_)", @$_);
}
done_testing();