blob: 16a36da3569d59dd51a7f2e79984df3a81cb3e24 [file] [log] [blame]
#!/usr/bin/perl -w
BEGIN {
unshift @INC, 't/lib';
}
use strict;
use Test::More;
use File::Spec;
use App::Prove;
use Getopt::Long;
use TAP::Parser::Utils qw( split_shell );
package FakeProve;
use vars qw( @ISA );
@ISA = qw( App::Prove );
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{_log} = [];
return $self;
}
sub _color_default {0}
sub _runtests {
my $self = shift;
push @{ $self->{_log} }, [ '_runtests', @_ ];
}
sub get_log {
my $self = shift;
my @log = @{ $self->{_log} };
$self->{_log} = [];
return @log;
}
sub _shuffle {
my $self = shift;
s/^/xxx/ for @_;
}
package main;
sub mabs {
my $ar = shift;
return [ map { File::Spec->rel2abs($_) } @$ar ];
}
{
my @import_log = ();
sub test_log_import { push @import_log, [@_] }
sub get_import_log {
my @log = @import_log;
@import_log = ();
return @log;
}
my @plugin_load_log = ();
sub test_log_plugin_load { push @plugin_load_log, [@_] }
sub get_plugin_load_log {
my @log = @plugin_load_log;
@plugin_load_log = ();
return @log;
}
}
my ( @ATTR, %DEFAULT_ASSERTION, @SCHEDULE, $HAS_YAML );
# see the "ACTUAL TEST" section at the bottom
BEGIN { # START PLAN
$HAS_YAML = 0;
eval { require YAML; $HAS_YAML = 1; };
# list of attributes
@ATTR = qw(
archive argv blib color directives exec extensions failures
formatter harness includes lib merge parse quiet really_quiet
recurse backwards shuffle taint_fail taint_warn verbose
warnings_fail warnings_warn
);
# what we expect if the 'expect' hash does not define it
%DEFAULT_ASSERTION = map { $_ => undef } @ATTR;
$DEFAULT_ASSERTION{includes} = $DEFAULT_ASSERTION{argv}
= sub { 'ARRAY' eq ref shift };
my @dummy_tests = map { File::Spec->catdir( 't', 'sample-tests', $_ ) }
qw(simple simple_yaml);
my $dummy_test = $dummy_tests[0];
########################################################################
# declarations - this drives all of the subtests.
# The cheatsheet follows.
# required: name, expect
# optional:
# args - arguments to constructor
# switches - command-line switches
# runlog - expected results of internal calls to _runtests, must
# match FakeProve's _log attr
# run_error - depends on 'runlog' (if missing, asserts no error)
# extra - follow-up check to handle exceptional cleanup / verification
# class - The App::Prove subclass to test. Defaults to FakeProve
@SCHEDULE = (
{ name => 'Create empty',
expect => {}
},
{ name => 'Set all options via constructor',
args => {
archive => 1,
argv => [qw(one two three)],
blib => 2,
color => 3,
directives => 4,
exec => 5,
failures => 7,
formatter => 8,
harness => 9,
includes => [qw(four five six)],
lib => 10,
merge => 11,
parse => 13,
quiet => 14,
really_quiet => 15,
recurse => 16,
backwards => 17,
shuffle => 18,
taint_fail => 19,
taint_warn => 20,
verbose => 21,
warnings_fail => 22,
warnings_warn => 23,
},
expect => {
archive => 1,
argv => [qw(one two three)],
blib => 2,
color => 3,
directives => 4,
exec => 5,
failures => 7,
formatter => 8,
harness => 9,
includes => [qw(four five six)],
lib => 10,
merge => 11,
parse => 13,
quiet => 14,
really_quiet => 15,
recurse => 16,
backwards => 17,
shuffle => 18,
taint_fail => 19,
taint_warn => 20,
verbose => 21,
warnings_fail => 22,
warnings_warn => 23,
}
},
{ name => 'Call with defaults',
args => { argv => [qw( one two three )] },
expect => {},
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
# Test all options individually
# { name => 'Just archive',
# args => {
# argv => [qw( one two three )],
# archive => 1,
# },
# expect => {
# archive => 1,
# },
# runlog => [
# [ { archive => 1,
# },
# 'TAP::Harness',
# 'one', 'two',
# 'three'
# ]
# ],
# },
{ name => 'Just argv',
args => {
argv => [qw( one two three )],
},
expect => {
argv => [qw( one two three )],
},
runlog => [
[ '_runtests',
{ verbosity => 0, show_count => 1 },
'TAP::Harness',
'one', 'two',
'three'
]
],
},
{ name => 'Just blib',
args => {
argv => [qw( one two three )],
blib => 1,
},
expect => {
blib => 1,
},
runlog => [
[ '_runtests',
{ lib => mabs( [ 'blib/lib', 'blib/arch' ] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just color',
args => {
argv => [qw( one two three )],
color => 1,
},
expect => {
color => 1,
},
runlog => [
[ '_runtests',
{ color => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just directives',
args => {
argv => [qw( one two three )],
directives => 1,
},
expect => {
directives => 1,
},
runlog => [
[ '_runtests',
{ directives => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just exec',
args => {
argv => [qw( one two three )],
exec => 1,
},
expect => {
exec => 1,
},
runlog => [
[ '_runtests',
{ exec => [1],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just failures',
args => {
argv => [qw( one two three )],
failures => 1,
},
expect => {
failures => 1,
},
runlog => [
[ '_runtests',
{ failures => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just formatter',
args => {
argv => [qw( one two three )],
formatter => 'TAP::Harness',
},
expect => {
formatter => 'TAP::Harness',
},
runlog => [
[ '_runtests',
{ formatter_class => 'TAP::Harness',
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just includes',
args => {
argv => [qw( one two three )],
includes => [qw( four five six )],
},
expect => {
includes => [qw( four five six )],
},
runlog => [
[ '_runtests',
{ lib => mabs( [qw( four five six )] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just lib',
args => {
argv => [qw( one two three )],
lib => 1,
},
expect => {
lib => 1,
},
runlog => [
[ '_runtests',
{ lib => mabs( ['lib'] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just merge',
args => {
argv => [qw( one two three )],
merge => 1,
},
expect => {
merge => 1,
},
runlog => [
[ '_runtests',
{ merge => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just parse',
args => {
argv => [qw( one two three )],
parse => 1,
},
expect => {
parse => 1,
},
runlog => [
[ '_runtests',
{ errors => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just quiet',
args => {
argv => [qw( one two three )],
quiet => 1,
},
expect => {
quiet => 1,
},
runlog => [
[ '_runtests',
{ verbosity => -1,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just really_quiet',
args => {
argv => [qw( one two three )],
really_quiet => 1,
},
expect => {
really_quiet => 1,
},
runlog => [
[ '_runtests',
{ verbosity => -2,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just recurse',
args => {
argv => [qw( one two three )],
recurse => 1,
},
expect => {
recurse => 1,
},
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just reverse',
args => {
argv => [qw( one two three )],
backwards => 1,
},
expect => {
backwards => 1,
},
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'three', 'two', 'one'
]
],
},
{ name => 'Just shuffle',
args => {
argv => [qw( one two three )],
shuffle => 1,
},
expect => {
shuffle => 1,
},
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'xxxone', 'xxxtwo',
'xxxthree'
]
],
},
{ name => 'Just taint_fail',
args => {
argv => [qw( one two three )],
taint_fail => 1,
},
expect => {
taint_fail => 1,
},
runlog => [
[ '_runtests',
{ switches => ['-T'],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just taint_warn',
args => {
argv => [qw( one two three )],
taint_warn => 1,
},
expect => {
taint_warn => 1,
},
runlog => [
[ '_runtests',
{ switches => ['-t'],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just verbose',
args => {
argv => [qw( one two three )],
verbose => 1,
},
expect => {
verbose => 1,
},
runlog => [
[ '_runtests',
{ verbosity => 1,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just warnings_fail',
args => {
argv => [qw( one two three )],
warnings_fail => 1,
},
expect => {
warnings_fail => 1,
},
runlog => [
[ '_runtests',
{ switches => ['-W'],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
{ name => 'Just warnings_warn',
args => {
argv => [qw( one two three )],
warnings_warn => 1,
},
expect => {
warnings_warn => 1,
},
runlog => [
[ '_runtests',
{ switches => ['-w'],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
'one', 'two', 'three'
]
],
},
# Command line parsing
{ name => 'Switch -v',
args => {
argv => [qw( one two three )],
},
switches => [ '-v', $dummy_test ],
expect => {
verbose => 1,
},
runlog => [
[ '_runtests',
{ verbosity => 1,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --verbose',
args => {
argv => [qw( one two three )],
},
switches => [ '--verbose', $dummy_test ],
expect => {
verbose => 1,
},
runlog => [
[ '_runtests',
{ verbosity => 1,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -f',
args => {
argv => [qw( one two three )],
},
switches => [ '-f', $dummy_test ],
expect => { failures => 1 },
runlog => [
[ '_runtests',
{ failures => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --failures',
args => {
argv => [qw( one two three )],
},
switches => [ '--failures', $dummy_test ],
expect => { failures => 1 },
runlog => [
[ '_runtests',
{ failures => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -l',
args => {
argv => [qw( one two three )],
},
switches => [ '-l', $dummy_test ],
expect => { lib => 1 },
runlog => [
[ '_runtests',
{ lib => mabs( ['lib'] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --lib',
args => {
argv => [qw( one two three )],
},
switches => [ '--lib', $dummy_test ],
expect => { lib => 1 },
runlog => [
[ '_runtests',
{ lib => mabs( ['lib'] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -b',
args => {
argv => [qw( one two three )],
},
switches => [ '-b', $dummy_test ],
expect => { blib => 1 },
runlog => [
[ '_runtests',
{ lib => mabs( [ 'blib/lib', 'blib/arch' ] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --blib',
args => {
argv => [qw( one two three )],
},
switches => [ '--blib', $dummy_test ],
expect => { blib => 1 },
runlog => [
[ '_runtests',
{ lib => mabs( [ 'blib/lib', 'blib/arch' ] ),
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -s',
args => {
argv => [qw( one two three )],
},
switches => [ '-s', $dummy_test ],
expect => { shuffle => 1 },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
"xxx$dummy_test"
]
],
},
{ name => 'Switch --shuffle',
args => {
argv => [qw( one two three )],
},
switches => [ '--shuffle', $dummy_test ],
expect => { shuffle => 1 },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
"xxx$dummy_test"
]
],
},
{ name => 'Switch -c',
args => {
argv => [qw( one two three )],
},
switches => [ '-c', $dummy_test ],
expect => { color => 1 },
runlog => [
[ '_runtests',
{ color => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -r',
args => {
argv => [qw( one two three )],
},
switches => [ '-r', $dummy_test ],
expect => { recurse => 1 },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --recurse',
args => {
argv => [qw( one two three )],
},
switches => [ '--recurse', $dummy_test ],
expect => { recurse => 1 },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --reverse',
args => {
argv => [qw( one two three )],
},
switches => [ '--reverse', @dummy_tests ],
expect => { backwards => 1 },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
reverse @dummy_tests
]
],
},
{ name => 'Switch -p',
args => {
argv => [qw( one two three )],
},
switches => [ '-p', $dummy_test ],
expect => {
parse => 1,
},
runlog => [
[ '_runtests',
{ errors => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --parse',
args => {
argv => [qw( one two three )],
},
switches => [ '--parse', $dummy_test ],
expect => {
parse => 1,
},
runlog => [
[ '_runtests',
{ errors => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -q',
args => {
argv => [qw( one two three )],
},
switches => [ '-q', $dummy_test ],
expect => { quiet => 1 },
runlog => [
[ '_runtests',
{ verbosity => -1,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --quiet',
args => {
argv => [qw( one two three )],
},
switches => [ '--quiet', $dummy_test ],
expect => { quiet => 1 },
runlog => [
[ '_runtests',
{ verbosity => -1,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -Q',
args => {
argv => [qw( one two three )],
},
switches => [ '-Q', $dummy_test ],
expect => { really_quiet => 1 },
runlog => [
[ '_runtests',
{ verbosity => -2,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --QUIET',
args => {
argv => [qw( one two three )],
},
switches => [ '--QUIET', $dummy_test ],
expect => { really_quiet => 1 },
runlog => [
[ '_runtests',
{ verbosity => -2,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch -m',
args => {
argv => [qw( one two three )],
},
switches => [ '-m', $dummy_test ],
expect => { merge => 1 },
runlog => [
[ '_runtests',
{ merge => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --merge',
args => {
argv => [qw( one two three )],
},
switches => [ '--merge', $dummy_test ],
expect => { merge => 1 },
runlog => [
[ '_runtests',
{ merge => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --directives',
args => {
argv => [qw( one two three )],
},
switches => [ '--directives', $dummy_test ],
expect => { directives => 1 },
runlog => [
[ '_runtests',
{ directives => 1,
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# .proverc
{ name => 'Empty exec in .proverc',
args => {
argv => [qw( one two three )],
},
proverc => 't/proverc/emptyexec',
switches => [$dummy_test],
expect => { exec => '' },
runlog => [
[ '_runtests',
{ exec => [],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# Executing one word (why would it be a -s though?)
{ name => 'Switch --exec -s',
args => {
argv => [qw( one two three )],
},
switches => [ '--exec', '-s', $dummy_test ],
expect => { exec => '-s' },
runlog => [
[ '_runtests',
{ exec => ['-s'],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# multi-part exec
{ name => 'Switch --exec "/foo/bar/perl -Ilib"',
args => {
argv => [qw( one two three )],
},
switches => [ '--exec', '/foo/bar/perl -Ilib', $dummy_test ],
expect => { exec => '/foo/bar/perl -Ilib' },
runlog => [
[ '_runtests',
{ exec => [qw(/foo/bar/perl -Ilib)],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# null exec (run tests as compiled binaries)
{ name => 'Switch --exec ""',
switches => [ '--exec', '', $dummy_test ],
expect => {
exec => # ick, must workaround the || default bit with a sub
sub { my $val = shift; defined($val) and !length($val) }
},
runlog => [
[ '_runtests',
{ exec => [],
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# Specify an oddball extension
{ name => 'Switch --ext=.wango',
switches => [ '--ext=.wango' ],
expect => { extensions => ['.wango'] },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
]
],
},
# Handle multiple extensions
{ name => 'Switch --ext=.foo --ext=.bar',
switches => [ '--ext=.foo', '--ext=.bar', ],
expect => { extensions => ['.foo','.bar'] },
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
]
],
},
# Source handlers
{ name => 'Switch --source simple',
args => { argv => [qw( one two three )] },
switches => [ '--source', 'MyCustom', $dummy_test ],
expect => {
sources => {
MyCustom => {},
},
},
runlog => [
[ '_runtests',
{ sources => {
MyCustom => {},
},
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Switch --sources with config',
args => { argv => [qw( one two three )] },
skip => $Getopt::Long::VERSION >= 2.28 && $HAS_YAML ? 0 : 1,
skip_reason => "YAML not available or Getopt::Long too old",
switches => [
'--source', 'Perl',
'--perl-option', 'foo=bar baz',
'--perl-option', 'avg=0.278',
'--source', 'MyCustom',
'--source', 'File',
'--file-option', 'extensions=.txt',
'--file-option', 'extensions=.tmp',
'--file-option', 'hash=this=that',
'--file-option', 'hash=foo=bar',
'--file-option', 'sep=foo\\=bar',
$dummy_test
],
expect => {
sources => {
Perl => { foo => 'bar baz', avg => 0.278 },
MyCustom => {},
File => {
extensions => [ '.txt', '.tmp' ],
hash => { this => 'that', foo => 'bar'},
sep => 'foo=bar',
},
},
},
runlog => [
[ '_runtests',
{ sources => {
Perl => { foo => 'bar baz', avg => 0.278 },
MyCustom => {},
File => {
extensions => [ '.txt', '.tmp' ],
hash => { this => 'that', foo => 'bar'},
sep => 'foo=bar',
},
},
verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# Plugins
{ name => 'Load plugin',
switches => [ '-P', 'Dummy', $dummy_test ],
args => {
argv => [qw( one two three )],
},
expect => {
plugins => ['Dummy'],
},
extra => sub {
my @loaded = get_import_log();
is_deeply \@loaded, [ ['App::Prove::Plugin::Dummy'] ],
"Plugin loaded OK";
},
plan => 1,
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Load plugin (args)',
switches => [ '-P', 'Dummy=cracking,cheese,gromit', $dummy_test ],
args => {
argv => [qw( one two three )],
},
expect => {
plugins => ['Dummy'],
},
extra => sub {
my @loaded = get_import_log();
is_deeply \@loaded,
[ [ 'App::Prove::Plugin::Dummy', 'cracking', 'cheese',
'gromit'
]
],
"Plugin loaded OK";
},
plan => 1,
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Load plugin (explicit path)',
switches => [ '-P', 'App::Prove::Plugin::Dummy', $dummy_test ],
args => {
argv => [qw( one two three )],
},
expect => {
plugins => ['Dummy'],
},
extra => sub {
my @loaded = get_import_log();
is_deeply \@loaded, [ ['App::Prove::Plugin::Dummy'] ],
"Plugin loaded OK";
},
plan => 1,
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Load plugin (args + call load method)',
switches => [ '-P', 'Dummy2=fou,du,fafa', $dummy_test ],
args => {
argv => [qw( one two three )],
},
expect => {
plugins => ['Dummy2'],
},
extra => sub {
my @import = get_import_log();
is_deeply \@import,
[ [ 'App::Prove::Plugin::Dummy2', 'fou', 'du', 'fafa' ] ],
"Plugin loaded OK";
my @loaded = get_plugin_load_log();
is( scalar @loaded, 1, 'Plugin->load called OK' );
my ( $plugin_class, $args ) = @{ shift @loaded };
is( $plugin_class, 'App::Prove::Plugin::Dummy2',
'plugin_class passed'
);
isa_ok(
$args->{app_prove}, 'App::Prove',
'app_prove object passed'
);
is_deeply(
$args->{args}, [qw( fou du fafa )],
'expected args passed'
);
},
plan => 5,
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
{ name => 'Load module',
switches => [ '-M', 'App::Prove::Plugin::Dummy', $dummy_test ],
args => {
argv => [qw( one two three )],
},
expect => {
plugins => ['Dummy'],
},
extra => sub {
my @loaded = get_import_log();
is_deeply \@loaded, [ ['App::Prove::Plugin::Dummy'] ],
"Plugin loaded OK";
},
plan => 1,
runlog => [
[ '_runtests',
{ verbosity => 0,
show_count => 1,
},
'TAP::Harness',
$dummy_test
]
],
},
# TODO
# Hmm, that doesn't work...
# { name => 'Switch -h',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '-h', $dummy_test ],
# expect => {},
# runlog => [
# [ '_runtests',
# {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
# { name => 'Switch --help',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--help', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
# { name => 'Switch -?',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '-?', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch -H',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '-H', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch --man',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--man', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch -V',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '-V', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch --version',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--version', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch --color!',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--color!', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
{ name => 'Switch -I=s@',
args => {
argv => [qw( one two three )],
},
switches => [ '-Ilib', $dummy_test ],
expect => {
includes => sub {
my ( $val, $attr ) = @_;
return
'ARRAY' eq ref $val
&& 1 == @$val
&& $val->[0] =~ /lib$/;
},
},
},
# { name => 'Switch -a',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '-a', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch --archive=-s',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--archive=-s', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch --formatter=-s',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--formatter=-s', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch -e',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '-e', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
#
# { name => 'Switch --harness=-s',
# args => {
# argv => [qw( one two three )],
# },
# switches => [ '--harness=-s', $dummy_test ],
# expect => {},
# runlog => [
# [ {},
# 'TAP::Harness',
# $dummy_test
# ]
# ],
# },
);
# END SCHEDULE
########################################################################
my $extra_plan = 0;
for my $test (@SCHEDULE) {
my $plan = 0;
$plan += $test->{plan} || 0;
$plan += 2 if $test->{runlog};
$plan += 1 if $test->{switches};
$test->{_planned} = $plan + 3 + @ATTR;
$extra_plan += $plan;
}
plan tests => @SCHEDULE * ( 3 + @ATTR ) + $extra_plan;
} # END PLAN
# ACTUAL TEST
for my $test (@SCHEDULE) {
my $name = $test->{name};
my $class = $test->{class} || 'FakeProve';
SKIP:
{
skip $test->{skip_reason}, $test->{_planned} if $test->{skip};
local $ENV{HARNESS_TIMER};
ok my $app = $class->new( exists $test->{args} ? $test->{args} : () ),
"$name: App::Prove created OK";
isa_ok $app, 'App::Prove';
isa_ok $app, $class;
# Optionally parse command args
if ( my $switches = $test->{switches} ) {
if ( my $proverc = $test->{proverc} ) {
$app->add_rc_file(
File::Spec->catfile( split /\//, $proverc ) );
}
eval { $app->process_args( '--norc', @$switches ) };
if ( my $err_pattern = $test->{parse_error} ) {
like $@, $err_pattern, "$name: expected parse error";
}
else {
ok !$@, "$name: no parse error";
}
}
my $expect = $test->{expect} || {};
for my $attr ( sort @ATTR ) {
my $val = $app->$attr();
my $assertion
= exists $expect->{$attr}
? $expect->{$attr}
: $DEFAULT_ASSERTION{$attr};
my $is_ok = undef;
if ( 'CODE' eq ref $assertion ) {
$is_ok = ok $assertion->( $val, $attr ),
"$name: $attr has the expected value";
}
elsif ( 'Regexp' eq ref $assertion ) {
$is_ok = like $val, $assertion,
"$name: $attr matches $assertion";
}
else {
$is_ok = is_deeply $val, $assertion,
"$name: $attr has the expected value";
}
unless ($is_ok) {
diag "got $val for $attr";
}
}
if ( my $runlog = $test->{runlog} ) {
eval { $app->run };
if ( my $err_pattern = $test->{run_error} ) {
like $@, $err_pattern, "$name: expected error OK";
pass;
pass for 1 .. $test->{plan};
}
else {
unless ( ok !$@, "$name: no error OK" ) {
diag "$name: error: $@\n";
}
my $gotlog = [ $app->get_log ];
if ( my $extra = $test->{extra} ) {
$extra->($gotlog);
}
# adapt our expectations if HARNESS_PERL_SWITCHES is set
push @{ $runlog->[0][1]{switches} },
split_shell( $ENV{HARNESS_PERL_SWITCHES} )
if $ENV{HARNESS_PERL_SWITCHES};
unless (
is_deeply $gotlog, $runlog,
"$name: run results match"
)
{
use Data::Dumper;
diag Dumper( { wanted => $runlog, got => $gotlog } );
}
}
}
} # SKIP
}