/* Make sure that the equivalence operator we use for * later tests actually works */ static void check_eq_operator (void) { gnc_numeric a = gnc_numeric_create (42, 58); gnc_numeric b = gnc_numeric_create (42, 58); gnc_numeric c = gnc_numeric_create (40, 58); /* Check strict equivalence and non-equivalence */ do_test (gnc_numeric_eq(a, a), "expected self-equivalence"); do_test (gnc_numeric_eq(a, b), "expected equivalence"); do_test (0 == gnc_numeric_eq(a, c), "expected inequivalence"); }
static void test_entry_basics ( Fixture *fixture, gconstpointer pData ) { time64 ts1 = gnc_time(NULL), ts2; const char *desc = "Test description with éà unicode chars"; const char *action = "Test action with éà unicode chars"; const char *note = "Test note with éà unicode chars"; gnc_numeric quantity = {500000, 100}; gboolean is_cn = FALSE; GncEntry *entry = gncEntryCreate(fixture->book); g_assert(entry); g_test_message( "Test basic setters/getters" ); g_test_message( " Date" ); gncEntrySetDate (entry, ts1); ts2 = gncEntryGetDate (entry); g_assert(ts2 == ts1); g_test_message( " DateEntered" ); gncEntrySetDateEntered (entry, ts1); ts2 = gncEntryGetDateEntered (entry); g_assert(ts2 == ts1); g_test_message( " Description" ); gncEntrySetDescription (entry, desc); g_assert(g_strcmp0 (gncEntryGetDescription (entry), desc) == 0); g_test_message( " Action" ); gncEntrySetAction (entry, action); g_assert(g_strcmp0 (gncEntryGetAction (entry), action) == 0); g_test_message( " Notes" ); gncEntrySetNotes (entry, note); g_assert(g_strcmp0 (gncEntryGetNotes (entry), note) == 0); g_test_message( " Quantity" ); gncEntrySetQuantity (entry, quantity); g_assert(gnc_numeric_eq (gncEntryGetQuantity (entry), quantity)); g_test_message( " DocQuantity (with is_cn = FALSE)" ); gncEntrySetDocQuantity (entry, quantity, is_cn); g_assert(gnc_numeric_eq (gncEntryGetDocQuantity (entry, is_cn), quantity)); g_assert(gnc_numeric_eq (gncEntryGetQuantity (entry), quantity)); g_test_message( " DocQuantity (with is_cn = TRUE)"); is_cn = TRUE; gncEntrySetDocQuantity (entry, quantity, is_cn); g_assert(gnc_numeric_eq (gncEntryGetDocQuantity (entry, is_cn), quantity)); g_assert(gnc_numeric_eq (gncEntryGetQuantity (entry), gnc_numeric_neg (quantity))); g_test_message( " InvAccount" ); gncEntrySetInvAccount (entry, fixture->account); g_assert(gncEntryGetInvAccount (entry) == fixture->account); }
void gncBillTermSetDiscount (GncBillTerm *term, gnc_numeric discount) { if (!term) return; if (gnc_numeric_eq (term->discount, discount)) return; gncBillTermBeginEdit (term); term->discount = discount; mark_term (term); gncBillTermCommitEdit (term); }
void gncEntrySetBillPrice (GncEntry *entry, gnc_numeric price) { if (!entry) return; if (gnc_numeric_eq (entry->b_price, price)) return; gncEntryBeginEdit (entry); entry->b_price = price; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); }
void gncEntrySetInvDiscount (GncEntry *entry, gnc_numeric discount) { if (!entry) return; if (gnc_numeric_eq (entry->i_discount, discount)) return; gncEntryBeginEdit (entry); entry->i_discount = discount; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); }
void gncEntrySetQuantity (GncEntry *entry, gnc_numeric quantity) { if (!entry) return; if (gnc_numeric_eq (entry->quantity, quantity)) return; gncEntryBeginEdit (entry); entry->quantity = quantity; entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); }
void gncEntrySetDocQuantity (GncEntry *entry, gnc_numeric quantity, gboolean is_cn) { if (!entry) return; if (gnc_numeric_eq (entry->quantity, quantity)) return; gncEntryBeginEdit (entry); entry->quantity = (is_cn ? gnc_numeric_neg (quantity) : quantity); entry->values_dirty = TRUE; mark_entry (entry); gncEntryCommitEdit (entry); }
void gncTaxTableEntrySetAmount (GncTaxTableEntry *entry, gnc_numeric amount) { if (!entry) return; if (gnc_numeric_eq (entry->amount, amount)) return; entry->amount = amount; if (entry->table) { mark_table (entry->table); mod_table (entry->table); } }
static void check_reduce (void) { gnc_numeric one, rone; gnc_numeric four, rfour; gnc_numeric val, rval; /* Check common factor elimination (needed for equality checks) */ one = gnc_numeric_create (1, 1); rone = gnc_numeric_create (1000000, 1000000); rone = gnc_numeric_reduce (rone); do_test (gnc_numeric_eq(one, rone), "reduce to one"); four = gnc_numeric_create (4, 1); rfour = gnc_numeric_create (480, 120); rfour = gnc_numeric_reduce (rfour); do_test (gnc_numeric_eq(four, rfour), "reduce to four"); val = gnc_numeric_create(10023234LL, 334216654LL); rval = gnc_numeric_reduce (val); check_unary_op (gnc_numeric_eq, gnc_numeric_create (5011617, 167108327), rval, val, "check_reduce(1) expected %s got %s = reduce(%s)"); val = gnc_numeric_create(17474724864LL, 136048896LL); rval = gnc_numeric_reduce (val); check_unary_op (gnc_numeric_eq, gnc_numeric_create (4 * 17 * 17, 9), rval, val, "check_reduce(2) expected %s got %s = reduce(%s)"); val = gnc_numeric_create(1024LL, 1099511627776LL); rval = gnc_numeric_reduce (val); check_unary_op (gnc_numeric_eq, gnc_numeric_create (1, 1024 * 1024 * 1024), rval, val, "check_reduce(3): expected %s got %s = reduce(%s)"); }
/** * Executes a transaction query statement and loads the transactions and all * of the splits. * * @param be SQL backend * @param stmt SQL statement */ static void query_transactions( GncSqlBackend* be, GncSqlStatement* stmt ) { GncSqlResult* result; g_return_if_fail( be != NULL ); g_return_if_fail( stmt != NULL ); result = gnc_sql_execute_select_statement( be, stmt ); if ( result != NULL ) { GList* tx_list = NULL; GList* node; GncSqlRow* row; Transaction* tx; #if LOAD_TRANSACTIONS_AS_NEEDED GSList* bal_list = NULL; GSList* nextbal; Account* root = gnc_book_get_root_account( be->book ); qof_event_suspend(); xaccAccountBeginEdit( root ); // Save the start/ending balances (balance, cleared and reconciled) for // every account. gnc_account_foreach_descendant( gnc_book_get_root_account( be->primary_book ), save_account_balances, &bal_list ); #endif // Load the transactions row = gnc_sql_result_get_first_row( result ); while ( row != NULL ) { tx = load_single_tx( be, row ); if ( tx != NULL ) { tx_list = g_list_prepend( tx_list, tx ); } row = gnc_sql_result_get_next_row( result ); } gnc_sql_result_dispose( result ); // Load all splits and slots for the transactions if ( tx_list != NULL ) { gnc_sql_slots_load_for_list( be, tx_list ); load_splits_for_tx_list( be, tx_list ); } // Commit all of the transactions for ( node = tx_list; node != NULL; node = node->next ) { Transaction* pTx = GNC_TRANSACTION(node->data); xaccTransCommitEdit( pTx ); } g_list_free( tx_list ); #if LOAD_TRANSACTIONS_AS_NEEDED // Update the account balances based on the loaded splits. If the end // balance has changed, update the start balance so that the end // balance is the same as it was before the splits were loaded. // Repeat for cleared and reconciled balances. for ( nextbal = bal_list; nextbal != NULL; nextbal = nextbal->next ) { full_acct_balances_t* balns = (full_acct_balances_t*)nextbal->data; gnc_numeric* pnew_end_bal; gnc_numeric* pnew_end_c_bal; gnc_numeric* pnew_end_r_bal; gnc_numeric adj; g_object_get( balns->acc, "end-balance", &pnew_end_bal, "end-cleared-balance", &pnew_end_c_bal, "end-reconciled-balance", &pnew_end_r_bal, NULL ); if ( !gnc_numeric_eq( *pnew_end_bal, balns->end_bal ) ) { adj = gnc_numeric_sub( balns->end_bal, *pnew_end_bal, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); balns->start_bal = gnc_numeric_add( balns->start_bal, adj, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); g_object_set( balns->acc, "start-balance", &balns->start_bal, NULL ); } if ( !gnc_numeric_eq( *pnew_end_c_bal, balns->end_cleared_bal ) ) { adj = gnc_numeric_sub( balns->end_cleared_bal, *pnew_end_c_bal, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); balns->start_cleared_bal = gnc_numeric_add( balns->start_cleared_bal, adj, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); g_object_set( balns->acc, "start-cleared-balance", &balns->start_cleared_bal, NULL ); } if ( !gnc_numeric_eq( *pnew_end_r_bal, balns->end_reconciled_bal ) ) { adj = gnc_numeric_sub( balns->end_reconciled_bal, *pnew_end_r_bal, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); balns->start_reconciled_bal = gnc_numeric_add( balns->start_reconciled_bal, adj, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); g_object_set( balns->acc, "start-reconciled-balance", &balns->start_reconciled_bal, NULL ); } xaccAccountRecomputeBalance( balns->acc ); g_free( pnew_end_bal ); g_free( pnew_end_c_bal ); g_free( pnew_end_r_bal ); g_free( balns ); } if ( bal_list != NULL ) { g_slist_free( bal_list ); } xaccAccountCommitEdit( root ); qof_event_resume(); #endif } }