Complete-Bash
view release on metacpan or search on metacpan
t/parse_cmdline.t view on Meta::CPAN
is_deeply(parse_cmdline(point(q|aa \\'b c^|)), [['aa', '\'b', 'c'], 2]);
is_deeply(parse_cmdline(point(q|aa 'b c '^|)), [['aa', 'b c '], 1]);
is_deeply(parse_cmdline(point(q|aa 'b c ' ^|)), [['aa', 'b c ', ''], 2]);
# adjoint with unquoted word
is_deeply(parse_cmdline(point(q|a'b^'|)), [['ab'], 0]);
is_deeply(parse_cmdline(point(q|a'b'^|)), [['ab'], 0]);
is_deeply(parse_cmdline(point(q|a'b' ^|)), [['ab', ''], 1]);
is_deeply(parse_cmdline(point(q|a'b ^'|)), [['ab '], 0]);
is_deeply(parse_cmdline(point(q|a'b ^'|)), [['ab '], 0]);
is_deeply(parse_cmdline(point(q|a'b '^|)), [['ab '], 0]);
is_deeply(parse_cmdline(point(q|a'b ' ^|)), [['ab ', ''], 1]);
# adjoint with single-quoted + unquoted (3 adjointed chunks)
is_deeply(parse_cmdline(point(q|a"c"'b '^|)), [['acb '], 0]);
is_deeply(parse_cmdline(point(q|a"c"'b ' ^|)), [['acb ', ''], 1]);
};
subtest "word-breaking characters" => sub {
is_deeply(parse_cmdline(point(q|aa --bb^=c|)), [['aa', '--bb', '=', 'c'], 1]);
is_deeply(parse_cmdline(point(q|aa --bb=c^|)), [['aa', '--bb', '=', 'c'], 3]);
is_deeply(parse_cmdline(point(q|aa --bb==c^|)), [['aa', '--bb', '==', 'c'], 3]);
is_deeply(parse_cmdline(point(q|a b@c^|)), [['a','b','@','c'], 3]);
is_deeply(parse_cmdline(point(q|a >b <c^|)), [['a','>','b','<','c'], 4]);
is_deeply(parse_cmdline(point(q(a|b^))), [['a','|','b'], 2]);
is_deeply(parse_cmdline(point(q|a b&^|)), [['a','b','&',''], 3]);
is_deeply(parse_cmdline(point(q|a (b)^|)), [['a','(','b)'], 2]);
is_deeply(parse_cmdline(point(q|a b::c^|)), [['a','b','::','c'], 3]);
# escape prevents word breaking
is_deeply(parse_cmdline(point(q|aa --bb\=c^|)), [['aa', '--bb=c'], 1]);
# quote protects word break character
is_deeply(parse_cmdline(point(q|aa "--bb=c"^|)), [['aa', '--bb=c'], 1]);
is_deeply(parse_cmdline(point(q|aa '--bb=c^|)), [['aa', '--bb=c'], 1]);
};
subtest "variable substitution" => sub {
local $ENV{var} = "foo";
local $ENV{var2}; # unknown var
is_deeply(parse_cmdline(point(q|a^ $var|)), [['a', 'foo'], 0]);
# not performed on current word
is_deeply(parse_cmdline(point(q|a $var^|)), [['a', '$var'], 1]);
is_deeply(parse_cmdline(point(q|a $var^ $var$var|)), [['a', '$var', 'foofoo'], 1]);
is_deeply(parse_cmdline(point(q|a^ $var2|)), [['a', ''], 0]);
# escape prevents variable substitution
is_deeply(parse_cmdline(point(q|a^ \\$var|)), [['a', '$var'], 0]);
# double quote still allows variable substitution
is_deeply(parse_cmdline(point(q|a^ "$var|)), [['a', 'foo'], 0]);
# single quote prevents variable substitution
is_deeply(parse_cmdline(point(q|a^ '$var|)), [['a', '$var'], 0]);
};
subtest "tilde expansion" => sub {
my @ent;
eval { @ent = getpwuid($>) };
$@ and plan skip_all => 'getpwuid($>) dies (probably not implemented)';
@ent or plan skip_all => 'getpwuid($>) is empty';
is_deeply(parse_cmdline(point(q|a^ ~|)), [['a', "$ent[7]"], 0]);
is_deeply(parse_cmdline(point(q|a^ ~/|)), [['a', "$ent[7]/"], 0]);
is_deeply(parse_cmdline(point(q|a^ ~/b|)), [['a', "$ent[7]/b"], 0]);
is_deeply(parse_cmdline(point(q|a^ ~/~|)), [['a', "$ent[7]/~"], 0]);
# not an expanded tilde
is_deeply(parse_cmdline(point(q|a^ a~|)), [['a', "a~"], 0]);
is_deeply(parse_cmdline(point(q|a^ ""~|)), [['a', "~"], 0]);
# XXX test ~username
# not performed on current word
is_deeply(parse_cmdline(point(q|a ~^|)), [['a', '~'], 1]);
# escape prevents tilde expansion
is_deeply(parse_cmdline(point(q|a^ \\~|)), [['a', '~'], 0]);
# double quote prevents tilde expansion
is_deeply(parse_cmdline(point(q|a^ "~|)), [['a', '~'], 0]);
# single quote prevents tilde expansion
is_deeply(parse_cmdline(point(q|a^ '~|)), [['a', '~'], 0]);
};
subtest "opt:truncate_current_word" => sub {
my $opts = {truncate_current_word=>1};
is_deeply(parse_cmdline(point(q|^a|), $opts), [[''], 0]);
is_deeply(parse_cmdline(point(q|a^|), $opts), [['a'], 0]);
is_deeply(parse_cmdline(point(q|a^a|), $opts), [['a'], 0]);
is_deeply(parse_cmdline(point(q|aa^a|), $opts), [['aa'], 0]);
is_deeply(parse_cmdline(point(q|aa^aa|), $opts), [['aa'], 0]);
is_deeply(parse_cmdline(point(q|^a b|), $opts), [['', 'b'], 0]);
is_deeply(parse_cmdline(point(q|a^ b|), $opts), [['a', 'b'], 0]);
is_deeply(parse_cmdline(point(q|a^a b|), $opts), [['a', 'b'], 0]);
is_deeply(parse_cmdline(point(q|aa^a b|), $opts), [['aa', 'b'], 0]);
is_deeply(parse_cmdline(point(q|aa^aa b|), $opts), [['aa', 'b'], 0]);
};
DONE_TESTING:
done_testing;
( run in 1.523 second using v1.01-cache-2.11-cpan-39bf76dae61 )