| line | stmt | bran | cond | sub | pod | time | code | 
| 1 | 1 |  |  | 1 |  | 60286 | use strict; | 
|  | 1 |  |  |  |  | 10 |  | 
|  | 1 |  |  |  |  | 27 |  | 
| 2 | 1 |  |  | 1 |  | 4 | use warnings; | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 68 |  | 
| 3 |  |  |  |  |  |  | package App::Cmd::Tester::CaptureExternal 0.334; | 
| 4 |  |  |  |  |  |  |  | 
| 5 | 1 |  |  | 1 |  | 411 | use parent 'App::Cmd::Tester'; | 
|  | 1 |  |  |  |  | 317 |  | 
|  | 1 |  |  |  |  | 6 |  | 
| 6 | 1 |  |  | 1 |  | 560 | use Capture::Tiny 0.13 qw/capture/; | 
|  | 1 |  |  |  |  | 22181 |  | 
|  | 1 |  |  |  |  | 160 |  | 
| 7 |  |  |  |  |  |  |  | 
| 8 |  |  |  |  |  |  | # ABSTRACT: Extends App::Cmd::Tester to capture from external subprograms | 
| 9 |  |  |  |  |  |  |  | 
| 10 |  |  |  |  |  |  | #pod =head1 SYNOPSIS | 
| 11 |  |  |  |  |  |  | #pod | 
| 12 |  |  |  |  |  |  | #pod   use Test::More tests => 4; | 
| 13 |  |  |  |  |  |  | #pod   use App::Cmd::Tester::CaptureExternal; | 
| 14 |  |  |  |  |  |  | #pod | 
| 15 |  |  |  |  |  |  | #pod   use YourApp; | 
| 16 |  |  |  |  |  |  | #pod | 
| 17 |  |  |  |  |  |  | #pod   my $result = test_app(YourApp => [ qw(command --opt value) ]); | 
| 18 |  |  |  |  |  |  | #pod | 
| 19 |  |  |  |  |  |  | #pod   like($result->stdout, qr/expected output/, 'printed what we expected'); | 
| 20 |  |  |  |  |  |  | #pod | 
| 21 |  |  |  |  |  |  | #pod   is($result->stderr, '', 'nothing sent to sderr'); | 
| 22 |  |  |  |  |  |  | #pod | 
| 23 |  |  |  |  |  |  | #pod   ok($result->output, "STDOUT concatenated with STDERR"); | 
| 24 |  |  |  |  |  |  | #pod | 
| 25 |  |  |  |  |  |  | #pod =head1 DESCRIPTION | 
| 26 |  |  |  |  |  |  | #pod | 
| 27 |  |  |  |  |  |  | #pod L provides a useful scaffold for testing applications, but it | 
| 28 |  |  |  |  |  |  | #pod is unable to capture output generated from any external subprograms that are | 
| 29 |  |  |  |  |  |  | #pod invoked from the application. | 
| 30 |  |  |  |  |  |  | #pod | 
| 31 |  |  |  |  |  |  | #pod This subclass uses an alternate mechanism for capturing output | 
| 32 |  |  |  |  |  |  | #pod (L) that does capture from external programs, with one | 
| 33 |  |  |  |  |  |  | #pod major limitation. | 
| 34 |  |  |  |  |  |  | #pod | 
| 35 |  |  |  |  |  |  | #pod It is not possible to capture externally from both STDOUT and STDERR while | 
| 36 |  |  |  |  |  |  | #pod also having appropriately interleaved combined output.  Therefore, the | 
| 37 |  |  |  |  |  |  | #pod C | 
| 38 |  |  |  |  |  |  | #pod | 
| 39 |  |  |  |  |  |  | #pod You can still use C | 
| 40 |  |  |  |  |  |  | #pod testing if something appeared in either output stream, but you can't rely on | 
| 41 |  |  |  |  |  |  | #pod the ordering being correct between lines to STDOUT and lines to STDERR. | 
| 42 |  |  |  |  |  |  | #pod | 
| 43 |  |  |  |  |  |  | #pod =cut | 
| 44 |  |  |  |  |  |  |  | 
| 45 |  |  |  |  |  |  | sub _run_with_capture { | 
| 46 | 1 |  |  | 1 |  | 3 | my ($class, $app, $argv) = @_; | 
| 47 |  |  |  |  |  |  |  | 
| 48 | 1 |  |  |  |  | 2 | my $run_rv; | 
| 49 |  |  |  |  |  |  |  | 
| 50 |  |  |  |  |  |  | my ($stdout, $stderr, $ok) = capture { | 
| 51 | 1 |  |  | 1 |  | 1310 | eval { | 
| 52 | 1 |  |  |  |  | 11 | local $App::Cmd::Tester::TEST_IN_PROGRESS = 1; | 
| 53 | 1 |  |  |  |  | 5 | local @ARGV = @$argv; | 
| 54 | 1 |  |  |  |  | 8 | $run_rv = $app->run; | 
| 55 | 1 |  |  |  |  | 95077 | 1; | 
| 56 |  |  |  |  |  |  | }; | 
| 57 | 1 |  |  |  |  | 31 | }; | 
| 58 |  |  |  |  |  |  |  | 
| 59 | 1 | 50 |  |  |  | 1346 | my $error = $ok ? undef : $@; | 
| 60 |  |  |  |  |  |  |  | 
| 61 |  |  |  |  |  |  | return { | 
| 62 | 1 |  |  |  |  | 34 | stdout => $stdout, | 
| 63 |  |  |  |  |  |  | stderr => $stderr, | 
| 64 |  |  |  |  |  |  | output => $stdout . $stderr, | 
| 65 |  |  |  |  |  |  | error  => $error, | 
| 66 |  |  |  |  |  |  | run_rv => $run_rv, | 
| 67 |  |  |  |  |  |  | }; | 
| 68 |  |  |  |  |  |  | } | 
| 69 |  |  |  |  |  |  |  | 
| 70 |  |  |  |  |  |  | 1; | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | __END__ |