The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
=head1 PURPOSE

Checks that talisman parameters are validated by L<MooX::Struct>.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

This software is copyright (c) 2012 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

use Test::More tests => 4;
use Test::NoWarnings;
use strict;
use warnings;

subtest 'isa checks' => sub {
	package Local::XXX1;
	use Sub::Talisman::Struct
		XXX => [qw( +number )],
	;

	::plan tests => 4;
	::ok eval q{ sub foo1 :XXX(123) { 1 }; 1 }, 'valid value';
	::ok eval q{ sub foo2 :XXX { 1 }; 1 }, 'no value';
	::ok !eval q{ sub foo3 :XXX("Hello") { 1 }; 1 }, 'invalid value';
	::like $@, qr{isa check for "number" failed}, 'error msg';
};

subtest 'required attribute checks' => sub {
	package Local::XXX2;
	use Sub::Talisman::Struct
		XXX => [qw( +number! )],
	;

	::plan tests => 5;
	::ok eval q{ sub foo1 :XXX(123) { 1 }; 1 }, 'valid value';
	::ok !eval q{ sub foo2 :XXX { 1 }; 1 }, 'no value';
	::like $@, qr{Missing required arguments: number}, 'error msg - missing';
	::ok !eval q{ sub foo3 :XXX("Hello") { 1 }; 1 }, 'invalid value';
	::like $@, qr{isa check for "number" failed}, 'error msg - invalid';
};

subtest 'too many args' => sub {
	package Local::XXX3;
	use Sub::Talisman::Struct
		XXX => [qw( +number! )],
	;

	::plan tests => 3;
	::ok eval q{ sub foo1 :XXX(123) { 1 }; 1 }, 'valid value';
	::ok !eval q{ sub foo2 :XXX(123,456) { 1 }; 1 }, 'too many values';
	::like $@, qr{Too many parameters for attribute Local::XXX3::XXX}, 'error msg';
};