The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;
use warnings;

use Test::More tests => 7;

require Fatal;

my @default = expand(':default');
my @threads = expand(':threads');
my @io = expand(':io');
my %io_hash = map { $_ => 1 } @io;
my @default_minus_io = grep { !exists($io_hash{$_}) } @default;

is_deeply(translate('!a', 'a'), ['!a'], 'Keeps insist variant');

is_deeply(translate(':default'), \@default,
          'translate and expand agrees');

is_deeply(translate(':default', ':void', ':io'),
          [@default_minus_io, ':void', @io],
          ':void position is respected');

is_deeply(translate(':default', ':void', ':io', ':void', ':threads'),
          [':void', @io, ':void', @threads],
          ':void (twice) position are respected');

is_deeply(translate(':default', '!', ':io'),
    [@default_minus_io, '!', @io], '! position is respected');

is_deeply(translate(':default', '!', ':io', '!', ':threads'),
          ['!', @io, '!', @threads],
          '! (twice) positions are respected');

is_deeply(translate(':default', '!open', '!', ':io'),
    [@default_minus_io, '!open', '!', grep { $_ ne 'open' } @io],
          '!open ! :io works as well');

sub expand {
    # substr is to strip "CORE::" without modifying $_
    return map { substr($_, 6) } @{Fatal->_expand_tag(@_)};
}

sub translate {
    return [Fatal->_translate_import_args(@_)];
}