GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
test-transaction-voiding.c
1 /***************************************************************************
2  * test-transaction-voiding.c
3  *
4  * Modified to run without Guile: Mon Aug 22 11:24:44 2005
5  * Copyright 2005 Neil Williams
7  ****************************************************************************/
8 /*
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301, USA.
23  */
24 
25 #include "config.h"
26 #include <glib.h>
27 #include <string.h>
28 #include "cashobjects.h"
29 #include "Account.h"
30 #include "TransLog.h"
31 #include "test-engine-stuff.h"
32 #include "test-stuff.h"
33 #include "Transaction.h"
34 
35 #define print_gnc_numeric(num) fprintf(stderr, "%s\n", gnc_numeric_to_string(num))
36 
37 static void
38 transaction_set_splits_to_accounts(Transaction *tr, Account *a1, Account *a2)
39 {
40 
41  Split *split;
42 
43  split = xaccTransGetSplit(tr, 0);
44 
45  xaccAccountInsertSplit(a1, split);
46 
47  split = xaccTransGetSplit(tr, 1);
48  xaccAccountInsertSplit(a2, split);
49  return;
50 }
51 
52 static void
53 run_test (void)
54 {
55  Account *acc1, *acc2;
56  Transaction *transaction;
57  gnc_numeric old_amt, new_amt, old_val, new_val;
58  QofBook *book;
59  Timespec ts;
60  time64 now;
61 
62  char *reason = "because I can";
63 
64  book = qof_book_new();
65 
66  acc1 = get_random_account(book);
67  acc2 = get_random_account(book);
68 
69  if (!acc1 || !acc2)
70  {
71  failure("accounts not created");
72  }
73 
74  do
75  {
76  transaction = get_random_transaction (book);
77  if (xaccTransGetVoidStatus (transaction))
78  {
79  xaccTransBeginEdit (transaction);
80  xaccTransDestroy (transaction);
81  xaccTransCommitEdit (transaction);
82  transaction = NULL;
83  }
84  }
85  while (!transaction);
86 
87  transaction_set_splits_to_accounts(transaction, acc1, acc2);
88 
89  /* Compromise, check amount on one and value on the other */
90 
91  old_amt = xaccSplitGetAmount(xaccTransGetSplit(transaction, 0));
92  old_val = xaccSplitGetValue(xaccTransGetSplit(transaction, 1));
93 
94  now = gnc_time (NULL);
95 
96  xaccTransVoid(transaction, reason);
97 
98  ts = xaccTransGetVoidTime (transaction);
99 
100  /* figure at most 2 seconds difference */
101  if ((ts.tv_sec < now) || ((ts.tv_sec - now) > 2))
102  {
103  failure("bad void time");
104  }
105 
106  if (!xaccTransGetVoidStatus(transaction))
107  {
108  failure("void status reports false after setting void");
109  }
110 
111  if (strcmp(reason, xaccTransGetVoidReason(transaction)) != 0)
112  {
113  failure("Reasons didn't match");
114  }
115 
116  new_amt = xaccSplitGetAmount(xaccTransGetSplit(transaction, 0));
117  /* print_gnc_numeric(new_amt); */
118 
119  if (!gnc_numeric_zero_p( new_amt))
120  {
121  failure("Amount of split0 not zero after voiding");
122  }
123 
124  new_val = xaccSplitGetValue(xaccTransGetSplit(transaction, 1));
125 
126  if (!(gnc_numeric_zero_p(new_val)))
127  {
128  failure("Value of split1 not zero after voiding");
129  }
130 
131 
132  if (!(gnc_numeric_eq(old_amt, xaccSplitVoidFormerAmount(xaccTransGetSplit(transaction, 0)))))
133  {
134  failure("former amount (after voiding) didn't match actual old amount");
135  }
136 
137  if (!(gnc_numeric_eq(old_val, xaccSplitVoidFormerValue(xaccTransGetSplit(transaction, 1)))))
138  {
139  failure("former value (after voiding) didn't match actual old value");
140  }
141 
142  /*
143  * Retore the transaction to its former glory.
144  */
145  xaccTransUnvoid(transaction);
146 
147  ts = xaccTransGetVoidTime (transaction);
148 
149  /* figure at most 2 seconds difference */
150  if ((ts.tv_sec != 0) || (ts.tv_sec != 0))
151  {
152  failure("void time not zero after restore");
153  }
154 
155  if (xaccTransGetVoidStatus(transaction))
156  {
157  failure("void status reports trus after restoring transaction");
158  }
159 
160  if (xaccTransGetVoidReason(transaction))
161  {
162  failure("void reason exists after restoring transaction");
163  }
164 
165  new_amt = xaccSplitGetAmount(xaccTransGetSplit(transaction, 0));
166  /* print_gnc_numeric(new_amt); */
167 
168  if (!(gnc_numeric_eq(old_amt, new_amt)))
169  {
170  failure("Amount of split0 not correct after restoring transaction");
171  }
172 
173  new_val = xaccSplitGetValue(xaccTransGetSplit(transaction, 1));
174 
175  if (!(gnc_numeric_eq(old_val, new_val)))
176  {
177  failure("Value of split1 not correct after restoring transaction");
178  }
179 
180 
182  {
183  failure("former amount (after restore) should be zero");
184  }
185 
187  {
188  failure("former value (after restore) should be zero");
189  }
190 
191  return;
192 }
193 
194 int
195 main (int argc, char **argv)
196 {
197  qof_init();
198  if (cashobjects_register())
199  {
200  xaccLogDisable ();
201  run_test ();
202  success("transaction voiding seems OK");
203  print_test_results();
204  }
205  qof_close();
206  return get_rv();
207 }
Split * xaccTransGetSplit(const Transaction *trans, int i)
Definition: Transaction.c:2144
const char * xaccTransGetVoidReason(const Transaction *trans)
Definition: Transaction.c:2533
void xaccLogDisable(void)
Definition: TransLog.c:93
QofBook * qof_book_new(void)
Use a 64-bit unsigned int timespec.
Definition: gnc-date.h:299
gboolean gnc_numeric_zero_p(gnc_numeric a)
void xaccTransDestroy(Transaction *trans)
Definition: Transaction.c:1402
gnc_numeric xaccSplitVoidFormerAmount(const Split *split)
Definition: Split.c:2144
Account handling public routines.
gnc_numeric xaccSplitVoidFormerValue(const Split *split)
Definition: Split.c:2151
void xaccTransVoid(Transaction *trans, const char *reason)
Definition: Transaction.c:2495
void xaccTransCommitEdit(Transaction *trans)
Definition: Transaction.c:1579
void xaccTransBeginEdit(Transaction *trans)
Definition: Transaction.c:1380
void xaccTransUnvoid(Transaction *trans)
Definition: Transaction.c:2552
gboolean gnc_numeric_eq(gnc_numeric a, gnc_numeric b)
API for the transaction logger.
void qof_close(void)
Safely close down the Query Object Framework.
gboolean xaccTransGetVoidStatus(const Transaction *trans)
Definition: Transaction.c:2526
Definition: SplitP.h:71
gnc_numeric xaccSplitGetValue(const Split *split)
Definition: Split.c:1993
Timespec xaccTransGetVoidTime(const Transaction *tr)
Definition: Transaction.c:2540
#define xaccAccountInsertSplit(acc, s)
Definition: Account.h:972
time64 gnc_time(time64 *tbuf)
get the current local time
gint64 time64
Definition: gnc-date.h:83
void qof_init(void)
Initialise the Query Object Framework.
API for Transactions and Splits (journal entries)
gnc_numeric xaccSplitGetAmount(const Split *split)
Definition: Split.c:1987