#!perl
use 5.010;
use strict;
use warnings;
use Test::More 0.98;
use Complete::Util qw(complete_comma_sep);
local $Complete::Common::OPT_WORD_MODE = 0;
local $Complete::Common::OPT_CHAR_MODE = 0;
local $Complete::Common::OPT_MAP_CASE = 0;
local $Complete::Common::OPT_FUZZY = 0;
local $Complete::Common::OPT_CI = 0;
test_complete(
word => '',
elems => [qw(a aa b)],
result => [qw(a aa b)],
);
test_complete(
word => 'a',
elems => [qw(a aa b)],
result => [qw(a aa)],
);
test_complete(
word => 'aa',
elems => [qw(a aa b)],
result => [{word=>'aa,', is_partial=>1}],
);
test_complete(
word => 'aaa',
elems => [qw(a aa b)],
result => [qw()],
);
test_complete(
word => 'aa,',
elems => [qw(a aa b)],
result => ['aa,a', 'aa,aa', 'aa,b'],
);
test_complete(
word => 'aa,,',
elems => [qw(a aa b)],
result => ['aa,,a', 'aa,,aa', 'aa,,b'],
);
test_complete(
word => 'aa,aa',
elems => [qw(a aa b)],
result => [{word=>'aa,aa,', is_partial=>1}],
);
test_complete(
word => 'aa,b',
elems => [qw(a aa b)],
result => [{word=>'aa,b,', is_partial=>1}],
);
test_complete(
word => 'aa,c',
elems => [qw(a aa b)],
result => [qw()],
);
test_complete(
word => 'aa,c,',
elems => [qw(a aa b)],
result => ['aa,c,a', 'aa,c,aa', 'aa,c,b'],
);
subtest "arg:uniq" => sub {
test_complete(
word => 'aa,',
elems => [qw(a aa b)],
uniq => 1,
result => ['aa,a', 'aa,b'],
);
test_complete(
word => 'aa,aa',
elems => [qw(a aa b)],
uniq => 1,
result => [qw()],
);
test_complete(
word => 'aa,aa,',
elems => [qw(a aa b)],
uniq => 1,
result => ['aa,aa,a', 'aa,aa,b'],
);
test_complete(
word => 'aa,a',
elems => [qw(a aa b)],
uniq => 1,
result => [{word=>'aa,a,', is_partial=>1}],
);
test_complete(
word => 'aa,a,b',
elems => [qw(a aa b)],
uniq => 1,
result => ['aa,a,b'], # no more commas, all elems have been listed
);
test_complete(
word => 'aa,a,b,',
elems => [qw(a aa b)],
uniq => 1,
result => [qw()],
);
};
subtest "arg:remaining" => sub {
my $remaining = sub {
my ($seen_elems, $elems) = @_;
my %seen;
for (@$seen_elems) {
(my $nodash = $_) =~ s/^-//;
$seen{$nodash}++;
}
my @remaining;
for (@$elems) {
(my $nodash = $_) =~ s/^-//;
push @remaining, $_ unless $seen{$nodash};
}
\@remaining;
};
test_complete(
word => '',
elems => [qw/a -a b -b/],
remaining => $remaining,
result => [qw/-a -b a b/],
);
test_complete(
word => 'a,',
elems => [qw/a -a b -b/],
remaining => $remaining,
result => ['a,-b', 'a,b'],
);
test_complete(
word => '-a,',
elems => [qw/a -a b -b/],
remaining => $remaining,
result => ['-a,-b', '-a,b'],
);
};
# XXX arg:exclude
# XXX opt:ci
# XXX opt:map_case
# XXX opt:word_mode
# XXX opt:char_mode
# XXX opt:fuzzy
# XXX arg:replace_map
# XXX arg:sep (not yet implemented)
DONE_TESTING:
done_testing;
sub test_complete {
my (%args) = @_;
my $name = $args{name} // $args{word};
my $res = complete_comma_sep(
word=>$args{word}, elems=>$args{elems},
exclude=>$args{exclude},
replace_map=>$args{replace_map},
uniq=>$args{uniq},
sep=>$args{sep},
remaining=>$args{remaining},
);
is_deeply($res, $args{result}, "$name (result)")
or diag explain($res);
}