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,2008 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 "nsIGenericFactory.h"
25 #include "nsComponentManagerUtils.h"
26 #include "nsArrayUtils.h"
27 #include "nsStringAPI.h"
28 #include "nsEmbedString.h"
29 #include "nsIMutableArray.h"
32 #include "mozIStorageConnection.h"
33 #include "nsTestUtils.h"
35 #include "nsITestRunner.h"
37 /* Project includes */
38 #include "nsStringUtils.h"
39 #include "aaIResource.h"
40 #include "aaIEntity.h"
45 #include "aaITransaction.h"
46 #include "aaIBalance.h"
47 #include "aaISession.h"
48 #include "aaBaseLoaders.h"
49 #include "aaAccountLoaders.h"
50 #include "aaIFilter.h"
51 #include "aaIStateFilter.h"
52 #include "aaILoadQuery.h"
53 #include "aaIncomeRow.h"
54 #include "aaSaveTransaction.h"
55 /* XXX _acc This is a temporary hack to acquire connection
56 * It has to be replaced with a 'chart'
58 #include "aaSession.h"
59 #include "aaTestConsts.h"
61 #include "aaAccountTestUtils.h"
62 #include "aaAccountTest.h"
66 aaAccountTest::Test(nsITestRunner
*aTestRunner
)
69 if (NS_FAILED( res
.status
)) {
70 aTestRunner
->AddError(nsITestRunner::errorJS
, \
71 AA_ACCOUNT_TEST_CONTRACT_ID
" not initialized");
72 return NS_ERROR_NOT_INITIALIZED
;
74 testEmptyBalance(aTestRunner
);
75 testPendingFacts(aTestRunner
);
76 testQuote(aTestRunner
);
77 testBalanceRow(aTestRunner
);
78 testTransaction(aTestRunner
);
79 testUpdateTransaction(aTestRunner
);
80 testReplaceTransaction(aTestRunner
);
81 testFlowBalance(aTestRunner
);
82 testStateFilter(aTestRunner
);
83 testCreditTransaction(aTestRunner
);
84 testDeleteTransaction(aTestRunner
);
85 testFlowChart(aTestRunner
);
86 testIncomeRow(aTestRunner
);
87 testLoadIncome(aTestRunner
);
88 testStopTransaction(aTestRunner
);
89 testLossTransaction(aTestRunner
);
90 testSplitTransaction(aTestRunner
);
91 testGainTransaction(aTestRunner
);
92 testDirectGainsLosses(aTestRunner
);
96 NS_IMPL_ISUPPORTS1(aaAccountTest
, nsITest
)
100 testFact(nsITestRunner
*cxxUnitTestRunner
, aaIFact
*node
, PRInt64 fromFlowId
,
101 PRInt64 toFlowId
, double sum
)
104 PRBool equals
= PR_TRUE
;
106 nsCOMPtr
<aaIFlow
> flow
;
108 node
->GetTakeFrom(getter_AddRefs( flow
));
111 if (NS_UNLIKELY( id
!= fromFlowId
)) {
113 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.takeFrom.id' is wrong" );
115 } else if (NS_UNLIKELY( fromFlowId
!= 0 )) {
117 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.takeFrom.id' is wrong" );
120 node
->GetGiveTo(getter_AddRefs( flow
));
123 if (NS_UNLIKELY( id
!= toFlowId
)) {
125 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.giveTo.id' is wrong" );
127 } else if (NS_UNLIKELY( toFlowId
!= 0 )) {
129 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.giveTo.id' is wrong" );
133 rv
= node
->GetAmount(&amount
);
135 if (diff
> 0.0001 || diff
< -0.0001) {
137 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'fact.amount' is wrong" );
144 testBalance(nsITestRunner
*cxxUnitTestRunner
, aaIBalance
*node
, PRInt64 flowId
,
145 PRInt64 resourceId
, double amount
, double value
, PRBool aSide
)
148 PRBool equals
= PR_TRUE
;
149 if (NS_UNLIKELY( ! node
)) {
150 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance' is null");
153 nsCOMPtr
<aaIFlow
> flow
;
154 rv
= node
->GetFlow(getter_AddRefs( flow
));
155 NS_TEST_ASSERT_MSG(flow
, " 'balance.flow' is null");
157 if (NS_LIKELY( flow
)) {
159 if (NS_UNLIKELY( id
!= flowId
) ) {
161 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.flow.id' is wrong");
167 nsCOMPtr
<aaIResource
> resource
;
168 rv
= node
->GetResource(getter_AddRefs( resource
));
169 NS_TEST_ASSERT_MSG(resource
, " 'balance.resource' is null" );
170 if (NS_LIKELY( resource
)) {
171 resource
->GetId(&id
);
172 if (NS_UNLIKELY( id
!= resourceId
) ) {
173 nsEmbedCString
msg(" 'balance.resource.id' is wrong - ");
176 NS_TEST_ASSERT_MSG(PR_FALSE
, msg
.get());
183 node
->GetAmount(&sum
);
185 if (NS_UNLIKELY(diff
> 0.0001 || diff
< -0.0001)) {
187 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.amount' is wrong");
190 node
->GetValue(&sum
);
192 if (NS_UNLIKELY(diff
> 0.0001 || diff
< -0.0001)) {
194 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.value' is wrong");
198 node
->GetSide(&side
);
199 if (NS_UNLIKELY( side
!= aSide
)) {
201 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'balance.side' is wrong");
207 testState(nsITestRunner
*cxxUnitTestRunner
, aaIState
*node
, PRInt64 flowId
,
208 PRInt64 resourceId
, double sum
)
210 NS_TEST_ASSERT_MSG(node
, " 'state' is null");
212 PRBool equals
= PR_TRUE
;
213 nsCOMPtr
<aaIFlow
> flow
;
214 rv
= node
->GetFlow(getter_AddRefs( flow
));
215 NS_TEST_ASSERT_MSG(flow
, " 'state.flow' is null");
218 if (NS_LIKELY( flow
)) {
220 if (NS_UNLIKELY( id
!= flowId
) ) {
222 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'state.flow.id' is wrong");
228 nsCOMPtr
<aaIResource
> resource
;
229 rv
= node
->GetResource(getter_AddRefs( resource
));
230 NS_TEST_ASSERT_MSG(resource
, " 'state.resource' is null" );
231 if (NS_LIKELY( resource
)) {
232 resource
->GetId(&id
);
233 if (NS_UNLIKELY( id
!= resourceId
) ) {
235 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'state.resource.id' is wrong");
242 rv
= node
->GetAmount(&amount
);
244 if (! isZero(diff
)) {
246 NS_TEST_ASSERT_MSG(PR_FALSE
, " 'state.amount' is wrong");
252 aaAccountTest::RAII::RAII(aaAccountTest
*t
)
253 :status(PR_FALSE
), test(nsnull
)
256 nsCOMPtr
<aaISession
> session(do_CreateInstance(AA_SESSION_CONTRACT_ID
, &rv
));
257 if (NS_UNLIKELY( ! session
))
260 nsCOMPtr
<aaILoadQuery
> flows
;
261 rv
= session
->CreateQuery(AA_LOADFLOW_CONTRACT_ID
, getter_AddRefs( flows
));
262 if (NS_UNLIKELY( ! flows
))
268 nsCOMPtr
<aaILoadQuery
> resources
;
269 rv
= session
->CreateQuery(AA_LOADRESOURCE_CONTRACT_ID
,
270 getter_AddRefs( resources
));
271 if (NS_UNLIKELY( ! resources
))
273 rv
= resources
->Load();
277 nsCOMPtr
<aaILoadQuery
> entities
;
278 rv
= session
->CreateQuery(AA_LOADENTITY_CONTRACT_ID
,
279 getter_AddRefs( entities
));
280 if (NS_UNLIKELY( ! entities
))
282 rv
= entities
->Load();
288 test
->mSession
= session
;
289 test
->mFlows
= flows
;
290 test
->mResources
= resources
;
291 test
->mEntities
= entities
;
294 aaAccountTest::RAII::~RAII()
297 test
->mPendingFact
= nsnull
;
298 test
->mResources
= nsnull
;
299 test
->mFlows
= nsnull
;
300 test
->mEntities
= nsnull
;
301 test
->mSession
= nsnull
;
306 aaAccountTest::RAII::cleanQuotes()
310 aaSession
*session
= static_cast<aaSession
*>(test
->mSession
.get());
313 if (session
->mConnection
)
314 session
->mConnection
->ExecuteSimpleSQL(
315 nsDependentCString("DELETE FROM quote WHERE 1=1"));
318 /* Private methods */
320 aaAccountTest::testEmptyBalance(nsITestRunner
*aTestRunner
)
323 NS_TEST_BEGIN(aTestRunner
);
324 aaSession
*session
= static_cast<aaSession
*>(mSession
.get());
325 NS_TEST_ASSERT_MSG(session
, "[empty balance] 'session' cast" );
326 NS_ENSURE_TRUE(session
, NS_ERROR_UNEXPECTED
);
328 nsCOMPtr
<aaILoadQuery
> set(do_CreateInstance(
329 AA_LOADBALANCE_CONTRACT_ID
, session
->mConnection
, &rv
));
330 NS_TEST_ASSERT_MSG(set
, "[empty balance] query instance creation" );
331 NS_ENSURE_TRUE(set
, rv
);
334 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[empty balance] loading");
335 NS_TEST_ASSERT_MSG(set
, "[empty balance] result set not loaded" );
336 NS_ENSURE_TRUE(set
, rv
);
339 set
->GetLength(&count
);
340 NS_TEST_ASSERT_MSG(count
== 0, "[empty balance] wrong flow count");
346 aaAccountTest::testPendingFacts(nsITestRunner
*aTestRunner
)
349 NS_TEST_BEGIN(aTestRunner
);
350 aaSession
*session
= static_cast<aaSession
*>(mSession
.get());
351 NS_TEST_ASSERT_MSG(session
, "[pending facts] 'session' cast" );
352 NS_ENSURE_TRUE(session
, NS_ERROR_UNEXPECTED
);
354 nsCOMPtr
<aaILoadQuery
> set(do_CreateInstance(
355 AA_LOADPENDINGFACTS_CONTRACT_ID
, session
->mConnection
, &rv
));
356 NS_TEST_ASSERT_MSG(set
, "[pending facts] query instance creation" );
357 NS_ENSURE_TRUE(set
, rv
);
360 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[pending facts] loading");
361 NS_TEST_ASSERT_MSG(set
, "[pending facts] result set not loaded" );
362 NS_ENSURE_TRUE(set
, rv
);
365 set
->GetLength(&count
);
366 NS_TEST_ASSERT_MSG(count
== 6, "[pending facts] wrong fact count");
368 mPendingFact
= do_QueryElementAt(set
, 0, &rv
);
369 NS_TEST_ASSERT_MSG(mPendingFact
, "[pending facts] 1st fact not loaded" );
371 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, mPendingFact
, 2, 3,
372 AA_EVENT_AMOUNT_2
), "[pending facts] 1st fact is wrong");
377 aaAccountTest::testQuote(nsITestRunner
*aTestRunner
)
380 NS_TEST_BEGIN(aTestRunner
);
381 nsCOMPtr
<aaIQuote
> node(do_CreateInstance("@aasii.org/base/quote;1", &rv
));
382 NS_TEST_ASSERT_MSG(node
, "[quote] instance not created" );
383 NS_ENSURE_TRUE(node
, rv
);
385 nsCOMPtr
<aaIResource
> rub
= do_QueryElementAt(mResources
, 0, &rv
);
386 node
->SetResource( rub
);
388 /* Set time to 2007-08-29 */
389 PRExplodedTime tm
= {0,0,0,12,29,7,2007};
390 node
->SetTime(PR_ImplodeTime(&tm
));
393 rv
= mSession
->Save( node
, nsnull
);
394 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[quote] saving");
396 aaSession
*session
= static_cast<aaSession
*>(mSession
.get());
397 NS_TEST_ASSERT_MSG(session
, "[quote] 'session' cast" );
398 NS_ENSURE_TRUE(session
, NS_ERROR_UNEXPECTED
);
400 nsCOMPtr
<aaILoadQuery
> set(do_CreateInstance(
401 AA_LOADQUOTE_CONTRACT_ID
, session
->mConnection
, &rv
));
402 NS_TEST_ASSERT_MSG(set
, "[quote] query instance creation" );
403 NS_ENSURE_TRUE(set
, rv
);
406 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[quote] loading");
407 NS_TEST_ASSERT_MSG(set
, "[quote] result set not loaded" );
408 NS_ENSURE_TRUE(set
, rv
);
411 set
->GetLength(&count
);
412 NS_TEST_ASSERT_MSG(count
== 1, "[quote] wrong quote count");
414 nsCOMPtr
<aaIQuote
> quote
= do_QueryElementAt(set
, 0, &rv
);
415 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[quote] quering 1st quote");
416 NS_TEST_ASSERT_MSG(quote
, "[quote] 1st quote not loaded" );
417 NS_ENSURE_TRUE(quote
, NS_ERROR_FAILURE
);
419 nsCOMPtr
<aaIResource
> obj
;
424 quote
->GetResource(getter_AddRefs( obj
));
425 if (NS_LIKELY( obj
)) {
426 obj
->GetId( &objId
);
427 NS_TEST_ASSERT_MSG(objId
== 1, "[quote] wrong resource id");
429 NS_TEST_ASSERT_MSG(obj
, "[quote] resource is null");
431 quote
->GetTime( &time
);
432 NS_TEST_ASSERT_MSG(time
== PR_ImplodeTime(&tm
), "[quote] wrong start time");
433 quote
->GetRate( &rate
);
434 NS_TEST_ASSERT_MSG(rate
< 1.00009 && rate
> 0.99991, "[quote] wrong rate");
440 aaAccountTest::testBalanceRow(nsITestRunner
*aTestRunner
)
442 NS_TEST_BEGIN(aTestRunner
);
447 /* Tesing aaBalanceRow.SetSide() */
449 res
= r1
.SetSide(q1
);
450 NS_TEST_ASSERT_MSG( !res
, "[balance row] accepts side with bad type 3");
453 res
= r1
.SetSide(q1
);
454 NS_TEST_ASSERT_MSG( !res
, "[balance row] accepts side with bad type 0");
458 res
= r2
.SetSide(q1
);
459 NS_TEST_ASSERT_MSG( res
, "[balance row] side 1 not accepted");
460 NS_TEST_ASSERT_MSG( r2
.mFlowRate
== q1
.mRate
,
461 "[balance row] wrong flow rate");
462 NS_TEST_ASSERT_MSG( r2
.mFactSide
== 0, "[balance row] wrong fact side");
463 NS_TEST_ASSERT_MSG( r2
.mSide
== 1, "[balance row] wrong balance side");
466 PRExplodedTime tm1
= {0,0,0,12,28,7,2007};
467 PRExplodedTime tm2
= {0,0,0,12,29,7,2007};
468 PRTime t1
= PR_ImplodeTime(&tm1
);
469 PRTime t2
= PR_ImplodeTime(&tm2
);
470 /* Tesing aaBalanceRow.SetFact() */
473 nsCOMPtr
<aaIFact
> fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
474 NS_ENSURE_TRUE(fact
, rv
);
475 nsCOMPtr
<aaIFlow
> flow1
= do_CreateInstance("@aasii.org/base/flow;1", &rv
);
476 NS_ENSURE_TRUE(flow1
, rv
);
477 nsCOMPtr
<aaIEvent
> event
= do_CreateInstance("@aasii.org/base/event;1",
479 NS_ENSURE_TRUE(event
, rv
);
480 fact
->SetGiveTo(flow1
);
481 fact
->SetAmount(2.0);
484 fact
->SetEvent(event
);
485 res
= r2
.SetFact(fact
);
486 NS_TEST_ASSERT_MSG( res
, "[balance row] fact not accepted");
487 NS_TEST_ASSERT_MSG( r2
.mAmount
== 1, "[balance row] wrong amount");
488 NS_TEST_ASSERT_MSG( r2
.mStart
== t1
, "[balance row] wrong start time");
491 double histAmnt
= 0.0, histVal
= 0.0;
492 /* Testing aaBalanceRow.Merge() - Part 1
493 * Case of increasing balance (0), same day (0), to-side (0)
504 r1
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
| aaBalanceRow::VALUE
;
505 res
= r1
.Merge(r2
, histAmnt
, histVal
);
506 NS_TEST_ASSERT_MSG( res
, "[balance row] merge type 000 failed");
507 NS_TEST_ASSERT_MSG( histAmnt
== 0.0,
508 "[balance row] historical amount is not zero");
509 NS_TEST_ASSERT_MSG( histVal
== 0.0,
510 "[balance row] historical value is not zero");
511 NS_TEST_ASSERT_MSG( r2
.mStatus
& aaBalanceRow::CLEARED
,
512 "[balance row] consumed balance not cleared");
513 NS_TEST_ASSERT_MSG( r2
.mAmount
== 0,
514 "[balance row] consumed amount not cleared");
515 NS_TEST_ASSERT_MSG( r2
.mSink
== &r1
,
516 "[balance row] consumed balance has no sink");
517 NS_TEST_ASSERT_MSG( r1
.mStatus
& aaBalanceRow::UPDATE
,
518 "[balance row] updated balance has wrong status");
519 NS_TEST_ASSERT_MSG( r1
.mAmount
== 3,
520 "[balance row] updated amount is wrong");
521 NS_TEST_ASSERT_MSG( r1
.mValue
== 4,
522 "[balance row] updated value has changed");
525 NS_TEST_ASSERT_MSG( r1
.mValue
== 6,
526 "[balance row] updated value not changed");
529 /* Testing aaBalanceRow.Merge() - Part 2
530 * Case of decreasing balance (1), different day (1), from-side (1)
534 histAmnt
= 0.0, histVal
= 0.0;
543 r1
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
| aaBalanceRow::VALUE
;
552 r2
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
;
554 res
= r1
.Merge(r2
, histAmnt
, histVal
);
555 NS_TEST_ASSERT_MSG( res
, "[balance row] merge type 111 failed");
556 NS_TEST_ASSERT_MSG( histAmnt
== 2.0,
557 "[balance row] historical amount is wrong");
558 NS_TEST_ASSERT_MSG( histVal
== 4.0,
559 "[balance row] historical value is wrong");
560 NS_TEST_ASSERT_MSG( r1
.mStatus
& aaBalanceRow::CLEARED
,
561 "[balance row] consumed balance not cleared");
562 NS_TEST_ASSERT_MSG( r1
.mAmount
== 3.0,
563 "[balance row] consumed amount changed");
564 NS_TEST_ASSERT_MSG( r2
.mSink
== nsnull
,
565 "[balance row] replacing balance has sink");
566 NS_TEST_ASSERT_MSG( r2
.mAmount
== 1.0,
567 "[balance row] replacing amount is wrong");
568 NS_TEST_ASSERT_MSG( r2
.mValue
== 2.0,
569 "[balance row] replacing value is wrong");
572 /* Testing aaBalanceRow.Merge() - Part 3
573 * Case of decreasing balance (1), same day (0), to-side (0)
577 histAmnt
= 0.0, histVal
= 0.0;
581 r1
.mAmount
= 34950.0;
582 r1
.mFlowRate
= 1 / 34.95;
586 r1
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
| aaBalanceRow::VALUE
;
591 r2
.mFlowRate
= 1 / 34.95;
595 r2
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
;
597 res
= r1
.Merge(r2
, histAmnt
, histVal
);
598 NS_TEST_ASSERT_MSG( res
, "[balance row] merge type 100 failed");
599 NS_TEST_ASSERT_MSG( isZero( histAmnt
- 34950.0),
600 "[balance row] historical amount is wrong");
601 NS_TEST_ASSERT_MSG( isZero( histVal
- 34950.0),
602 "[balance row] historical value is wrong");
603 NS_TEST_ASSERT_MSG( r2
.mStatus
& aaBalanceRow::CLEARED
,
604 "[balance row] consumed balance not cleared");
605 NS_TEST_ASSERT_MSG( r2
.mAmount
== 0,
606 "[balance row] consumed amount not cleared");
607 NS_TEST_ASSERT_MSG( r2
.mSink
== &r1
,
608 "[balance row] consumed balance has no sink");
609 NS_TEST_ASSERT_MSG( r1
.mStatus
& aaBalanceRow::UPDATE
,
610 "[balance row] updated balance has wrong status");
611 NS_TEST_ASSERT_MSG( isZero(r1
.mAmount
),
612 "[balance row] updated amount is wrong");
613 NS_TEST_ASSERT_MSG( isZero(r1
.mValue
),
614 "[balance row] updated value wrong");
617 /* Testing aaBalanceRow.Merge() - Part 4
618 * Case of decreasing balance (1), same day (0), from-side (1), switch(1)
622 histAmnt
= 0.0, histVal
= 0.0;
626 r1
.mAmount
= 69900.0;
627 r1
.mFlowRate
= 1 / 34.95;
631 r1
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
| aaBalanceRow::VALUE
;
635 r2
.mFlowRate
= 1 / 34.95;
636 r2
.mAmount
= (2600.0);
640 r2
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
;
642 res
= r1
.Merge(r2
, histAmnt
, histVal
);
643 NS_TEST_ASSERT_MSG( res
, "[balance row] merge type 101 failed");
644 NS_TEST_ASSERT_MSG( isZero( histAmnt
- 69900.0),
645 "[balance row] historical amount is wrong");
646 NS_TEST_ASSERT_MSG( isZero( histVal
- 69900.0),
647 "[balance row] historical value is wrong");
648 NS_TEST_ASSERT_MSG( r2
.mStatus
& aaBalanceRow::CLEARED
,
649 "[balance row] consumed balance not cleared");
650 NS_TEST_ASSERT_MSG( r2
.mAmount
== 0,
651 "[balance row] consumed amount not cleared");
652 NS_TEST_ASSERT_MSG( r2
.mSink
== &r1
,
653 "[balance row] consumed balance has no sink");
654 NS_TEST_ASSERT_MSG( r1
.mStatus
& aaBalanceRow::UPDATE
,
655 "[balance row] updated balance has wrong status");
656 NS_TEST_ASSERT_MSG( isZero(r1
.mAmount
- 600.0),
657 "[balance row] updated amount is wrong");
658 NS_TEST_ASSERT_MSG( isZero(r1
.mValue
),
659 "[balance row] updated value wrong");
662 /* Testing aaBalanceRow.Merge() - Part 5
663 * Case of decreasing balance (1), same day (0), to-side (0), switch(1)
667 histAmnt
= 0.0, histVal
= 0.0;
672 r1
.mFlowRate
= 34.95;
676 r1
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
| aaBalanceRow::VALUE
;
680 r2
.mFlowRate
= 34.95;
681 r2
.mAmount
= (600.0 * r2
.mFlowRate
);
685 r2
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
;
687 res
= r1
.Merge(r2
, histAmnt
, histVal
);
688 NS_TEST_ASSERT_MSG( res
, "[balance row] merge type 1001 failed");
689 NS_TEST_ASSERT_MSG( isZero( histAmnt
- 500.0),
690 "[balance row] historical amount is wrong");
691 NS_TEST_ASSERT_MSG( isZero( histVal
- 17475.0),
692 "[balance row] historical value is wrong");
693 NS_TEST_ASSERT_MSG( r2
.mStatus
& aaBalanceRow::CLEARED
,
694 "[balance row] consumed balance not cleared");
695 NS_TEST_ASSERT_MSG( r2
.mAmount
== 0,
696 "[balance row] consumed amount not cleared");
697 NS_TEST_ASSERT_MSG( r2
.mSink
== &r1
,
698 "[balance row] consumed balance has no sink");
699 NS_TEST_ASSERT_MSG( r1
.mStatus
& aaBalanceRow::UPDATE
,
700 "[balance row] updated balance has wrong status");
701 NS_TEST_ASSERT_MSG( isZero(r1
.mAmount
- 3495.0),
702 "[balance row] updated amount is wrong");
703 NS_TEST_ASSERT_MSG( isZero(r1
.mValue
),
704 "[balance row] updated value wrong");
707 /* Testing aaBalanceRow.Merge() - Part 6
708 * Case of decreasing balance (1), same day (0), from-side (1)
712 histAmnt
= 0.0, histVal
= 0.0;
716 r1
.mAmount
= 30000.0;
717 r1
.mFlowRate
= 1.0/150.0;
721 r1
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
| aaBalanceRow::VALUE
;
725 r2
.mFlowRate
= 1.0/150.0;
726 r2
.mAmount
= (20000.0 * r2
.mFlowRate
);
730 r2
.mStatus
= aaBalanceRow::SIDE
| aaBalanceRow::FLOW
;
732 res
= r1
.Merge(r2
, histAmnt
, histVal
);
733 NS_TEST_ASSERT_MSG( res
, "[balance row] merge type 101 failed");
734 NS_TEST_ASSERT_MSG( isZero( histAmnt
- 20000.0),
735 "[balance row] historical amount is wrong");
736 NS_TEST_ASSERT_MSG( isZero( histVal
- 20000.0),
737 "[balance row] historical value is wrong");
738 NS_TEST_ASSERT_MSG( r2
.mStatus
& aaBalanceRow::CLEARED
,
739 "[balance row] consumed balance not cleared");
740 NS_TEST_ASSERT_MSG( r2
.mAmount
== 0,
741 "[balance row] consumed amount not cleared");
742 NS_TEST_ASSERT_MSG( r2
.mSink
== &r1
,
743 "[balance row] consumed balance has no sink");
744 NS_TEST_ASSERT_MSG( r1
.mStatus
& aaBalanceRow::UPDATE
,
745 "[balance row] updated balance has wrong status");
746 NS_TEST_ASSERT_MSG( isZero(r1
.mAmount
- 10000.0),
747 "[balance row] updated amount is wrong");
748 NS_TEST_ASSERT_MSG( isZero(r1
.mValue
- 10000.0),
749 "[balance row] updated value wrong");
752 /* Testing aaBalanceRow.AddValue() */
757 NS_TEST_ASSERT_MSG(r1
.mStatus
== 0, "[balance row] Incorrect status");
764 aaAccountTest::testTransaction(nsITestRunner
*aTestRunner
)
767 NS_TEST_BEGIN(aTestRunner
);
768 aaSession
*session
= static_cast<aaSession
*>(mSession
.get());
769 NS_TEST_ASSERT_MSG(session
, "[transaction] 'session' cast" );
770 NS_ENSURE_TRUE(session
, NS_ERROR_UNEXPECTED
);
772 nsCOMPtr
<aaISaveQuery
> saver(do_CreateInstance(
773 AA_SAVETRANSACTION_CONTRACT_ID
, session
->mConnection
, &rv
));
774 NS_TEST_ASSERT_MSG(saver
, "[transaction] query instance creation" );
775 NS_ENSURE_TRUE(saver
, rv
);
777 nsCOMPtr
<aaITransaction
> node(do_CreateInstance(
778 "@aasii.org/base/transaction;1", &rv
));
779 NS_TEST_ASSERT_MSG(node
, "[transaction] instance not created" );
780 NS_ENSURE_TRUE(node
, rv
);
782 node
->SetFact(mPendingFact
);
784 rv
= saver
->Save(node
, nsnull
);
785 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[transaction] saving" );
787 nsCOMPtr
<aaILoadQuery
> set
;
788 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
789 NS_TEST_ASSERT_MSG(set
, "[transaction] result set not created" );
790 NS_ENSURE_TRUE(set
, rv
);
792 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[transaction] result set not loaded" );
795 set
->GetLength(&count
);
796 NS_TEST_ASSERT_MSG(count
== 2, "[transaction] wrong flow count");
798 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
799 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
800 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
801 "[transaction] flow2 is wrong");
803 balance
= do_QueryElementAt(set
, 1);
804 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
,
805 AA_EVENT_AMOUNT_2
, 1), "[transaction] flow3 is wrong");
807 rv
= mSession
->CreateQuery(AA_LOADPENDINGFACTS_CONTRACT_ID
,
808 getter_AddRefs( set
));
809 NS_TEST_ASSERT_MSG(set
, "[transaction] fact set not created" );
810 NS_ENSURE_TRUE(set
, rv
);
812 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[transaction] fact set not loaded" );
814 set
->GetLength(&count
);
815 NS_TEST_ASSERT_MSG(count
== AA_TXN_COUNT
- 1,
816 "[transaction] wrong fact count");
818 mPendingFact
= do_QueryElementAt(set
, 0, &rv
);
819 NS_TEST_ASSERT_MSG(mPendingFact
, "[transaction] pending fact not loaded" );
821 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, mPendingFact
, 1, 3,
822 AA_EVENT_AMOUNT_3
), "[transaction] pending fact is wrong");
827 aaAccountTest::testUpdateTransaction(nsITestRunner
*aTestRunner
)
830 NS_TEST_BEGIN(aTestRunner
);
832 nsCOMPtr
<aaITransaction
> node(do_CreateInstance(
833 "@aasii.org/base/transaction;1", &rv
));
834 NS_TEST_ASSERT_MSG(node
, "[update txn] instance not created" );
835 NS_ENSURE_TRUE(node
, rv
);
837 node
->SetFact(mPendingFact
);
839 rv
= mSession
->Save(node
, nsnull
);
840 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[update txn] saving" );
842 nsCOMPtr
<aaILoadQuery
> set
;
843 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
844 NS_TEST_ASSERT_MSG(set
, "[update txn] result set not created" );
845 NS_ENSURE_TRUE(set
, rv
);
847 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[update txn] result set not loaded" );
850 set
->GetLength(&count
);
851 NS_TEST_ASSERT_MSG(count
== 3, "[update txn] wrong flow count");
853 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
854 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
855 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
856 "[update txn] flow2 is wrong");
858 balance
= do_QueryElementAt(set
, 1);
859 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
860 + AA_EVENT_AMOUNT_3
, AA_EVENT_AMOUNT_2
+ AA_EVENT_AMOUNT_3
, 1),
861 "[update txn] flow3 is wrong");
863 balance
= do_QueryElementAt(set
, 2);
864 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
865 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
866 "[update txn] flow1 is wrong");
868 rv
= mSession
->CreateQuery(AA_LOADPENDINGFACTS_CONTRACT_ID
,
869 getter_AddRefs( set
));
870 NS_TEST_ASSERT_MSG(set
, "[update txn] fact set not created" );
871 NS_ENSURE_TRUE(set
, rv
);
873 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[update txn] fact set not loaded" );
875 set
->GetLength(&count
);
876 NS_TEST_ASSERT_MSG(count
== AA_TXN_COUNT
- 2,
877 "[update txn] wrong fact count");
879 mPendingFact
= do_QueryElementAt(set
, 0, &rv
);
880 NS_TEST_ASSERT_MSG(mPendingFact
, "[update txn] pending fact not loaded" );
882 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, mPendingFact
, 3, 4,
883 AA_EVENT_AMOUNT_4
), "[update txn] pending fact is wrong");
888 aaAccountTest::testReplaceTransaction(nsITestRunner
*aTestRunner
)
891 NS_TEST_BEGIN(aTestRunner
);
893 nsCOMPtr
<aaITransaction
> node(do_CreateInstance(
894 "@aasii.org/base/transaction;1", &rv
));
895 NS_TEST_ASSERT_MSG(node
, "[replace txn] instance not created" );
896 NS_ENSURE_TRUE(node
, rv
);
898 node
->SetFact(mPendingFact
);
900 rv
= mSession
->Save(node
, nsnull
);
901 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[replace txn] saving" );
903 nsCOMPtr
<aaILoadQuery
> set
;
904 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
905 NS_TEST_ASSERT_MSG(set
, "[replace txn] result set not created" );
906 NS_ENSURE_TRUE(set
, rv
);
908 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[replace txn] result set not loaded" );
911 set
->GetLength(&count
);
912 NS_TEST_ASSERT_MSG(count
== 4, "[replace txn] wrong flow count");
914 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
915 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
916 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
917 "[replace txn] flow2 is wrong");
919 balance
= do_QueryElementAt(set
, 1);
920 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
921 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
922 "[replace txn] flow1 is wrong");
924 balance
= do_QueryElementAt(set
, 2);
925 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
926 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
, AA_EVENT_AMOUNT_2
927 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
, 1),
928 "[replace txn] flow3 is wrong");
930 balance
= do_QueryElementAt(set
, 3);
931 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
932 AA_EVENT_AMOUNT_4
, 1), "[replace txn] flow4 is wrong");
934 rv
= mSession
->CreateQuery(AA_LOADPENDINGFACTS_CONTRACT_ID
,
935 getter_AddRefs( set
));
936 NS_TEST_ASSERT_MSG(set
, "[replace txn] fact set not created" );
937 NS_ENSURE_TRUE(set
, rv
);
939 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[replace txn] fact set not loaded" );
941 set
->GetLength(&count
);
942 NS_TEST_ASSERT_MSG(count
== AA_TXN_COUNT
- 3,
943 "[replace txn] wrong fact count");
945 mPendingFact
= do_QueryElementAt(set
, 0, &rv
);
946 NS_TEST_ASSERT_MSG(mPendingFact
, "[transaction] pending fact not loaded" );
948 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, mPendingFact
, 5, 6,
949 AA_EVENT_AMOUNT_6
), "[transaction] pending fact is wrong");
953 #define AA_FB_FILTER1 " WHERE balance.flow_id=3 AND balance.start =\
954 (SELECT MAX(start) FROM balance WHERE flow_id=3 AND start <= 2454342)\
955 AND (balance.paid > 2454342 OR balance.paid IS NULL)"
958 aaAccountTest::testFlowBalance(nsITestRunner
*aTestRunner
)
961 NS_TEST_BEGIN(aTestRunner
);
963 nsCOMPtr
<aaILoadQuery
> set
;
964 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
965 NS_TEST_ASSERT_MSG(set
, "[flow balance] result set not created" );
966 NS_ENSURE_TRUE(set
, rv
);
968 nsCOMPtr
<aaIStringFilter
> filter(do_CreateInstance(AA_FILTER_CONTRACT_ID
));
969 filter
->SetExpression(NS_LITERAL_CSTRING(AA_FB_FILTER1
));
970 set
->SetFilter(filter
);
972 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[flow balance] result set not loaded" );
975 set
->GetLength(&count
);
976 NS_TEST_ASSERT_MSG(count
== 1, "[flow balance] wrong count");
978 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
979 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
980 + AA_EVENT_AMOUNT_3
, AA_EVENT_AMOUNT_2
+ AA_EVENT_AMOUNT_3
, 1),
981 "[flow balance] flow3 is wrong");
987 aaAccountTest::testStateFilter(nsITestRunner
*aTestRunner
)
990 NS_TEST_BEGIN(aTestRunner
);
992 nsCOMPtr
<aaILoadQuery
> set
;
993 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
994 NS_TEST_ASSERT_MSG(set
, "[state filter] result set not created" );
995 NS_ENSURE_TRUE(set
, rv
);
997 nsCOMPtr
<aaIStateFilter
> filter
=
998 do_CreateInstance(AA_STATEFILTER_CONTRACT_ID
);
1000 nsCOMPtr
<aaIFlow
> bank
= do_QueryElementAt(mFlows
, 2);
1001 filter
->SetFlow( bank
);
1003 /* Set date to 2007-08-29 */
1004 PRExplodedTime tm
= {0,0,0,12,29,7,2007};
1005 filter
->SetDate(PR_ImplodeTime(&tm
));
1007 set
->SetFilter(filter
);
1009 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[state filter] result set not loaded" );
1012 set
->GetLength(&count
);
1013 NS_TEST_ASSERT_MSG(count
== 1, "[state filter] wrong count");
1015 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
1016 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
1017 + AA_EVENT_AMOUNT_3
, AA_EVENT_AMOUNT_2
+ AA_EVENT_AMOUNT_3
, 1),
1018 "[state filter] flow3 is wrong");
1024 aaAccountTest::testCreditTransaction(nsITestRunner
*aTestRunner
)
1027 NS_TEST_BEGIN(aTestRunner
);
1029 nsCOMPtr
<aaITransaction
> node(do_CreateInstance(
1030 "@aasii.org/base/transaction;1", &rv
));
1031 NS_TEST_ASSERT_MSG(node
, "[credit txn] instance not created" );
1032 NS_ENSURE_TRUE(node
, rv
);
1034 node
->SetFact(mPendingFact
);
1036 rv
= mSession
->Save(node
, nsnull
);
1037 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[credit txn] saving" );
1039 nsCOMPtr
<aaILoadQuery
> set
;
1040 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
1041 NS_TEST_ASSERT_MSG(set
, "[credit txn] result set not created" );
1042 NS_ENSURE_TRUE(set
, rv
);
1044 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[credit txn] result set not loaded" );
1047 set
->GetLength(&count
);
1048 NS_TEST_ASSERT_MSG(count
== 6, "[credit txn] wrong flow count");
1050 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
1051 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1052 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1053 "[credit txn] flow2 is wrong");
1055 balance
= do_QueryElementAt(set
, 1);
1056 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1057 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1058 "[credit txn] flow1 is wrong");
1060 balance
= do_QueryElementAt(set
, 2);
1061 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
1062 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
, AA_EVENT_AMOUNT_2
1063 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
, 1),
1064 "[credit txn] flow3 is wrong");
1066 balance
= do_QueryElementAt(set
, 3);
1067 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1068 AA_EVENT_AMOUNT_4
, 1), "[credit txn] flow4 is wrong");
1070 balance
= do_QueryElementAt(set
, 4);
1071 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 5, 1, AA_EVENT_AMOUNT_6
1072 * AA_EVENT_RATE_2
, AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, 0),
1073 "[credit txn] flow5 is wrong");
1075 balance
= do_QueryElementAt(set
, 5);
1076 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4, AA_EVENT_AMOUNT_6
,
1077 AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, 1), "[credit txn] flow6 is wrong");
1079 rv
= mSession
->CreateQuery(AA_LOADPENDINGFACTS_CONTRACT_ID
,
1080 getter_AddRefs( set
));
1081 NS_TEST_ASSERT_MSG(set
, "[credit txn] fact set not created" );
1082 NS_ENSURE_TRUE(set
, rv
);
1084 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[credit txn] fact set not loaded" );
1086 set
->GetLength(&count
);
1087 NS_TEST_ASSERT_MSG(count
== AA_TXN_COUNT
- 4,
1088 "[credit txn] wrong fact count");
1090 mPendingFact
= do_QueryElementAt(set
, 0, &rv
);
1091 NS_TEST_ASSERT_MSG(mPendingFact
, "[transaction] pending fact not loaded" );
1093 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, mPendingFact
, 3, 5,
1094 AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
),
1095 "[transaction] pending fact is wrong");
1100 aaAccountTest::testDeleteTransaction(nsITestRunner
*aTestRunner
)
1103 NS_TEST_BEGIN(aTestRunner
);
1105 nsCOMPtr
<aaITransaction
> node(do_CreateInstance(
1106 "@aasii.org/base/transaction;1", &rv
));
1107 NS_TEST_ASSERT_MSG(node
, "[delete txn] instance not created" );
1108 NS_ENSURE_TRUE(node
, rv
);
1110 node
->SetFact(mPendingFact
);
1112 rv
= mSession
->Save(node
, nsnull
);
1113 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[delete txn] saving" );
1115 nsCOMPtr
<aaILoadQuery
> list
;
1116 rv
= mSession
->CreateQuery(AA_LOADFACTLIST_CONTRACT_ID
,
1117 getter_AddRefs( list
));
1118 NS_TEST_ASSERT_MSG(list
, "[delete txn] list not created" );
1119 NS_ENSURE_TRUE(list
, rv
);
1120 nsCOMPtr
<aaIStringFilter
> filter(do_CreateInstance(AA_FILTER_CONTRACT_ID
));
1121 filter
->SetExpression(NS_LITERAL_CSTRING(" WHERE transfer._ROWID_=5"));
1122 list
->SetFilter(filter
);
1124 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[delete txn] list not loaded" );
1127 rv
= list
->GetLength(&count
);
1128 NS_TEST_ASSERT_OK(rv
);
1129 NS_TEST_ASSERT_MSG(count
== 1, "[delete txn] wrong fact count");
1131 nsCOMPtr
<aaITransaction
> txn
= do_QueryElementAt(list
, 0);
1132 NS_TEST_ASSERT_MSG(txn
, "[delete txn] transaction not loaded");
1133 if (NS_LIKELY(txn
)) {
1134 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, txn
->PickFact(), 3, 5,
1135 AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
),
1136 "[delete txn] new fact is wrong");
1137 NS_TEST_ASSERT_MSG(txn
->PickValue() == AA_EVENT_AMOUNT_6
1138 * AA_EVENT_RATE_2
, "[delete txn] wrong value stored");
1141 nsCOMPtr
<aaILoadQuery
> set
;
1142 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
1143 NS_TEST_ASSERT_MSG(set
, "[delete txn] result set not created" );
1144 NS_ENSURE_TRUE(set
, rv
);
1146 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[delete txn] result set not loaded" );
1149 set
->GetLength(&count
);
1150 NS_TEST_ASSERT_MSG(count
== 5, "[delete txn] wrong flow count");
1152 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
1153 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1154 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1155 "[delete txn] flow2 is wrong");
1157 balance
= do_QueryElementAt(set
, 1);
1158 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1159 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1160 "[delete txn] flow1 is wrong");
1162 balance
= do_QueryElementAt(set
, 2);
1163 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
1164 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
1165 - AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, AA_EVENT_AMOUNT_2
1166 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
1167 - AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, 1),
1168 "[delete txn] flow3 is wrong");
1170 balance
= do_QueryElementAt(set
, 3);
1171 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1172 AA_EVENT_AMOUNT_4
, 1), "[delete txn] flow4 is wrong");
1174 balance
= do_QueryElementAt(set
, 4);
1175 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4, AA_EVENT_AMOUNT_6
,
1176 AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, 1), "[delete txn] flow6 is wrong");
1178 rv
= mSession
->CreateQuery(AA_LOADPENDINGFACTS_CONTRACT_ID
,
1179 getter_AddRefs( set
));
1180 NS_TEST_ASSERT_MSG(set
, "[delete txn] fact set not created" );
1181 NS_ENSURE_TRUE(set
, rv
);
1183 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[delete txn] fact set not loaded" );
1185 set
->GetLength(&count
);
1186 NS_TEST_ASSERT_MSG(count
== AA_TXN_COUNT
- 5,
1187 "[delete txn] wrong fact count");
1189 mPendingFact
= do_QueryElementAt(set
, 0, &rv
);
1190 NS_TEST_ASSERT_MSG(mPendingFact
, "[delete txn] pending fact not loaded" );
1192 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, mPendingFact
, 6, 7,
1194 "[transaction] pending fact is wrong");
1199 aaAccountTest::testFlowChart(nsITestRunner
*aTestRunner
)
1202 NS_TEST_BEGIN(aTestRunner
);
1204 nsCOMPtr
<aaILoadQuery
> list
;
1205 rv
= mSession
->CreateQuery(AA_LOADFLOWCHART_CONTRACT_ID
,
1206 getter_AddRefs( list
));
1207 NS_TEST_ASSERT_MSG(list
, "[flow chart] list not created" );
1208 NS_ENSURE_TRUE(list
, rv
);
1210 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[flow chart] list not loaded" );
1213 rv
= list
->GetLength(&count
);
1214 NS_TEST_ASSERT_OK(rv
);
1216 nsCOMPtr
<aaIFlow
> flow
= do_QueryElementAt(list
, count
- 1, &rv
);
1217 NS_TEST_ASSERT_MSG(flow
, "[flow chart] tested flow not loaded");
1218 NS_ENSURE_TRUE(flow
, rv
);
1221 rv
= flow
->GetTag(wstr
);
1222 NS_TEST_ASSERT_OK(rv
);
1223 NS_TEST_ASSERT_MSG(wstr
.Equals(NS_LITERAL_STRING("profit and loss")),
1224 "[flow chart] wrong flow tag");
1229 aaAccountTest::testIncomeRow(nsITestRunner
*aTestRunner
)
1231 NS_TEST_BEGIN(aTestRunner
);
1233 NS_TEST_ASSERT_MSG(income
.mStatus
== 0, "[income row] wrong initial status");
1235 PRBool res
= income
.Update(1, 1.0);
1236 NS_TEST_ASSERT_MSG(res
, "[income row] updating a new object");
1237 NS_TEST_ASSERT_MSG(income
.mStatus
== aaIncomeRow::NEW
,
1238 "[income row] wrong status of a new object");
1239 NS_TEST_ASSERT_MSG(income
.mValue
== 1.0,
1240 "[income row] wrong value stored to a new object");
1241 NS_TEST_ASSERT_MSG(income
.mSide
== 0,
1242 "[income row] wrong side in a new object");
1244 income
.mStatus
= aaIncomeRow::LOADED
;
1246 res
= income
.Update(1, 2.0);
1247 NS_TEST_ASSERT_MSG(!res
, "[income row] new object accepting bad input");
1248 NS_TEST_ASSERT_MSG(income
.mStatus
== aaIncomeRow::BROKEN
,
1249 "[income row] wrong status of a new object");
1250 NS_TEST_ASSERT_MSG(income
.mValue
== 1.0,
1251 "[income row] wrong value stored to a new object");
1253 income
.mStatus
= aaIncomeRow::LOADED
;
1255 res
= income
.Update(2, 2.0);
1256 NS_TEST_ASSERT_MSG(res
, "[income row] updating a loaded object");
1257 NS_TEST_ASSERT_MSG(income
.mStatus
== aaIncomeRow::UPDATE
,
1258 "[income row] wrong status of an updated object");
1259 NS_TEST_ASSERT_MSG(income
.mValue
== 3.0,
1260 "[income row] wrong value stored to an updated object");
1261 NS_TEST_ASSERT_MSG(income
.mSide
== 0,
1262 "[income row] wrong side in a updated object");
1264 income
.mStatus
= aaIncomeRow::LOADED
;
1266 res
= income
.Update(2, -4.0);
1267 NS_TEST_ASSERT_MSG(res
, "[income row] reverting a loaded object");
1268 NS_TEST_ASSERT_MSG(income
.mStatus
== aaIncomeRow::UPDATE
,
1269 "[income row] wrong status of an reverted object");
1270 NS_TEST_ASSERT_MSG(income
.mValue
== 1.0,
1271 "[income row] wrong value stored to an reverted object");
1272 NS_TEST_ASSERT_MSG(income
.mSide
== 1,
1273 "[income row] wrong side in a reverted object");
1275 income
.mStatus
= aaIncomeRow::LOADED
;
1276 res
= income
.Update(3, 4.0);
1277 NS_TEST_ASSERT_MSG(res
, "[income row] replacing a loaded object");
1278 NS_TEST_ASSERT_MSG(income
.mStatus
== aaIncomeRow::REPLACE
,
1279 "[income row] wrong status of an replacing object");
1280 NS_TEST_ASSERT_MSG(income
.mValue
== 3.0,
1281 "[income row] wrong value stored to an replacing object");
1282 NS_TEST_ASSERT_MSG(income
.mSide
== 0,
1283 "[income row] wrong side in a replacing object");
1284 NS_TEST_ASSERT_MSG(income
.mStart
== 3,
1285 "[income row] wrong start of a replacing object");
1286 NS_TEST_ASSERT_MSG(income
.mPaid
== 2,
1287 "[income row] wrong end of a replaced object");
1292 aaAccountTest::testLoadIncome(nsITestRunner
*aTestRunner
)
1295 NS_TEST_BEGIN(aTestRunner
);
1297 nsCOMPtr
<aaILoadQuery
> loader
;
1298 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
1299 getter_AddRefs( loader
));
1300 NS_TEST_ASSERT_MSG(loader
, "[load income] loader not created" );
1301 NS_ENSURE_TRUE(loader
, rv
);
1302 rv
= loader
->Load();
1303 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[load income] loader not loaded" );
1306 rv
= loader
->GetLength(&count
);
1307 NS_TEST_ASSERT_OK(rv
);
1308 NS_TEST_ASSERT_MSG(count
== 0, "[load income] wrong line count");
1314 aaAccountTest::testStopTransaction(nsITestRunner
*aTestRunner
)
1317 NS_TEST_BEGIN(aTestRunner
);
1319 nsCOMPtr
<aaITransaction
> node(do_CreateInstance(
1320 "@aasii.org/base/transaction;1", &rv
));
1321 NS_TEST_ASSERT_MSG(node
, "[stop txn] instance not created" );
1322 NS_ENSURE_TRUE(node
, rv
);
1324 node
->SetFact(mPendingFact
);
1326 rv
= mSession
->Save(node
, nsnull
);
1327 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[stop txn] saving" );
1329 nsCOMPtr
<aaILoadQuery
> list
;
1330 rv
= mSession
->CreateQuery(AA_LOADFACTLIST_CONTRACT_ID
,
1331 getter_AddRefs( list
));
1332 NS_TEST_ASSERT_MSG(list
, "[stop txn] list not created" );
1333 NS_ENSURE_TRUE(list
, rv
);
1335 nsCOMPtr
<aaIStringFilter
> filter(do_CreateInstance(AA_FILTER_CONTRACT_ID
));
1336 filter
->SetExpression(NS_LITERAL_CSTRING(" WHERE transfer._ROWID_=6"));
1337 list
->SetFilter(filter
);
1339 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[stop txn] list not loaded" );
1342 rv
= list
->GetLength(&count
);
1343 NS_TEST_ASSERT_OK(rv
);
1344 NS_TEST_ASSERT_MSG(count
== 1, "[stop txn] wrong fact count");
1346 nsCOMPtr
<aaITransaction
> txn
= do_QueryElementAt(list
, 0);
1347 NS_TEST_ASSERT_MSG(txn
, "[stop txn] transaction not loaded");
1348 if (NS_LIKELY(txn
)) {
1349 NS_TEST_ASSERT_MSG(testFact(aTestRunner
, txn
->PickFact(), 6, 7,
1351 "[stop txn] new fact is wrong");
1352 NS_TEST_ASSERT_MSG(txn
->PickValue() == AA_EVENT_AMOUNT_6
1353 * AA_EVENT_RATE_2
, "[stop txn] wrong value stored");
1354 NS_TEST_ASSERT_MSG(txn
->PickHasEarnings(),
1355 "[stop txn] wrong earnings status");
1356 NS_TEST_ASSERT_MSG(isZero(txn
->PickEarnings() - AA_EVENT_AMOUNT_6
1357 * (AA_EVENT_RATE_3
- AA_EVENT_RATE_2
)),
1358 "[stop txn] wrong earnings stored");
1361 nsCOMPtr
<aaILoadQuery
> set
;
1362 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
, getter_AddRefs( set
));
1363 NS_TEST_ASSERT_MSG(set
, "[stop txn] result set not created" );
1364 NS_ENSURE_TRUE(set
, rv
);
1366 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[stop txn] result set not loaded" );
1369 set
->GetLength(&count
);
1370 NS_TEST_ASSERT_MSG(count
== 5, "[stop txn] wrong flow count");
1372 nsCOMPtr
<aaIBalance
> balance(do_QueryElementAt(set
, 0));
1373 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1374 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1375 "[stop txn] flow2 is wrong");
1377 balance
= do_QueryElementAt(set
, 1);
1378 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1379 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1380 "[stop txn] flow1 is wrong");
1382 balance
= do_QueryElementAt(set
, 2);
1383 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, AA_EVENT_AMOUNT_2
1384 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
1385 - AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, AA_EVENT_AMOUNT_2
1386 + AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
1387 - AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_2
, 1),
1388 "[stop txn] flow3 is wrong");
1390 balance
= do_QueryElementAt(set
, 3);
1391 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1392 AA_EVENT_AMOUNT_4
, 1), "[stop txn] flow4 is wrong");
1394 balance
= do_QueryElementAt(set
, 4);
1395 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 7, 1, AA_EVENT_AMOUNT_6
1396 * AA_EVENT_RATE_3
, AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_3
, 1),
1397 "[stop txn] flow7 is wrong");
1399 nsCOMPtr
<aaILoadQuery
> incomeSet
;
1400 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
1401 getter_AddRefs( incomeSet
));
1402 NS_TEST_ASSERT_MSG(incomeSet
, "[stop txn] income set not created" );
1403 NS_ENSURE_TRUE(incomeSet
, rv
);
1404 rv
= incomeSet
->Load();
1405 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[stop txn] income set not loaded" );
1408 incomeSet
->GetLength(&count
);
1409 NS_TEST_ASSERT_MSG(count
== 1, "[stop txn] wrong income count");
1412 balance
= do_QueryElementAt(incomeSet
, 0);
1413 NS_TEST_ASSERT_MSG(balance
, "[stop txn] income not loaded" );
1414 if (NS_LIKELY(balance
)) {
1415 mProfit
= AA_EVENT_AMOUNT_6
* (AA_EVENT_RATE_3
- AA_EVENT_RATE_2
);
1416 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() - mProfit
),
1417 "[stop txn] wrong income saved");
1420 rv
= mSession
->CreateQuery(AA_LOADPENDINGFACTS_CONTRACT_ID
,
1421 getter_AddRefs( set
));
1422 NS_TEST_ASSERT_MSG(set
, "[stop txn] fact set not created" );
1423 NS_ENSURE_TRUE(set
, rv
);
1425 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[stop txn] fact set not loaded" );
1427 set
->GetLength(&count
);
1428 NS_TEST_ASSERT_MSG(count
== AA_TXN_COUNT
- 6,
1429 "[stop txn] wrong fact count");
1435 aaAccountTest::testLossTransaction(nsITestRunner
*aTestRunner
)
1438 NS_TEST_BEGIN(aTestRunner
);
1439 nsCOMPtr
<aaIEntity
> bank
= do_QueryElementAt(mEntities
, 3, &rv
);
1440 NS_ENSURE_TRUE(bank
, rv
);
1442 nsCOMPtr
<aaIResource
> rub(do_QueryElementAt(mResources
, 0, &rv
));
1443 nsCOMPtr
<aaIResource
> eur(do_QueryElementAt(mResources
, 3, &rv
));
1445 nsCOMPtr
<aaIFlow
> bankAccRub(do_QueryElementAt(mFlows
,2));
1446 nsCOMPtr
<aaIFlow
> bankAccEur(do_QueryElementAt(mFlows
,5));
1448 nsCOMPtr
<aaIFlow
> forex(do_QueryElementAt(mFlows
, 6));
1449 nsCOMPtr
<aaIFact
> fact(do_CreateInstance("@aasii.org/base/fact;1", &rv
));
1450 nsCOMPtr
<aaIEvent
> event(do_CreateInstance("@aasii.org/base/event;1"));
1451 nsCOMPtr
<aaITransaction
> txn(do_CreateInstance(
1452 "@aasii.org/base/transaction;1", &rv
));
1456 nsCOMPtr
<aaILoadQuery
> set
;
1457 nsCOMPtr
<aaIBalance
> balance
;
1458 /* Settle forex deal #2 */
1460 /* Set time to 2007-09-03 */
1461 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
1462 PRExplodedTime tm
= {0,0,0,12,3,8,2007};
1463 event
->SetTime(PR_ImplodeTime(&tm
));
1465 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
1466 NS_ENSURE_TRUE(block
, rv
);
1469 NS_ENSURE_TRUE(fact
, rv
);
1470 fact
->SetAmount(AA_EVENT_AMOUNT_6
* AA_EVENT_RATE_3
);
1471 fact
->SetTakeFrom(forex
);
1472 fact
->SetGiveTo(bankAccRub
);
1474 rv
= block
->AppendElement(fact
, PR_FALSE
);
1475 NS_TEST_ASSERT_OK(rv
);
1477 rv
= mSession
->Save(event
, nsnull
);
1478 NS_TEST_ASSERT_OK(rv
);
1480 NS_ENSURE_TRUE(txn
, rv
);
1483 rv
= mSession
->Save(txn
, nsnull
);
1484 NS_TEST_ASSERT_OK(rv
);
1486 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
1487 getter_AddRefs(set
));
1488 NS_TEST_ASSERT_OK(rv
);
1489 NS_ENSURE_TRUE(set
, rv
);
1491 NS_TEST_ASSERT_OK(rv
);
1493 set
->GetLength(&count
);
1494 NS_TEST_ASSERT_MSG(count
== 4, "[loss txn] [fact 7] wrong flow count");
1496 balance
= do_QueryElementAt(set
, 0);
1497 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1498 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1499 "[loss txn] [fact 7] flow2 is wrong");
1501 balance
= do_QueryElementAt(set
, 1);
1502 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1503 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1504 "[loss txn] [fact 7] flow1 is wrong");
1506 balance
= do_QueryElementAt(set
, 2);
1507 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1508 AA_EVENT_AMOUNT_4
, 1), "[loss txn] [fact 7] flow4 is wrong");
1510 mRubs
= AA_EVENT_AMOUNT_2
+ AA_EVENT_AMOUNT_3
- AA_EVENT_AMOUNT_4
1511 + AA_EVENT_AMOUNT_6
* (AA_EVENT_RATE_3
- AA_EVENT_RATE_2
);
1512 balance
= do_QueryElementAt(set
, 3);
1513 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
1514 1), "[loss txn] [fact 7] flow3 is wrong");
1517 /* Create flow for forex deal #3 */
1519 forex
= do_CreateInstance("@aasii.org/base/flow;1");
1520 NS_ENSURE_TRUE(forex
, NS_ERROR_FAILURE
);
1521 forex
->SetTag(NS_LITERAL_STRING(AA_FLOW_TAG_10
));
1522 forex
->SetEntity(bank
);
1523 forex
->SetGiveResource(rub
);
1524 forex
->SetTakeResource(eur
);
1525 forex
->SetRate(1 / AA_EVENT_RATE_4
);
1526 forex
->SetLimit(AA_EVENT_AMOUNT_7
);
1527 rv
= mSession
->Save(forex
, nsnull
);
1528 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[loss event] [deal 3] saving flow");
1529 NS_ENSURE_SUCCESS(rv
, rv
);
1531 forex
->GetId( &id
);
1532 NS_TEST_ASSERT_MSG(id
== 8, "[loss event] [deal 3] unexpected 'flow.id'");
1533 NS_ENSURE_TRUE(id
== 8, NS_ERROR_UNEXPECTED
);
1536 /* Pay forex deal #3 */
1538 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
1539 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
1540 /* Set time to 2007-09-03 */
1541 PRExplodedTime tm
= {0,0,0,12,3,8,2007};
1542 event
->SetTime(PR_ImplodeTime(&tm
));
1544 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
1545 NS_ENSURE_TRUE(block
, rv
);
1548 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
1549 NS_ENSURE_TRUE(fact
, rv
);
1550 fact
->SetAmount(AA_EVENT_AMOUNT_7
* AA_EVENT_RATE_4
);
1551 fact
->SetTakeFrom(bankAccRub
);
1552 fact
->SetGiveTo(forex
);
1554 rv
= block
->AppendElement(fact
, PR_FALSE
);
1555 NS_TEST_ASSERT_OK(rv
);
1557 rv
= mSession
->Save(event
, nsnull
);
1558 NS_TEST_ASSERT_OK(rv
);
1560 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
1561 NS_ENSURE_TRUE(txn
, rv
);
1564 rv
= mSession
->Save(txn
, nsnull
);
1565 NS_TEST_ASSERT_OK(rv
);
1567 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
1568 getter_AddRefs(set
));
1569 NS_TEST_ASSERT_OK(rv
);
1570 NS_ENSURE_TRUE(set
, rv
);
1572 NS_TEST_ASSERT_OK(rv
);
1574 set
->GetLength(&count
);
1575 NS_TEST_ASSERT_MSG(count
== 5, "[loss txn] [fact 8] wrong flow count");
1577 balance
= do_QueryElementAt(set
, 0);
1578 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1579 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1580 "[loss txn] [fact 8] flow2 is wrong");
1582 balance
= do_QueryElementAt(set
, 1);
1583 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1584 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1585 "[loss txn] [fact 8] flow1 is wrong");
1587 balance
= do_QueryElementAt(set
, 2);
1588 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1589 AA_EVENT_AMOUNT_4
, 1), "[loss txn] [fact 8] flow4 is wrong");
1591 mRubs
-= AA_EVENT_AMOUNT_7
* AA_EVENT_RATE_4
;
1592 balance
= do_QueryElementAt(set
, 3);
1593 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
1594 1), "[loss txn] [fact 8] flow3 is wrong");
1596 balance
= do_QueryElementAt(set
, 4);
1597 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 8, 4,
1598 AA_EVENT_AMOUNT_7
, AA_EVENT_AMOUNT_7
* AA_EVENT_RATE_4
, 1),
1599 "[loss txn] [fact 8] flow8 is wrong");
1602 /* Recieve settlement from forex deal #3 */
1604 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
1605 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
1606 /* Set time to 2007-09-04 */
1607 PRExplodedTime tm
= {0,0,0,12,4,8,2007};
1608 event
->SetTime(PR_ImplodeTime(&tm
));
1610 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
1611 NS_ENSURE_TRUE(block
, rv
);
1614 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
1615 NS_ENSURE_TRUE(fact
, rv
);
1616 fact
->SetAmount(AA_EVENT_AMOUNT_7
);
1617 fact
->SetTakeFrom(forex
);
1618 fact
->SetGiveTo(bankAccEur
);
1620 rv
= block
->AppendElement(fact
, PR_FALSE
);
1621 NS_TEST_ASSERT_OK(rv
);
1623 rv
= mSession
->Save(event
, nsnull
);
1624 NS_TEST_ASSERT_OK(rv
);
1626 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
1627 NS_ENSURE_TRUE(txn
, rv
);
1630 rv
= mSession
->Save(txn
, nsnull
);
1631 NS_TEST_ASSERT_OK(rv
);
1633 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
1634 getter_AddRefs(set
));
1635 NS_TEST_ASSERT_OK(rv
);
1636 NS_ENSURE_TRUE(set
, rv
);
1638 NS_TEST_ASSERT_OK(rv
);
1640 set
->GetLength(&count
);
1641 NS_TEST_ASSERT_MSG(count
== 5, "[loss txn] [fact 9] wrong flow count");
1643 balance
= do_QueryElementAt(set
, 0);
1644 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1645 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1646 "[loss txn] [fact 9] flow2 is wrong");
1648 balance
= do_QueryElementAt(set
, 1);
1649 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1650 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1651 "[loss txn] [fact 9] flow1 is wrong");
1653 balance
= do_QueryElementAt(set
, 2);
1654 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1655 AA_EVENT_AMOUNT_4
, 1), "[loss txn] [fact 9] flow4 is wrong");
1657 balance
= do_QueryElementAt(set
, 3);
1658 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
1659 1), "[loss txn] [fact 9] flow3 is wrong");
1661 balance
= do_QueryElementAt(set
, 4);
1662 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
1663 AA_EVENT_AMOUNT_7
, AA_EVENT_AMOUNT_7
* AA_EVENT_RATE_4
, 1),
1664 "[loss txn] [fact 9] flow8 is wrong");
1667 nsCOMPtr
<aaIFlow
> office
= do_CreateInstance("@aasii.org/base/flow;1");
1668 nsCOMPtr
<aaIEntity
> landlord
= do_CreateInstance("@aasii.org/base/entity;1");
1669 nsCOMPtr
<aaIResource
> rent
= do_CreateInstance("@aasii.org/base/resource;1");
1670 /* Create flow for office rent */
1672 NS_ENSURE_TRUE(office
, NS_ERROR_FAILURE
);
1673 NS_ENSURE_TRUE(landlord
, NS_ERROR_FAILURE
);
1674 NS_ENSURE_TRUE(rent
, NS_ERROR_FAILURE
);
1675 landlord
->SetTag(NS_LITERAL_STRING(AA_ENTITY_TAG_6
));
1676 rv
= mSession
->Save(landlord
, nsnull
);
1677 NS_TEST_ASSERT_OK(rv
);
1678 NS_ENSURE_SUCCESS(rv
, rv
);
1680 rent
->SetTag(NS_LITERAL_STRING(AA_RESOURCE_TAG_5
));
1681 rv
= mSession
->Save(rent
, nsnull
);
1682 NS_TEST_ASSERT_OK(rv
);
1683 NS_ENSURE_SUCCESS(rv
, rv
);
1685 office
->SetTag(NS_LITERAL_STRING(AA_FLOW_TAG_11
));
1686 office
->SetEntity(landlord
);
1687 office
->SetGiveResource(rub
);
1688 office
->SetTakeResource(rent
);
1689 office
->SetRate(1 / AA_EVENT_RATE_6
);
1690 office
->SetLimit(12);
1691 rv
= mSession
->Save(office
, nsnull
);
1692 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[loss event] [office] saving flow");
1693 NS_ENSURE_SUCCESS(rv
, rv
);
1695 office
->GetId( &id
);
1696 NS_TEST_ASSERT_MSG(id
== 9, "[loss event] [office] unexpected 'flow.id'");
1697 NS_ENSURE_TRUE(id
== 9, NS_ERROR_UNEXPECTED
);
1700 nsCOMPtr
<aaIFlow
> finres
= do_CreateInstance("@aasii.org/base/income-flow;1");
1701 nsCOMPtr
<aaIState
> state
;
1702 /* Accrue office rent for august */
1704 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
1705 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
1706 /* Set time to 2007-08-31 */
1707 PRExplodedTime tm
= {0,0,0,12,31,7,2007};
1708 event
->SetTime(PR_ImplodeTime(&tm
));
1710 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
1711 NS_ENSURE_TRUE(block
, rv
);
1714 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
1715 NS_ENSURE_TRUE(fact
, rv
);
1717 fact
->SetTakeFrom(office
);
1718 fact
->SetGiveTo(finres
);
1720 rv
= block
->AppendElement(fact
, PR_FALSE
);
1721 NS_TEST_ASSERT_OK(rv
);
1723 rv
= mSession
->Save(event
, nsnull
);
1724 NS_TEST_ASSERT_OK(rv
);
1726 mSession
->CreateQuery(AA_LOADFLOWSTATES_CONTRACT_ID
, getter_AddRefs(set
));
1727 NS_TEST_ASSERT_OK(rv
);
1728 NS_ENSURE_SUCCESS(rv
, rv
);
1731 NS_TEST_ASSERT_OK(rv
);
1733 set
->GetLength(&count
);
1734 NS_TEST_ASSERT_MSG(count
== 6, "[loss event] wrong flow count");
1736 state
= do_QueryElementAt(set
, 3, &rv
);
1737 NS_TEST_ASSERT_MSG(state
, "[loss event] 3nd item not read" );
1738 NS_ENSURE_TRUE(state
, NS_ERROR_FAILURE
);
1740 NS_TEST_ASSERT_MSG(testState(aTestRunner
, state
, 3, 1, mRubs
),
1741 "[loss event] flow3 is wrong");
1743 state
= do_QueryElementAt(set
, 5, &rv
);
1744 NS_TEST_ASSERT_MSG(state
, "[loss event] 5th item not read" );
1745 NS_ENSURE_TRUE(state
, NS_ERROR_FAILURE
);
1747 NS_TEST_ASSERT_MSG(testState(aTestRunner
, state
, 9, 1, AA_EVENT_RATE_6
),
1748 "[loss event] flow7 is wrong");
1751 /* Reflect office rent for august */
1753 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
1754 NS_ENSURE_TRUE(txn
, rv
);
1757 rv
= mSession
->Save(txn
, nsnull
);
1758 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[loss txn] not saved");
1760 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
1761 getter_AddRefs(set
));
1762 NS_TEST_ASSERT_OK(rv
);
1763 NS_ENSURE_TRUE(set
, rv
);
1765 NS_TEST_ASSERT_OK(rv
);
1767 set
->GetLength(&count
);
1768 NS_TEST_ASSERT_MSG(count
== 6, "[loss txn] wrong flow count");
1770 balance
= do_QueryElementAt(set
, 0);
1771 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1772 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1773 "[loss txn] flow2 is wrong");
1775 balance
= do_QueryElementAt(set
, 1);
1776 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1777 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1778 "[loss txn] flow1 is wrong");
1780 balance
= do_QueryElementAt(set
, 2);
1781 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1782 AA_EVENT_AMOUNT_4
, 1), "[loss txn] flow4 is wrong");
1784 balance
= do_QueryElementAt(set
, 3);
1785 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
1786 1), "[loss txn] flow3 is wrong");
1788 balance
= do_QueryElementAt(set
, 4);
1789 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
1790 AA_EVENT_AMOUNT_7
, AA_EVENT_AMOUNT_7
* AA_EVENT_RATE_4
, 1),
1791 "[loss txn] flow8 is wrong");
1793 balance
= do_QueryElementAt(set
, 5);
1794 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 1,
1795 AA_EVENT_RATE_6
, AA_EVENT_RATE_6
, 0),
1796 "[loss txn] flow9 is wrong");
1798 nsCOMPtr
<aaILoadQuery
> incomeSet
;
1799 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
1800 getter_AddRefs( incomeSet
));
1801 NS_TEST_ASSERT_MSG(incomeSet
, "[loss txn] income set not created" );
1802 NS_ENSURE_TRUE(incomeSet
, rv
);
1803 rv
= incomeSet
->Load();
1804 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[loss txn] income set not loaded" );
1807 incomeSet
->GetLength(&count
);
1808 NS_TEST_ASSERT_MSG(count
== 1, "[loss txn] wrong income count");
1810 balance
= do_QueryElementAt(incomeSet
, 0);
1811 NS_TEST_ASSERT_MSG(balance
, "[loss txn] income not loaded" );
1812 if (NS_LIKELY(balance
)) {
1813 mProfit
-= AA_EVENT_RATE_6
;
1814 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() + mProfit
),
1815 "[loss txn] wrong income saved");
1823 aaAccountTest::testSplitTransaction(nsITestRunner
*aTestRunner
)
1826 NS_TEST_BEGIN(aTestRunner
);
1827 nsCOMPtr
<aaIEntity
> bank
= do_QueryElementAt(mEntities
, 3, &rv
);
1828 NS_ENSURE_TRUE(bank
, rv
);
1830 nsCOMPtr
<aaIResource
> rub(do_QueryElementAt(mResources
, 0, &rv
));
1831 nsCOMPtr
<aaIResource
> eur(do_QueryElementAt(mResources
, 3, &rv
));
1833 nsCOMPtr
<aaIFlow
> bankAccRub(do_QueryElementAt(mFlows
,2));
1834 nsCOMPtr
<aaIFlow
> bankAccEur(do_QueryElementAt(mFlows
,5));
1836 nsCOMPtr
<aaIFlow
> forex
;
1837 nsCOMPtr
<aaIFact
> fact(do_CreateInstance("@aasii.org/base/fact;1", &rv
));
1838 nsCOMPtr
<aaIEvent
> event(do_CreateInstance("@aasii.org/base/event;1"));
1839 nsCOMPtr
<aaITransaction
> txn(do_CreateInstance(
1840 "@aasii.org/base/transaction;1", &rv
));
1844 nsCOMPtr
<aaILoadQuery
> set
;
1845 nsCOMPtr
<aaIBalance
> balance
;
1846 /* Create flow for forex deal #4 */
1848 forex
= do_CreateInstance("@aasii.org/base/flow;1");
1849 NS_ENSURE_TRUE(forex
, NS_ERROR_FAILURE
);
1850 forex
->SetTag(NS_LITERAL_STRING(AA_FLOW_TAG_12
));
1851 forex
->SetEntity(bank
);
1852 forex
->SetGiveResource(eur
);
1853 forex
->SetTakeResource(rub
);
1854 forex
->SetRate(AA_EVENT_RATE_5
);
1855 forex
->SetLimit(AA_EVENT_AMOUNT_8
);
1856 rv
= mSession
->Save(forex
, nsnull
);
1857 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[split event] [deal 4] saving flow");
1858 NS_ENSURE_SUCCESS(rv
, rv
);
1860 forex
->GetId( &id
);
1861 NS_TEST_ASSERT_MSG(id
== 10, "[split event] [deal 4] unexpected 'flow.id'");
1862 NS_ENSURE_TRUE(id
== 10, NS_ERROR_UNEXPECTED
);
1865 nsCOMPtr
<aaIState
> state
;
1866 /* Partially pay forex deal #4 */
1868 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
1869 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
1870 /* Set time to 2007-09-05 */
1871 PRExplodedTime tm
= {0,0,0,12,5,8,2007};
1872 event
->SetTime(PR_ImplodeTime(&tm
));
1874 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
1875 NS_ENSURE_TRUE(block
, rv
);
1878 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
1879 NS_ENSURE_TRUE(fact
, rv
);
1880 fact
->SetAmount(AA_EVENT_AMOUNT_9
);
1881 fact
->SetTakeFrom(bankAccEur
);
1882 fact
->SetGiveTo(forex
);
1884 rv
= block
->AppendElement(fact
, PR_FALSE
);
1885 NS_TEST_ASSERT_OK(rv
);
1887 rv
= mSession
->Save(event
, nsnull
);
1888 NS_TEST_ASSERT_OK(rv
);
1890 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
1891 NS_ENSURE_TRUE(txn
, rv
);
1894 rv
= mSession
->Save(txn
, nsnull
);
1895 NS_TEST_ASSERT_OK(rv
);
1897 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
1898 getter_AddRefs(set
));
1899 NS_TEST_ASSERT_OK(rv
);
1900 NS_ENSURE_TRUE(set
, rv
);
1902 NS_TEST_ASSERT_OK(rv
);
1904 set
->GetLength(&count
);
1905 NS_TEST_ASSERT_MSG(count
== 7, "[split txn] [fact 11] wrong flow count");
1907 balance
= do_QueryElementAt(set
, 0);
1908 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
1909 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
1910 "[split txn] [fact 11] flow2 is wrong");
1912 balance
= do_QueryElementAt(set
, 1);
1913 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
1914 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
1915 "[split txn] [fact 11] flow1 is wrong");
1917 balance
= do_QueryElementAt(set
, 2);
1918 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
1919 AA_EVENT_AMOUNT_4
, 1), "[split txn] [fact 11] flow4 is wrong");
1921 balance
= do_QueryElementAt(set
, 3);
1922 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
1923 1), "[split txn] [fact 11] flow3 is wrong");
1925 balance
= do_QueryElementAt(set
, 4);
1926 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 1,
1927 AA_EVENT_RATE_6
, AA_EVENT_RATE_6
, 0),
1928 "[loss txn] flow9 is wrong");
1930 mEuros
= AA_EVENT_AMOUNT_7
- AA_EVENT_AMOUNT_9
;
1931 balance
= do_QueryElementAt(set
, 5);
1932 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
1933 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
1934 "[split txn] [fact 11] flow6 is wrong");
1936 balance
= do_QueryElementAt(set
, 6);
1937 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 10, 1,
1938 AA_EVENT_AMOUNT_9
* AA_EVENT_RATE_5
,
1939 AA_EVENT_AMOUNT_9
* AA_EVENT_RATE_5
, 1),
1940 "[split txn] [fact 11] flow10 is wrong");
1942 nsCOMPtr
<aaILoadQuery
> incomeSet
;
1943 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
1944 getter_AddRefs( incomeSet
));
1945 NS_TEST_ASSERT_MSG(incomeSet
, "[split txn] income set not created" );
1946 NS_ENSURE_TRUE(incomeSet
, rv
);
1947 rv
= incomeSet
->Load();
1948 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[split txn] income set not loaded" );
1951 incomeSet
->GetLength(&count
);
1952 NS_TEST_ASSERT_MSG(count
== 1, "[split txn] wrong income count");
1954 balance
= do_QueryElementAt(incomeSet
, 0);
1955 NS_TEST_ASSERT_MSG(balance
, "[split txn] income not loaded" );
1956 if (NS_LIKELY(balance
)) {
1957 mProfit
+= (AA_EVENT_RATE_5
- AA_EVENT_RATE_4
) * AA_EVENT_AMOUNT_9
;
1958 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() + mProfit
),
1959 "[split txn] wrong income saved");
1963 /* Partially receive from forex deal #4 */
1965 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
1966 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
1967 /* Set time to 2007-09-05 */
1968 PRExplodedTime tm
= {0,0,0,12,5,8,2007};
1969 event
->SetTime(PR_ImplodeTime(&tm
));
1971 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
1972 NS_ENSURE_TRUE(block
, rv
);
1975 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
1976 NS_ENSURE_TRUE(fact
, rv
);
1977 fact
->SetAmount(AA_EVENT_AMOUNT_10
* AA_EVENT_RATE_5
);
1978 fact
->SetTakeFrom(forex
);
1979 fact
->SetGiveTo(bankAccRub
);
1981 rv
= block
->AppendElement(fact
, PR_FALSE
);
1982 NS_TEST_ASSERT_OK(rv
);
1984 rv
= mSession
->Save(event
, nsnull
);
1985 NS_TEST_ASSERT_OK(rv
);
1987 mSession
->CreateQuery(AA_LOADFLOWSTATES_CONTRACT_ID
, getter_AddRefs(set
));
1988 NS_TEST_ASSERT_OK(rv
);
1989 NS_ENSURE_SUCCESS(rv
, rv
);
1992 NS_TEST_ASSERT_OK(rv
);
1994 set
->GetLength(&count
);
1995 NS_TEST_ASSERT_MSG(count
== 7, "[split event] wrong flow count");
1997 state
= do_QueryElementAt(set
, 5, &rv
);
1998 NS_TEST_ASSERT_MSG(state
, "[split event] 5th item not read" );
1999 NS_ENSURE_TRUE(state
, NS_ERROR_FAILURE
);
2001 NS_TEST_ASSERT_MSG(testState(aTestRunner
, state
, 10, 4,
2002 AA_EVENT_AMOUNT_10
- AA_EVENT_AMOUNT_9
),
2003 "[split event] flow7 is wrong");
2006 /* Reflect partial revenue from forex deal #4 */
2008 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2009 NS_ENSURE_TRUE(txn
, rv
);
2012 rv
= mSession
->Save(txn
, nsnull
);
2013 NS_TEST_ASSERT_OK(rv
);
2015 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2016 getter_AddRefs(set
));
2017 NS_TEST_ASSERT_OK(rv
);
2018 NS_ENSURE_TRUE(set
, rv
);
2020 NS_TEST_ASSERT_OK(rv
);
2022 set
->GetLength(&count
);
2023 NS_TEST_ASSERT_MSG(count
== 7, "[split txn] [fact 11] wrong flow count");
2025 balance
= do_QueryElementAt(set
, 0);
2026 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2027 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2028 "[split txn] [fact 11] flow2 is wrong");
2030 balance
= do_QueryElementAt(set
, 1);
2031 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2032 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2033 "[split txn] [fact 11] flow1 is wrong");
2035 balance
= do_QueryElementAt(set
, 2);
2036 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2037 AA_EVENT_AMOUNT_4
, 1), "[split txn] [fact 11] flow4 is wrong");
2039 balance
= do_QueryElementAt(set
, 3);
2040 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 1,
2041 AA_EVENT_RATE_6
, AA_EVENT_RATE_6
, 0),
2042 "[split txn] flow9 is wrong");
2044 balance
= do_QueryElementAt(set
, 4);
2045 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2046 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2047 "[split txn] [fact 11] flow6 is wrong");
2049 balance
= do_QueryElementAt(set
, 5);
2050 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 10, 4,
2051 (AA_EVENT_AMOUNT_10
- AA_EVENT_AMOUNT_9
),
2052 (AA_EVENT_AMOUNT_10
- AA_EVENT_AMOUNT_9
) * AA_EVENT_RATE_5
, 0),
2053 "[split txn] [fact 11] flow10 is wrong");
2055 mRubs
+= AA_EVENT_AMOUNT_10
* AA_EVENT_RATE_5
;
2056 balance
= do_QueryElementAt(set
, 6);
2057 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2058 1), "[split txn] [fact 11] flow3 is wrong");
2060 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2061 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2062 getter_AddRefs( incomeSet
));
2063 NS_TEST_ASSERT_MSG(incomeSet
, "[split txn] income set not created" );
2064 NS_ENSURE_TRUE(incomeSet
, rv
);
2065 rv
= incomeSet
->Load();
2066 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[split txn] income set not loaded" );
2069 incomeSet
->GetLength(&count
);
2070 NS_TEST_ASSERT_MSG(count
== 1, "[split txn] wrong income count");
2072 balance
= do_QueryElementAt(incomeSet
, 0);
2073 NS_TEST_ASSERT_MSG(balance
, "[split txn] income not loaded" );
2074 if (NS_LIKELY(balance
)) {
2075 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() + mProfit
),
2076 "[split txn] wrong income saved");
2080 /* Fully pay forex deal #4 */
2082 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2083 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2084 /* Set time to 2007-09-05 */
2085 PRExplodedTime tm
= {0,0,0,12,5,8,2007};
2086 event
->SetTime(PR_ImplodeTime(&tm
));
2088 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2089 NS_ENSURE_TRUE(block
, rv
);
2092 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2093 NS_ENSURE_TRUE(fact
, rv
);
2094 fact
->SetAmount(AA_EVENT_AMOUNT_11
);
2095 fact
->SetTakeFrom(bankAccEur
);
2096 fact
->SetGiveTo(forex
);
2098 rv
= block
->AppendElement(fact
, PR_FALSE
);
2099 NS_TEST_ASSERT_OK(rv
);
2101 rv
= mSession
->Save(event
, nsnull
);
2102 NS_TEST_ASSERT_OK(rv
);
2104 mSession
->CreateQuery(AA_LOADFLOWSTATES_CONTRACT_ID
, getter_AddRefs(set
));
2105 NS_TEST_ASSERT_OK(rv
);
2106 NS_ENSURE_SUCCESS(rv
, rv
);
2109 NS_TEST_ASSERT_OK(rv
);
2111 set
->GetLength(&count
);
2112 NS_TEST_ASSERT_MSG(count
== 7, "[split event] wrong flow count");
2114 state
= do_QueryElementAt(set
, 5, &rv
);
2115 NS_TEST_ASSERT_MSG(state
, "[split event] 5th item not read" );
2116 NS_ENSURE_TRUE(state
, NS_ERROR_FAILURE
);
2118 NS_TEST_ASSERT_MSG(testState(aTestRunner
, state
, 10, 1,
2119 AA_EVENT_AMOUNT_12
* AA_EVENT_RATE_5
),
2120 "[split event] flow7 is wrong");
2123 /* Reflect full payment of deal #4 */
2125 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2126 NS_ENSURE_TRUE(txn
, rv
);
2129 rv
= mSession
->Save(txn
, nsnull
);
2130 NS_TEST_ASSERT_OK(rv
);
2132 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2133 getter_AddRefs(set
));
2134 NS_TEST_ASSERT_OK(rv
);
2135 NS_ENSURE_TRUE(set
, rv
);
2137 NS_TEST_ASSERT_OK(rv
);
2139 set
->GetLength(&count
);
2140 NS_TEST_ASSERT_MSG(count
== 7, "[split txn] [fact 13] wrong flow count");
2142 balance
= do_QueryElementAt(set
, 0);
2143 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2144 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2145 "[split txn] [fact 13] flow2 is wrong");
2147 balance
= do_QueryElementAt(set
, 1);
2148 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2149 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2150 "[split txn] [fact 13] flow1 is wrong");
2152 balance
= do_QueryElementAt(set
, 2);
2153 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2154 AA_EVENT_AMOUNT_4
, 1), "[split txn] [fact 13] flow4 is wrong");
2156 balance
= do_QueryElementAt(set
, 3);
2157 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 1,
2158 AA_EVENT_RATE_6
, AA_EVENT_RATE_6
, 0),
2159 "[split txn] flow9 is wrong");
2161 mEuros
-= AA_EVENT_AMOUNT_11
;
2162 balance
= do_QueryElementAt(set
, 4);
2163 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2164 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2165 "[split txn] [fact 13] flow6 is wrong");
2167 balance
= do_QueryElementAt(set
, 5);
2168 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 10, 1,
2169 AA_EVENT_AMOUNT_12
* AA_EVENT_RATE_5
,
2170 AA_EVENT_AMOUNT_12
* AA_EVENT_RATE_5
, 1),
2171 "[split txn] [fact 13] flow10 is wrong");
2172 NS_TEST_ASSERT_MSG(balance
&& balance
->PickAmount() == 3495.0,
2173 "[split txn] [fact 13] inprecise calculation");
2175 balance
= do_QueryElementAt(set
, 6);
2176 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2177 1), "[split txn] [fact 13] flow3 is wrong");
2179 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2180 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2181 getter_AddRefs( incomeSet
));
2182 NS_TEST_ASSERT_MSG(incomeSet
, "[split txn] income set not created" );
2183 NS_ENSURE_TRUE(incomeSet
, rv
);
2184 rv
= incomeSet
->Load();
2185 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[split txn] income set not loaded" );
2188 incomeSet
->GetLength(&count
);
2189 NS_TEST_ASSERT_MSG(count
== 0, "[split txn] wrong income count");
2190 mProfit
+= (AA_EVENT_RATE_5
- AA_EVENT_RATE_4
) * AA_EVENT_AMOUNT_11
;
2198 aaAccountTest::testGainTransaction(nsITestRunner
*aTestRunner
)
2201 NS_TEST_BEGIN(aTestRunner
);
2202 nsCOMPtr
<aaIEntity
> bank
= do_QueryElementAt(mEntities
, 3, &rv
);
2203 NS_ENSURE_TRUE(bank
, rv
);
2205 nsCOMPtr
<aaIResource
> rub(do_QueryElementAt(mResources
, 0, &rv
));
2206 nsCOMPtr
<aaIResource
> eur(do_QueryElementAt(mResources
, 3, &rv
));
2209 nsCOMPtr
<aaIFlow
> bankAccRub(do_QueryElementAt(mFlows
,2));
2210 nsCOMPtr
<aaIFlow
> bankAccEur(do_QueryElementAt(mFlows
,5));
2211 nsCOMPtr
<aaIFlow
> forex(do_QueryElementAt(mFlows
,9));
2212 nsCOMPtr
<aaIFlow
> office(do_QueryElementAt(mFlows
,8));
2214 nsCOMPtr
<aaIFact
> fact(do_CreateInstance("@aasii.org/base/fact;1", &rv
));
2215 nsCOMPtr
<aaIEvent
> event(do_CreateInstance("@aasii.org/base/event;1"));
2216 nsCOMPtr
<aaITransaction
> txn(do_CreateInstance(
2217 "@aasii.org/base/transaction;1", &rv
));
2220 nsCOMPtr
<aaILoadQuery
> set
;
2221 nsCOMPtr
<aaIBalance
> balance
;
2223 /* Recieve settlement from forex deal #4 */
2225 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2226 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2227 /* Set time to 2007-09-05 */
2228 PRExplodedTime tm
= {0,0,0,12,5,8,2007};
2229 event
->SetTime(PR_ImplodeTime(&tm
));
2231 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2232 NS_ENSURE_TRUE(block
, rv
);
2235 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2236 NS_ENSURE_TRUE(fact
, rv
);
2237 fact
->SetAmount(AA_EVENT_AMOUNT_12
* AA_EVENT_RATE_5
);
2238 fact
->SetTakeFrom(forex
);
2239 fact
->SetGiveTo(bankAccRub
);
2241 rv
= block
->AppendElement(fact
, PR_FALSE
);
2242 NS_TEST_ASSERT_OK(rv
);
2244 rv
= mSession
->Save(event
, nsnull
);
2245 NS_TEST_ASSERT_OK(rv
);
2247 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2248 NS_ENSURE_TRUE(txn
, rv
);
2251 rv
= mSession
->Save(txn
, nsnull
);
2252 NS_TEST_ASSERT_OK(rv
);
2254 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2255 getter_AddRefs(set
));
2256 NS_TEST_ASSERT_OK(rv
);
2257 NS_ENSURE_TRUE(set
, rv
);
2259 NS_TEST_ASSERT_OK(rv
);
2261 set
->GetLength(&count
);
2262 NS_TEST_ASSERT_MSG(count
== 6, "[gain txn] [fact 14] wrong flow count");
2264 balance
= do_QueryElementAt(set
, 0);
2265 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2266 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2267 "[gain txn] [fact 14] flow2 is wrong");
2269 balance
= do_QueryElementAt(set
, 1);
2270 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2271 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2272 "[gain txn] [fact 14] flow1 is wrong");
2274 balance
= do_QueryElementAt(set
, 2);
2275 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2276 AA_EVENT_AMOUNT_4
, 1), "[gain txn] [fact 14] flow4 is wrong");
2278 balance
= do_QueryElementAt(set
, 3);
2279 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 1,
2280 AA_EVENT_RATE_6
, AA_EVENT_RATE_6
, 0),
2281 "[gain txn] flow9 is wrong");
2283 balance
= do_QueryElementAt(set
, 4);
2284 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2285 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2286 "[gain txn] [fact 14] flow6 is wrong");
2288 mRubs
+= AA_EVENT_AMOUNT_12
* AA_EVENT_RATE_5
;
2289 balance
= do_QueryElementAt(set
, 5);
2290 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2291 1), "[gain txn] [fact 14] flow3 is wrong");
2294 nsCOMPtr
<aaIState
> state
;
2295 /* Settle office rent for Aug and prepay for Sep*/
2297 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2298 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2299 /* Set time to 2007-09-05 */
2300 PRExplodedTime tm
= {0,0,0,12,5,8,2007};
2301 event
->SetTime(PR_ImplodeTime(&tm
));
2303 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2304 NS_ENSURE_TRUE(block
, rv
);
2307 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2308 NS_ENSURE_TRUE(fact
, rv
);
2309 fact
->SetAmount(2 * AA_EVENT_RATE_6
);
2310 fact
->SetTakeFrom(bankAccRub
);
2311 fact
->SetGiveTo(office
);
2313 rv
= block
->AppendElement(fact
, PR_FALSE
);
2314 NS_TEST_ASSERT_OK(rv
);
2316 rv
= mSession
->Save(event
, nsnull
);
2317 NS_TEST_ASSERT_OK(rv
);
2319 mSession
->CreateQuery(AA_LOADFLOWSTATES_CONTRACT_ID
, getter_AddRefs(set
));
2320 NS_TEST_ASSERT_OK(rv
);
2321 NS_ENSURE_SUCCESS(rv
, rv
);
2324 NS_TEST_ASSERT_OK(rv
);
2326 set
->GetLength(&count
);
2327 NS_TEST_ASSERT_MSG(count
== 6, "[gain event] wrong flow count");
2329 state
= do_QueryElementAt(set
, 5, &rv
);
2330 NS_TEST_ASSERT_MSG(state
, "[gain event] 5th item not read" );
2331 NS_ENSURE_TRUE(state
, NS_ERROR_FAILURE
);
2333 NS_TEST_ASSERT_MSG(testState(aTestRunner
, state
, 9, 5, 1),
2334 "[gain event] flow7 is wrong");
2337 /* Reflect payment for office */
2339 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2340 NS_ENSURE_TRUE(txn
, rv
);
2343 rv
= mSession
->Save(txn
, nsnull
);
2344 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[gain txn] not saved");
2346 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2347 getter_AddRefs(set
));
2348 NS_TEST_ASSERT_OK(rv
);
2349 NS_ENSURE_TRUE(set
, rv
);
2351 NS_TEST_ASSERT_OK(rv
);
2353 set
->GetLength(&count
);
2354 NS_TEST_ASSERT_MSG(count
== 6, "[gain txn] [fact 15] wrong flow count");
2356 balance
= do_QueryElementAt(set
, 0);
2357 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2358 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2359 "[gain txn] [fact 15] flow2 is wrong");
2361 balance
= do_QueryElementAt(set
, 1);
2362 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2363 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2364 "[gain txn] [fact 15] flow1 is wrong");
2366 balance
= do_QueryElementAt(set
, 2);
2367 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2368 AA_EVENT_AMOUNT_4
, 1), "[gain txn] [fact 15] flow4 is wrong");
2370 balance
= do_QueryElementAt(set
, 3);
2371 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2372 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2373 "[gain txn] [fact 15] flow6 is wrong");
2375 mRubs
-= 2 * AA_EVENT_RATE_6
;
2376 balance
= do_QueryElementAt(set
, 4);
2377 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2378 1), "[gain txn] [fact 15] flow3 is wrong");
2380 balance
= do_QueryElementAt(set
, 5);
2381 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 5,
2382 1, AA_EVENT_RATE_6
, 1),
2383 "[gain txn] flow9 is wrong");
2385 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2386 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2387 getter_AddRefs( incomeSet
));
2388 NS_TEST_ASSERT_MSG(incomeSet
, "[gain txn] income set not created" );
2389 NS_ENSURE_TRUE(incomeSet
, rv
);
2390 rv
= incomeSet
->Load();
2391 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[gain txn] income set not loaded" );
2394 incomeSet
->GetLength(&count
);
2395 NS_TEST_ASSERT_MSG(count
== 0, "[gain txn] wrong income count");
2398 nsCOMPtr
<aaIFlow
> finres
= do_CreateInstance("@aasii.org/base/income-flow;1");
2399 /* Direct monetary loss */
2401 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2402 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2403 /* Set time to 2007-09-06 */
2404 PRExplodedTime tm
= {0,0,0,12,6,8,2007};
2405 event
->SetTime(PR_ImplodeTime(&tm
));
2407 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2408 NS_ENSURE_TRUE(block
, rv
);
2411 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2412 NS_ENSURE_TRUE(fact
, rv
);
2413 fact
->SetAmount(AA_EVENT_AMOUNT_13
);
2414 fact
->SetTakeFrom(bankAccRub
);
2415 fact
->SetGiveTo(finres
);
2417 rv
= block
->AppendElement(fact
, PR_FALSE
);
2418 NS_TEST_ASSERT_OK(rv
);
2420 rv
= mSession
->Save(event
, nsnull
);
2421 NS_TEST_ASSERT_OK(rv
);
2423 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2424 NS_ENSURE_TRUE(txn
, rv
);
2427 rv
= mSession
->Save(txn
, nsnull
);
2428 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[gain txn] not saved");
2430 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2431 getter_AddRefs(set
));
2432 NS_TEST_ASSERT_OK(rv
);
2433 NS_ENSURE_TRUE(set
, rv
);
2435 NS_TEST_ASSERT_OK(rv
);
2437 set
->GetLength(&count
);
2438 NS_TEST_ASSERT_MSG(count
== 6, "[gain txn] wrong flow count");
2440 balance
= do_QueryElementAt(set
, 0);
2441 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2442 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2443 "[gain txn] flow2 is wrong");
2445 balance
= do_QueryElementAt(set
, 1);
2446 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2447 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2448 "[gain txn] flow1 is wrong");
2450 balance
= do_QueryElementAt(set
, 2);
2451 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2452 AA_EVENT_AMOUNT_4
, 1), "[gain txn] flow4 is wrong");
2454 balance
= do_QueryElementAt(set
, 3);
2455 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2456 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2457 "[gain txn] flow6 is wrong");
2459 balance
= do_QueryElementAt(set
, 4);
2460 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 5,
2461 1, AA_EVENT_RATE_6
, 1),
2462 "[gain txn] flow9 is wrong");
2464 mRubs
-= AA_EVENT_AMOUNT_13
;
2465 balance
= do_QueryElementAt(set
, 5);
2466 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2467 1), "[gain txn] flow3 is wrong");
2469 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2470 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2471 getter_AddRefs( incomeSet
));
2472 NS_TEST_ASSERT_MSG(incomeSet
, "[gain txn] income set not created" );
2473 NS_ENSURE_TRUE(incomeSet
, rv
);
2474 rv
= incomeSet
->Load();
2475 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[gain txn] income set not loaded" );
2478 incomeSet
->GetLength(&count
);
2479 NS_TEST_ASSERT_MSG(count
== 1, "[gain txn] wrong income count");
2481 balance
= do_QueryElementAt(incomeSet
, 0);
2482 NS_TEST_ASSERT_MSG(balance
, "[gain txn] income not loaded" );
2483 if (NS_LIKELY(balance
)) {
2484 mProfit
-= AA_EVENT_AMOUNT_13
;
2485 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() + mProfit
),
2486 "[gain txn] wrong income saved");
2490 /* Direct monetary gain */
2492 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2493 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2494 /* Set time to 2007-09-07 */
2495 PRExplodedTime tm
= {0,0,0,12,7,8,2007};
2496 event
->SetTime(PR_ImplodeTime(&tm
));
2498 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2499 NS_ENSURE_TRUE(block
, rv
);
2502 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2503 NS_ENSURE_TRUE(fact
, rv
);
2504 fact
->SetAmount(AA_EVENT_AMOUNT_14
);
2505 fact
->SetTakeFrom(finres
);
2506 fact
->SetGiveTo(bankAccRub
);
2508 rv
= block
->AppendElement(fact
, PR_FALSE
);
2509 NS_TEST_ASSERT_OK(rv
);
2511 rv
= mSession
->Save(event
, nsnull
);
2512 NS_TEST_ASSERT_OK(rv
);
2514 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2515 NS_ENSURE_TRUE(txn
, rv
);
2518 rv
= mSession
->Save(txn
, nsnull
);
2519 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[gain txn] not saved");
2521 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2522 getter_AddRefs(set
));
2523 NS_TEST_ASSERT_OK(rv
);
2524 NS_ENSURE_TRUE(set
, rv
);
2526 NS_TEST_ASSERT_OK(rv
);
2528 set
->GetLength(&count
);
2529 NS_TEST_ASSERT_MSG(count
== 6, "[gain txn] wrong flow count");
2531 balance
= do_QueryElementAt(set
, 0);
2532 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2533 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2534 "[gain txn] flow2 is wrong");
2536 balance
= do_QueryElementAt(set
, 1);
2537 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2538 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2539 "[gain txn] flow1 is wrong");
2541 balance
= do_QueryElementAt(set
, 2);
2542 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2543 AA_EVENT_AMOUNT_4
, 1), "[gain txn] flow4 is wrong");
2545 balance
= do_QueryElementAt(set
, 3);
2546 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2547 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2548 "[gain txn] flow6 is wrong");
2550 balance
= do_QueryElementAt(set
, 4);
2551 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 5,
2552 1, AA_EVENT_RATE_6
, 1),
2553 "[gain txn] flow9 is wrong");
2555 mRubs
+= AA_EVENT_AMOUNT_14
;
2556 balance
= do_QueryElementAt(set
, 5);
2557 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2558 1), "[gain txn] flow3 is wrong");
2560 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2561 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2562 getter_AddRefs( incomeSet
));
2563 NS_TEST_ASSERT_MSG(incomeSet
, "[gain txn] income set not created" );
2564 NS_ENSURE_TRUE(incomeSet
, rv
);
2565 rv
= incomeSet
->Load();
2566 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[gain txn] income set not loaded" );
2569 incomeSet
->GetLength(&count
);
2570 NS_TEST_ASSERT_MSG(count
== 0, "[gain txn] wrong income count");
2577 aaAccountTest::testDirectGainsLosses(nsITestRunner
*aTestRunner
)
2580 NS_TEST_BEGIN(aTestRunner
);
2582 nsCOMPtr
<aaIResource
> rub(do_QueryElementAt(mResources
, 0, &rv
));
2583 nsCOMPtr
<aaIResource
> eur(do_QueryElementAt(mResources
, 3, &rv
));
2585 nsCOMPtr
<aaIFlow
> bankAccRub(do_QueryElementAt(mFlows
,2));
2586 nsCOMPtr
<aaIFlow
> bankAccEur(do_QueryElementAt(mFlows
,5));
2587 nsCOMPtr
<aaIFlow
> forex(do_QueryElementAt(mFlows
,9));
2589 nsCOMPtr
<aaIFact
> fact(do_CreateInstance("@aasii.org/base/fact;1", &rv
));
2590 nsCOMPtr
<aaIEvent
> event(do_CreateInstance("@aasii.org/base/event;1"));
2591 nsCOMPtr
<aaITransaction
> txn(do_CreateInstance(
2592 "@aasii.org/base/transaction;1", &rv
));
2593 NS_ENSURE_TRUE(txn
, rv
);
2596 nsCOMPtr
<aaILoadQuery
> set
;
2597 nsCOMPtr
<aaIBalance
> balance
;
2599 /* Receive prepayment from forex deal #4 */
2601 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2602 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2603 /* Set time to 2007-09-10 */
2604 PRExplodedTime tm
= {0,0,0,12,10,8,2007};
2605 event
->SetTime(PR_ImplodeTime(&tm
));
2607 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2608 NS_ENSURE_TRUE(block
, rv
);
2611 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2612 NS_ENSURE_TRUE(fact
, rv
);
2613 fact
->SetAmount(AA_EVENT_AMOUNT_15
* AA_EVENT_RATE_5
);
2614 fact
->SetTakeFrom(forex
);
2615 fact
->SetGiveTo(bankAccRub
);
2617 rv
= block
->AppendElement(fact
, PR_FALSE
);
2618 NS_TEST_ASSERT_OK(rv
);
2620 rv
= mSession
->Save(event
, nsnull
);
2621 NS_TEST_ASSERT_OK(rv
);
2623 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2624 NS_ENSURE_TRUE(txn
, rv
);
2627 rv
= mSession
->Save(txn
, nsnull
);
2628 NS_TEST_ASSERT_OK(rv
);
2630 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2631 getter_AddRefs(set
));
2632 NS_TEST_ASSERT_OK(rv
);
2633 NS_ENSURE_TRUE(set
, rv
);
2635 NS_TEST_ASSERT_OK(rv
);
2637 set
->GetLength(&count
);
2638 NS_TEST_ASSERT_MSG(count
== 7, "[gain txn] [fact 18] wrong flow count");
2640 balance
= do_QueryElementAt(set
, 0);
2641 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2, AA_EVENT_AMOUNT_2
2642 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2643 "[gain txn] [fact 18] flow2 is wrong");
2645 balance
= do_QueryElementAt(set
, 1);
2646 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2, AA_EVENT_AMOUNT_3
2647 / AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2648 "[gain txn] [fact 18] flow1 is wrong");
2650 balance
= do_QueryElementAt(set
, 2);
2651 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3, AA_EVENT_AMOUNT_5
,
2652 AA_EVENT_AMOUNT_4
, 1), "[gain txn] [fact 18] flow4 is wrong");
2654 balance
= do_QueryElementAt(set
, 3);
2655 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2656 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2657 "[gain txn] [fact 18] flow6 is wrong");
2659 balance
= do_QueryElementAt(set
, 4);
2660 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 5,
2661 1, AA_EVENT_RATE_6
, 1),
2662 "[gain txn] [fact 18] flow9 is wrong");
2664 balance
= do_QueryElementAt(set
, 5);
2665 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 10, 4,
2666 AA_EVENT_AMOUNT_15
, AA_EVENT_AMOUNT_15
* AA_EVENT_RATE_5
, 0),
2667 "[split txn] [fact 18] flow10 is wrong");
2669 mRubs
+= AA_EVENT_AMOUNT_15
* AA_EVENT_RATE_5
;
2670 balance
= do_QueryElementAt(set
, 6);
2671 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2672 1), "[gain txn] [fact 18] flow3 is wrong");
2675 nsCOMPtr
<aaIFlow
> finres
= do_CreateInstance("@aasii.org/base/income-flow;1");
2676 /* Direct write-off - loss */
2678 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2679 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2680 /* Set time to 2007-09-10 */
2681 PRExplodedTime tm
= {0,0,0,12,10,8,2007};
2682 event
->SetTime(PR_ImplodeTime(&tm
));
2684 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2685 NS_ENSURE_TRUE(block
, rv
);
2688 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2689 NS_ENSURE_TRUE(fact
, rv
);
2690 fact
->SetAmount(AA_EVENT_AMOUNT_15
);
2691 fact
->SetTakeFrom(bankAccEur
);
2692 fact
->SetGiveTo(finres
);
2694 rv
= block
->AppendElement(fact
, PR_FALSE
);
2695 NS_TEST_ASSERT_OK(rv
);
2697 rv
= mSession
->Save(event
, nsnull
);
2698 NS_TEST_ASSERT_OK(rv
);
2700 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2701 NS_ENSURE_TRUE(txn
, rv
);
2704 rv
= mSession
->Save(txn
, nsnull
);
2705 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[write-off txn] not saved");
2707 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2708 getter_AddRefs(set
));
2709 NS_TEST_ASSERT_OK(rv
);
2710 NS_ENSURE_TRUE(set
, rv
);
2712 NS_TEST_ASSERT_OK(rv
);
2714 set
->GetLength(&count
);
2715 NS_TEST_ASSERT_MSG(count
== 7, "[write-off txn] wrong flow count");
2717 balance
= do_QueryElementAt(set
, 0);
2718 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2,
2719 AA_EVENT_AMOUNT_2
/ AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2720 "[write-off txn] flow2 is wrong");
2722 balance
= do_QueryElementAt(set
, 1);
2723 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2,
2724 AA_EVENT_AMOUNT_3
/ AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2725 "[write-off txn] flow1 is wrong");
2727 balance
= do_QueryElementAt(set
, 2);
2728 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3,
2729 AA_EVENT_AMOUNT_5
, AA_EVENT_AMOUNT_4
, 1),
2730 "[write-off txn] flow4 is wrong");
2732 balance
= do_QueryElementAt(set
, 3);
2733 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 5,
2734 1, AA_EVENT_RATE_6
, 1),
2735 "[write-off txn] flow9 is wrong");
2737 balance
= do_QueryElementAt(set
, 4);
2738 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 10, 4,
2739 AA_EVENT_AMOUNT_15
, AA_EVENT_AMOUNT_15
* AA_EVENT_RATE_5
, 0),
2740 "[split txn] [fact 18] flow10 is wrong");
2742 balance
= do_QueryElementAt(set
, 5);
2743 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2744 1), "[write-off txn] flow3 is wrong");
2746 mEuros
-= AA_EVENT_AMOUNT_15
;
2747 balance
= do_QueryElementAt(set
, 6);
2748 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2749 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2750 "[write-off txn] flow6 is wrong");
2752 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2753 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2754 getter_AddRefs( incomeSet
));
2755 NS_TEST_ASSERT_MSG(incomeSet
, "[write-off txn] income set not created" );
2756 NS_ENSURE_TRUE(incomeSet
, rv
);
2757 rv
= incomeSet
->Load();
2758 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
),
2759 "[write-off txn] income set not loaded");
2762 incomeSet
->GetLength(&count
);
2763 NS_TEST_ASSERT_MSG(count
== 1, "[write-off txn] wrong income count");
2765 balance
= do_QueryElementAt(incomeSet
, 0);
2766 NS_TEST_ASSERT_MSG(balance
, "[write-off txn] income not loaded" );
2767 if (NS_LIKELY(balance
)) {
2768 mProfit
-= AA_EVENT_AMOUNT_15
* AA_EVENT_RATE_4
;
2769 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() + mProfit
),
2770 "[write-off txn] wrong income saved");
2774 /* Direct write-in - gain */
2776 event
= do_CreateInstance("@aasii.org/base/event;1", &rv
);
2777 NS_ENSURE_TRUE(event
, NS_ERROR_UNEXPECTED
);
2778 /* Set time to 2007-09-10 */
2779 PRExplodedTime tm
= {0,0,0,12,10,8,2007};
2780 event
->SetTime(PR_ImplodeTime(&tm
));
2782 nsCOMPtr
<nsIMutableArray
> block(do_QueryInterface(event
, &rv
));
2783 NS_ENSURE_TRUE(block
, rv
);
2786 fact
= do_CreateInstance("@aasii.org/base/fact;1", &rv
);
2787 NS_ENSURE_TRUE(fact
, rv
);
2788 fact
->SetAmount(AA_EVENT_AMOUNT_15
);
2789 fact
->SetTakeFrom(finres
);
2790 fact
->SetGiveTo(forex
);
2792 rv
= block
->AppendElement(fact
, PR_FALSE
);
2793 NS_TEST_ASSERT_OK(rv
);
2795 rv
= mSession
->Save(event
, nsnull
);
2796 NS_TEST_ASSERT_OK(rv
);
2798 txn
= do_CreateInstance("@aasii.org/base/transaction;1", &rv
);
2799 NS_ENSURE_TRUE(txn
, rv
);
2802 rv
= mSession
->Save(txn
, nsnull
);
2803 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
), "[write-in txn] not saved");
2805 rv
= mSession
->CreateQuery(AA_LOADBALANCE_CONTRACT_ID
,
2806 getter_AddRefs(set
));
2807 NS_TEST_ASSERT_OK(rv
);
2808 NS_ENSURE_TRUE(set
, rv
);
2810 NS_TEST_ASSERT_OK(rv
);
2812 set
->GetLength(&count
);
2813 NS_TEST_ASSERT_MSG(count
== 6, "[write-in txn] wrong flow count");
2815 balance
= do_QueryElementAt(set
, 0);
2816 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 2, 2,
2817 AA_EVENT_AMOUNT_2
/ AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_2
, 0),
2818 "[write-in txn] flow2 is wrong");
2820 balance
= do_QueryElementAt(set
, 1);
2821 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 1, 2,
2822 AA_EVENT_AMOUNT_3
/ AA_FLOW_SHARE_RATE
, AA_EVENT_AMOUNT_3
, 0),
2823 "[write-in txn] flow1 is wrong");
2825 balance
= do_QueryElementAt(set
, 2);
2826 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 4, 3,
2827 AA_EVENT_AMOUNT_5
, AA_EVENT_AMOUNT_4
, 1),
2828 "[write-in txn] flow4 is wrong");
2830 balance
= do_QueryElementAt(set
, 3);
2831 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 9, 5,
2832 1, AA_EVENT_RATE_6
, 1),
2833 "[write-in txn] flow9 is wrong");
2835 balance
= do_QueryElementAt(set
, 4);
2836 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 3, 1, mRubs
, mRubs
,
2837 1), "[write-in txn] flow3 is wrong");
2839 balance
= do_QueryElementAt(set
, 5);
2840 NS_TEST_ASSERT_MSG(testBalance(aTestRunner
, balance
, 6, 4,
2841 mEuros
, mEuros
* AA_EVENT_RATE_4
, 1),
2842 "[write-in txn] flow6 is wrong");
2844 nsCOMPtr
<aaILoadQuery
> incomeSet
;
2845 rv
= mSession
->CreateQuery(AA_LOADINCOME_CONTRACT_ID
,
2846 getter_AddRefs( incomeSet
));
2847 NS_TEST_ASSERT_MSG(incomeSet
, "[write-in txn] income set not created" );
2848 NS_ENSURE_TRUE(incomeSet
, rv
);
2849 rv
= incomeSet
->Load();
2850 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv
),
2851 "[write-in txn] income set not loaded");
2854 incomeSet
->GetLength(&count
);
2855 NS_TEST_ASSERT_MSG(count
== 1, "[write-in txn] wrong income count");
2857 balance
= do_QueryElementAt(incomeSet
, 0);
2858 NS_TEST_ASSERT_MSG(balance
, "[write-in txn] income not loaded" );
2859 if (NS_LIKELY(balance
)) {
2860 mProfit
+= AA_EVENT_AMOUNT_15
* AA_EVENT_RATE_5
;
2861 NS_TEST_ASSERT_MSG(isZero(balance
->PickValue() - mProfit
),
2862 "[write-in txn] wrong income saved");