#!perl
# Test that Want::howmany gets used and that Want module absence is
# handled gracefully.
use Test::More tests => 12;
use strict;
use warnings;
use Data::Iterator::Hierarchical;
my @test_data= map { [ "A$_","B$_","C$_" ] } 1 .. 100;
my $it = hierarchical_iterator(\@test_data);
sub test_Want_not_installed {
my ($want) = @_;
local $@;
ok( !eval { () = $it->(my $inner); 1}, "$want not installed fails");
like($@,qr/not installed/,"$want not installed error");
}
# To test the 'not installed' error even if Want is installed we
# need to fake it not being installed Hmmm... is there not a
# Test:: for this?
sub fake_Want_not_installed {
require Data::Iterator::Hierarchical::FakeWant::WillFail
if $_[1] eq 'Want.pm';
}
# To test the 'not installed' error we need to fake Want not being installed
# Hmmm... is there not a Test:: for this?
unshift @INC, \&fake_Want_not_installed;
test_Want_not_installed 'fake Want';
shift @INC;
SKIP: {
skip 'Want is installed', 2 if eval { require Want; 1 };
test_Want_not_installed 'Want';
}
our $howmany;
my $want = 'Want::howmany';
sub do_tests {
{
local $howmany = 1;
my($one)=$it->(my $inner);
my($two)=$inner->();
like($two,qr/^B/,"$want 1");
}
{
local $howmany = 2;
my($one,$two)=$it->(my $inner);
my($three)=$inner->();
like($three,qr/^C/,"$want 2");
}
{
local $howmany;
local $@;
ok( !eval { my @stuff = $it->(my $inner); 1}, "$want undef fails");
like($@,qr/not implicit/,"$want undef error");
}
}
SKIP: {
skip 'Want not installed', 4 unless eval { require Want; 1 };
do_tests;
}
# Run the fake tests even when Want *is* installed to test the tests
no warnings 'redefine';
*Want::howmany = sub () { $howmany };
$want = "fake $want";
$INC{'Want.pm'} ||= '';
do_tests;