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: */
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"
25 #include "nsIGenericFactory.h"
26 #include "nsComponentManagerUtils.h"
28 #include "nsArrayUtils.h"
29 #include "nsEmbedString.h"
32 #include "mozIStorageConnection.h"
33 #include "nsTestUtils.h"
35 #include "nsITestRunner.h"
37 /* Project includes */
38 #include "nsStringUtils.h"
39 #include "aaAmountUtils.h"
40 #include "aaIResource.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
62 virtual ~aaReportTest() {;}
67 nsCOMPtr
<aaISession
> mSession
;
68 nsCOMPtr
<aaILoadQuery
> mFlows
;
70 nsresult
testTranscript(nsITestRunner
*aTestRunner
);
71 nsresult
testPnLTranscript(nsITestRunner
*aTestRunner
);
72 nsresult
testBalanceSheet(nsITestRunner
*aTestRunner
);
78 RAII(aaReportTest
*t
);
87 aaReportTest::Test(nsITestRunner
*aTestRunner
)
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
);
101 NS_IMPL_ISUPPORTS1(aaReportTest
, nsITest
)
105 testFact(nsITestRunner
*cxxUnitTestRunner
, aaIFact
*node
, PRInt64 fromFlowId
,
106 PRInt64 toFlowId
, double sum
)
109 PRBool equals
= PR_TRUE
;
111 NS_TEST_ASSERT_MSG(node
, " 'fact' is null");
112 if (NS_UNLIKELY( ! node
))
114 nsCOMPtr
<aaIFlow
> flow
;
116 node
->GetTakeFrom(getter_AddRefs( flow
));
119 if (NS_UNLIKELY( id
!= fromFlowId
)) {
121 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.takeFrom.id' is wrong" );
123 } else if (NS_UNLIKELY( fromFlowId
!= 0 )) {
125 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.takeFrom.id' is wrong" );
128 node
->GetGiveTo(getter_AddRefs( flow
));
131 if (NS_UNLIKELY( id
!= toFlowId
)) {
133 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.giveTo.id' is wrong" );
135 } else if (NS_UNLIKELY( toFlowId
!= 0 )) {
137 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.giveTo.id' is wrong" );
141 rv
= node
->GetAmount(&amount
);
143 if (diff
> 0.0001 || diff
< -0.0001) {
145 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.amount' is wrong" );
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
))
161 if (! testFact(cxxUnitTestRunner
, txn
->PickFact(), fromFlowId
, toFlowId
,
168 if (! isZero(diff
)) {
170 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'txn.value' is wrong" );
174 txn
->GetHasEarnings(&b
);
177 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'txn.hasEarnings' is wrong" );
187 testBalance(nsITestRunner
*cxxUnitTestRunner
, aaIBalance
*node
, PRInt64 flowId
,
188 PRInt64 resourceId
, double amount
, double value
, PRBool aSide
)
191 PRBool equals
= PR_TRUE
;
192 if (NS_UNLIKELY( ! node
)) {
193 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance' is null");
196 nsCOMPtr
<aaIFlow
> flow
;
197 rv
= node
->GetFlow(getter_AddRefs( flow
));
198 NS_TEST_ASSERT_MSG(flow
, " 'balance.flow' is null");
200 if (NS_LIKELY( flow
)) {
202 if (NS_UNLIKELY( id
!= flowId
) ) {
203 nsEmbedCString
msg(" 'balance.flow.id' is wrong - ");
206 NS_TEST_ASSERT_MSG(PR_FALSE
, msg
.get());
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 - ");
221 NS_TEST_ASSERT_MSG(PR_FALSE
, msg
.get());
228 node
->GetAmount(&sum
);
230 if (NS_UNLIKELY(diff
> 0.0001 || diff
< -0.0001)) {
232 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.amount' is wrong");
235 node
->GetValue(&sum
);
237 if (NS_UNLIKELY(diff
> 0.0001 || diff
< -0.0001)) {
239 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.value' is wrong");
243 node
->GetSide(&side
);
244 if (NS_UNLIKELY( side
!= aSide
)) {
246 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.side' is wrong");
252 testIncomeState(nsITestRunner
*cxxUnitTestRunner
, aaIBalance
*node
,
253 double value
, PRBool aSide
)
256 PRBool equals
= PR_TRUE
;
257 if (NS_UNLIKELY( ! node
)) {
258 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'income state' is null");
261 nsCOMPtr
<aaIFlow
> flow
;
262 rv
= node
->GetFlow(getter_AddRefs( flow
));
264 if (NS_LIKELY( flow
)) {
266 nsEmbedCString
msg(" 'income state.flow' is wrong - ");
268 if (NS_UNLIKELY( id
)) {
270 NS_TEST_ASSERT_MSG(PR_FALSE
, msg
.get());
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 -" );
284 NS_TEST_ASSERT_MSG(PR_FALSE
, msg
.get());
288 node
->GetAmount(&sum
);
292 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'income state.amount' is wrong");
295 node
->GetValue(&sum
);
297 if (NS_UNLIKELY(diff
> 0.0001 || diff
< -0.0001)) {
299 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'income state.value' is wrong");
303 node
->GetSide(&side
);
304 if (NS_UNLIKELY( side
!= aSide
)) {
306 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'income state.side' is wrong");
311 RAII::RAII(aaReportTest
*t
)
312 :status(PR_FALSE
), test(nsnull
)
315 nsCOMPtr
<aaISession
> session(do_CreateInstance(AA_SESSION_CONTRACT_ID
, &rv
));
316 if (NS_UNLIKELY( ! session
))
321 test
->mSession
= session
;
326 test
->mFlows
= nsnull
;
327 test
->mSession
= nsnull
;
331 nsCOMPtr
<aaIManager
> manager
=
332 do_CreateInstance(AA_MANAGER_CONTRACT_ID
, &rv
);
333 if (NS_UNLIKELY( ! manager
))
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",
347 AA_REPORT_TEST_CONTRACT_ID
,
348 aaReportTestConstructor
351 NS_IMPL_NSGETMODULE(aareportt
, kComponents
)
353 /* Private methods */
355 aaReportTest::testTranscript(nsITestRunner
*aTestRunner
)
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
);
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 */
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");
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 */
420 transcript
->SetStart(PR_ImplodeTime(&tm
));
421 /* Set end time to 2007-08-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");
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 */
460 transcript
->SetStart(PR_ImplodeTime(&tm
));
461 /* Set end time to 2007-08-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");
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 */
496 transcript
->SetStart(PR_ImplodeTime(&tm
));
497 /* Set end time to 2007-08-29 */
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");
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 */
521 transcript
->SetStart(PR_ImplodeTime(&tm
));
522 /* Set end time to 2007-08-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");
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");
553 aaReportTest::testPnLTranscript(nsITestRunner
*aTestRunner
)
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 */
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");
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");
611 aaReportTest::testBalanceSheet(nsITestRunner
*aTestRunner
)
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
);
623 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[balance sheet] [1] loading");
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
));
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");