You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
695 lines
31 KiB
695 lines
31 KiB
/***************************************************************************
|
|
querytabletest.cpp
|
|
-------------------
|
|
copyright : (C) 2002 by Thomas Baumgart
|
|
email : ipwizard@users.sourceforge.net
|
|
Ace Jones <ace.j@hotpop.com>
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include <tqvaluelist.h>
|
|
#include <tqvaluevector.h>
|
|
#include <tqfile.h>
|
|
|
|
#include <kdebug.h>
|
|
#include <tdeversion.h>
|
|
#include <kglobal.h>
|
|
#include <kglobalsettings.h>
|
|
#include <klocale.h>
|
|
#include <kstandarddirs.h>
|
|
|
|
#include "querytabletest.h"
|
|
#include "reportstestcommon.h"
|
|
|
|
#define private public
|
|
#include "tquerytable.h"
|
|
#undef private
|
|
|
|
#include "../mymoney/mymoneyaccount.h"
|
|
#include "../mymoney/mymoneysecurity.h"
|
|
#include "../mymoney/mymoneyprice.h"
|
|
#include "../mymoney/storage/mymoneystoragedump.h"
|
|
#include "../mymoney/mymoneyreport.h"
|
|
#include "../mymoney/mymoneystatement.h"
|
|
#include "../mymoney/storage/mymoneystoragexml.h"
|
|
|
|
using namespace reports;
|
|
using namespace test;
|
|
|
|
QueryTableTest::QueryTableTest()
|
|
{
|
|
}
|
|
|
|
void QueryTableTest::setUp () {
|
|
|
|
storage = new MyMoneySeqAccessMgr;
|
|
file = MyMoneyFile::instance();
|
|
file->attachStorage(storage);
|
|
MyMoneyFileTransaction ft;
|
|
file->addCurrency(MyMoneySecurity("CAD", "Canadian Dollar", "C$"));
|
|
file->addCurrency(MyMoneySecurity("USD", "US Dollar", "$"));
|
|
file->addCurrency(MyMoneySecurity("JPY", "Japanese Yen", TQChar(0x00A5), 100, 1));
|
|
file->addCurrency(MyMoneySecurity("GBP", "British Pound", "#"));
|
|
file->setBaseCurrency(file->currency("USD"));
|
|
|
|
MyMoneyPayee payeeTest("Test Payee");
|
|
file->addPayee(payeeTest);
|
|
MyMoneyPayee payeeTest2("Thomas Baumgart");
|
|
file->addPayee(payeeTest2);
|
|
|
|
acAsset = (MyMoneyFile::instance()->asset().id());
|
|
acLiability = (MyMoneyFile::instance()->liability().id());
|
|
acExpense = (MyMoneyFile::instance()->expense().id());
|
|
acIncome = (MyMoneyFile::instance()->income().id());
|
|
acChecking = makeAccount(TQString("Checking Account"),MyMoneyAccount::Checkings,moCheckingOpen,TQDate(2004,5,15),acAsset);
|
|
acCredit = makeAccount(TQString("Credit Card"),MyMoneyAccount::CreditCard,moCreditOpen,TQDate(2004,7,15),acLiability);
|
|
acSolo = makeAccount(TQString("Solo"),MyMoneyAccount::Expense,0,TQDate(2004,1,11),acExpense);
|
|
acParent = makeAccount(TQString("Parent"),MyMoneyAccount::Expense,0,TQDate(2004,1,11),acExpense);
|
|
acChild = makeAccount(TQString("Child"),MyMoneyAccount::Expense,0,TQDate(2004,2,11),acParent);
|
|
acForeign = makeAccount(TQString("Foreign"),MyMoneyAccount::Expense,0,TQDate(2004,1,11),acExpense);
|
|
acTax = makeAccount(TQString("Tax"), MyMoneyAccount::Expense,0,TQDate(2005,1,11),acExpense, "", true);
|
|
|
|
MyMoneyInstitution i("Bank of the World","","","","","","");
|
|
file->addInstitution(i);
|
|
inBank = i.id();
|
|
ft.commit();
|
|
}
|
|
|
|
void QueryTableTest::tearDown ()
|
|
{
|
|
file->detachStorage(storage);
|
|
delete storage;
|
|
}
|
|
|
|
void QueryTableTest::testQueryBasics()
|
|
{
|
|
try
|
|
{
|
|
TransactionHelper t1q1( TQDate(2004,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q1( TQDate(2004,2,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3q1( TQDate(2004,3,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4y1( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
TransactionHelper t1q2( TQDate(2004,4,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q2( TQDate(2004,5,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3q2( TQDate(2004,6,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4q2( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
TransactionHelper t1y2( TQDate(2005,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2y2( TQDate(2005,5,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3y2( TQDate(2005,9,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4y2( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
unsigned cols;
|
|
|
|
MyMoneyReport filter;
|
|
filter.setRowType( MyMoneyReport::eCategory );
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCaccount;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
filter.setName("Transactions by Category");
|
|
XMLandback(filter);
|
|
QueryTable qtbl_1(filter);
|
|
|
|
writeTabletoHTML(qtbl_1,"Transactions by Category.html");
|
|
|
|
TQValueList<ListTable::TableRow> rows = qtbl_1.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 12);
|
|
CPPUNIT_ASSERT(rows[0]["categorytype"]=="Expense");
|
|
CPPUNIT_ASSERT(rows[0]["category"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[0]["postdate"]=="2004-02-01");
|
|
CPPUNIT_ASSERT(rows[11]["categorytype"]=="Expense");
|
|
CPPUNIT_ASSERT(rows[11]["category"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[11]["postdate"]=="2005-01-01");
|
|
|
|
TQString html = qtbl_1.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Parent") == -(moParent1 + moParent2) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Parent: Child") == -(moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Solo") == -(moSolo) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Expense") == -(moParent1 + moParent2 + moSolo + moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == -(moParent1 + moParent2 + moSolo + moChild) * 3 + moCheckingOpen + moCreditOpen );
|
|
filter.setRowType( MyMoneyReport::eTopCategory );
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCaccount;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
filter.setName("Transactions by Top Category");
|
|
XMLandback(filter);
|
|
QueryTable qtbl_2(filter);
|
|
|
|
writeTabletoHTML(qtbl_2,"Transactions by Top Category.html");
|
|
|
|
rows = qtbl_2.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 12);
|
|
CPPUNIT_ASSERT(rows[0]["categorytype"]=="Expense");
|
|
CPPUNIT_ASSERT(rows[0]["topcategory"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[0]["postdate"]=="2004-02-01");
|
|
CPPUNIT_ASSERT(rows[8]["categorytype"]=="Expense");
|
|
CPPUNIT_ASSERT(rows[8]["topcategory"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[8]["postdate"]=="2005-09-01");
|
|
CPPUNIT_ASSERT(rows[11]["categorytype"]=="Expense");
|
|
CPPUNIT_ASSERT(rows[11]["topcategory"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[11]["postdate"]=="2005-01-01");
|
|
|
|
html = qtbl_2.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Parent") == -(moParent1 + moParent2 + moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Solo") == -(moSolo) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Expense") == -(moParent1 + moParent2 + moSolo + moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == -(moParent1 + moParent2 + moSolo + moChild) * 3 + moCheckingOpen + moCreditOpen);
|
|
|
|
filter.setRowType( MyMoneyReport::eAccount );
|
|
filter.setName("Transactions by Account");
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCcategory;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
XMLandback(filter);
|
|
QueryTable qtbl_3(filter);
|
|
|
|
writeTabletoHTML(qtbl_3,"Transactions by Account.html");
|
|
|
|
rows = qtbl_3.rows();
|
|
|
|
#if 1
|
|
CPPUNIT_ASSERT(rows.count() == 16);
|
|
CPPUNIT_ASSERT(rows[1]["account"]=="Checking Account");
|
|
CPPUNIT_ASSERT(rows[1]["category"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[1]["postdate"]=="2004-01-01");
|
|
CPPUNIT_ASSERT(rows[14]["account"]=="Credit Card");
|
|
CPPUNIT_ASSERT(rows[14]["category"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[14]["postdate"]=="2005-09-01");
|
|
#else
|
|
CPPUNIT_ASSERT(rows.count() == 12);
|
|
CPPUNIT_ASSERT(rows[0]["account"]=="Checking Account");
|
|
CPPUNIT_ASSERT(rows[0]["category"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[0]["postdate"]=="2004-01-01");
|
|
CPPUNIT_ASSERT(rows[11]["account"]=="Credit Card");
|
|
CPPUNIT_ASSERT(rows[11]["category"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[11]["postdate"]=="2005-09-01");
|
|
#endif
|
|
|
|
html = qtbl_3.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Checking Account") == -(moSolo) * 3 + moCheckingOpen);
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Credit Card") == -(moParent1 + moParent2 + moChild) * 3 + moCreditOpen );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == -(moParent1 + moParent2 + moSolo + moChild) * 3 + moCheckingOpen + moCreditOpen);
|
|
|
|
filter.setRowType( MyMoneyReport::ePayee );
|
|
filter.setName("Transactions by Payee");
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCmemo | MyMoneyReport::eTQCcategory;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
XMLandback(filter);
|
|
QueryTable qtbl_4(filter);
|
|
|
|
writeTabletoHTML(qtbl_4,"Transactions by Payee.html");
|
|
|
|
rows = qtbl_4.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 12);
|
|
CPPUNIT_ASSERT(rows[0]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[0]["category"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[0]["postdate"]=="2004-01-01");
|
|
CPPUNIT_ASSERT(rows[8]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[8]["category"]=="Parent: Child");
|
|
CPPUNIT_ASSERT(rows[8]["postdate"]=="2004-11-07");
|
|
CPPUNIT_ASSERT(rows[11]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[11]["category"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[11]["postdate"]=="2005-09-01");
|
|
|
|
html = qtbl_4.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Test Payee") == -(moParent1 + moParent2 + moSolo + moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == -(moParent1 + moParent2 + moSolo + moChild) * 3 + moCheckingOpen + moCreditOpen);
|
|
|
|
filter.setRowType( MyMoneyReport::eMonth );
|
|
filter.setName("Transactions by Month");
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCcategory;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
XMLandback(filter);
|
|
QueryTable qtbl_5(filter);
|
|
|
|
writeTabletoHTML(qtbl_5,"Transactions by Month.html");
|
|
|
|
rows = qtbl_5.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 12);
|
|
CPPUNIT_ASSERT(rows[0]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[0]["category"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[0]["postdate"]=="2004-01-01");
|
|
CPPUNIT_ASSERT(rows[8]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[8]["category"]=="Parent: Child");
|
|
CPPUNIT_ASSERT(rows[8]["postdate"]=="2004-11-07");
|
|
CPPUNIT_ASSERT(rows[11]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[11]["category"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[11]["postdate"]=="2005-09-01");
|
|
|
|
html = qtbl_5.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Month of 2004-01-01") == -moSolo );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Month of 2004-11-01") == -(moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Month of 2004-05-01") == -moParent1 + moCheckingOpen );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == -(moParent1 + moParent2 + moSolo + moChild) * 3 + moCheckingOpen + moCreditOpen);
|
|
|
|
filter.setRowType( MyMoneyReport::eWeek );
|
|
filter.setName("Transactions by Week");
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCcategory;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
XMLandback(filter);
|
|
QueryTable qtbl_6(filter);
|
|
|
|
writeTabletoHTML(qtbl_6,"Transactions by Week.html");
|
|
|
|
rows = qtbl_6.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 12);
|
|
CPPUNIT_ASSERT(rows[0]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[0]["category"]=="Solo");
|
|
CPPUNIT_ASSERT(rows[0]["postdate"]=="2004-01-01");
|
|
CPPUNIT_ASSERT(rows[11]["payee"]=="Test Payee");
|
|
CPPUNIT_ASSERT(rows[11]["category"]=="Parent");
|
|
CPPUNIT_ASSERT(rows[11]["postdate"]=="2005-09-01");
|
|
|
|
html = qtbl_6.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Week of 2003-12-29") == -moSolo );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Week of 2004-11-01") == -(moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" Week of 2005-08-29") == -moParent2 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == -(moParent1 + moParent2 + moSolo + moChild) * 3 + moCheckingOpen + moCreditOpen);
|
|
}
|
|
catch(MyMoneyException *e)
|
|
{
|
|
CPPUNIT_FAIL(e->what());
|
|
delete e;
|
|
}
|
|
|
|
// Test querytable::TableRow::operator> and operator==
|
|
|
|
QueryTable::TableRow low;
|
|
low["first"] = "A";
|
|
low["second"] = "B";
|
|
low["third"] = "C";
|
|
|
|
QueryTable::TableRow high;
|
|
high["first"] = "A";
|
|
high["second"] = "C";
|
|
high["third"] = "B";
|
|
|
|
QueryTable::TableRow::setSortCriteria("first,second,third");
|
|
CPPUNIT_ASSERT( low < high );
|
|
CPPUNIT_ASSERT( low <= high );
|
|
CPPUNIT_ASSERT( high > low );
|
|
CPPUNIT_ASSERT( high <= high );
|
|
CPPUNIT_ASSERT( high == high );
|
|
}
|
|
|
|
void QueryTableTest::testCashFlowAnalysis()
|
|
{
|
|
//
|
|
// Test IRR calculations
|
|
//
|
|
|
|
CashFlowList list;
|
|
|
|
list += CashFlowListItem( TQDate(2004,5,3),1000.0 );
|
|
list += CashFlowListItem( TQDate(2004,5,20),59.0 );
|
|
list += CashFlowListItem( TQDate(2004,6,3),14.0 );
|
|
list += CashFlowListItem( TQDate(2004,6,24),92.0 );
|
|
list += CashFlowListItem( TQDate(2004,7,6),63.0 );
|
|
list += CashFlowListItem( TQDate(2004,7,25),15.0 );
|
|
list += CashFlowListItem( TQDate(2004,8,5),92.0 );
|
|
list += CashFlowListItem( TQDate(2004,9,2),18.0 );
|
|
list += CashFlowListItem( TQDate(2004,9,21),5.0 );
|
|
list += CashFlowListItem( TQDate(2004,10,16),-2037.0 );
|
|
|
|
MyMoneyMoney IRR(list.IRR(),1000);
|
|
|
|
CPPUNIT_ASSERT( IRR == MyMoneyMoney(1676,1000) );
|
|
|
|
list.pop_back();
|
|
list += CashFlowListItem( TQDate(2004,10,16),-1358.0 );
|
|
|
|
IRR = MyMoneyMoney( list.IRR(), 1000 );
|
|
|
|
CPPUNIT_ASSERT( IRR.isZero() );
|
|
}
|
|
|
|
void QueryTableTest::testAccountQuery()
|
|
{
|
|
try
|
|
{
|
|
TQString htmlcontext = TQString("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\">\n<html><head><link rel=\"stylesheet\" type=\"text/css\" href=\"html/kmymoney2.css\"></head><body>\n%1\n</body></html>\n");
|
|
|
|
//
|
|
// No transactions, opening balances only
|
|
//
|
|
|
|
MyMoneyReport filter;
|
|
filter.setRowType( MyMoneyReport::eInstitution );
|
|
filter.setName("Accounts by Institution (No transactions)");
|
|
XMLandback(filter);
|
|
QueryTable qtbl_1(filter);
|
|
|
|
writeTabletoHTML(qtbl_1,"Accounts by Institution (No transactions).html");
|
|
|
|
TQValueList<ListTable::TableRow> rows = qtbl_1.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 2);
|
|
CPPUNIT_ASSERT(rows[0]["account"]=="Checking Account");
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["value"])==moCheckingOpen);
|
|
CPPUNIT_ASSERT(rows[0]["equitytype"].isEmpty());
|
|
CPPUNIT_ASSERT(rows[1]["account"]=="Credit Card");
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["value"])==moCreditOpen);
|
|
CPPUNIT_ASSERT(rows[1]["equitytype"].isEmpty());
|
|
|
|
TQString html = qtbl_1.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" None") == moCheckingOpen+moCreditOpen );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == moCheckingOpen+moCreditOpen );
|
|
|
|
//
|
|
// Adding in transactions
|
|
//
|
|
|
|
TransactionHelper t1q1( TQDate(2004,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q1( TQDate(2004,2,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3q1( TQDate(2004,3,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4y1( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
TransactionHelper t1q2( TQDate(2004,4,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q2( TQDate(2004,5,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3q2( TQDate(2004,6,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4q2( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
TransactionHelper t1y2( TQDate(2005,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2y2( TQDate(2005,5,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3y2( TQDate(2005,9,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4y2( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
filter.setRowType( MyMoneyReport::eInstitution );
|
|
filter.setName("Accounts by Institution (With Transactions)");
|
|
XMLandback(filter);
|
|
QueryTable qtbl_2(filter);
|
|
|
|
rows = qtbl_2.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 2);
|
|
CPPUNIT_ASSERT(rows[0]["account"]=="Checking Account");
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["value"])==(moCheckingOpen-moSolo*3));
|
|
CPPUNIT_ASSERT(rows[1]["account"]=="Credit Card");
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["value"])==(moCreditOpen-(moParent1 + moParent2 + moChild) * 3));
|
|
|
|
html = qtbl_2.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == moCheckingOpen+moCreditOpen-(moParent1 + moParent2 + moSolo + moChild) * 3 );
|
|
|
|
//
|
|
// Account TYPES
|
|
//
|
|
|
|
filter.setRowType( MyMoneyReport::eAccountType );
|
|
filter.setName("Accounts by Type");
|
|
XMLandback(filter);
|
|
QueryTable qtbl_3(filter);
|
|
|
|
rows = qtbl_3.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 2);
|
|
CPPUNIT_ASSERT(rows[0]["account"]=="Checking Account");
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["value"])==(moCheckingOpen-moSolo*3));
|
|
CPPUNIT_ASSERT(rows[1]["account"]=="Credit Card");
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["value"])==(moCreditOpen-(moParent1 + moParent2 + moChild) * 3));
|
|
|
|
html = qtbl_3.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" "+i18n("Checking")) == moCheckingOpen-moSolo*3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total")+" "+i18n("Credit Card")) == moCreditOpen-(moParent1 + moParent2 + moChild) * 3 );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == moCheckingOpen+moCreditOpen-(moParent1 + moParent2 + moSolo + moChild) * 3 );
|
|
}
|
|
catch(MyMoneyException *e)
|
|
{
|
|
CPPUNIT_FAIL(e->what());
|
|
delete e;
|
|
}
|
|
}
|
|
|
|
void QueryTableTest::testInvestment(void)
|
|
{
|
|
try
|
|
{
|
|
// Equities
|
|
eqStock1 = makeEquity("Stock1","STK1");
|
|
eqStock2 = makeEquity("Stock2","STK2");
|
|
|
|
// Accounts
|
|
acInvestment = makeAccount("Investment",MyMoneyAccount::Investment,moZero,TQDate(2004,1,1),acAsset);
|
|
acStock1 = makeAccount("Stock 1",MyMoneyAccount::Stock,moZero,TQDate(2004,1,1),acInvestment,eqStock1);
|
|
acStock2 = makeAccount("Stock 2",MyMoneyAccount::Stock,moZero,TQDate(2004,1,1),acInvestment,eqStock2);
|
|
acDividends = makeAccount("Dividends",MyMoneyAccount::Income,moZero,TQDate(2004,1,1),acIncome);
|
|
acInterest = makeAccount("Interest",MyMoneyAccount::Income,moZero,TQDate(2004,1,1),acIncome);
|
|
|
|
// Transactions
|
|
// Date Action Shares Price Stock Asset Income
|
|
InvTransactionHelper s1b1( TQDate(2004,2,1), MyMoneySplit::ActionBuyShares, 1000.00, 100.00, acStock1, acChecking, TQString() );
|
|
InvTransactionHelper s1b2( TQDate(2004,3,1), MyMoneySplit::ActionBuyShares, 1000.00, 110.00, acStock1, acChecking, TQString() );
|
|
InvTransactionHelper s1s1( TQDate(2004,4,1), MyMoneySplit::ActionBuyShares, -200.00, 120.00, acStock1, acChecking, TQString() );
|
|
InvTransactionHelper s1s2( TQDate(2004,5,1), MyMoneySplit::ActionBuyShares, -200.00, 100.00, acStock1, acChecking, TQString() );
|
|
InvTransactionHelper s1r1( TQDate(2004,6,1), MyMoneySplit::ActionReinvestDividend, 50.00, 100.00, acStock1, TQString(), acDividends );
|
|
InvTransactionHelper s1r2( TQDate(2004,7,1), MyMoneySplit::ActionReinvestDividend, 50.00, 80.00, acStock1, TQString(), acDividends );
|
|
InvTransactionHelper s1c1( TQDate(2004,8,1), MyMoneySplit::ActionDividend, 10.00, 100.00, acStock1, acChecking, acDividends );
|
|
InvTransactionHelper s1c2( TQDate(2004,9,1), MyMoneySplit::ActionDividend, 10.00, 120.00, acStock1, acChecking, acDividends );
|
|
InvTransactionHelper s1y1( TQDate(2004,9,15), MyMoneySplit::ActionYield, 10.00, 110.00, acStock1, acChecking, acInterest );
|
|
|
|
makeEquityPrice( eqStock1, TQDate(2004,10,1), 100.00 );
|
|
|
|
//
|
|
// Investment Transactions Report
|
|
//
|
|
|
|
MyMoneyReport invtran_r(
|
|
MyMoneyReport::eTopAccount,
|
|
MyMoneyReport::eTQCaction|MyMoneyReport::eTQCshares|MyMoneyReport::eTQCprice,
|
|
MyMoneyTransactionFilter::userDefined,
|
|
MyMoneyReport::eDetailAll,
|
|
i18n("Investment Transactions"),
|
|
i18n("Test Report")
|
|
);
|
|
invtran_r.setDateFilter(TQDate(2004,1,1),TQDate(2004,12,31));
|
|
invtran_r.setInvestmentsOnly(true);
|
|
XMLandback(invtran_r);
|
|
QueryTable invtran(invtran_r);
|
|
|
|
#if 1
|
|
writeTabletoHTML(invtran,"investment_transactions_test.html");
|
|
|
|
TQValueList<ListTable::TableRow> rows = invtran.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count()==17);
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["value"])==MyMoneyMoney(100000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[2]["value"])==MyMoneyMoney(110000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[3]["value"])==MyMoneyMoney(-24000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[4]["value"])==MyMoneyMoney(-20000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[5]["value"])==MyMoneyMoney( 5000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[6]["value"])==MyMoneyMoney( 4000.00));
|
|
// need to fix these... fundamentally different from the original test
|
|
//CPPUNIT_ASSERT(MyMoneyMoney(invtran.m_rows[8]["value"])==MyMoneyMoney( -1000.00));
|
|
//CPPUNIT_ASSERT(MyMoneyMoney(invtran.m_rows[11]["value"])==MyMoneyMoney( -1200.00));
|
|
//CPPUNIT_ASSERT(MyMoneyMoney(invtran.m_rows[14]["value"])==MyMoneyMoney( -1100.00));
|
|
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["price"])==MyMoneyMoney(100.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[3]["price"])==MyMoneyMoney(120.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[5]["price"])==MyMoneyMoney(100.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[7]["price"])==MyMoneyMoney(100.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[10]["price"])==MyMoneyMoney(120.00));
|
|
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[2]["shares"])==MyMoneyMoney(1000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[4]["shares"])==MyMoneyMoney(-200.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[6]["shares"])==MyMoneyMoney( 50.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[8]["shares"])==MyMoneyMoney( 0.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[11]["shares"])==MyMoneyMoney( 0.00));
|
|
|
|
CPPUNIT_ASSERT(rows[1]["action"]=="Buy");
|
|
CPPUNIT_ASSERT(rows[3]["action"]=="Sell");
|
|
CPPUNIT_ASSERT(rows[5]["action"]=="Reinvest");
|
|
CPPUNIT_ASSERT(rows[7]["action"]=="Dividend");
|
|
CPPUNIT_ASSERT(rows[13]["action"]=="Yield");
|
|
#else
|
|
CPPUNIT_ASSERT(rows.count()==9);
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["value"])==MyMoneyMoney(100000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["value"])==MyMoneyMoney(110000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[2]["value"])==MyMoneyMoney(-24000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[3]["value"])==MyMoneyMoney(-20000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[4]["value"])==MyMoneyMoney( 5000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[5]["value"])==MyMoneyMoney( 4000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[6]["value"])==MyMoneyMoney( -1000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[7]["value"])==MyMoneyMoney( -1200.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[8]["value"])==MyMoneyMoney( -1100.00));
|
|
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["price"])==MyMoneyMoney(100.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[2]["price"])==MyMoneyMoney(120.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[4]["price"])==MyMoneyMoney(100.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[6]["price"])==MyMoneyMoney( 0.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[8]["price"])==MyMoneyMoney( 0.00));
|
|
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["shares"])==MyMoneyMoney(1000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[3]["shares"])==MyMoneyMoney(-200.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[5]["shares"])==MyMoneyMoney( 50.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[7]["shares"])==MyMoneyMoney( 0.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[8]["shares"])==MyMoneyMoney( 0.00));
|
|
|
|
CPPUNIT_ASSERT(rows[0]["action"]=="Buy");
|
|
CPPUNIT_ASSERT(rows[2]["action"]=="Sell");
|
|
CPPUNIT_ASSERT(rows[4]["action"]=="Reinvest");
|
|
CPPUNIT_ASSERT(rows[6]["action"]=="Dividend");
|
|
CPPUNIT_ASSERT(rows[8]["action"]=="Yield");
|
|
#endif
|
|
|
|
TQString html = invtran.renderHTML();
|
|
#if 1
|
|
// i think this is the correct amount. different treatment of dividend and yield
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total Stock 1")) == MyMoneyMoney(175000.00) );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == MyMoneyMoney(175000.00) );
|
|
#else
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Total Stock 1")) == MyMoneyMoney(171700.00) );
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == MyMoneyMoney(171700.00) );
|
|
#endif
|
|
|
|
//
|
|
// Investment Performance Report
|
|
//
|
|
|
|
MyMoneyReport invhold_r(
|
|
MyMoneyReport::eAccountByTopAccount,
|
|
MyMoneyReport::eTQCperformance,
|
|
MyMoneyTransactionFilter::userDefined,
|
|
MyMoneyReport::eDetailAll,
|
|
i18n("Investment Performance by Account"),
|
|
i18n("Test Report")
|
|
);
|
|
invhold_r.setDateFilter(TQDate(2004,1,1),TQDate(2004,10,1));
|
|
invhold_r.setInvestmentsOnly(true);
|
|
XMLandback(invhold_r);
|
|
QueryTable invhold(invhold_r);
|
|
|
|
writeTabletoHTML(invhold,"Investment Performance by Account.html");
|
|
|
|
rows = invhold.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count()==2);
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["return"])==MyMoneyMoney("669/10000"));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["buys"])==MyMoneyMoney(210000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["sells"])==MyMoneyMoney(-44000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["reinvestincome"])==MyMoneyMoney(9000.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["cashincome"])==MyMoneyMoney(3300.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["shares"])==MyMoneyMoney(1700.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[0]["price"])==MyMoneyMoney(100.00));
|
|
CPPUNIT_ASSERT(MyMoneyMoney(rows[1]["return"]).isZero());
|
|
|
|
html = invhold.renderHTML();
|
|
CPPUNIT_ASSERT( searchHTML(html,i18n("Grand Total")) == MyMoneyMoney(170000.00) );
|
|
|
|
#if 0
|
|
// Dump file & reports
|
|
TQFile g( "investmentkmy.xml" );
|
|
g.open( IO_WriteOnly );
|
|
MyMoneyStorageXML xml;
|
|
IMyMoneyStorageFormat& interface = xml;
|
|
interface.writeFile(&g, dynamic_cast<IMyMoneySerialize*> (MyMoneyFile::instance()->storage()));
|
|
g.close();
|
|
|
|
invtran.dump("invtran.html","<html><head></head><body>%1</body></html>");
|
|
invhold.dump("invhold.html","<html><head></head><body>%1</body></html>");
|
|
#endif
|
|
|
|
}
|
|
catch(MyMoneyException *e)
|
|
{
|
|
CPPUNIT_FAIL(e->what());
|
|
delete e;
|
|
}
|
|
}
|
|
//this is to prevent me from making mistakes again when modifying balances - asoliverez
|
|
//this case tests only the opening and ending balance of the accounts
|
|
void QueryTableTest::testBalanceColumn()
|
|
{
|
|
try
|
|
{
|
|
TransactionHelper t1q1( TQDate(2004,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q1( TQDate(2004,2,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3q1( TQDate(2004,3,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4y1( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
TransactionHelper t1q2( TQDate(2004,4,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q2( TQDate(2004,5,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3q2( TQDate(2004,6,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4q2( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
TransactionHelper t1y2( TQDate(2005,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2y2( TQDate(2005,5,1), MyMoneySplit::ActionWithdrawal, moParent1, acCredit, acParent );
|
|
TransactionHelper t3y2( TQDate(2005,9,1), MyMoneySplit::ActionWithdrawal, moParent2, acCredit, acParent );
|
|
TransactionHelper t4y2( TQDate(2004,11,7), MyMoneySplit::ActionWithdrawal, moChild, acCredit, acChild );
|
|
|
|
unsigned cols;
|
|
|
|
MyMoneyReport filter;
|
|
|
|
filter.setRowType( MyMoneyReport::eAccount );
|
|
filter.setName("Transactions by Account");
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCcategory | MyMoneyReport::eTQCbalance;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) ); //
|
|
XMLandback(filter);
|
|
QueryTable qtbl_3(filter);
|
|
|
|
writeTabletoHTML(qtbl_3,"Transactions by Account.html");
|
|
|
|
TQString html = qtbl_3.renderHTML();
|
|
|
|
TQValueList<ListTable::TableRow> rows = qtbl_3.rows();
|
|
|
|
CPPUNIT_ASSERT(rows.count() == 16);
|
|
|
|
//this is to make sure that the dates of closing and opening balances and the balance numbers are ok
|
|
TQString openingDate = KGlobal::locale()->formatDate(TQDate(2004,1,1), true);
|
|
TQString closingDate = KGlobal::locale()->formatDate(TQDate(2005,9,1), true);
|
|
CPPUNIT_ASSERT( html.find(openingDate + "</td><td class=\"left\"></td><td class=\"left\">"+i18n("Opening Balance")) > 0);
|
|
CPPUNIT_ASSERT( html.find(closingDate + "</td><td class=\"left\"></td><td class=\"left\">"+i18n("Closing Balance")+"</td><td class=\"left\"></td><td class=\"value\"></td><td> -702.36</td></tr>") > 0);
|
|
CPPUNIT_ASSERT( html.find(closingDate + "</td><td class=\"left\"></td><td class=\"left\">"+i18n("Closing Balance")+"</td><td class=\"left\"></td><td class=\"value\"></td><td> -705.69</td></tr>") > 0);
|
|
|
|
}
|
|
catch(MyMoneyException *e)
|
|
{
|
|
CPPUNIT_FAIL(e->what());
|
|
delete e;
|
|
}
|
|
|
|
}
|
|
|
|
void QueryTableTest::testTaxReport()
|
|
{
|
|
try {
|
|
TransactionHelper t1q1( TQDate(2004,1,1), MyMoneySplit::ActionWithdrawal, moSolo, acChecking, acSolo );
|
|
TransactionHelper t2q1( TQDate(2004,2,1), MyMoneySplit::ActionWithdrawal, moParent1, acChecking, acTax );
|
|
|
|
unsigned cols;
|
|
MyMoneyReport filter;
|
|
|
|
filter.setRowType( MyMoneyReport::eCategory );
|
|
filter.setName("Tax Transactions");
|
|
cols = MyMoneyReport::eTQCnumber | MyMoneyReport::eTQCpayee | MyMoneyReport::eTQCaccount;
|
|
filter.setQueryColumns( static_cast<MyMoneyReport::EQueryColumns>(cols) );
|
|
filter.setTax(true);
|
|
|
|
XMLandback(filter);
|
|
QueryTable qtbl_3(filter);
|
|
|
|
writeTabletoHTML(qtbl_3,"Tax Transactions.html");
|
|
|
|
TQValueList<ListTable::TableRow> rows = qtbl_3.rows();
|
|
|
|
TQString html = qtbl_3.renderHTML();
|
|
CPPUNIT_ASSERT(rows.count() == 1);
|
|
} catch(MyMoneyException *e) {
|
|
CPPUNIT_FAIL(e->what());
|
|
delete e;
|
|
}
|
|
}
|
|
|
|
// vim:cin:si:ai:et:ts=2:sw=2:
|