The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 42;

use Test::Mock::Cmd::TestUtils;

use Test::Mock::Cmd::TestUtils::X;

BEGIN {
  SKIP: {
        skip '/bin/echo is required for these tests.', 12 if !-x '/bin/echo';

        my $scalar = qx(/bin/echo qx scalar);
        my @array  = qx(/bin/echo qx array);
        like( $scalar,   qr/qx scalar/, 'qx scalar before mocking' );
        like( $array[0], qr/qx array/,  'qx array before mocking' );

        my $scalara = `/bin/echo back ticks scalar`;
        my @arraya  = `/bin/echo back ticks array`;
        like( $scalara,   qr/back ticks scalar/, 'back ticks scalar before mocking' );
        like( $arraya[0], qr/back ticks array/,  'back ticks array before mocking' );

        my $scalarb = readpipe('/bin/echo readpipe scalar');
        my @arrayb  = readpipe('/bin/echo readpipe array');
        like( $scalarb,   qr/readpipe scalar/, 'readpipe scalar before mocking' );
        like( $arrayb[0], qr/readpipe array/,  'readpipe array before mocking' );

        my $scalarc = Test::Mock::Cmd::TestUtils::X::i_call_qx();
        my @arrayc  = Test::Mock::Cmd::TestUtils::X::i_call_qx();
        like( $scalarc,   qr/QX/, 'qx class scalar before mocking' );
        like( $arrayc[0], qr/QX/, 'qx class array before mocking' );

        my $scalard = Test::Mock::Cmd::TestUtils::X::i_call_backticks();
        my @arrayd  = Test::Mock::Cmd::TestUtils::X::i_call_backticks();
        like( $scalard,   qr/BT/, 'back ticks class scalar before mocking' );
        like( $arrayd[0], qr/BT/, 'back ticks class array before mocking' );

        my $scalare = Test::Mock::Cmd::TestUtils::X::i_call_readpipe('/bin/echo class readpipe scalar');
        my @arraye  = Test::Mock::Cmd::TestUtils::X::i_call_readpipe('/bin/echo class readpipe array');
        like( $scalare,   qr/readpipe scalar/, 'qx class scalar before mocking' );
        like( $arraye[0], qr/readpipe array/,  'qx class array before mocking' );
    }
}

use Test::Mock::Cmd sub {
    my ($cmd) = @_;
    return Test::Mock::Cmd::TestUtils::test_more_is_like_return_42( $cmd, $cmd, $cmd );
};

use Test::Mock::Cmd::TestUtils::Y;

diag("Testing Test::Mock::Cmd $Test::Mock::Cmd::VERSION");

SKIP: {
    skip '/bin/echo is required for these tests.', 30 if !-x '/bin/echo';

    my $scalar = qx(/bin/echo qx scalar);
    my @array  = qx(/bin/echo qx array);
    is( $scalar,   42, 'qx scalar after mocking' );
    is( $array[0], 42, 'qx array after mocking' );

    my $scalara = `/bin/echo back ticks scalar`;
    my @arraya  = `/bin/echo back ticks array`;
    is( $scalara,   42, 'back ticks scalar after mocking' );
    is( $arraya[0], 42, 'back ticks array after mocking' );

    my $scalarb = readpipe('/bin/echo readpipe scalar');
    my @arrayb  = readpipe('/bin/echo readpipe array');
    is( $scalarb,   42, 'readpipe scalar after mocking' );
    is( $arrayb[0], 42, 'readpipe array after mocking' );

    my $scalarc = Test::Mock::Cmd::TestUtils::Y::i_call_qx('/bin/echo class qx scalar');
    my @arrayc  = Test::Mock::Cmd::TestUtils::Y::i_call_qx('/bin/echo class qx array');
    is( $scalarc,   42, 'qx class scalar after mocking' );
    is( $arrayc[0], 42, 'qx class array after mocking' );

    my $scalard = Test::Mock::Cmd::TestUtils::Y::i_call_backticks('/bin/echo class back ticks scalar');
    my @arrayd  = Test::Mock::Cmd::TestUtils::Y::i_call_backticks('/bin/echo class back ticks array');
    is( $scalard,   42, 'back ticks class scalar after mocking' );
    is( $arrayd[0], 42, 'back ticks class array after mocking' );

    my $scalare = Test::Mock::Cmd::TestUtils::Y::i_call_readpipe('/bin/echo class readpipe scalar');
    my @arraye  = Test::Mock::Cmd::TestUtils::Y::i_call_readpipe('/bin/echo class readpipe array');
    is( $scalare,   42, 'qx class scalar after mocking' );
    is( $arraye[0], 42, 'qx class array after mocking' );

    my $scalarf = Test::Mock::Cmd::TestUtils::X::i_call_qx();
    my @arrayf  = Test::Mock::Cmd::TestUtils::X::i_call_qx();
    like( $scalarf,   qr/QX/, 'qx class scalar before mocking - not affected' );
    like( $arrayf[0], qr/QX/, 'qx class array before mocking- not affected' );

    my $scalarg = Test::Mock::Cmd::TestUtils::X::i_call_backticks();
    my @arrayg  = Test::Mock::Cmd::TestUtils::X::i_call_backticks();
    like( $scalarg,   qr/BT/, 'back ticks class scalar before mocking - not affected' );
    like( $arrayg[0], qr/BT/, 'back ticks class array before mocking - not affected' );

    my $scalarh = Test::Mock::Cmd::TestUtils::X::i_call_readpipe('/bin/echo class readpipe scalar');
    my @arrayh  = Test::Mock::Cmd::TestUtils::X::i_call_readpipe('/bin/echo class readpipe array');
    like( $scalarh,   qr/readpipe scalar/, 'qx class scalar before mocking - not affected' );
    like( $arrayh[0], qr/readpipe array/,  'qx class array before mocking - not affected' );
}