From 3284ec47035374b0507dd14117d83c1d8f8ca48c Mon Sep 17 00:00:00 2001 From: Phil Longstaff Date: Sat, 17 Apr 2010 17:00:18 +0000 Subject: [PATCH] Add functions to compare 2 business objects for equality, and use them in 'make check' tests. Adds functions to compare 2 business objects for equality. The 'make check' tests can then use these functions to store and reload objects and compare them for equality. This allows the sql backend to be tested. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@19028 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/business/business-core/gncAddress.c | 1 + src/business/business-core/gncBillTerm.c | 64 +++++++++ src/business/business-core/gncBillTerm.h | 1 + src/business/business-core/gncCustomer.c | 71 ++++++++++ src/business/business-core/gncEmployee.c | 71 ++++++++++ src/business/business-core/gncEmployee.h | 1 + src/business/business-core/gncEntry.c | 110 +++++++++++++++ src/business/business-core/gncEntry.h | 1 + src/business/business-core/gncInvoice.c | 91 ++++++++++++ src/business/business-core/gncInvoice.h | 1 + src/business/business-core/gncJob.c | 40 ++++++ src/business/business-core/gncJob.h | 1 + src/business/business-core/gncOrder.c | 49 +++++++ src/business/business-core/gncOrder.h | 1 + src/business/business-core/gncTaxTable.c | 87 ++++++++++++ src/business/business-core/gncTaxTable.h | 2 + src/business/business-core/gncVendor.c | 72 ++++++++++ src/business/business-core/gncVendor.h | 1 + .../sql/test/test-dbi-business-stuff.c | 129 +++++++++++++++++- .../sql/test/test-dbi-business.c | 37 ++++- 20 files changed, 823 insertions(+), 8 deletions(-) diff --git a/src/business/business-core/gncAddress.c b/src/business/business-core/gncAddress.c index 5e0ef5789a..bbafe7b785 100644 --- a/src/business/business-core/gncAddress.c +++ b/src/business/business-core/gncAddress.c @@ -597,6 +597,7 @@ int gncAddressCompare (const GncAddress *a, const GncAddress *b) gboolean gncAddressEqual(const GncAddress* a, const GncAddress* b) { + if (a == NULL && b == NULL) return TRUE; if (a == NULL || b == NULL) return FALSE; g_return_val_if_fail(GNC_IS_ADDRESS(a), FALSE); diff --git a/src/business/business-core/gncBillTerm.c b/src/business/business-core/gncBillTerm.c index c997cbbf96..8ef2dcf480 100644 --- a/src/business/business-core/gncBillTerm.c +++ b/src/business/business-core/gncBillTerm.c @@ -693,6 +693,70 @@ int gncBillTermCompare (const GncBillTerm *a, const GncBillTerm *b) return safe_strcmp (a->desc, b->desc); } +gboolean gncBillTermEqual(const GncBillTerm *a, const GncBillTerm *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_BILLTERM(a), FALSE); + g_return_val_if_fail(GNC_IS_BILLTERM(b), FALSE); + + if (safe_strcmp(a->name, b->name) != 0) + { + PWARN("Names differ: %s vs %s", a->name, b->name); + return FALSE; + } + + if (safe_strcmp(a->desc, b->desc) != 0) + { + PWARN("Descriptions differ: %s vs %s", a->desc, b->desc); + return FALSE; + } + + if (a->type != b->type) + { + PWARN("Types differ"); + return FALSE; + } + + if (a->due_days != b->due_days) + { + PWARN("Due days differ: %d vs %d", a->due_days, b->due_days); + return FALSE; + } + + if (a->disc_days != b->disc_days) + { + PWARN("Discount days differ: %d vs %d", a->disc_days, b->disc_days); + return FALSE; + } + + if (!gnc_numeric_equal(a->discount, b->discount)) + { + PWARN("Discounts differ"); + return FALSE; + } + + if (a->cutoff != b->cutoff) + { + PWARN("Cutoffs differ: %d vs %d", a->cutoff, b->cutoff); + return FALSE; + } + + if (a->invisible != b->invisible) + { + PWARN("Invisible flags differ"); + return FALSE; + } + +// gint64 refcount; +// GncBillTerm * parent; /* if non-null, we are an immutable child */ +// GncBillTerm * child; /* if non-null, we have not changed */ +// GList * children; /* list of children for disconnection */ + + return TRUE; +} + gboolean gncBillTermIsDirty (const GncBillTerm *term) { if (!term) return FALSE; diff --git a/src/business/business-core/gncBillTerm.h b/src/business/business-core/gncBillTerm.h index 01b2c26202..dbe51cc1e8 100644 --- a/src/business/business-core/gncBillTerm.h +++ b/src/business/business-core/gncBillTerm.h @@ -144,6 +144,7 @@ gint64 gncBillTermGetRefcount (const GncBillTerm *term); /** @} */ int gncBillTermCompare (const GncBillTerm *a, const GncBillTerm *b); +gboolean gncBillTermEqual(const GncBillTerm *a, const GncBillTerm *b); /********************************************************/ /* functions to compute dates from Bill Terms */ diff --git a/src/business/business-core/gncCustomer.c b/src/business/business-core/gncCustomer.c index 3974b4054b..6508f041d5 100644 --- a/src/business/business-core/gncCustomer.c +++ b/src/business/business-core/gncCustomer.c @@ -734,11 +734,66 @@ int gncCustomerCompare (const GncCustomer *a, const GncCustomer *b) gboolean gncCustomerEqual(const GncCustomer *a, const GncCustomer *b) { + if (a == NULL && b == NULL) return TRUE; if (a == NULL || b == NULL) return FALSE; g_return_val_if_fail(GNC_IS_CUSTOMER(a), FALSE); g_return_val_if_fail(GNC_IS_CUSTOMER(b), FALSE); + if (safe_strcmp(a->id, b->id) != 0) + { + PWARN("IDs differ: %s vs %s", a->id, b->id); + return FALSE; + } + + if (safe_strcmp(a->name, b->name) != 0) + { + PWARN("Names differ: %s vs %s", a->name, b->name); + return FALSE; + } + + if (safe_strcmp(a->notes, b->notes) != 0) + { + PWARN("Notes differ: %s vs %s", a->notes, b->notes); + return FALSE; + } + + if (!gncBillTermEqual(a->terms, b->terms)) + { + PWARN("Bill terms differ"); + return FALSE; + } + + if (!gnc_commodity_equal(a->currency, b->currency)) + { + PWARN("currencies differ"); + return FALSE; + } + + if (!gncTaxTableEqual(a->taxtable, b->taxtable)) + { + PWARN("tax tables differ"); + return FALSE; + } + + if (a->taxtable_override != b->taxtable_override) + { + PWARN("Tax table override flags differ"); + return FALSE; + } + + if (a->taxincluded != b->taxincluded) + { + PWARN("Tax included flags differ"); + return FALSE; + } + + if (a->active != b->active) + { + PWARN("Active flags differ"); + return FALSE; + } + if (!gncAddressEqual(a->addr, b->addr)) { PWARN("addresses differ"); @@ -750,6 +805,22 @@ gncCustomerEqual(const GncCustomer *a, const GncCustomer *b) return FALSE; } + if (!gnc_numeric_equal(a->credit, b->credit)) + { + PWARN("Credit amounts differ"); + return FALSE; + } + + if (!gnc_numeric_equal(a->discount, b->discount)) + { + PWARN("Discount amounts differ"); + return FALSE; + } + + /* FIXME: Need to check jobs list + GList * jobs; + */ + return TRUE; } diff --git a/src/business/business-core/gncEmployee.c b/src/business/business-core/gncEmployee.c index 5ba626bbd0..98e9124051 100644 --- a/src/business/business-core/gncEmployee.c +++ b/src/business/business-core/gncEmployee.c @@ -558,6 +558,77 @@ int gncEmployeeCompare (const GncEmployee *a, const GncEmployee *b) return(strcmp(a->username, b->username)); } +gboolean gncEmployeeEqual(const GncEmployee* a, const GncEmployee* b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL ) return FALSE; + + g_return_val_if_fail(GNC_IS_EMPLOYEE(a), FALSE); + g_return_val_if_fail(GNC_IS_EMPLOYEE(b), FALSE); + + if (safe_strcmp(a->id, b->id) != 0) + { + PWARN("IDs differ: %s vs %s", a->id, b->id); + return FALSE; + } + + if (safe_strcmp(a->username, b->username) != 0) + { + PWARN("Usernames differ: %s vs %s", a->username, b->username); + return FALSE; + } + + if (!gncAddressEqual(a->addr, b->addr)) + { + PWARN("Addresses differ"); + return FALSE; + } + + if (!gnc_commodity_equal(a->currency, b->currency)) + { + PWARN("Currencies differ"); + return FALSE; + } + + if (a->active != b->active) + { + PWARN("Active flags differ"); + return FALSE; + } + + if (safe_strcmp(a->language, b->language) != 0) + { + PWARN("Languages differ: %s vs %s", a->language, b->language); + return FALSE; + } + + if (safe_strcmp(a->acl, b->acl) != 0) + { + PWARN("ACLs differ: %s vs %s", a->acl, b->acl); + return FALSE; + } + + if (!xaccAccountEqual(a->ccard_acc, b->ccard_acc, TRUE)) + { + PWARN("Accounts differ"); + return FALSE; + } + + if (!gnc_numeric_equal(a->workday, b->workday)) + { + PWARN("Workdays differ"); + return FALSE; + } + + if (!gnc_numeric_equal(a->rate, b->rate)) + { + PWARN("Rates differ"); + return FALSE; + } + + return TRUE; +} + /* Package-Private functions */ static const char * _gncEmployeePrintable (gpointer item) diff --git a/src/business/business-core/gncEmployee.h b/src/business/business-core/gncEmployee.h index 2d972ad4f9..494f0ec9f0 100644 --- a/src/business/business-core/gncEmployee.h +++ b/src/business/business-core/gncEmployee.h @@ -105,6 +105,7 @@ static inline GncEmployee * gncEmployeeLookup (const QofBook *book, const GncGUI } gboolean gncEmployeeIsDirty (const GncEmployee *employee); +gboolean gncEmployeeEqual(const GncEmployee* e1, const GncEmployee* e2); #define EMPLOYEE_ID "id" #define EMPLOYEE_USERNAME "username" diff --git a/src/business/business-core/gncEntry.c b/src/business/business-core/gncEntry.c index 7758b6bf80..6494cb4c6e 100644 --- a/src/business/business-core/gncEntry.c +++ b/src/business/business-core/gncEntry.c @@ -1420,6 +1420,116 @@ int gncEntryCompare (const GncEntry *a, const GncEntry *b) return qof_instance_guid_compare(a, b); } +#define CHECK_STRING(X, Y, FIELD) \ + if (safe_strcmp((X)->FIELD, (Y)->FIELD) != 0) \ + { \ + PWARN("%s differ: %s vs %s", #FIELD, (X)->FIELD, (Y)->FIELD); \ + return FALSE; \ + } + +#define CHECK_ACCOUNT(X, Y, FIELD) \ + if (!xaccAccountEqual((X)->FIELD, (Y)->FIELD, TRUE)) \ + { \ + PWARN("%s differ", #FIELD); \ + return FALSE; \ + } + +#define CHECK_NUMERIC(X, Y, FIELD) \ + if (!gnc_numeric_equal((X)->FIELD, (Y)->FIELD)) \ + { \ + PWARN("%s differ", #FIELD); \ + return FALSE; \ + } + +#define CHECK_VALUE(X, Y, FIELD) \ + if ((X)->FIELD != (Y)->FIELD) \ + { \ + PWARN("%s differ", #FIELD); \ + return FALSE; \ + } + +gboolean gncEntryEqual(const GncEntry *a, const GncEntry *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_ENTRY(a), FALSE); + g_return_val_if_fail(GNC_IS_ENTRY(b), FALSE); + + CHECK_STRING(a, b, desc); + CHECK_STRING(a, b, action); + CHECK_STRING(a, b, notes); + CHECK_NUMERIC(a, b, quantity); + + if (a->invoice != NULL) + { + CHECK_ACCOUNT(a, b, i_account); + CHECK_NUMERIC(a, b, i_price); + CHECK_VALUE(a, b, i_taxable); + CHECK_VALUE(a, b, i_taxincluded); + if (!gncTaxTableEqual(a->i_tax_table, b->i_tax_table)) + { + PWARN("i_tax_table differ"); + return FALSE; + } + + CHECK_NUMERIC(a, b, i_discount); + CHECK_VALUE(a, b, i_disc_type); + CHECK_VALUE(a, b, i_disc_how); + CHECK_NUMERIC(a, b, i_value); + CHECK_NUMERIC(a, b, i_value_rounded); + CHECK_NUMERIC(a, b, i_tax_value); + CHECK_NUMERIC(a, b, i_tax_value_rounded); + CHECK_NUMERIC(a, b, i_disc_value); + CHECK_NUMERIC(a, b, i_disc_value_rounded); + +#if 0 + Timespec date; + Timespec date_entered; + + /* employee bill data */ + GncEntryPaymentType b_payment; + + /* customer invoice */ + GList * i_tax_values; + Timespec i_taxtable_modtime; + +#endif + } + + if (a->bill != NULL) + { + CHECK_ACCOUNT(a, b, b_account); + CHECK_NUMERIC(a, b, b_price); + + CHECK_NUMERIC(a, b, b_value); + CHECK_NUMERIC(a, b, b_value_rounded); + CHECK_NUMERIC(a, b, b_tax_value); + CHECK_NUMERIC(a, b, b_tax_value_rounded); +#if 0 + Timespec date; + Timespec date_entered; + + /* vendor bill data */ + gboolean b_taxable; + gboolean b_taxincluded; + GncTaxTable * b_tax_table; + gboolean billable; + GncOwner billto; + + /* employee bill data */ + GncEntryPaymentType b_payment; + + /* vendor bill */ + GList * b_tax_values; + Timespec b_taxtable_modtime; +#endif + } + /* FIXME: Need real tests */ + + return TRUE; +} + /* ============================================================= */ /* Object declaration */ diff --git a/src/business/business-core/gncEntry.h b/src/business/business-core/gncEntry.h index b1fcfcfb16..5899d2b625 100644 --- a/src/business/business-core/gncEntry.h +++ b/src/business/business-core/gncEntry.h @@ -231,6 +231,7 @@ gboolean gncEntryIsOpen (const GncEntry *entry); void gncEntryBeginEdit (GncEntry *entry); void gncEntryCommitEdit (GncEntry *entry); int gncEntryCompare (const GncEntry *a, const GncEntry *b); +gboolean gncEntryEqual(const GncEntry *a, const GncEntry *b); #define ENTRY_DATE "date" #define ENTRY_DATE_ENTERED "date-entered" diff --git a/src/business/business-core/gncInvoice.c b/src/business/business-core/gncInvoice.c index 4627b2e0b8..b071a7b56f 100644 --- a/src/business/business-core/gncInvoice.c +++ b/src/business/business-core/gncInvoice.c @@ -1897,6 +1897,97 @@ int gncInvoiceCompare (const GncInvoice *a, const GncInvoice *b) return qof_instance_guid_compare(a, b); } +gboolean gncInvoiceEqual(const GncInvoice *a, const GncInvoice *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_INVOICE(a), FALSE); + g_return_val_if_fail(GNC_IS_INVOICE(b), FALSE); + + if (safe_strcmp(a->id, b->id) != 0) + { + PWARN("IDs differ: %s vs %s", a->id, b->id); + return FALSE; + } + + if (safe_strcmp(a->notes, b->notes) != 0) + { + PWARN("Notes differ: %s vs %s", a->notes, b->notes); + return FALSE; + } + + if (safe_strcmp(a->billing_id, b->billing_id) != 0) + { + PWARN("Billing IDs differ: %s vs %s", a->billing_id, b->billing_id); + return FALSE; + } + + if (safe_strcmp(a->printname, b->printname) != 0) + { + PWARN("Printnames differ: %s vs %s", a->printname, b->printname); + return FALSE; + } + + if (a->active != b->active) + { + PWARN("Active flags differ"); + return FALSE; + } + + if (!gncBillTermEqual(a->terms, b->terms)) + { + PWARN("Billterms differ"); + return FALSE; + } + + if (!gncJobEqual(a->job, b->job)) + { + PWARN("Jobs differ"); + return FALSE; + } + + if (!gnc_commodity_equal(a->currency, b->currency)) + { + PWARN("Currencies differ"); + return FALSE; + } + + if (!xaccAccountEqual(a->posted_acc, b->posted_acc, TRUE)) + { + PWARN("Posted accounts differ"); + return FALSE; + } + + if (!xaccTransEqual(a->posted_txn, b->posted_txn, TRUE, TRUE, TRUE, FALSE)) + { + PWARN("Posted tx differ"); + return FALSE; + } + +#if 0 + if (!gncLotEqual(a->posted_lot, b->posted_lot)) + { + PWARN("Posted lots differ"); + return FALSE; + } +#endif + + /* FIXME: Need real checks */ +#if 0 + GList *entries; + GList *prices; + GncOwner owner; + GncOwner billto; + Timespec date_opened; + Timespec date_posted; + + gnc_numeric to_charge_amount; +#endif + + return TRUE; +} + /* ============================================================= */ /* Package-Private functions */ diff --git a/src/business/business-core/gncInvoice.h b/src/business/business-core/gncInvoice.h index 111e74f93e..db4c311d7b 100644 --- a/src/business/business-core/gncInvoice.h +++ b/src/business/business-core/gncInvoice.h @@ -193,6 +193,7 @@ static inline GncInvoice * gncInvoiceLookup (const QofBook *book, const GncGUID void gncInvoiceBeginEdit (GncInvoice *invoice); void gncInvoiceCommitEdit (GncInvoice *invoice); int gncInvoiceCompare (const GncInvoice *a, const GncInvoice *b); +gboolean gncInvoiceEqual(const GncInvoice *a, const GncInvoice *b); gboolean gncInvoiceIsPosted (const GncInvoice *invoice); gboolean gncInvoiceIsPaid (const GncInvoice *invoice); diff --git a/src/business/business-core/gncJob.c b/src/business/business-core/gncJob.c index 8c2d26d4e4..60ca3868e1 100644 --- a/src/business/business-core/gncJob.c +++ b/src/business/business-core/gncJob.c @@ -460,6 +460,46 @@ int gncJobCompare (const GncJob * a, const GncJob *b) return (safe_strcmp(a->id, b->id)); } +gboolean gncJobEqual(const GncJob * a, const GncJob *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_JOB(a), FALSE); + g_return_val_if_fail(GNC_IS_JOB(b), FALSE); + + if (safe_strcmp(a->id, b->id) != 0) + { + PWARN("IDs differ: %s vs %s", a->id, b->id); + return FALSE; + } + + if (safe_strcmp(a->name, b->name) != 0) + { + PWARN("Names differ: %s vs %s", a->name, b->name); + return FALSE; + } + + if (safe_strcmp(a->desc, b->desc) != 0) + { + PWARN("Descriptions differ: %s vs %s", a->desc, b->desc); + return FALSE; + } + + if (a->active != b->active) + { + PWARN("Active flags differ"); + return FALSE; + } + + /* FIXME: Need real tests */ +#if 0 + GncOwner owner; +#endif + + return TRUE; +} + /* ================================================================== */ /* Package-Private functions */ diff --git a/src/business/business-core/gncJob.h b/src/business/business-core/gncJob.h index 7fa32c01e2..775c3ec984 100644 --- a/src/business/business-core/gncJob.h +++ b/src/business/business-core/gncJob.h @@ -98,6 +98,7 @@ static inline GncJob * gncJobLookup (const QofBook *book, const GncGUID *guid) /* Other functions */ int gncJobCompare (const GncJob *a, const GncJob *b); +gboolean gncJobEqual(const GncJob *a, const GncJob *b); #define JOB_ID "id" #define JOB_NAME "name" diff --git a/src/business/business-core/gncOrder.c b/src/business/business-core/gncOrder.c index cd3912f3b1..b4c147103f 100644 --- a/src/business/business-core/gncOrder.c +++ b/src/business/business-core/gncOrder.c @@ -496,6 +496,55 @@ int gncOrderCompare (const GncOrder *a, const GncOrder *b) return qof_instance_guid_compare(a, b); } +gboolean gncOrderEqual(const GncOrder * a, const GncOrder *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_ORDER(a), FALSE); + g_return_val_if_fail(GNC_IS_ORDER(b), FALSE); + + if (safe_strcmp(a->id, b->id) != 0) + { + PWARN("IDs differ: %s vs %s", a->id, b->id); + return FALSE; + } + + if (safe_strcmp(a->notes, b->notes) != 0) + { + PWARN("Notes differ: %s vs %s", a->notes, b->notes); + return FALSE; + } + + if (a->active != b->active) + { + PWARN("Active flags differ"); + return FALSE; + } + + if (safe_strcmp(a->reference, b->reference) != 0) + { + PWARN("References differ: %s vs %s", a->reference, b->reference); + return FALSE; + } + + if (safe_strcmp(a->printname, b->printname) != 0) + { + PWARN("printnames differ: %s vs %s", a->printname, b->printname); + return FALSE; + } + + /* FIXME: Need real tests */ +#if 0 + GncOwner owner; + GList * entries; + Timespec opened; + Timespec closed; +#endif + + return TRUE; +} + /* =========================================================== */ /* Package-Private functions */ diff --git a/src/business/business-core/gncOrder.h b/src/business/business-core/gncOrder.h index 2d8eb5c8c1..1996f4ffe4 100644 --- a/src/business/business-core/gncOrder.h +++ b/src/business/business-core/gncOrder.h @@ -92,6 +92,7 @@ GList * gncOrderGetEntries (GncOrder *order); void gncOrderBeginEdit (GncOrder *order); void gncOrderCommitEdit (GncOrder *order); int gncOrderCompare (const GncOrder *a, const GncOrder *b); +gboolean gncOrderEqual(const GncOrder *a, const GncOrder *b); gboolean gncOrderIsClosed (const GncOrder *order); diff --git a/src/business/business-core/gncTaxTable.c b/src/business/business-core/gncTaxTable.c index b5f2410dd5..9c8e05502b 100644 --- a/src/business/business-core/gncTaxTable.c +++ b/src/business/business-core/gncTaxTable.c @@ -859,6 +859,93 @@ int gncTaxTableCompare (const GncTaxTable *a, const GncTaxTable *b) return safe_strcmp (a->name, b->name); } +gboolean gncTaxTableEntryEqual(const GncTaxTableEntry *a, const GncTaxTableEntry *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + if (!xaccAccountEqual(a->account, b->account, TRUE)) + { + PWARN("accounts differ"); + return FALSE; + } + + if (a->type != b->type) + { + PWARN("types differ"); + return FALSE; + } + + if (!gnc_numeric_equal(a->amount, b->amount)) + { + PWARN("amounts differ"); + return FALSE; + } + + return TRUE; +} + +gboolean gncTaxTableEqual(const GncTaxTable *a, const GncTaxTable *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_TAXTABLE(a), FALSE); + g_return_val_if_fail(GNC_IS_TAXTABLE(b), FALSE); + + if (safe_strcmp(a->name, b->name) != 0) + { + PWARN("Names differ: %s vs %s", a->name, b->name); + return FALSE; + } + + if (a->invisible != b->invisible) + { + PWARN("invisible flags differ"); + return FALSE; + } + + if ((a->entries != NULL) != (b->entries != NULL)) + { + PWARN("only one has entries"); + return FALSE; + } + + if (a->entries != NULL && b->entries != NULL) + { + GncTaxTableEntryList* a_node; + GncTaxTableEntryList* b_node; + + for (a_node = a->entries, b_node = b->entries; + a_node != NULL && b_node != NULL; + a_node = a_node->next, b_node = b_node->next) + { + if (!gncTaxTableEntryEqual((GncTaxTableEntry*)a_node->data, + (GncTaxTableEntry*)b_node->data)) + { + PWARN("entries differ"); + return FALSE; + } + } + + if (a_node != NULL || b_node != NULL) + { + PWARN("Unequal number of entries"); + return FALSE; + } + } + +#if 0 + /* See src/doc/business.txt for an explanation of the following */ + /* Code that handles this is *identical* to that in gncBillTerm */ + gint64 refcount; + GncTaxTable * parent; /* if non-null, we are an immutable child */ + GncTaxTable * child; /* if non-null, we have not changed */ + GList * children; /* list of children for disconnection */ +#endif + + return TRUE; +} /* * This will add value to the account-value for acc, creating a new diff --git a/src/business/business-core/gncTaxTable.h b/src/business/business-core/gncTaxTable.h index 935640960d..5e0e1da6b9 100644 --- a/src/business/business-core/gncTaxTable.h +++ b/src/business/business-core/gncTaxTable.h @@ -134,6 +134,7 @@ void gncTaxTableRemoveEntry (GncTaxTable *table, GncTaxTableEntry *entry); void gncTaxTableChanged (GncTaxTable *table); void gncTaxTableBeginEdit (GncTaxTable *table); void gncTaxTableCommitEdit (GncTaxTable *table); +gboolean gncTaxTableEqual(const GncTaxTable *a, const GncTaxTable *b); /** @name Get Functions @{ */ @@ -169,6 +170,7 @@ gnc_numeric gncTaxTableEntryGetAmount (const GncTaxTableEntry *entry); int gncTaxTableCompare (const GncTaxTable *a, const GncTaxTable *b); int gncTaxTableEntryCompare (const GncTaxTableEntry *a, const GncTaxTableEntry *b); +gboolean gncTaxTableEntryEqual(const GncTaxTableEntry *a, const GncTaxTableEntry *b); /************************************************/ diff --git a/src/business/business-core/gncVendor.c b/src/business/business-core/gncVendor.c index 61e3539e27..daf53b8f4f 100644 --- a/src/business/business-core/gncVendor.c +++ b/src/business/business-core/gncVendor.c @@ -639,6 +639,78 @@ int gncVendorCompare (const GncVendor *a, const GncVendor *b) return(strcmp(a->name, b->name)); } +gboolean gncVendorEqual(const GncVendor *a, const GncVendor *b) +{ + if (a == NULL && b == NULL) return TRUE; + if (a == NULL || b == NULL) return FALSE; + + g_return_val_if_fail(GNC_IS_VENDOR(a), FALSE); + g_return_val_if_fail(GNC_IS_VENDOR(b), FALSE); + + if (safe_strcmp(a->id, b->id) != 0) + { + PWARN("IDs differ: %s vs %s", a->id, b->id); + return FALSE; + } + + if (safe_strcmp(a->name, b->name) != 0) + { + PWARN("Names differ: %s vs %s", a->name, b->name); + return FALSE; + } + + if (safe_strcmp(a->notes, b->notes) != 0) + { + PWARN("Notes differ"); + return FALSE; + } + + if (!gncBillTermEqual(a->terms, b->terms)) + { + PWARN("BillTerms differ"); + return FALSE; + } + + if (!gncAddressEqual(a->addr, b->addr)) + { + PWARN("Addresses differ"); + return FALSE; + } + + if (!gnc_commodity_equal(a->currency, b->currency)) + { + PWARN("Currencies differ"); + return FALSE; + } + + if (!gncTaxTableEqual(a->taxtable, b->taxtable)) + { + PWARN("Tax tables differ"); + return FALSE; + } + + if (a->taxtable_override != b->taxtable_override) + { + PWARN("Tax table override flags differ"); + return FALSE; + } + + if (a->taxincluded != b->taxincluded) + { + PWARN("Tax included flags differ"); + return FALSE; + } + + if (a->active != b->active) + { + PWARN("Active flags differ"); + return FALSE; + } + +// GList * jobs; + return TRUE; +} + GList * gncVendorGetJoblist (const GncVendor *vendor, gboolean show_all) { if (!vendor) return NULL; diff --git a/src/business/business-core/gncVendor.h b/src/business/business-core/gncVendor.h index ee759d0937..1319bf5ae9 100644 --- a/src/business/business-core/gncVendor.h +++ b/src/business/business-core/gncVendor.h @@ -105,6 +105,7 @@ GncTaxTable* gncVendorGetTaxTable (const GncVendor *vendor); GList * gncVendorGetJoblist (const GncVendor *vendor, gboolean show_all); gboolean gncVendorIsDirty (const GncVendor *vendor); int gncVendorCompare (const GncVendor *a, const GncVendor *b); +gboolean gncVendorEqual(const GncVendor *a, const GncVendor *b); /** Return a pointer to the instance gncVendor that is identified * by the guid, and is residing in the book. Returns NULL if the diff --git a/src/business/business-core/sql/test/test-dbi-business-stuff.c b/src/business/business-core/sql/test/test-dbi-business-stuff.c index 99fee4add9..4257b3abed 100644 --- a/src/business/business-core/sql/test/test-dbi-business-stuff.c +++ b/src/business/business-core/sql/test/test-dbi-business-stuff.c @@ -36,6 +36,9 @@ #include "Transaction.h" #include "gnc-commodity.h" #include "gncCustomer.h" +#include "gncInvoice.h" +#include "gncEmployee.h" +#include "gncVendor.h" static QofLogModule log_module = "test-dbi"; @@ -58,15 +61,131 @@ compare_customers( QofBook* book_1, QofBook* book_2 ) do_compare( book_1, book_2, GNC_ID_CUSTOMER, compare_single_customer, "Customer lists match" ); } +static void +compare_single_employee( QofInstance* inst, gpointer user_data ) +{ + CompareInfoStruct* info = (CompareInfoStruct*)user_data; + GncEmployee* emp_1 = GNC_EMPLOYEE(inst); + GncEmployee* emp_2 = gncEmployeeLookup( info->book_2, qof_instance_get_guid(inst) ); + + if (!gncEmployeeEqual( emp_1, emp_2 )) + { + info->result = FALSE; + } +} + +static void +compare_employees( QofBook* book_1, QofBook* book_2 ) +{ + do_compare( book_1, book_2, GNC_ID_EMPLOYEE, compare_single_employee, "Employee lists match" ); +} + +static void +compare_single_invoice( QofInstance* inst, gpointer user_data ) +{ + CompareInfoStruct* info = (CompareInfoStruct*)user_data; + GncInvoice* inv_1 = GNC_INVOICE(inst); + GncInvoice* inv_2 = gncInvoiceLookup( info->book_2, qof_instance_get_guid(inst) ); + + if (!gncInvoiceEqual( inv_1, inv_2 )) + { + info->result = FALSE; + } +} + +static void +compare_invoices( QofBook* book_1, QofBook* book_2 ) +{ + do_compare( book_1, book_2, GNC_ID_INVOICE, compare_single_invoice, "Invoice lists match" ); +} + +static void +compare_single_job( QofInstance* inst, gpointer user_data ) +{ + CompareInfoStruct* info = (CompareInfoStruct*)user_data; + GncJob* job_1 = GNC_JOB(inst); + GncJob* job_2 = gncJobLookup( info->book_2, qof_instance_get_guid(inst) ); + + if (!gncJobEqual( job_1, job_2 )) + { + info->result = FALSE; + } +} + +static void +compare_jobs( QofBook* book_1, QofBook* book_2 ) +{ + do_compare( book_1, book_2, GNC_ID_JOB, compare_single_job, "Job lists match" ); +} + +static void +compare_single_vendor( QofInstance* inst, gpointer user_data ) +{ + CompareInfoStruct* info = (CompareInfoStruct*)user_data; + GncVendor* vendor_1 = GNC_VENDOR(inst); + GncVendor* vendor_2 = gncVendorLookup( info->book_2, qof_instance_get_guid(inst) ); + + if (!gncVendorEqual( vendor_1, vendor_2 )) + { + info->result = FALSE; + } +} + +static void +compare_vendors( QofBook* book_1, QofBook* book_2 ) +{ + do_compare( book_1, book_2, GNC_ID_VENDOR, compare_single_vendor, "Vendor lists match" ); +} + +static void +compare_single_billterm( QofInstance* inst, gpointer user_data ) +{ + CompareInfoStruct* info = (CompareInfoStruct*)user_data; + GncBillTerm* bt_1 = GNC_BILLTERM(inst); + GncBillTerm* bt_2 = gncBillTermLookup( info->book_2, qof_instance_get_guid(inst) ); + + if (!gncBillTermEqual( bt_1, bt_2 )) + { + info->result = FALSE; + } +} + +static void +compare_billterms( QofBook* book_1, QofBook* book_2 ) +{ + do_compare( book_1, book_2, GNC_ID_BILLTERM, compare_single_billterm, "Billterms lists match" ); +} + +static void +compare_single_taxtable( QofInstance* inst, gpointer user_data ) +{ + CompareInfoStruct* info = (CompareInfoStruct*)user_data; + GncTaxTable* tt_1 = GNC_TAXTABLE(inst); + GncTaxTable* tt_2 = gncTaxTableLookup( info->book_2, qof_instance_get_guid(inst) ); + + if (!gncTaxTableEqual( tt_1, tt_2 )) + { + info->result = FALSE; + } +} + +static void +compare_taxtables( QofBook* book_1, QofBook* book_2 ) +{ + do_compare( book_1, book_2, GNC_ID_TAXTABLE, compare_single_taxtable, "TaxTable lists match" ); +} + static void compare_books( QofBook* book_1, QofBook* book_2 ) { + compare_billterms( book_1, book_2 ); + compare_taxtables( book_1, book_2 ); + compare_customers( book_1, book_2 ); -// compare_invoices( book_1, book_2 ); -// compare_jobs( book_1, book_2 ); -// compare_vendors( book_1, book_2 ); -// compare_billterms( book_1, book_2 ); -// compare_employees( book_1, book_2 ); + compare_employees( book_1, book_2 ); + compare_invoices( book_1, book_2 ); + compare_jobs( book_1, book_2 ); + compare_vendors( book_1, book_2 ); } void diff --git a/src/business/business-core/sql/test/test-dbi-business.c b/src/business/business-core/sql/test/test-dbi-business.c index ed8b9ada3f..294ab441da 100644 --- a/src/business/business-core/sql/test/test-dbi-business.c +++ b/src/business/business-core/sql/test/test-dbi-business.c @@ -36,6 +36,7 @@ #include "gnc-commodity.h" #include "gncAddress.h" #include "gncCustomer.h" +#include "gncInvoice.h" #include "gnc-backend-sql.h" @@ -66,7 +67,13 @@ create_session(void) gnc_commodity* currency; GncAddress* addr; GncCustomer* cust; - + GncEmployee* emp; + GncVendor* v; + GncInvoice* inv; + GncJob* job; + GncTaxTable* tt; + GncTaxTableEntry* tte; + table = gnc_commodity_table_get_table( book ); currency = gnc_commodity_table_lookup( table, GNC_COMMODITY_NS_CURRENCY, "CAD" ); @@ -74,12 +81,30 @@ create_session(void) xaccAccountSetType( acct1, ACCT_TYPE_BANK ); xaccAccountSetName( acct1, "Bank 1" ); xaccAccountSetCommodity( acct1, currency ); - + xaccAccountSetHidden( acct1, FALSE ); + xaccAccountSetPlaceholder( acct1, FALSE ); gnc_account_append_child( root, acct1 ); acct2 = xaccMallocAccount( book ); xaccAccountSetType( acct2, ACCT_TYPE_BANK ); - xaccAccountSetName( acct2, "Bank 1" ); + xaccAccountSetName( acct2, "Bank 2" ); + xaccAccountSetCommodity( acct2, currency ); + xaccAccountSetHidden( acct2, FALSE ); + xaccAccountSetPlaceholder( acct2, FALSE ); + gnc_account_append_child( root, acct2 ); + + tt = gncTaxTableCreate( book ); + gncTaxTableSetName( tt, "tt" ); + tte = gncTaxTableEntryCreate(); + gncTaxTableEntrySetAccount( tte, acct1 ); + gncTaxTableEntrySetType( tte, GNC_AMT_TYPE_VALUE ); + gncTaxTableEntrySetAmount( tte, gnc_numeric_zero() ); + gncTaxTableAddEntry( tt, tte ); + tte = gncTaxTableEntryCreate(); + gncTaxTableEntrySetAccount( tte, acct2 ); + gncTaxTableEntrySetType( tte, GNC_AMT_TYPE_PERCENT ); + gncTaxTableEntrySetAmount( tte, gnc_numeric_zero() ); + gncTaxTableAddEntry( tt, tte ); cust = gncCustomerCreate( book ); gncCustomerSetID( cust, "0001" ); @@ -96,6 +121,12 @@ create_session(void) gncAddressSetPhone( addr, "(123) 555-2121" ); gncAddressSetEmail( addr, "cust@mycustomer.com" ); + emp = gncEmployeeCreate( book ); + gncEmployeeSetID( emp, "0001" ); + gncEmployeeSetUsername( emp, "gnucash" ); + gncEmployeeSetLanguage( emp, "english" ); + gncEmployeeSetCurrency( emp, currency ); + return session; }