#!perl
use 5.010;
use strict;
use warnings;
use Test::More 0.98;
use Complete::Util qw(complete_array_elem);
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 => 'a',
array => [qw(an apple a day keeps the doctor away)],
result => [qw(a an apple away)],
);
test_complete(
word => 'an',
array => [qw(an apple a day keeps the doctor away)],
result => [qw(an)],
);
test_complete(
word => 'any',
array => [qw(an apple a day keeps the doctor away)],
result => [qw()],
);
subtest "arg:exclude" => sub {
test_complete(
name => 'arg:exclude',
word => 'a',
array => [qw(an apple a day keeps the doctor away)],
exclude => [qw(a apple foo)],
result => [qw(an away)],
);
{
local $Complete::Common::OPT_MAP_CASE = 1;
test_complete(
name => 'arg:exclude + opt:map_case',
word => 'a-',
array => [qw(a_b a_bc)],
exclude => [qw(a-b)],
result => [qw(a_bc)],
);
}
};
subtest 'opt:ci' => sub {
local $Complete::Common::OPT_CI = 1;
test_complete(
name => 'opt:ci',
word => 'an',
array => [qw(An apple a day keeps the doctor away)],
result => [qw(An)],
);
test_complete(
name => 'opt:ci + arg:exclude',
word => 'a',
array => [qw(an apple a day keeps the doctor away)],
exclude => [qw(A Apple foo)],
result => [qw(an away)],
);
};
subtest "opt:map_case" => sub {
local $Complete::Common::OPT_MAP_CASE;
$Complete::Common::OPT_MAP_CASE = 0;
test_complete(
name => 'opt:map_case=0',
word => 'a-',
map_case => 0,
array => [qw(a-1 A-2 a_3 A_4)],
result => [qw(a-1)],
);
$Complete::Common::OPT_MAP_CASE = 1;
test_complete(
name => 'opt:map_case=1 (1)',
word => 'a-',
map_case => 1,
array => [qw(a-1 A-2 a_3 A_4)],
result => [qw(a-1 a_3)],
);
test_complete(
name => 'opt:map_case=1 (2)',
word => 'a_',
map_case => 1,
array => [qw(a-1 A-2 a_3 A_4)],
result => [qw(a-1 a_3)],
);
};
subtest "opt:word_mode" => sub {
local $Complete::Common::OPT_WORD_MODE;
$Complete::Common::OPT_WORD_MODE = 0;
test_complete(
name => 'opt:word_mode=0',
word => 'a-b',
array => [qw(a-f-B a-f-b a-f-ab a-f-g-b)],
result => [qw()],
);
$Complete::Common::OPT_WORD_MODE = 1;
test_complete(
name => 'opt:word_mode=1',
word => 'a-b',
array => [qw(a-f-B a-f-b a-f-ab a-f-g-b)],
result => [qw(a-f-b a-f-g-b)],
);
test_complete(
name => 'opt:word_mode=1 searching non-first word',
word => '-b',
array => [qw(a-f-B a-f-b a-f-ab a-f-g-b)],
result => [qw(a-f-b a-f-g-b)],
);
};
subtest "opt:char_mode (prefix)" => sub {
local $Complete::Common::OPT_CHAR_MODE;
$Complete::Common::OPT_CHAR_MODE = 0;
test_complete(
name => 'opt:char_mode=0',
word => 'ab',
array => [qw(axb xaxb ba)],
result => [qw()],
);
$Complete::Common::OPT_CHAR_MODE = 1;
test_complete(
name => 'opt:char_mode=1',
word => 'ab',
array => [qw(axb xaxb ba)],
result => [qw(axb)],
);
};
subtest "opt:char_mode" => sub {
local $Complete::Common::OPT_CHAR_MODE;
$Complete::Common::OPT_CHAR_MODE = 0;
test_complete(
name => 'opt:char_mode=0',
word => 'ab',
array => [qw(bxb xaxb ba)],
result => [qw()],
);
$Complete::Common::OPT_CHAR_MODE = 1;
test_complete(
name => 'opt:char_mode=1',
word => 'ab',
array => [qw(bxb xaxb ba)],
result => [qw(xaxb)],
);
};
subtest "opt:fuzzy" => sub {
local $Complete::Common::OPT_FUZZY;
$Complete::Common::OPT_FUZZY = 1;
test_complete(
name => 'opt:fuzzy=1',
word => 'apl',
array => [qw(apple orange Apricot)],
result => [qw(apple)],
);
};
subtest "arg:replace_map" => sub {
test_complete(
name => 'arg:replace_map (1)',
word => "um",
array => ["mount", "unmount", "sync-to", "sync-from"],
replace_map => {unmount => [qw/umount/]},
result => ["unmount"],
);
test_complete(
name => 'arg:replace_map (2)',
word => "umount",
array => ["mount", "unmount", "sync-to", "sync-from"],
replace_map => {unmount => [qw/umount/]},
result => ["unmount"],
);
{
local $Complete::Common::OPT_CHAR_MODE = 1;
test_complete(
name => 'arg:replace_map + opt:char_mode=1',
word => "to",
array => ["mount", "unmount", "sync-to", "sync-from"],
replace_map => {unmount => [qw/umount/]},
result => ["sync-to"],
);
}
{
local $Complete::Common::OPT_CI = 1;
test_complete(
name => 'arg:replace_map + opt:ci=1',
word => "uMO",
array => ["mount", "unmount"],
replace_map => {Unmount => [qw/Umount/]},
result => ["Unmount"],
);
}
};
subtest "arg:summaries" => sub {
test_complete(
word => 'a',
array => [qw(an apple a day keeps the doctor away)],
summaries => [qw(S1 S2 S3 S4 S5 S6 S7 S8)],
result => [
{word=>"a" , summary=>"S3"},
{word=>"an" , summary=>"S1"},
{word=>"apple", summary=>"S2"},
{word=>"away" , summary=>"S8"},
],
);
};
DONE_TESTING:
done_testing();
sub test_complete {
my (%args) = @_;
my $name = $args{name} // $args{word};
my $res = complete_array_elem(
word=>$args{word}, array=>$args{array}, exclude=>$args{exclude},
replace_map=>$args{replace_map},
summaries=>$args{summaries},
);
is_deeply($res, $args{result}, "$name (result)")
or diag explain($res);
}