The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 13;

use File::Which qw( which );
use SmokeRunner::Multi;

use lib 't/lib';
use SmokeRunner::Multi::Test;


test_setup();

NEW:
{
    my $smoker = SmokeRunner::Multi->new();
    isa_ok( $smoker, 'SmokeRunner::Multi' );
}

NEXT_TEST_SET:
{
    write_four_sets();

    my $smoker = SmokeRunner::Multi->new();

    my $next_set = $smoker->next_set();
    is( $next_set->name(), 'set1', 'next_set() returns expected set' );
}

_CLASS_FOR:
{
    my $smoker = SmokeRunner::Multi->new();

    eval { $smoker->_class_for( 'Runner' ) };
    like( $@, qr/\QNo config for runner/,
          'cannot call _class_for with one arg' );

    eval { $smoker->_class_for( 'Runner', undef ) };
    like( $@, qr/\QNo config for runner/,
          'cannot call _class_for with undef as second arg' );

    eval { $smoker->_class_for( 'Runner', 'DoesNotExist' ) };
    like( $@, qr/\QCan't locate/,
          'cannot call _class_for with invalid class name' );

    is( $smoker->_class_for( 'Runner', 'TAPArchive' ),
        'SmokeRunner::Multi::Runner::TAPArchive',
        '_class_for() returns full class name' );

    is( $smoker->_class_for( 'Runner', 'TAPArchive' ),
        'SmokeRunner::Multi::Runner::TAPArchive',
        '_class_for() returns full class name on second call' );

    is( $smoker->_class_for( 'Runner', 'SmokeRunner::Multi::Runner::TAPArchive' ),
        'SmokeRunner::Multi::Runner::TAPArchive',
        '_class_for() returns full class name when given full class name' );
}

MAKE_THINGS:
{
    my $smoker = SmokeRunner::Multi->new();

    my $next_set = $smoker->next_set();

    my $runner = $smoker->make_runner( set => $next_set );
    isa_ok( $runner, 'SmokeRunner::Multi::Runner::Prove' );

    my $reporter = $smoker->make_reporter( runner => $runner );
    isa_ok( $reporter, 'SmokeRunner::Multi::Reporter::Test' );
}

RUN_AND_REPORT_NEXT_SET:
{
 SKIP:
    {
        skip 'These tests require that prove be in the PATH.', 3
            unless which('prove');

        my $smoker = SmokeRunner::Multi->new();
        my $next_set = $smoker->next_set();

        my $last_run_time = $next_set->last_run_time();
        $next_set->prioritize();

        my $reporter = $smoker->run_and_report_next_set();

        like( $reporter->output(), qr/01-a/,
              'reporter has some output' );

        my $set = SmokeRunner::Multi::TestSet->new( set_dir => $next_set->set_dir() );

        ok( ! $set->is_prioritized(),
            'set is no longer prioritized and calling run_and_report_next_set()' );
        cmp_ok( $set->last_run_time(), '>', $last_run_time,
                'last run time for set was updated' );
    }
}