diff --git a/kmymoney/mymoney/CMakeLists.txt b/kmymoney/mymoney/CMakeLists.txt --- a/kmymoney/mymoney/CMakeLists.txt +++ b/kmymoney/mymoney/CMakeLists.txt @@ -259,5 +259,11 @@ target_link_libraries( onlinejobtypedtest kmm_mymoney onlinetask_interfaces ${target_link_libraries_test}) + # mymoneytransactionfiltertest + set( mymoneytransactionfiltertest_SRCS mymoneytransactionfiltertest.cpp ) + kde4_add_unit_test( mymoneytransactionfiltertest TESTNAME kmymoney-mymoneytransactionfiltertest ${mymoneytransactionfiltertest_SRCS} ) + add_dependencies( mymoneytransactionfiltertest kmm_mymoney ) + + target_link_libraries( mymoneytransactionfiltertest kmm_mymoney ${target_link_libraries_test}) endif( KDE4_BUILD_TESTS ) diff --git a/kmymoney/mymoney/mymoneytransactionfilter.h b/kmymoney/mymoney/mymoneytransactionfilter.h --- a/kmymoney/mymoney/mymoneytransactionfilter.h +++ b/kmymoney/mymoney/mymoneytransactionfilter.h @@ -287,8 +287,9 @@ /** * This method is used to check a specific transaction against the filter. * The transaction will match the whole filter, if all specified filters - * match. If the filter is cleared using the clear() method, any transaciton - * matches. + * match. If the filter is cleared using the clear() method, any transaction + * matches. Matching splits from the transaction are returned by @ref + * matchingSplits(). * * @param transaction A transaction * diff --git a/kmymoney/mymoney/mymoneytransactionfilter.cpp b/kmymoney/mymoney/mymoneytransactionfilter.cpp --- a/kmymoney/mymoney/mymoneytransactionfilter.cpp +++ b/kmymoney/mymoney/mymoneytransactionfilter.cpp @@ -223,7 +223,7 @@ bool MyMoneyTransactionFilter::matchText(const MyMoneySplit * const sp) const { // check if the text is contained in one of the fields - // memo, value, number, payee, tag, account, date + // memo, value, number, payee, tag, account if (m_filterSet.singleFilter.textFilter) { MyMoneyFile* file = MyMoneyFile::instance(); const MyMoneyAccount& acc = file->account(sp->accountId()); diff --git a/kmymoney/mymoney/mymoneytransactionfiltertest.h b/kmymoney/mymoney/mymoneytransactionfiltertest.h new file mode 100644 --- /dev/null +++ b/kmymoney/mymoney/mymoneytransactionfiltertest.h @@ -0,0 +1,48 @@ +/*************************************************************************** + mymoneytransactionfiltertest.h + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef MYMONEYTRANSACTIONFILTERTEST_H +#define MYMONEYTRANSACTIONFILTERTEST_H + +#include + +class MyMoneyTransactionFilterTest : public QObject +{ + Q_OBJECT +private slots: + void initTestCase(); + void testMatchAmount(); + void testMatchText(); + void testMatchSplit(); + void testMatchTransactionAll(); + void testMatchTransactionAccount(); + void testMatchTransactionCategory(); + void testMatchTransactionDate(); + void testMatchTransactionNumber(); + void testMatchTransactionPayee(); + void testMatchTransactionState(); + void testMatchTransactionTag(); + void testMatchTransactionTypeAllTypes(); + void testMatchTransactionTypeDeposits(); + void testMatchTransactionTypePayments(); + void testMatchTransactionTypeTransfers(); + void testMatchTransactionValidity(); +private: + QString payeeId; + QList tagIdList; + QString acCheckingId; + QString acExpenseId; + QString acIncomeId; +}; + +#endif diff --git a/kmymoney/mymoney/mymoneytransactionfiltertest.cpp b/kmymoney/mymoney/mymoneytransactionfiltertest.cpp new file mode 100644 --- /dev/null +++ b/kmymoney/mymoney/mymoneytransactionfiltertest.cpp @@ -0,0 +1,805 @@ +/*************************************************************************** + mymoneytransactionfiltertest.cpp + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "mymoneytransactionfiltertest.h" + +#include + +#include "mymoneytransactionfilter.h" +#include "mymoneyfile.h" +#include "mymoneyseqaccessmgr.h" + +#undef QVERIFY +#define QVERIFY(statement) \ + QTest::qVerify((statement), #statement, "", __FILE__, __LINE__) + +#undef QCOMPARE +#define QCOMPARE(actual, expected) \ + QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__) + +using namespace std; + +// copied from reports/reportstestcommon.cpp +QString makeAccount(const QString& _name, MyMoneyAccount::accountTypeE _type, MyMoneyMoney _balance, const QDate& _open, const QString& _parent, QString _currency = "", bool _taxReport = false, bool _openingBalance = false); + +QString makeAccount(const QString& _name, MyMoneyAccount::accountTypeE _type, MyMoneyMoney _balance, const QDate& _open, const QString& _parent, QString _currency, bool _taxReport, bool _openingBalance) +{ + MyMoneyAccount info; + MyMoneyFileTransaction ft; + + info.setName(_name); + info.setAccountType(_type); + info.setOpeningDate(_open); + if (!_currency.isEmpty()) + info.setCurrencyId(_currency); + else + info.setCurrencyId(MyMoneyFile::instance()->baseCurrency().id()); + + if (_taxReport) + info.setValue("Tax", "Yes"); + + if (_openingBalance) + info.setValue("OpeningBalanceAccount", "Yes"); + + MyMoneyAccount parent = MyMoneyFile::instance()->account(_parent); + MyMoneyFile::instance()->addAccount(info, parent); + // create the opening balance transaction if any + if (!_balance.isZero()) { + MyMoneySecurity sec = MyMoneyFile::instance()->currency(info.currencyId()); + MyMoneyFile::instance()->openingBalanceAccount(sec); + MyMoneyFile::instance()->createOpeningBalanceTransaction(info, _balance); + } + ft.commit(); + + return info.id(); +} + +void MyMoneyTransactionFilterTest::initTestCase() +{ + MyMoneySeqAccessMgr *storage = new MyMoneySeqAccessMgr; + MyMoneyFile *file = MyMoneyFile::instance(); + file->attachStorage(storage); + MyMoneyFileTransaction ft; + + file->addCurrency(MyMoneySecurity("USD", "US Dollar", "$")); + file->setBaseCurrency(file->currency("USD")); + + MyMoneyPayee payeeTest("Payee 10.2"); + file->addPayee(payeeTest); + payeeId = payeeTest.id(); + + MyMoneyTag tag("Tag 10.2"); + file->addTag(tag); + tagIdList << tag.id(); + + QString acAsset = MyMoneyFile::instance()->asset().id(); + QString acExpense = (MyMoneyFile::instance()->expense().id()); + QString acIncome = (MyMoneyFile::instance()->income().id()); + acCheckingId = makeAccount("Account 10.2", MyMoneyAccount::Checkings, MyMoneyMoney(0.0), QDate(2004, 1, 1), acAsset); + acExpenseId = makeAccount("Expense", MyMoneyAccount::Expense, MyMoneyMoney(), QDate(2004, 1, 11), acExpense); + acIncomeId = makeAccount("Expense", MyMoneyAccount::Expense, MyMoneyMoney(), QDate(2004, 1, 11), acIncome); + + ft.commit(); +} + +void MyMoneyTransactionFilterTest::testMatchAmount() +{ + MyMoneySplit split; + split.setShares(MyMoneyMoney(123.20)); + + MyMoneyTransactionFilter filter; + QVERIFY (filter.matchAmount(&split)); + + filter.setAmountFilter(MyMoneyMoney("123.0"), MyMoneyMoney("124.0")); + QVERIFY (filter.matchAmount(&split)); + filter.setAmountFilter(MyMoneyMoney("120.0"), MyMoneyMoney("123.0")); + QVERIFY (!filter.matchAmount(&split)); +} + +void MyMoneyTransactionFilterTest::testMatchText() +{ + MyMoneySplit split; + MyMoneyTransactionFilter filter; + + // no filter + QVERIFY (filter.matchText(&split)); + + filter.setTextFilter(QRegExp("10.2"), false); + MyMoneyTransactionFilter filterInvert; + filterInvert.setTextFilter(QRegExp("10.2"), true); + MyMoneyTransactionFilter filterNotFound; + filterNotFound.setTextFilter(QRegExp("10.5"), false); + + // memo + split.setMemo("10.2"); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); + split.setMemo(""); + // payee + split.setPayeeId(payeeId); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); + split.setPayeeId(""); + // tag + split.setTagIdList(tagIdList); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); + split.setTagIdList(QStringList()); + // value + split.setValue(MyMoneyMoney("10.2")); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); + split.setValue(MyMoneyMoney("0.0")); + // number + split.setNumber("10.2"); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); + split.setNumber("0.0"); + // transaction id + split.setTransactionId("10.2"); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); + split.setTransactionId("0.0"); + // account + split.setAccountId(acCheckingId); + QVERIFY (filter.matchText(&split)); + QVERIFY (!filterInvert.matchText(&split)); + QVERIFY (!filterNotFound.matchText(&split)); +} + +void MyMoneyTransactionFilterTest::testMatchSplit() +{ + qDebug() << "returns matchText() || matchAmount(), which are already tested"; +} + +void MyMoneyTransactionFilterTest::testMatchTransactionAll() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acExpenseId); + split2.setShares(MyMoneyMoney(123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.setReportAllSplits(false); + QVERIFY(filter.match(transaction)); + // FIXME: is it correct to return no splits ? + QCOMPARE(filter.matchingSplits().size(), 0); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionAccount() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acExpenseId); + split2.setShares(MyMoneyMoney(123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.addAccount(acCheckingId); + filter.setReportAllSplits(true); + filter.setConsiderCategory(false); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + filter.setReportAllSplits(false); + filter.setConsiderCategory(false); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + filter.setReportAllSplits(false); + filter.setConsiderCategory(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + filter.setReportAllSplits(true); + filter.setConsiderCategory(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + filter.clear(); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionCategory() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acExpenseId); + split2.setShares(MyMoneyMoney(123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.addCategory(acExpenseId); + filter.setReportAllSplits(true); + filter.setConsiderCategory(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.setConsiderCategory(false); + QVERIFY(!filter.match(transaction)); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionDate() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acExpenseId); + split2.setShares(MyMoneyMoney(123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + filter.setDateFilter(QDate(2014, 1, 1), QDate(2014, 1, 3)); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.setReportAllSplits(false); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + filter.setDateFilter(QDate(2014, 1, 3), QDate(2014, 1, 5)); + QVERIFY(!filter.match(transaction)); +} + +void setupTransactionForNumber(MyMoneyTransaction &transaction, const QString &accountId) +{ + MyMoneySplit split; + split.setAccountId(accountId); + split.setShares(MyMoneyMoney(123.00)); + split.setNumber("1"); + split.setMemo("1"); + + MyMoneySplit split2; + split2.setAccountId(accountId); + split2.setShares(MyMoneyMoney(1.00)); + split2.setNumber("2"); + split2.setMemo("2"); + + MyMoneySplit split3; + split3.setAccountId(accountId); + split3.setShares(MyMoneyMoney(100.00)); + split3.setNumber("3"); + split3.setMemo("3"); + + MyMoneySplit split4; + split4.setAccountId(accountId); + split4.setShares(MyMoneyMoney(22.00)); + split4.setNumber("4"); + split4.setMemo("4"); + + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + transaction.addSplit(split3); + transaction.addSplit(split4); +} + +void runtTestMatchTransactionNumber(MyMoneyTransaction &transaction, MyMoneyTransactionFilter &filter) +{ + // return all matching splits + filter.setReportAllSplits(true); + + filter.setNumberFilter("", ""); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 4); + + filter.setNumberFilter("1", ""); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 4); + + filter.setNumberFilter("", "4"); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 4); + + filter.setNumberFilter("1", "4"); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 4); + + filter.setNumberFilter("1", "2"); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + // do not return all matching splits + filter.setReportAllSplits(false); + + filter.setNumberFilter("1", "4"); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + filter.setNumberFilter("1", "2"); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionNumber() +{ + MyMoneyTransaction transaction; + setupTransactionForNumber(transaction, acCheckingId); + + MyMoneyTransactionFilter filter; + runtTestMatchTransactionNumber(transaction, filter); + + transaction.clear(); + setupTransactionForNumber(transaction, acExpenseId); + + filter.clear(); + runtTestMatchTransactionNumber(transaction, filter); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionPayee() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + split.setPayeeId(payeeId); + + MyMoneySplit split2; + split2.setAccountId(acCheckingId); + split2.setShares(MyMoneyMoney(124.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.addPayee(payeeId); + + filter.setReportAllSplits(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + filter.setReportAllSplits(false); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // check no category support + MyMoneySplit split3; + split3.setAccountId(acExpenseId); + split3.setShares(MyMoneyMoney(120.00)); + split3.setPayeeId(payeeId); + + MyMoneyTransaction transaction2; + transaction2.setPostDate(QDate(2014, 1, 2)); + transaction2.addSplit(split3); + + filter.setReportAllSplits(true); + QVERIFY(!filter.match(transaction2)); + QCOMPARE(filter.matchingSplits().size(), 0); + + qDebug() << "payee on categories could not be tested"; +} + +void MyMoneyTransactionFilterTest::testMatchTransactionState() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + split.setReconcileFlag(MyMoneySplit::NotReconciled); + + MyMoneySplit split2; + split2.setAccountId(acCheckingId); + split2.setShares(MyMoneyMoney(1.00)); + split2.setReconcileFlag(MyMoneySplit::Cleared); + + MyMoneySplit split3; + split3.setAccountId(acCheckingId); + split3.setShares(MyMoneyMoney(100.00)); + split3.setReconcileFlag(MyMoneySplit::Reconciled); + + MyMoneySplit split4; + split4.setAccountId(acCheckingId); + split4.setShares(MyMoneyMoney(22.00)); + split4.setReconcileFlag(MyMoneySplit::Frozen); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + transaction.addSplit(split3); + transaction.addSplit(split4); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 4); + + // all states + filter.addState(MyMoneyTransactionFilter::notReconciled); + filter.addState(MyMoneyTransactionFilter::cleared); + filter.addState(MyMoneyTransactionFilter::reconciled); + filter.addState(MyMoneyTransactionFilter::frozen); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 4); + + // single state + filter.clear(); + filter.addState(MyMoneyTransactionFilter::notReconciled); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + filter.clear(); + + filter.addState(MyMoneyTransactionFilter::cleared); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + filter.clear(); + + filter.addState(MyMoneyTransactionFilter::reconciled); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + filter.clear(); + + filter.addState(MyMoneyTransactionFilter::frozen); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // check no category support + MyMoneySplit split5; + split5.setAccountId(acCheckingId); + split5.setShares(MyMoneyMoney(22.00)); + split5.setReconcileFlag(MyMoneySplit::Frozen); + + MyMoneyTransaction transaction2; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split5); + + filter.clear(); + filter.setReportAllSplits(true); + filter.addState(MyMoneyTransactionFilter::frozen); + QVERIFY(!filter.match(transaction2)); + QCOMPARE(filter.matchingSplits().size(), 0); + + qDebug() << "states on categories could not be tested"; +} + +void MyMoneyTransactionFilterTest::testMatchTransactionTag() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setShares(MyMoneyMoney(123.00)); + split.setTagIdList(tagIdList); + + MyMoneySplit split2; + split2.setAccountId(acExpenseId); + split2.setShares(MyMoneyMoney(123.00)); + split2.setTagIdList(tagIdList); + + MyMoneySplit split3; + split3.setAccountId(acCheckingId); + split3.setShares(MyMoneyMoney(10.00)); + split3.setTagIdList(tagIdList); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + transaction.addSplit(split3); + + MyMoneyTransactionFilter filter; + filter.addTag(tagIdList.first()); + filter.setReportAllSplits(true); + QVERIFY(filter.match(transaction)); + // -1 because categories are not supported yet + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.setReportAllSplits(false); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // check no category support + MyMoneySplit split4; + split4.setAccountId(acExpenseId); + split4.setShares(MyMoneyMoney(123.00)); + split4.setTagIdList(tagIdList); + + MyMoneyTransaction transaction2; + transaction2.setPostDate(QDate(2014, 1, 2)); + transaction2.addSplit(split4); + + filter.setReportAllSplits(true); + QVERIFY(!filter.match(transaction2)); + QCOMPARE(filter.matchingSplits().size(), 0); + + qDebug() << "tags on categories could not be tested"; +} + +void MyMoneyTransactionFilterTest::testMatchTransactionTypeAllTypes() +{ + /* + alltypes + - account group == MyMoneyAccount::Income || + - account group == MyMoneyAccount::Expense + */ + MyMoneySplit split; + split.setAccountId(acExpenseId); + split.setValue(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acIncomeId); + split2.setValue(MyMoneyMoney(-123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + + // all splits + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.addType(MyMoneyTransactionFilter::allTypes); + qDebug() << "MyMoneyTransactionFilter::allTypes could not be tested"; + qDebug() << "because type filter does not work with categories"; + + QVERIFY(!filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 0); + + // ! alltypes + MyMoneySplit split3; + split3.setAccountId(acCheckingId); + split3.setValue(MyMoneyMoney(-123.00)); + + MyMoneyTransaction transaction2; + transaction2.addSplit(split3); + + QVERIFY(!filter.match(transaction2)); + QCOMPARE(filter.matchingSplits().size(), 0); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionTypeDeposits() +{ + // deposits - split value is positive + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setValue(MyMoneyMoney(123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + + // all splits + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // deposits + filter.addType(MyMoneyTransactionFilter::deposits); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // no deposits + MyMoneySplit split2; + split2.setAccountId(acCheckingId); + split2.setValue(MyMoneyMoney(-123.00)); + + MyMoneyTransaction transaction2; + transaction2.setPostDate(QDate(2014, 1, 2)); + transaction2.addSplit(split2); + + QVERIFY(!filter.match(transaction2)); + QCOMPARE(filter.matchingSplits().size(), 0); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionTypePayments() +{ + /* + payments + - account group != MyMoneyAccount::Income + - account group != MyMoneyAccount::Expense + - split value is not positive + - number of splits != 2 + */ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setValue(MyMoneyMoney(-123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + + // all splits + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // valid payments + filter.addType(MyMoneyTransactionFilter::payments); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // no payments + // check number of splits != 2 + MyMoneySplit split2; + split2.setAccountId(acCheckingId); + split2.setValue(MyMoneyMoney(-123.00)); + transaction.addSplit(split2); + + QVERIFY(!filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 0); + + // split value is not positive + MyMoneySplit split3; + split3.setAccountId(acCheckingId); + split3.setValue(MyMoneyMoney(123.00)); + transaction.addSplit(split3); + + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + // account group != MyMoneyAccount::Income && account group != MyMoneyAccount::Expense + MyMoneySplit split4; + split4.setAccountId(acExpenseId); + split4.setValue(MyMoneyMoney(-124.00)); + transaction.addSplit(split4); + + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionTypeTransfers() +{ + /* + check transfers + - number of splits == 2 + - account group != MyMoneyAccount::Income + - account group != MyMoneyAccount::Expense + */ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setValue(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acCheckingId); + split2.setValue(MyMoneyMoney(-123.00)); + + MyMoneySplit split3; + split3.setAccountId(acCheckingId); + split3.setValue(MyMoneyMoney(-123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + MyMoneyTransactionFilter filter; + filter.setReportAllSplits(true); + + // all splits + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.addType(MyMoneyTransactionFilter::transfers); + + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + // transfers - invalid number of counts + transaction.addSplit(split3); + QVERIFY(!filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 0); + + // transfers - invalid account + MyMoneySplit split4; + split4.setAccountId(acIncomeId); + split4.setValue(MyMoneyMoney(-123.00)); + + MyMoneySplit split5; + split5.setAccountId(acCheckingId); + split5.setValue(MyMoneyMoney(123.00)); + + MyMoneyTransaction transaction2; + transaction2.setPostDate(QDate(2014, 1, 2)); + transaction2.addSplit(split4); + transaction2.addSplit(split5); + + QVERIFY(!filter.match(transaction2)); + QCOMPARE(filter.matchingSplits().size(), 0); +} + +void MyMoneyTransactionFilterTest::testMatchTransactionValidity() +{ + MyMoneySplit split; + split.setAccountId(acCheckingId); + split.setValue(MyMoneyMoney(123.00)); + + MyMoneySplit split2; + split2.setAccountId(acExpenseId); + split2.setValue(MyMoneyMoney(-123.00)); + + MyMoneyTransaction transaction; + transaction.setPostDate(QDate(2014, 1, 2)); + transaction.addSplit(split); + transaction.addSplit(split2); + + // check valid transaction + MyMoneyTransactionFilter filter; + filter.addValidity(MyMoneyTransactionFilter::valid); + filter.setReportAllSplits(true); + + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 2); + + filter.setReportAllSplits(false); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 1); + + // check invalid transaction + filter.clear(); + filter.addValidity(MyMoneyTransactionFilter::invalid); + filter.setReportAllSplits(true); + + QVERIFY(!filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 0); + + // add split to make transaction invalid + MyMoneySplit split3; + split3.setAccountId(acExpenseId); + split3.setValue(MyMoneyMoney(-10.00)); + transaction.addSplit(split3); + + filter.setReportAllSplits(true); + QVERIFY(filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 3); + + filter.clear(); + filter.addValidity(MyMoneyTransactionFilter::valid); + + QVERIFY(!filter.match(transaction)); + QCOMPARE(filter.matchingSplits().size(), 0); +} + +QTEST_MAIN(MyMoneyTransactionFilterTest)