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;
use Test::Fatal;
use Test::Method;
use Class::Load qw( load_class );
use DateTime;

my $card_c = load_class('Business::CyberSource::RequestPart::Card');

my $card0
	= new_ok( $card_c => [{
		account_number => '4111111111111111',
		expiration     => {
			year  => '2025',
			month => '04',
		},
	}]);

is $card0->type, 'VISA', 'type visa';

isa_ok $card0->expiration, 'DateTime', 'expiration object';
is $card0->expiration->month, 4,       'expiration month';
is $card0->expiration->year,  2025,    'expiration year';
is $card0->expiration->day,   30,      'expiration day';
is $card0->is_expired,        0,       'card0 not expired';

my $dt0 = DateTime->new( year => 2025, month => 4, day => 30 );
my $dt1 = DateTime->new( year => 2025, month => 5, day => 1  );
my $dt2 = DateTime->new( year => 2025, month => 5, day => 2  );
my $dt3 = DateTime->new( year => 2025, month => 6, day => 1  );

is $card0->_compare_date_against_expiration( $dt0 ), 0, 'april not expired';
is $card0->_compare_date_against_expiration( $dt1 ), 0, 'may 1 not expired';
is $card0->_compare_date_against_expiration( $dt2 ), 1, 'may 2 expired';
is $card0->_compare_date_against_expiration( $dt3 ), 1, 'june expired';

my $card1
	= new_ok( $card_c => [{
		account_number => '5555 5555 5555 4444',
		expiration     => {
			year  => '2012',
			month => '04',
		},
	}]);

is $card1->type,      'MASTERCARD', 'mastercard';
is $card1->is_expired, 1,           'card1 expired';

my $card2
	= new_ok( $card_c => [{
		account_number => '3566 1111 1111 1113',
		expiration     => {
			year  => '2012',
			month => '04',
		},
	}]);

method_ok $card2, 'type', [], 'DISCOVER';

done_testing;