[config] Restore debug while on linux (bug #127)
[abstract.git] / report / test / aaReportTest.cpp
blob40a34445332a79aa20bb3a78b23c6700fdca3d7b
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
3 /*
4 * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "xpcom-config.h"
24 #include "nsCOMPtr.h"
25 #include "nsIGenericFactory.h"
26 #include "nsComponentManagerUtils.h"
27 #include "nsIArray.h"
28 #include "nsArrayUtils.h"
29 #include "nsEmbedString.h"
31 /* Unfrozen API */
32 #include "mozIStorageConnection.h"
33 #include "nsTestUtils.h"
34 #include "nsITest.h"
35 #include "nsITestRunner.h"
37 /* Project includes */
38 #include "nsStringUtils.h"
39 #include "aaAmountUtils.h"
40 #include "aaIResource.h"
41 #include "aaIFlow.h"
42 #include "aaIFact.h"
43 #include "aaIBalance.h"
44 #include "aaITransaction.h"
45 #include "aaBaseLoaders.h"
46 #include "aaISession.h"
47 #include "aaIManager.h"
48 #include "aaIFilter.h"
49 #include "aaIStateFilter.h"
50 #include "aaTranscript.h"
51 #include "aaBalanceSheet.h"
52 #include "aaTestConsts.h"
54 #define AA_REPORT_TEST_CID \
55 {0xca303dca, 0xd6d4, 0x4049, {0xba, 0x4c, 0x51, 0x4b, 0xf2, 0x3c, 0x82, 0x98}}
56 #define AA_REPORT_TEST_CONTRACT_ID "@aasii.org/report/unit;1"
58 class aaReportTest: public nsITest
60 public:
61 aaReportTest() {;}
62 virtual ~aaReportTest() {;}
63 NS_DECL_ISUPPORTS
64 NS_DECL_NSITEST
65 private:
66 friend class RAII;
67 nsCOMPtr<aaISession> mSession;
68 nsCOMPtr<aaILoadQuery> mFlows;
70 nsresult testTranscript(nsITestRunner *aTestRunner);
71 nsresult testPnLTranscript(nsITestRunner *aTestRunner);
72 nsresult testBalanceSheet(nsITestRunner *aTestRunner);
75 class RAII
77 public:
78 RAII(aaReportTest *t);
79 ~RAII();
81 PRBool status;
82 private:
83 aaReportTest* test;
86 NS_IMETHODIMP
87 aaReportTest::Test(nsITestRunner *aTestRunner)
89 RAII res(this);
90 if (NS_FAILED( res.status )) {
91 aTestRunner->AddError(nsITestRunner::errorJS, \
92 AA_REPORT_TEST_CONTRACT_ID " not initialized");
93 return NS_ERROR_NOT_INITIALIZED;
95 testTranscript( aTestRunner );
96 testPnLTranscript(aTestRunner);
97 testBalanceSheet(aTestRunner);
98 return NS_OK;
101 NS_IMPL_ISUPPORTS1(aaReportTest, nsITest)
103 /* Helpers */
104 PRBool
105 testFact(nsITestRunner *cxxUnitTestRunner, aaIFact *node, PRInt64 fromFlowId,
106 PRInt64 toFlowId, double sum)
108 nsresult rv;
109 PRBool equals = PR_TRUE;
111 NS_TEST_ASSERT_MSG(node, " 'fact' is null");
112 if (NS_UNLIKELY( ! node ))
113 return PR_FALSE;
114 nsCOMPtr<aaIFlow> flow;
115 PRInt64 id;
116 node->GetTakeFrom(getter_AddRefs( flow ));
117 if ( flow ) {
118 flow->GetId( &id );
119 if (NS_UNLIKELY( id != fromFlowId )) {
120 equals = PR_FALSE;
121 NS_TEST_ASSERT_MSG(PR_FALSE, " 'fact.takeFrom.id' is wrong" );
123 } else if (NS_UNLIKELY( fromFlowId != 0 )) {
124 equals = PR_FALSE;
125 NS_TEST_ASSERT_MSG(PR_FALSE, " 'fact.takeFrom.id' is wrong" );
128 node->GetGiveTo(getter_AddRefs( flow ));
129 if ( flow ) {
130 flow->GetId( &id );
131 if (NS_UNLIKELY( id != toFlowId )) {
132 equals = PR_FALSE;
133 NS_TEST_ASSERT_MSG(PR_FALSE, " 'fact.giveTo.id' is wrong" );
135 } else if (NS_UNLIKELY( toFlowId != 0 )) {
136 equals = PR_FALSE;
137 NS_TEST_ASSERT_MSG(PR_FALSE, " 'fact.giveTo.id' is wrong" );
140 double amount, diff;
141 rv = node->GetAmount(&amount);
142 diff = amount - sum;
143 if (diff > 0.0001 || diff < -0.0001) {
144 equals = PR_FALSE;
145 NS_TEST_ASSERT_MSG(PR_FALSE, " 'fact.amount' is wrong" );
148 return equals;
151 PRBool
152 testTxn(nsITestRunner *cxxUnitTestRunner, aaITransaction *txn,
153 PRInt64 fromFlowId, PRInt64 toFlowId, double amount, double value,
154 PRBool status = 0, double earnings = 0.0)
156 PRBool equals = PR_TRUE;
158 NS_TEST_ASSERT_MSG(txn, " 'txn' is null");
159 if (NS_UNLIKELY( ! txn ))
160 return PR_FALSE;
161 if (! testFact(cxxUnitTestRunner, txn->PickFact(), fromFlowId, toFlowId,
162 amount))
163 return PR_FALSE;
165 double sum, diff;
166 txn->GetValue(&sum);
167 diff = value - sum;
168 if (! isZero(diff)) {
169 equals = PR_FALSE;
170 NS_TEST_ASSERT_MSG(PR_FALSE, " 'txn.value' is wrong" );
173 PRBool b;
174 txn->GetHasEarnings(&b);
175 if (b != status) {
176 equals = PR_FALSE;
177 NS_TEST_ASSERT_MSG(PR_FALSE, " 'txn.hasEarnings' is wrong" );
180 if (!b)
181 return equals;
183 return equals;
186 PRBool
187 testBalance(nsITestRunner *cxxUnitTestRunner, aaIBalance *node, PRInt64 flowId,
188 PRInt64 resourceId, double amount, double value, PRBool aSide)
190 nsresult rv;
191 PRBool equals = PR_TRUE;
192 if (NS_UNLIKELY( ! node )) {
193 NS_TEST_ASSERT_MSG(PR_FALSE, " 'balance' is null");
194 return PR_FALSE;
196 nsCOMPtr<aaIFlow> flow;
197 rv = node->GetFlow(getter_AddRefs( flow ));
198 NS_TEST_ASSERT_MSG(flow, " 'balance.flow' is null");
199 PRInt64 id;
200 if (NS_LIKELY( flow )) {
201 flow->GetId(&id);
202 if (NS_UNLIKELY( id != flowId) ) {
203 nsEmbedCString msg(" 'balance.flow.id' is wrong - ");
204 AppendInt(msg, id);
205 equals = PR_FALSE;
206 NS_TEST_ASSERT_MSG(PR_FALSE, msg.get());
208 } else {
209 equals = PR_FALSE;
212 nsCOMPtr<aaIResource> resource;
213 rv = node->GetResource(getter_AddRefs( resource ));
214 NS_TEST_ASSERT_MSG(resource, " 'balance.resource' is null" );
215 if (NS_LIKELY( resource )) {
216 resource->GetId(&id);
217 if (NS_UNLIKELY( id != resourceId) ) {
218 nsEmbedCString msg(" 'balance.resource.id' is wrong - ");
219 AppendInt(msg, id);
220 equals = PR_FALSE;
221 NS_TEST_ASSERT_MSG(PR_FALSE, msg.get());
223 } else {
224 equals = PR_FALSE;
227 double sum, diff;
228 node->GetAmount(&sum);
229 diff = amount - sum;
230 if (NS_UNLIKELY(diff > 0.0001 || diff < -0.0001)) {
231 equals = PR_FALSE;
232 NS_TEST_ASSERT_MSG(PR_FALSE, " 'balance.amount' is wrong");
235 node->GetValue(&sum);
236 diff = value - sum;
237 if (NS_UNLIKELY(diff > 0.0001 || diff < -0.0001)) {
238 equals = PR_FALSE;
239 NS_TEST_ASSERT_MSG(PR_FALSE, " 'balance.value' is wrong");
242 PRBool side;
243 node->GetSide(&side);
244 if (NS_UNLIKELY( side != aSide)) {
245 equals = PR_FALSE;
246 NS_TEST_ASSERT_MSG(PR_FALSE, " 'balance.side' is wrong");
248 return equals;
251 PRBool
252 testIncomeState(nsITestRunner *cxxUnitTestRunner, aaIBalance *node,
253 double value, PRBool aSide)
255 nsresult rv;
256 PRBool equals = PR_TRUE;
257 if (NS_UNLIKELY( ! node )) {
258 NS_TEST_ASSERT_MSG(PR_FALSE, " 'income state' is null");
259 return PR_FALSE;
261 nsCOMPtr<aaIFlow> flow;
262 rv = node->GetFlow(getter_AddRefs( flow ));
263 PRInt64 id;
264 if (NS_LIKELY( flow )) {
265 flow->GetId(&id);
266 nsEmbedCString msg(" 'income state.flow' is wrong - ");
267 AppendInt(msg, id);
268 if (NS_UNLIKELY( id )) {
269 equals = PR_FALSE;
270 NS_TEST_ASSERT_MSG(PR_FALSE, msg.get());
272 } else {
273 equals = PR_FALSE;
274 NS_TEST_ASSERT_MSG(PR_FALSE, " 'income state.flow' is null");
277 nsCOMPtr<aaIResource> resource;
278 rv = node->GetResource(getter_AddRefs( resource ));
279 if (NS_UNLIKELY( resource )) {
280 resource->GetId(&id);
281 nsEmbedCString msg(" 'income state.resource' is not null -" );
282 AppendInt(msg, id);
283 equals = PR_FALSE;
284 NS_TEST_ASSERT_MSG(PR_FALSE, msg.get());
287 double sum, diff;
288 node->GetAmount(&sum);
289 diff = sum;
290 if (!isZero(diff)) {
291 equals = PR_FALSE;
292 NS_TEST_ASSERT_MSG(PR_FALSE, " 'income state.amount' is wrong");
295 node->GetValue(&sum);
296 diff = value - sum;
297 if (NS_UNLIKELY(diff > 0.0001 || diff < -0.0001)) {
298 equals = PR_FALSE;
299 NS_TEST_ASSERT_MSG(PR_FALSE, " 'income state.value' is wrong");
302 PRBool side;
303 node->GetSide(&side);
304 if (NS_UNLIKELY( side != aSide)) {
305 equals = PR_FALSE;
306 NS_TEST_ASSERT_MSG(PR_FALSE, " 'income state.side' is wrong");
308 return equals;
311 RAII::RAII(aaReportTest *t)
312 :status(PR_FALSE), test(nsnull)
314 nsresult rv;
315 nsCOMPtr<aaISession> session(do_CreateInstance(AA_SESSION_CONTRACT_ID, &rv));
316 if (NS_UNLIKELY( ! session))
317 return;
319 status = PR_TRUE;
320 test = t;
321 test->mSession = session;
324 RAII::~RAII()
326 test->mFlows = nsnull;
327 test->mSession = nsnull;
328 test = nsnull;
330 nsresult rv;
331 nsCOMPtr<aaIManager> manager =
332 do_CreateInstance(AA_MANAGER_CONTRACT_ID, &rv);
333 if (NS_UNLIKELY( ! manager))
334 return;
336 manager->Backup("storage.sqlite");
339 /* Module and Factory code */
340 NS_GENERIC_FACTORY_CONSTRUCTOR(aaReportTest)
342 static const nsModuleComponentInfo kComponents[] =
345 "Report Module Unit Test",
346 AA_REPORT_TEST_CID,
347 AA_REPORT_TEST_CONTRACT_ID,
348 aaReportTestConstructor
351 NS_IMPL_NSGETMODULE(aareportt, kComponents)
353 /* Private methods */
354 nsresult
355 aaReportTest::testTranscript(nsITestRunner *aTestRunner)
357 nsresult rv;
358 NS_TEST_BEGIN( aTestRunner );
360 nsCOMPtr<mozIStorageConnection> connection;
361 rv = mSession->GetConnection(getter_AddRefs( connection ));
362 NS_TEST_ASSERT_OK(rv);
364 nsCOMPtr<aaITranscript> transcript( do_CreateInstance(
365 AA_TRANSCRIPT_CONTRACT_ID, connection) );
366 NS_TEST_ASSERT_MSG(transcript, "[transcript] intance creation");
367 NS_ENSURE_TRUE(transcript, rv);
369 rv = mSession->CreateQuery(AA_LOADFLOW_CONTRACT_ID, getter_AddRefs(mFlows));
370 NS_TEST_ASSERT_MSG(mFlows, "[transcript] creating flow loader");
371 NS_ENSURE_TRUE(mFlows, rv);
373 rv = mFlows->Load();
374 NS_TEST_ASSERT_OK(rv); NS_ENSURE_SUCCESS(rv, rv);
376 /* Set flow to bank */
377 nsCOMPtr<aaIFlow> bank = do_QueryElementAt(mFlows, 2);
378 transcript->SetFlow( bank );
380 /* *** Transcript [1] *** */
382 /* Set start time to 2007-08-28 */
383 PRExplodedTime tm = {0,0,0,12,28,7,2007};
384 transcript->SetStart(PR_ImplodeTime(&tm));
385 /* Set end time to 2007-08-29 */
386 tm.tm_mday = 29;
387 transcript->SetEnd(PR_ImplodeTime(&tm));
389 rv = transcript->Load();
390 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[transcript] [1] loading");
392 nsCOMPtr<aaIBalance> balance;
393 rv = transcript->GetOpening(getter_AddRefs( balance ));
394 NS_TEST_ASSERT_OK(rv);
395 NS_TEST_ASSERT_MSG(! balance, "[transcript] [1] opening must be null");
397 rv = transcript->GetClosing(getter_AddRefs( balance ));
398 NS_TEST_ASSERT_OK(rv);
399 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 1, AA_EVENT_AMOUNT_2
400 + AA_EVENT_AMOUNT_3, AA_EVENT_AMOUNT_2 + AA_EVENT_AMOUNT_3, 1),
401 "[transcript] [1] closing is wrong");
403 PRUint32 count = 0;
404 rv = transcript->GetLength(&count);
405 NS_TEST_ASSERT_OK(rv);
406 NS_TEST_ASSERT_MSG(count == 2, "[transcript] [1] wrong fact count");
408 nsCOMPtr<aaITransaction> txn = do_QueryElementAt(transcript, 0);
409 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 2, 3,
410 AA_EVENT_AMOUNT_2), "[transcript] [1] 1st fact is wrong");
412 txn = do_QueryElementAt(transcript, 1);
413 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 1, 3,
414 AA_EVENT_AMOUNT_3), "[transcript] [1] 2nd fact is wrong");
416 /* *** Transcript [2] *** */
418 /* Set start time to 2007-08-28 */
419 tm.tm_mday = 28;
420 transcript->SetStart(PR_ImplodeTime(&tm));
421 /* Set end time to 2007-08-30 */
422 tm.tm_mday = 30;
423 transcript->SetEnd(PR_ImplodeTime(&tm));
425 rv = transcript->Load();
426 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[transcript] [2] loading");
428 rv = transcript->GetOpening(getter_AddRefs( balance ));
429 NS_TEST_ASSERT_OK(rv);
430 NS_TEST_ASSERT_MSG(! balance, "[transcript] [2] opening must be null");
432 rv = transcript->GetClosing(getter_AddRefs( balance ));
433 NS_TEST_ASSERT_OK(rv);
434 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 1, AA_EVENT_AMOUNT_2
435 + AA_EVENT_AMOUNT_3 - AA_EVENT_AMOUNT_4- AA_EVENT_AMOUNT_6 * AA_EVENT_RATE_2, AA_EVENT_AMOUNT_2
436 + AA_EVENT_AMOUNT_3 - AA_EVENT_AMOUNT_4- AA_EVENT_AMOUNT_6 * AA_EVENT_RATE_2, 1),
437 "[transcript] [2] closing is wrong");
439 count = 0;
440 rv = transcript->GetLength(&count);
441 NS_TEST_ASSERT_OK(rv);
442 NS_TEST_ASSERT_MSG(count == 4, "[transcript] [2] wrong fact count");
444 txn = do_QueryElementAt(transcript, 0);
445 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 2, 3,
446 AA_EVENT_AMOUNT_2), "[transcript] [2] 1st fact is wrong");
448 txn = do_QueryElementAt(transcript, 1);
449 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 1, 3,
450 AA_EVENT_AMOUNT_3), "[transcript] [2] 2nd fact is wrong");
452 txn = do_QueryElementAt(transcript, 2);
453 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 3, 4,
454 AA_EVENT_AMOUNT_4), "[update txn] pending fact is wrong");
456 /* *** Transcript [3] *** */
458 /* Set start time to 2007-08-29 */
459 tm.tm_mday = 29;
460 transcript->SetStart(PR_ImplodeTime(&tm));
461 /* Set end time to 2007-08-31 */
462 tm.tm_mday = 31;
463 transcript->SetEnd(PR_ImplodeTime(&tm));
465 rv = transcript->Load();
466 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[transcript] [3] loading");
468 rv = transcript->GetOpening(getter_AddRefs( balance ));
469 NS_TEST_ASSERT_OK(rv);
470 NS_TEST_ASSERT_MSG(txn && testBalance(aTestRunner, balance, 3, 1, AA_EVENT_AMOUNT_2
471 + AA_EVENT_AMOUNT_3, AA_EVENT_AMOUNT_2 + AA_EVENT_AMOUNT_3, 1),
472 "[transcript] [3] opening is wrong");
474 rv = transcript->GetClosing(getter_AddRefs( balance ));
475 NS_TEST_ASSERT_OK(rv);
476 NS_TEST_ASSERT_MSG(txn && testBalance(aTestRunner, balance, 3, 1, AA_EVENT_AMOUNT_2
477 + AA_EVENT_AMOUNT_3 - AA_EVENT_AMOUNT_4
478 - AA_EVENT_AMOUNT_6 * AA_EVENT_RATE_2, AA_EVENT_AMOUNT_2
479 + AA_EVENT_AMOUNT_3 - AA_EVENT_AMOUNT_4
480 - AA_EVENT_AMOUNT_6 * AA_EVENT_RATE_2, 1),
481 "[transcript] [3] closing is wrong");
483 count = 0;
484 rv = transcript->GetLength(&count);
485 NS_TEST_ASSERT_OK(rv);
486 NS_TEST_ASSERT_MSG(count == 2, "[transcript] [3] wrong fact count");
488 txn = do_QueryElementAt(transcript, 0);
489 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 3, 4,
490 AA_EVENT_AMOUNT_4), "[transcript] [3] pending fact is wrong");
492 /* *** Transcript [4] *** */
494 /* Set start time to 2007-08-28 */
495 tm.tm_mday = 27;
496 transcript->SetStart(PR_ImplodeTime(&tm));
497 /* Set end time to 2007-08-29 */
498 tm.tm_mday = 28;
499 transcript->SetEnd(PR_ImplodeTime(&tm));
501 rv = transcript->Load();
502 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[transcript] [4] loading");
504 rv = transcript->GetOpening(getter_AddRefs( balance ));
505 NS_TEST_ASSERT_OK(rv);
506 NS_TEST_ASSERT_MSG(! balance, "[transcript] [4] opening must be null");
508 rv = transcript->GetClosing(getter_AddRefs( balance ));
509 NS_TEST_ASSERT_OK(rv);
510 NS_TEST_ASSERT_MSG(! balance, "[transcript] [4] closing must be null");
512 count = 1;
513 rv = transcript->GetLength(&count);
514 NS_TEST_ASSERT_OK(rv);
515 NS_TEST_ASSERT_MSG(count == 0, "[transcript] [4] wrong fact count");
517 /* *** Transcript [5] *** */
519 /* Set start time to 2007-08-28 */
520 tm.tm_mday = 28;
521 transcript->SetStart(PR_ImplodeTime(&tm));
522 /* Set end time to 2007-08-30 */
523 tm.tm_mday = 30;
524 transcript->SetEnd(PR_ImplodeTime(&tm));
526 nsCOMPtr<aaIFlow> purchase = do_QueryElementAt(mFlows, 3);
527 transcript->SetFlow(purchase);
528 rv = transcript->Load();
529 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[transcript] [5] loading");
531 rv = transcript->GetOpening(getter_AddRefs( balance ));
532 NS_TEST_ASSERT_OK(rv);
533 NS_TEST_ASSERT_MSG(! balance, "[transcript] [5] opening must be null");
535 rv = transcript->GetClosing(getter_AddRefs( balance ));
536 NS_TEST_ASSERT_OK(rv);
537 NS_TEST_ASSERT_MSG(txn && testBalance(aTestRunner, balance, 4, 3, AA_EVENT_AMOUNT_5,
538 AA_EVENT_AMOUNT_4, 1), "[transcript] [5] closing is wrong");
540 count = 0;
541 rv = transcript->GetLength(&count);
542 NS_TEST_ASSERT_OK(rv);
543 NS_TEST_ASSERT_MSG(count == 1, "[transcript] [5] wrong fact count");
545 txn = do_QueryElementAt(transcript, 0);
546 NS_TEST_ASSERT_MSG(txn && testFact(aTestRunner, txn->PickFact(), 3, 4,
547 AA_EVENT_AMOUNT_4), "[update txn] pending fact is wrong");
549 return NS_OK;
552 nsresult
553 aaReportTest::testPnLTranscript(nsITestRunner *aTestRunner)
555 nsresult rv;
556 NS_TEST_BEGIN( aTestRunner );
558 nsCOMPtr<aaITranscript> transcript;
559 rv = mSession->CreateQuery(AA_TRANSCRIPT_CONTRACT_ID,
560 getter_AddRefs(transcript));
561 NS_TEST_ASSERT_MSG(transcript, "[transcript] intance creation");
562 NS_ENSURE_TRUE(transcript, rv);
564 /* Set flow to PnL */
565 nsCOMPtr<aaIFlow> finres = do_CreateInstance("@aasii.org/base/income-flow;1");
566 transcript->SetFlow( finres );
568 /* *** Transcript [6] *** */
570 /* Set start time to 2007-08-28 */
571 PRExplodedTime tm = {0,0,0,12,28,7,2007};
572 transcript->SetStart(PR_ImplodeTime(&tm));
573 /* Set end time to 2007-09-10 */
574 tm.tm_month = 8;
575 tm.tm_mday = 10;
576 transcript->SetEnd(PR_ImplodeTime(&tm));
578 rv = transcript->Load();
579 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[transcript] [6] loading");
581 nsCOMPtr<aaIBalance> balance;
582 rv = transcript->GetOpening(getter_AddRefs( balance ));
583 NS_TEST_ASSERT_OK(rv);
584 NS_TEST_ASSERT_MSG(! balance, "[transcript] [6] opening must be null");
586 rv = transcript->GetClosing(getter_AddRefs( balance ));
587 NS_TEST_ASSERT_OK(rv);
588 NS_TEST_ASSERT_MSG(testIncomeState(aTestRunner, balance, AA_EVENT_AMOUNT_15
589 * (AA_EVENT_RATE_5 - AA_EVENT_RATE_4), 0),
590 "[transcript] [6] closing is wrong");
592 PRUint32 count = 0;
593 rv = transcript->GetLength(&count);
594 NS_TEST_ASSERT_OK(rv);
595 NS_TEST_ASSERT_MSG(count == 8, "[transcript] [8] wrong txn count");
597 nsCOMPtr<aaITransaction> txn = do_QueryElementAt(transcript, 0);
598 NS_TEST_ASSERT_MSG(testTxn(aTestRunner, txn, 6, 7, AA_EVENT_AMOUNT_6,
599 AA_EVENT_AMOUNT_6 * AA_EVENT_RATE_2, 1, AA_EVENT_AMOUNT_6
600 * (AA_EVENT_RATE_3 - AA_EVENT_RATE_2)), "[transcript] [8] 1st txn is wrong");
602 txn = do_QueryElementAt(transcript, 7);
603 NS_TEST_ASSERT_MSG(testTxn(aTestRunner, txn, 0, 10, AA_EVENT_AMOUNT_15, 0.0,
604 1, AA_EVENT_AMOUNT_15 * AA_EVENT_RATE_5),
605 "[transcript] [8] 8th txn is wrong");
607 return NS_OK;
610 nsresult
611 aaReportTest::testBalanceSheet(nsITestRunner *aTestRunner)
613 nsresult rv;
614 NS_TEST_BEGIN( aTestRunner );
616 nsCOMPtr<aaIBalanceSheet> sheet;
617 rv = mSession->CreateQuery(AA_BALANCESHEET_CONTRACT_ID,
618 getter_AddRefs(sheet));
619 NS_TEST_ASSERT_MSG(sheet, "[balance sheet] intance creation");
620 NS_ENSURE_TRUE(sheet, rv);
622 rv = sheet->Load();
623 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[balance sheet] [1] loading");
625 PRUint32 count = 0;
626 rv = sheet->GetLength(&count);
627 NS_TEST_ASSERT_OK(rv);
628 NS_TEST_ASSERT_MSG(count == 7, "[balance sheet] [1] wrong line count");
630 nsCOMPtr<aaIBalance> balance = do_QueryElementAt(sheet, 6);
631 NS_TEST_ASSERT_MSG(balance, "[balance sheet] income not loaded" );
633 NS_TEST_ASSERT_MSG(testIncomeState(aTestRunner, balance, AA_EVENT_AMOUNT_15
634 * (AA_EVENT_RATE_5 - AA_EVENT_RATE_4), 0),
635 "[balance sheet] income is wrong");
637 double assets, liabilities;
638 rv = sheet->GetTotalAssets(&assets);
639 NS_TEST_ASSERT_OK(rv);
640 NS_TEST_ASSERT_MSG(isZero(assets - 242300),
641 "[balance sheet] [1] wrong total assets");
643 rv = sheet->GetTotalLiabilities(&liabilities);
644 NS_TEST_ASSERT_OK(rv);
645 NS_TEST_ASSERT_MSG(isZero(liabilities - 242300),
646 "[balance sheet] [1] wrong total liabilities");
648 /* Set date to 2007-09-07 */
649 PRExplodedTime tm = {0,0,0,12,7,8,2007};
650 rv = sheet->SetDate(PR_ImplodeTime(&tm));
652 rv = sheet->Load();
653 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[balance sheet] [2] loading");
655 sheet->GetLength(&count);
656 NS_TEST_ASSERT_MSG(count == 6, "[balance sheet] [2] wrong flow count");
658 balance = do_QueryElementAt(sheet, 0);
659 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 2, 2, AA_EVENT_AMOUNT_2
660 / AA_FLOW_SHARE_RATE, AA_EVENT_AMOUNT_2, 0),
661 "[balance sheet] flow2 is wrong");
663 balance = do_QueryElementAt(sheet, 1);
664 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 1, 2, AA_EVENT_AMOUNT_3
665 / AA_FLOW_SHARE_RATE, AA_EVENT_AMOUNT_3, 0),
666 "[balance sheet] flow1 is wrong");
668 balance = do_QueryElementAt(sheet, 2);
669 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 4, 3, AA_EVENT_AMOUNT_5,
670 AA_EVENT_AMOUNT_4, 1), "[balance sheet] flow4 is wrong");
672 balance = do_QueryElementAt(sheet, 3);
673 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 6, 4,
674 2400, 2400 * AA_EVENT_RATE_4, 1),
675 "[balance sheet] flow6 is wrong");
677 balance = do_QueryElementAt(sheet, 4);
678 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 9, 5,
679 1, AA_EVENT_RATE_6, 1),
680 "[balance sheet] flow9 is wrong");
682 balance = do_QueryElementAt(sheet, 5);
683 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 1, 87920, 87920,
684 1), "[balance sheet] flow3 is wrong");
686 rv = sheet->GetTotalAssets(&assets);
687 NS_TEST_ASSERT_OK(rv);
688 NS_TEST_ASSERT_MSG(isZero(assets - 242000),
689 "[balance sheet] [2] wrong total assets");
691 rv = sheet->GetTotalLiabilities(&liabilities);
692 NS_TEST_ASSERT_OK(rv);
693 NS_TEST_ASSERT_MSG(isZero(liabilities - 242000),
694 "[balance sheet] [2] wrong total liabilities");
696 return NS_OK;