Test-Perinci-CmdLine
view release on metacpan or search on metacpan
lib/Test/Perinci/CmdLine.pm view on Meta::CPAN
argv => [],
stdin => "bar\nbaz",
stdout_like => qr/a1=\[bar,baz\]/,
},
],
}, # cmdline_src (stdin_or_args)
{
name => 'dry-run',
tests => [
{
tags => ['dry-run'],
name => 'dry-run (via env, 0)',
gen_args => {url=>'/Perinci/Examples/dry_run'},
#inline_gen_args => {...},
env => {DRY_RUN=>0},
argv => [],
stdout_like => qr/wet/,
},
{
tags => ['dry-run'],
name => 'dry-run (via env, 1)',
gen_args => {url=>'/Perinci/Examples/dry_run'},
#inline_gen_args => {...},
env => {DRY_RUN=>1},
argv => [qw//],
stdout_like => qr/dry/,
},
{
tags => ['dry-run'],
name => 'dry-run (via cmdline opt)',
gen_args => {url=>'/Perinci/Examples/dry_run'},
#inline_gen_args => {...},
argv => [qw/--dry-run/],
stdout_like => qr/dry/,
},
],
}, # dry-run
{
name => 'tx',
tests => [
{
tags => ['tx', 'dry-run'],
name => 'dry_run (using tx) (w/o)',
gen_args => {url=>'/Perinci/Examples/Tx/check_state'},
argv => [],
stdout_like => qr/^$/,
},
{
tags => ['tx', 'dry-run'],
name => 'dry_run (using tx) (w/)',
gen_args => {url=>'/Perinci/Examples/Tx/check_state'},
argv => [qw/--dry-run/],
stdout_like => qr/check_state/,
},
],
}, # tx
{
name => 'streaming',
before_all_tests => sub {
write_text("$tempdir/infile-str", "one\ntwo three\nfour\n");
write_text("$tempdir/infile-hash-json", qq({}\n{"a":1}\n{"b":2,"c":3}\n{"d":4}\n));
write_text("$tempdir/infile-invalid-json", qq({}\n{\n));
write_text("$tempdir/infile-int", qq(1\n3\n5\n));
write_text("$tempdir/infile-invalid-int", qq(1\nx\n5\n));
write_text("$tempdir/infile-words", qq(word1\nword2\n));
write_text("$tempdir/infile-invalid-words", qq(word1\nword2\nnot a word\n));
},
tests => [
# streaming input
{
tags => ['streaming', 'streaming-input'],
name => "stream input, simple type, chomp on",
gen_args => {url => '/Perinci/Examples/Stream/count_lines'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-str"],
stdout_like => qr/
3
/mx,
},
{
tags => ['streaming', 'streaming-input'],
name => "stream input, simple type, chomp off",
gen_args => {url => '/Perinci/Examples/Stream/wc'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-str"],
stdout_like => qr/
^chars \s+ 19\n
^lines \s+ 3\n
^words \s+ 4\n
/mx,
},
{
tags => ['streaming', 'streaming-input'],
name => "stream input, json stream",
gen_args => {url => '/Perinci/Examples/Stream/wc_keys'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-hash-json"],
stdout_like => qr/^keys \s+ 4\n/mx,
},
{
tags => ['streaming', 'streaming-input', 'validate-streaming-input'],
name => 'stream input, simple type, word validation', # also test that each record is chomp-ed
gen_args => {url => '/Perinci/Examples/Stream/count_words'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-words"],
stdout_like => qr/2/,
},
{
tags => ['streaming', 'streaming-input', 'validate-streaming-input'],
name => 'stream input, simple types, word validation, error',
gen_args => {url => '/Perinci/Examples/Stream/count_words'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-invalid-words"],
exit_code_like => qr/[1-9]/,
stderr_like => qr/fails validation/,
},
{
tags => ['streaming', 'streaming-input', 'validate-streaming-input'],
name => 'stream input, simple types, word validation, error',
gen_args => {url => '/Perinci/Examples/Stream/count_words'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-invalid-words"],
exit_code_like => qr/[1-9]/,
stderr_like => qr/fails validation/,
},
{
tags => ['streaming', 'streaming-input', 'validate-streaming-input'],
name => 'stream input, json stream, error',
gen_args => {url => '/Perinci/Examples/Stream/wc_keys'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-invalid-json"],
exit_code => 200,
},
# streaming result
{
tags => ['streaming', 'streaming-result', 'validate-streaming-result'],
name => "stream result, simple types, word validation",
gen_args => {url => '/Perinci/Examples/Stream/produce_words_err'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["-n", 9],
},
{
tags => ['streaming', 'streaming-result', 'validate-streaming-result'],
name => "stream result, simple types, word validation, error",
gen_args => {url => '/Perinci/Examples/Stream/produce_words_err'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["-n", 10],
exit_code_like => qr/[1-9]/,
stderr_like => qr/fails validation/,
},
{
tags => ['streaming', 'streaming-result'],
name => "stream result, json stream",
gen_args => {url => '/Perinci/Examples/Stream/produce_hashes'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => [qw/-n 3/],
stdout_like => qr/
^\Q{"num":1}\E\n
^\Q{"num":2}\E\n
^\Q{"num":3}\E\n
/mx,
},
# streaming input+result
{
tags => ['streaming', 'streaming-input', 'streaming-result'],
name => "stream input+result, simple type, float validation",
gen_args => {url => '/Perinci/Examples/Stream/square_nums'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-int"],
stdout_like => qr/
^"?1"?\n
^"?9"?\n
^"?25"?\n
/mx,
},
{
tags => ['streaming', 'streaming-input', 'streaming-result', 'validate-streaming-input'],
name => "stream input+result, simple type, float validation, error",
gen_args => {url => '/Perinci/Examples/Stream/square_nums'},
inline_gen_args => {load_module=>["Perinci::Examples::Stream"]},
argv => ["$tempdir/infile-invalid-int"],
exit_code_like => qr/[1-9]/, # sometimes it's 9, sometimes it's 25; looks like the input line is being used somehow as exit code?
stderr_like => qr/fails validation/,
},
],
}, # streaming
{
name => 'result metadata',
tests => [
{
name => 'cmdline.exit_code',
gen_args => {url=>'/Perinci/Examples/CmdLineResMeta/exit_code'},
inline_gen_args => {load_module=>['Perinci::Examples::CmdLineResMeta']},
argv => [qw//],
exit_code => 7,
},
{
name => 'cmdline.result',
gen_args => {url=>'/Perinci/Examples/CmdLineResMeta/result'},
inline_gen_args => {load_module=>['Perinci::Examples::CmdLineResMeta']},
argv => [qw//],
stdout_like => qr/false/,
},
{
name => 'cmdline.default_format',
gen_args => {url=>'/Perinci/Examples/CmdLineResMeta/default_format'},
inline_gen_args => {load_module=>['Perinci::Examples::CmdLineResMeta']},
argv => [qw//],
stdout_like => qr/null/,
},
{
name => 'cmdline.default_format (overriden by cmdline opt)',
gen_args => {url=>'/Perinci/Examples/CmdLineResMeta/default_format'},
inline_gen_args => {load_module=>['Perinci::Examples::CmdLineResMeta']},
argv => [qw/--format text/],
stdout_like => qr/\A\z/,
},
{
name => 'cmdline.skip_format',
gen_args => {url=>'/Perinci/Examples/CmdLineResMeta/skip_format'},
inline_gen_args => {load_module=>['Perinci::Examples::CmdLineResMeta']},
argv => [qw//],
stdout_like => qr/ARRAY\(0x/,
},
],
}, # result metadata
{
name => 'completion',
completion_tests => [
{
name => 'self-completion works',
gen_args => {url => '/Perinci/Examples/Tiny/odd_even'},
inline_gen_args => {load_module=>['Perinci::Examples::Tiny']},
argv => [],
comp_line0 => 'cmd --nu^',
comp_answer => ['--number'],
},
{
tags => ['subcommand'],
name => 'completion of subcommand name',
gen_args => {
url => '/Perinci/Examples/Tiny/',
subcommands => {
'sc1' => '/Perinci/Examples/Tiny/noop',
( run in 1.004 second using v1.01-cache-2.11-cpan-39bf76dae61 )