The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use Test::More 'no_plan';
use lib qw(t/lib);

my $class = 'Brick';

use_ok( $class );

my $brick = $class->new;
isa_ok( $brick, $class );

my $bucket_class = $brick->bucket_class;
ok( $bucket_class, "Bucket class is defined: $bucket_class" );

my $bucket = $brick->create_bucket;
isa_ok( $bucket, $bucket_class );

ok( defined &{ "${class}::_load_external_packages" }, 
	"_load_external_packages is there" );

ok( defined &{ "${class}::add_validator_packages" }, 
	"add_validator_packages is there" );
	

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
ok( ! defined &{ "${bucket_class}::_is_the_number_3" },
	"_is_the_number_3 is not in $bucket_class"
	);
ok( ! defined &{ "${bucket_class}::_is_the_letter_e" },
	"_is_the_letter_e is not in $bucket_class"
	);
	
use_ok( 'Mock::FooValidator' );

ok( ! defined &{ "${bucket_class}::_is_the_number_3" },
	"_is_the_number_3 is not in $bucket_class"
	);
ok( ! defined &{ "${bucket_class}::_is_the_letter_e" },
	"_is_the_letter_e is not in $bucket_class"
	);

$brick->add_validator_packages( 'Mock::FooValidator' );	

ok( defined &{ "${bucket_class}::_is_the_number_3" },
	"_is_the_number_3 is in $bucket_class after add_validator_packages"
	);
isa_ok( $bucket->_is_the_number_3, ref sub {} );	

ok( defined &{ "${bucket_class}::_is_the_letter_e" },
	"_is_the_letter_e is in $bucket_class after add_validator_packages"
	);
isa_ok( $bucket->_is_the_letter_e, ref sub {} );	

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
ok( ! defined &{ "${bucket_class}::_is_odd" },
	"_is_odd is not in $bucket_class"
	);
ok( ! defined &{ "${bucket_class}::_is_even" },
	"_is_even is not in $bucket_class"
	);

use_ok( 'Mock::BarValidator' );

ok( ! defined &{ "${bucket_class}::_is_odd" },
	"_is_odd is not in $bucket_class"
	);
ok( ! defined &{ "${bucket_class}::_is_even" },
	"_is_even is not in $bucket_class"
	);
	
$brick->add_validator_packages( 'Mock::BarValidator' );	

ok( defined &{ "${bucket_class}::_is_odd_number" },
	"_is_the_number_3 is not in $bucket_class after add_validator_packages"
	);
isa_ok( $bucket->_is_odd_number, ref sub {} );	

ok( defined &{ "${bucket_class}::_is_even_number" },
	"_is_the_letter_e is not in $bucket_class after add_validator_packages"
	);
isa_ok( $bucket->_is_even_number, ref sub {} );	

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
# Try it with packages that don't exist

eval { eval "use Mock::Please::Dont::Be::There::No::Really" };
ok( defined $@, 
	"Mock::Please::Dont::Be::There::No::Really is not there (good)"  );
	
eval { 
	$brick->add_validator_packages( 
		"Mock::Please::Dont::Be::There::No::Really" ) };
my $at = $@;
ok( defined $at, "Adding non-existent validator package" );