#!/usr/bin/perl
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Finance-IIF.t'
use strict;
use Test::More tests => 998;
my $DOWARN;
BEGIN {
BEGIN {
$SIG{"__WARN__"} = sub { warn $_[0] if $DOWARN }
}
$DOWARN = 1;
use_ok('Finance::QIF') or exit;
}
my $package = "Finance::QIF";
my $testfile = "t/test.qif";
{ # new
can_ok( $package, qw(new) );
my $obj = $package->new;
isa_ok( $obj, $package );
is( $obj->{debug}, 0, "default debug value" );
is( $obj->{autodetect}, 0, "default autodetect value" );
is( $obj->{trim_white_space}, 0, "default trim_white_space value" );
is( $obj->record_separator, $/, "default record separator" );
$obj = $package->new(
debug => 1,
record_separator => "X\rX\n",
);
is( $obj->{debug}, 1, "custom debug value" );
is( $obj->record_separator, "X\rX\n", "custom record separator" );
}
{ # autodetect
my ( $fh, $obj );
$fh = File::Temp->new;
$fh->close;
$obj = $package->new( file => $fh->filename, autodetect => 1 );
is( $obj->record_separator, $/, "autodetect default record separator" );
$fh = File::Temp->new;
print( $fh "Testing Windows\r\n" );
$fh->close;
$obj = $package->new( file => $fh->filename, autodetect => 1 );
is( $obj->record_separator, "\r\n", "autodetect windows record separator" );
$fh = File::Temp->new;
print( $fh "Testing Mac\r" );
$fh->close;
$obj = $package->new( file => $fh->filename, autodetect => 1 );
is( $obj->record_separator, "\r", "autodetect mac record separator" );
$fh = File::Temp->new;
print( $fh "Testing Unix\n" );
$fh->close;
$obj = $package->new( file => $fh->filename, autodetect => 1 );
is( $obj->record_separator, "\n", "autodetect unix record separator" );
}
{ # trim_white_space
my $fh = File::Temp->new;
print( $fh "!Type:Security\nNIntuit \nS INTU\nT Stock \nGHigh Risk\n^\n" );
$fh->close;
my $obj = $package->new( file => $fh->filename, autodetect => 1 );
ok( $obj->{trim_white_space} == 0, "trim_white_space not set" );
my $record = $obj->next();
ok( $record->{security} eq "Intuit ", "trim_white_space trailing" );
ok( $record->{symbol} eq " INTU", "trim_white_space leading" );
ok( $record->{type} eq " Stock ", "trim_white_space both" );
$obj = $package->new(
file => $fh->filename,
autodetect => 1,
trim_white_space => 1
);
ok( $obj->{trim_white_space} == 1, "trim_white_space set" );
$record = $obj->next();
ok( $record->{security} eq "Intuit", "trim_white_space trailing" );
ok( $record->{symbol} eq "INTU", "trim_white_space leading" );
ok( $record->{type} eq "Stock", "trim_white_space both" );
}
{ # reset
can_ok( $package, qw(reset) );
my $obj = $package->new;
eval { $obj->reset };
like(
$@,
qr/^No filehandle available/,
"reset without a filehandle croaks"
);
my $fh = File::Temp->new;
print( $fh "!Type:Security\nNIntuit\nSINTU\nTStock\nGHigh Risk\n^\n" );
$fh->close;
$obj = $package->new( file => $fh->filename, autodetect => 1 );
my $record1 = $obj->next;
$obj->reset;
my $record2 = $obj->next;
ok(
$record1->{header} eq $record2->{header}
&& $record1->{security} eq $record2->{security}
&& $record1->{symbol} eq $record2->{symbol}
&& $record1->{type} eq $record2->{type}
&& $record1->{goal} eq $record2->{goal},
"reset reads same record"
);
}
{ # file
can_ok( $package, qw(file) );
my $obj = $package->new;
is( $obj->file, undef, "file undef by default" );
is( $obj->file($testfile), $testfile, "file with one arg" );
is( $obj->file( $testfile, "<" ), $testfile, "file with two args" );
$obj = $package->new( file => $testfile );
is( $obj->file, $testfile, "new with scalar file argument" );
SKIP: {
skip "Perl 5.008 not installed", 1 if $] < 5.008;
$obj = $package->new( file => [ $testfile, "<:crlf" ] );
is( $obj->file, $testfile, "new with arrayref file argument" );
}
is_deeply( [ $obj->file( 1, 2 ) ], [ 1, 2 ], "file returns list" );
}
{ # croak checks for: _filehandle next _getline close
my @methods = qw(_filehandle next _getline close);
can_ok( $package, @methods );
foreach my $method (@methods) {
my $obj = $package->new;
eval { $obj->$method };
like(
$@,
qr/^No filehandle available/,
"$method without a filehandle croaks"
);
}
}
{ # open
can_ok( $package, qw(open) );
my $obj = $package->new;
eval { $obj->open };
like( $@, qr/^No file specified/, "open without a file croaks" );
$obj = $package->new;
eval { $obj->open($testfile) };
is( $@, "", "open with file does not die" );
}
{ # _parseline
can_ok( $package, qw(_parseline) );
}
{ # _warning
can_ok( $package, qw(_warning) );
}
testfile( "Read ", $testfile );
my $in = $package->new(
file => $testfile,
autodetect => 1
);
binmode $in->_filehandle;
my $fh = File::Temp->new;
$fh->close;
my $tempfile = $fh->filename;
my $out = $package->new(
file => ">" . $tempfile,
record_separator => $in->record_separator
);
binmode $out->_filehandle;
# Trap warning so we can validate message returned.
$DOWARN = 0;
# need to create a test that intentionally causes a warning so we can validate
# warnings are always working properly
# turn warnings back on
$DOWARN = 1;
my $header = "";
while ( my $record = $in->next ) {
if ( $header ne $record->{header} ) {
$out->header( $record->{header} );
$header = $record->{header};
}
$out->write($record);
}
$in->close;
$out->close;
testfile( "Write ", $tempfile );
#test default write/write works
$out = $package->new( file => ">" . $tempfile, );
my $record = {
header => "Type:Security",
security => "Intuit",
symbol => "INTU",
type => "Stock",
goal => "High Risk"
};
$out->header( $record->{header} );
$out->write($record);
$out->close;
$in = $package->new( file => $tempfile, );
$record = $in->next;
ok( $record->{header} eq "Type:Security", "default write/read" );
ok( $record->{security} eq "Intuit", "default write/read" );
ok( $record->{symbol} eq "INTU", "default write/read" );
ok( $record->{type} eq "Stock", "default write/read" );
ok( $record->{goal} eq "High Risk", "default write/read" );
# Need a test for confirming we don't interfere with other open files
# reading input with different line separator.
sub testfile {
my $test = shift;
my $file = shift;
my $qif = $package->new(
file => $file,
record_separator => "\n"
);
binmode $qif->_filehandle;
# account tests
{
my $record;
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Asset", $test . "Account" );
ok( $record->{description} eq "Sample Asset", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Note on Asset", $test . "Account" );
ok( $record->{type} eq "Oth A", $test . "Account" );
ok( $record->{balance} eq "25,000.00", $test . "Account" );
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Bank", $test . "Account" );
ok( $record->{description} eq "Sample Bank", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Notes on Sample", $test . "Account" );
ok( $record->{type} eq "Bank", $test . "Account" );
ok( $record->{balance} eq "1,465.00", $test . "Account" );
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Cash", $test . "Account" );
ok( $record->{description} eq "Sample Cash", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Note on Cash", $test . "Account" );
ok( $record->{type} eq "Cash", $test . "Account" );
ok( $record->{balance} eq "0.00", $test . "Account" );
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Credit Card", $test . "Account" );
ok( $record->{description} eq "Sample Card", $test . "Account" );
ok( $record->{limit} eq "15,000.00", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Note on Card", $test . "Account" );
ok( $record->{type} eq "CCard", $test . "Account" );
ok( $record->{balance} eq "0.00", $test . "Account" );
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Liability", $test . "Account" );
ok( $record->{description} eq "Sample Liability", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Note on Liability", $test . "Account" );
ok( $record->{type} eq "Oth L", $test . "Account" );
ok( $record->{balance} eq "50,000.00", $test . "Account" );
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Mutual Fund", $test . "Account" );
ok( $record->{description} eq "Sample Fund", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Note on Fund", $test . "Account" );
ok( $record->{type} eq "Mutual", $test . "Account" );
ok( $record->{balance} eq "672.87", $test . "Account" );
$record = $qif->next;
ok( $record->{header} eq "Account", $test . "Account" );
ok( $record->{name} eq "Portfolio", $test . "Account" );
ok( $record->{description} eq "Sample Portfolio", $test . "Account" );
ok( $record->{tax} eq "", $test . "Account" );
ok( $record->{note} eq "Note on portfolio", $test . "Account" );
ok( $record->{type} eq "Port", $test . "Account" );
ok( $record->{balance} eq "2,651.00", $test . "Account" );
}
# Added a trailing space to the !Clear:AutoSwitch line in data file.
# We should test to make sure it is processed as a accepted header and
# that no error message was generated during processing.
# security tests
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Security", $test . "Security" );
ok( $record->{security} eq "Intuit", $test . "Security" );
ok( $record->{symbol} eq "INTU", $test . "Security" );
ok( $record->{type} eq "Stock", $test . "Security" );
ok( $record->{goal} eq "High Risk", $test . "Security" );
$record = $qif->next;
ok( $record->{header} eq "Type:Security", $test . "Security" );
}
# payee tests
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Payee", $test . "Payee" );
ok( $record->{name} eq "Safeway", $test . "Payee" );
ok( $record->{address} eq "Safeway Address\n\n", $test . "Payee" );
ok( $record->{city} eq "City", $test . "Payee" );
ok( $record->{state} eq "SC", $test . "Payee" );
ok( $record->{zip} eq "99999 ", $test . "Payee" );
ok( $record->{country} eq "", $test . "Payee" );
ok( $record->{phone} eq "3333333333", $test . "Payee" );
ok( $record->{account} eq "123456789", $test . "Payee" );
}
# category tests
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Cat", $test . "Category" );
ok( $record->{name} eq "Auto", $test . "Category" );
ok( $record->{description} eq "Automobile Expenses",
$test . "Category" );
ok( $record->{expense} eq "", $test . "Category" );
for ( my $count = 0 ; $count < 21 ; $count++ ) {
$record = $qif->next;
ok( $record->{header} eq "Type:Cat", $test . "Category" );
}
$record = $qif->next;
ok( $record->{header} eq "Type:Cat", $test . "Category" );
ok( $record->{name} eq "Interest Inc", $test . "Category" );
ok( $record->{description} eq "Interest Income", $test . "Category" );
ok( $record->{income} eq "", $test . "Category" );
ok( $record->{tax} eq "", $test . "Category" );
ok( $record->{schedule} eq "4592", $test . "Category" );
ok( $record->{budget}[0] eq "1.00", $test . "Category" );
ok( $record->{budget}[1] eq "0.00", $test . "Category" );
ok( $record->{budget}[2] eq "0.00", $test . "Category" );
ok( $record->{budget}[3] eq "1.00", $test . "Category" );
ok( $record->{budget}[4] eq "0.00", $test . "Category" );
ok( $record->{budget}[5] eq "0.00", $test . "Category" );
ok( $record->{budget}[6] eq "1.00", $test . "Category" );
ok( $record->{budget}[7] eq "0.00", $test . "Category" );
ok( $record->{budget}[8] eq "0.00", $test . "Category" );
ok( $record->{budget}[9] eq "0.00", $test . "Category" );
ok( $record->{budget}[10] eq "0.00", $test . "Category" );
ok( $record->{budget}[11] eq "1.00", $test . "Category" );
for ( my $count = 0 ; $count < 73 ; $count++ ) {
$record = $qif->next;
ok( $record->{header} eq "Type:Cat", $test . "Category" );
}
}
# budget tests
{
for ( my $count = 0 ; $count < 17 ; $count++ ) {
my $record = $qif->next;
ok( $record->{header} eq "Type:Budget", $test . "Budget" );
}
my $record = $qif->next;
ok( $record->{header} eq "Type:Budget", $test . "Budget" );
ok( $record->{name} eq "Groceries", $test . "Budget" );
ok( $record->{description} eq "Groceries", $test . "Budget" );
ok( $record->{budget}[0] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[1] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[2] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[3] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[4] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[5] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[6] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[7] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[8] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[9] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[10] eq "-100.00", $test . "Budget" );
ok( $record->{budget}[11] eq "-100.00", $test . "Budget" );
for ( my $count = 0 ; $count < 78 ; $count++ ) {
$record = $qif->next;
ok( $record->{header} eq "Type:Budget", $test . "Budget" );
}
}
# Class tests
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Class", $test . "Class" );
ok( $record->{name} eq "Class", $test . "Class" );
ok( $record->{description} eq "Class Description", $test . "Class" );
$record = $qif->next;
ok( $record->{header} eq "Type:Class", $test . "Class" );
}
# Oth A test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Oth A" );
ok( $record->{name} eq "Asset", $test . "Oth A" );
ok( $record->{type} eq "Oth A", $test . "Oth A" );
ok( $record->{balance} eq "25,000.00", $test . "Oth A" );
for ( my $count = 0 ; $count < 2 ; $count++ ) {
$record = $qif->next;
ok( $record->{header} eq "Type:Oth A", $test . "Oth A" );
}
}
# Bank test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Bank" );
ok( $record->{name} eq "Bank", $test . "Bank" );
ok( $record->{type} eq "Bank", $test . "Bank" );
ok( $record->{balance} eq "1,465.00", $test . "Bank" );
$record = $qif->next;
ok( $record->{header} eq "Type:Bank", $test . "Bank" );
ok( $record->{date} eq "1/10/06", $test . "Bank" );
ok( $record->{payee} eq "Opening Balance", $test . "Bank" );
ok( $record->{memo} eq "", $test . "Bank" );
ok( $record->{transaction} eq "0.00", $test . "Bank" );
ok( $record->{address} eq "", $test . "Bank" );
ok( $record->{status} eq "X", $test . "Bank" );
ok( $record->{category} eq "[Bank]", $test . "Bank" );
$record = $qif->next;
ok( $record->{header} eq "Type:Bank", $test . "Bank" );
ok( $record->{date} eq "1/10/06", $test . "Bank" );
ok( $record->{payee} eq "Paycheck", $test . "Bank" );
ok( $record->{memo} eq "", $test . "Bank" );
ok( $record->{transaction} eq "1,690.00", $test . "Bank" );
ok( $record->{address} eq "", $test . "Bank" );
ok( $record->{category} eq "Salary", $test . "Bank" );
ok( $record->{splits}[0]{category} eq "Salary", $test . "Bank" );
ok( $record->{splits}[0]{memo} eq "", $test . "Bank" );
ok( $record->{splits}[0]{amount} eq "2,000.00", $test . "Bank" );
ok( $record->{splits}[1]{category} eq "Payroll Taxes, Self:Federal",
$test . "Bank" );
ok( $record->{splits}[1]{memo} eq "", $test . "Bank" );
ok( $record->{splits}[1]{amount} eq "-250.00", $test . "Bank" );
ok( $record->{splits}[2]{category} eq "Payroll Taxes, Self:Soc Sec",
$test . "Bank" );
ok( $record->{splits}[2]{amount} eq "-50.00", $test . "Bank" );
ok( $record->{splits}[3]{category} eq "Payroll Taxes, Self:Medicare",
$test . "Bank" );
ok( $record->{splits}[3]{memo} eq "", $test . "Bank" );
ok( $record->{splits}[3]{amount} eq "-10.00", $test . "Bank" );
$record = $qif->next;
ok( $record->{header} eq "Type:Bank", $test . "Bank" );
ok( $record->{date} eq "1/17/06", $test . "Bank" );
ok( $record->{payee} eq "Safeway", $test . "Bank" );
ok( $record->{memo} eq "", $test . "Bank" );
ok( $record->{transaction} eq "-100.00", $test . "Bank" );
ok( $record->{address} eq "", $test . "Bank" );
ok( $record->{category} eq "Groceries", $test . "Bank" );
$record = $qif->next;
ok( $record->{header} eq "Type:Bank", $test . "Bank" );
ok( $record->{date} eq "2/17/06", $test . "Bank" );
ok( $record->{payee} eq "Safeway", $test . "Bank" );
ok( $record->{memo} eq "", $test . "Bank" );
ok( $record->{transaction} eq "-125.00", $test . "Bank" );
ok( $record->{address} eq "", $test . "Bank" );
ok( $record->{number} eq ">>>>>", $test . "Bank" );
ok( $record->{category} eq "Groceries", $test . "Bank" );
ok( $record->{splits}[0]{category} eq "Groceries", $test . "Bank" );
ok( $record->{splits}[0]{memo} eq "", $test . "Bank" );
ok( $record->{splits}[0]{amount} eq "-100.00", $test . "Bank" );
ok( $record->{splits}[1]{category} eq "Misc", $test . "Bank" );
ok( $record->{splits}[1]{memo} eq "", $test . "Bank" );
ok( $record->{splits}[1]{amount} eq "-25.00", $test . "Bank" );
$record = $qif->next;
ok( $record->{header} eq "Type:Bank", $test . "Bank" );
ok( $record->{date} eq "3/17/06", $test . "Bank" );
ok( $record->{payee} eq "Safeway", $test . "Bank" );
ok( $record->{memo} eq "", $test . "Bank" );
ok( $record->{transaction} eq "-100.00", $test . "Bank" );
ok( $record->{total} eq "-100.00", $test . "Bank" );
ok( $record->{address} eq "", $test . "Bank" );
ok( $record->{category} eq "Groceries", $test . "Bank" );
$qif->{trim_white_space} = 1;
$record = $qif->next;
ok( $record->{header} eq "Type:Bank", $test . "Bank" );
ok( $record->{date} eq "3/17/06", $test . "Bank" );
ok( $record->{payee} eq "QFC", $test . "Bank" );
ok( $record->{memo} eq "", $test . "Bank" );
ok( $record->{transaction} eq "-100.00", $test . "Bank" );
ok( $record->{total} eq "-100.00", $test . "Bank" );
ok( $record->{address} eq "", $test . "Bank" );
ok( $record->{category} eq "Groceries", $test . "Bank" );
$qif->{trim_white_space} = 0;
}
# Cash test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Cash" );
ok( $record->{name} eq "Cash", $test . "Cash" );
ok( $record->{type} eq "Cash", $test . "Cash" );
ok( $record->{balance} eq "0.00", $test . "Cash" );
$record = $qif->next;
ok( $record->{header} eq "Type:Cash", $test . "Cash" );
ok( $record->{date} eq "1/10/06", $test . "Cash" );
ok( $record->{payee} eq "Opening Balance", $test . "Cash" );
ok( $record->{memo} eq "", $test . "Cash" );
ok( $record->{transaction} eq "0.00", $test . "Cash" );
ok( $record->{address} eq "", $test . "Cash" );
ok( $record->{status} eq "X", $test . "Cash" );
ok( $record->{category} eq "[Cash]", $test . "Cash" );
}
# Credit Card test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Credit Card" );
ok( $record->{name} eq "Credit Card", $test . "Credit Card" );
ok( $record->{limit} eq "15,000.00", $test . "Credit Card" );
ok( $record->{type} eq "CCard", $test . "Credit Card" );
ok( $record->{balance} eq "0.00", $test . "Credit Card" );
$record = $qif->next;
ok( $record->{header} eq "Type:CCard", $test . "Credit Card" );
ok( $record->{date} eq "1/10/06", $test . "Credit Card" );
ok( $record->{payee} eq "Opening Balance", $test . "Credit Card" );
ok( $record->{memo} eq "", $test . "Credit Card" );
ok( $record->{transaction} eq "0.00", $test . "Credit Card" );
ok( $record->{address} eq "", $test . "Credit Card" );
ok( $record->{status} eq "X", $test . "Credit Card" );
ok( $record->{category} eq "[Credit Card]", $test . "Credit Card" );
}
# Liability test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Liability" );
ok( $record->{name} eq "Liability", $test . "Liability" );
ok( $record->{type} eq "Oth L", $test . "Liability" );
ok( $record->{balance} eq "50,000.00", $test . "Liability" );
$record = $qif->next;
ok( $record->{header} eq "Type:Oth L", $test . "Liability" );
ok( $record->{date} eq "1/10/06", $test . "Liability" );
ok( $record->{payee} eq "Opening Balance", $test . "Liability" );
ok( $record->{memo} eq "", $test . "Liability" );
ok( $record->{transaction} eq "-50,000.00", $test . "Liability" );
ok( $record->{address} eq "", $test . "Liability" );
ok( $record->{status} eq "X", $test . "Liability" );
ok( $record->{category} eq "[Liability]", $test . "Liability" );
}
# Mutual Fund test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Mutual Fund" );
ok( $record->{name} eq "Mutual Fund", $test . "Mutual Fund" );
ok( $record->{type} eq "Mutual", $test . "Mutual Fund" );
ok( $record->{balance} eq "672.87", $test . "Mutual Fund" );
for ( my $count = 0 ; $count < 1 ; $count++ ) {
$record = $qif->next;
ok( $record->{header} eq "Type:Invst", $test . "Mutual Fund" );
}
}
# Portfolio test
{
my $record = $qif->next;
ok( $record->{header} eq "Account", $test . "Portfolio" );
ok( $record->{name} eq "Portfolio", $test . "Portfolio" );
ok( $record->{type} eq "Port", $test . "Portfolio" );
ok( $record->{balance} eq "2,651.00", $test . "Portfolio" );
}
# Invest test
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Invst", $test . "Invest" );
ok( $record->{date} eq "1/10/06", $test . "Invest" );
ok( $record->{action} eq "ShrsIn", $test . "Invest" );
ok( $record->{security} eq "Intuit", $test . "Invest" );
ok( $record->{quantity} eq "50", $test . "Invest" );
ok( $record->{memo} eq "Initial Move", $test . "Invest" );
}
# Prices test
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Prices", $test . "Prices" );
ok( $record->{symbol} eq "INTU", $test . "Prices" );
ok( $record->{prices}[0]{close} eq "55.400", $test . "Prices" );
ok( $record->{prices}[0]{date} eq "12/12/05", $test . "Prices" );
ok( $record->{prices}[0]{max} eq "55.560", $test . "Prices" );
ok( $record->{prices}[0]{min} eq "53.660", $test . "Prices" );
ok( $record->{prices}[0]{volume} eq "3120461", $test . "Prices" );
ok( $record->{prices}[1]{close} eq "55.570", $test . "Prices" );
ok( $record->{prices}[1]{date} eq "12/13/05", $test . "Prices" );
ok( $record->{prices}[1]{max} eq "55.740", $test . "Prices" );
ok( $record->{prices}[1]{min} eq "54.600", $test . "Prices" );
ok( $record->{prices}[1]{volume} eq "2437647", $test . "Prices" );
$record = $qif->next;
ok( $record->{header} eq "Type:Prices", $test . "Prices" );
$record = $qif->next;
ok( $record->{header} eq "Type:Prices", $test . "Prices" );
ok( $record->{symbol} eq "WIN", $test . "Prices" );
ok( $record->{prices}[0]{close} eq "19.740", $test . "Prices" );
ok( $record->{prices}[0]{date} eq "12/12/05", $test . "Prices" );
ok( exists( $record->{prices}[0]{max} ) == 0, $test . "Prices" );
ok( exists( $record->{prices}[0]{min} ) == 0, $test . "Prices" );
ok( exists( $record->{prices}[0]{volume} ) == 0, $test . "Prices" );
}
# Memorized test
{
my $record = $qif->next;
ok( $record->{header} eq "Type:Memorized", $test . "Memorized" );
ok( $record->{transaction} eq "-50.00", $test . "Memorized" );
ok( $record->{payee} eq "Safeway", $test . "Memorized" );
ok( $record->{memo} eq "", $test . "Memorized" );
ok( $record->{type} eq "C", $test . "Memorized" );
$record = $qif->next;
ok( $record->{header} eq "Type:Memorized", $test . "Memorized" );
ok( $record->{transaction} eq "-1,140.17", $test . "Memorized" );
ok( $record->{payee} eq "Bank", $test . "Memorized" );
ok( $record->{memo} eq "", $test . "Memorized" );
ok( $record->{address} eq "", $test . "Memorized" );
ok( $record->{category} eq "[Liability]", $test . "Memorized" );
ok( $record->{splits}[0]{category} eq "[Liability]",
$test . "Memorized" );
ok( $record->{splits}[0]{memo} eq "principal", $test . "Memorized" );
ok( $record->{splits}[0]{amount} eq "-952.67", $test . "Memorized" );
ok( $record->{splits}[1]{category} eq "Mortgage Int",
$test . "Memorized" );
ok( $record->{splits}[1]{memo} eq "interest", $test . "Memorized" );
ok( $record->{splits}[1]{amount} eq "-187.50", $test . "Memorized" );
ok( $record->{first} eq "2/1/06", $test . "Memorized" );
ok( $record->{years} eq "4", $test . "Memorized" );
ok( $record->{made} eq "0", $test . "Memorized" );
ok( $record->{periods} eq "12", $test . "Memorized" );
ok( $record->{interest} eq "4.5", $test . "Memorized" );
ok( $record->{balance} eq "25,000.00", $test . "Memorized" );
ok( $record->{loan} eq "25,000.00", $test . "Memorized" );
ok( $record->{type} eq "P", $test . "Memorized" );
$record = $qif->next;
ok( $record->{header} eq "Type:Memorized", $test . "Memorized" );
ok( $record->{action} eq "SellX", $test . "Memorized" );
ok( $record->{security} eq "IDS New D A", $test . "Memorized" );
ok( $record->{price} eq "22.096936", $test . "Memorized" );
ok( $record->{quantity} eq "158.393", $test . "Memorized" );
ok( $record->{total} eq "3,500.00", $test . "Memorized" );
ok( $record->{transaction} eq "3,500.00", $test . "Memorized" );
ok( $record->{memo} eq "Investment", $test . "Memorized" );
ok( $record->{category} eq "[Invest]", $test . "Memorized" );
ok( $record->{amount} eq "3,500.00", $test . "Memorized" );
ok( $record->{type} eq "I", $test . "Memorized" );
}
}