The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;

use File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../lib";

use UR;
use Test::More;
use File::Temp;

BEGIN {
    eval "use Getopt::Complete::Cache;";
    if ($@ =~ qr(Can't locate Getopt/Complete/Cache.pm in \@INC)) {
        plan skip_all => 'Getopt::Complete::Cache does not exist on the system';
    } else {
        plan tests => 11;  # This should match the number of keys in %tests below
        use_ok('Getopt::Complete::Cache');
    }
}

my $fh = File::Temp->new();
my $fname = $fh->filename;

# Create the file
my $cmd = UR::Namespace::Command::Update::TabCompletionSpec->create(classname => 'UR::Namespace::Command', output => $fname);
ok($cmd, 'Created command object');
$cmd->dump_error_messages(0);
$cmd->dump_warning_messages(0);
$cmd->queue_error_messages(1);
$cmd->queue_warning_messages(1);

ok($cmd->execute(), 'creating ur spec file in tmp');

my @messages = $cmd->warning_messages();
ok(!scalar(@messages), 'executing command generated no warning messages');
@messages = $cmd->error_messages();
is(scalar(@messages), 1, 'executing command generated one error message');
like($messages[0],
     qr/Command\.pm\.opts is 0 bytes, reverting to previous/,
     'Error message was correct');

# Try loading/parsing the file
ok(-f $fname, 'Output options file exists');
my $content = join('', $fh->getlines);
my $spec = eval $content;
is($@, '', 'eval of spec file worked');

# first look for >define, the next item in the list is subcommands for define
my $found = 0;
for (my $i = 0; $i < @$spec; $i++) {
    if ($spec->[$i] eq '>define') {
        $found = 1;
        $spec = $spec->[$i+1];
        last;
    }
}
ok($found, 'Found define top-level command data');

$found = 0;
for (my $i = 0; $i < @$spec; $i++) {
    if ($spec->[$i] eq '>namespace') {
        $found = 1;
        last;
    }
}
ok($found, 'Found define namespace command data');

# Try importing the file
my $rv = Getopt::Complete::Cache->import(file => $fname, above => 1, comp_cword => 1); 
is($rv, 1, 'importing ur spec from tmp');