The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::Routine;
use Test::Routine::Util;
use Test::More;

use Scalar::Util 'refaddr';

my %good_args = (
    date        => '31/12/2012',
    narrative   => '1 BANK CHEQUE FEE - BWA CUSTOMER',
    cheque_num  => undef,
    amount      => '-10.00',
    type        => 'FEE',
);

run_tests(
    undef,
    't::lib::Test::UnexpectedParamFails' => {
        class       => 'Transaction',
        good_args   => \%good_args,
    },
);

test 'equals method true' => sub {
    my $txn1 = Finance::Bank::Bankwest::Transaction->new( %good_args );
    my $txn2 = Finance::Bank::Bankwest::Transaction->new( %good_args );
    isnt refaddr $txn1, refaddr $txn2,
        'the two transactions must have separate references';
    ok $txn1->equals($txn2),
        'direct equals method call must return true';
    ok($txn1 eq $txn2, '"eq" operator must return true');
};

test 'equals method false' => sub {
    for (
        [ date          => '30/12/2012'     ],
        [ narrative     => 'SOMETHING ELSE' ],
        [ type          => 'ABC'            ],
        [ amount        => undef            ],
        [ amount        => '34.50'          ],
        [ cheque_num    => '000000123'      ],
    ) {
        my ($attr, $value) = @$_;
        my $txn1 = Finance::Bank::Bankwest::Transaction->new( %good_args );
        my $txn2 = Finance::Bank::Bankwest::Transaction->new(
            %good_args,
            $attr => $value,
        );
        ok ! $txn1->equals($txn2),
            "equals must return false for different '$attr' value";
        ok $txn1 ne $txn2,
            "'ne' must return true for different '$attr' value";
    }
};

test 'date_dt method' => sub {
    plan skip_all => 'DateTime not installed'
        if not eval { require DateTime; 1 };
    my $txn = Finance::Bank::Bankwest::Transaction->new( %good_args );
    is $txn->date_dt->strftime('%d/%m/%Y'), $txn->date,
        'DateTime date must match string date';
};

run_me;
done_testing;