[storage] Allow transfer rollbacks (bug 155)
[abstract.git] / storage / account / test / aaCurrencyTest.cpp
blobd27d046471b07530e64f4d297217652c7c5c5b90
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
3 /*
4 * Copyright (C) 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 "nsComponentManagerUtils.h"
25 #include "nsStringAPI.h"
26 #include "nsEmbedString.h"
27 #include "nsIMutableArray.h"
28 #include "nsArrayUtils.h"
30 /* Unfrozen API */
31 #include "nsTestUtils.h"
32 #include "nsITestRunner.h"
34 /* Project includes */
35 #include "aaIResource.h"
36 #include "aaIEntity.h"
37 #include "aaIFlow.h"
38 #include "aaIQuote.h"
39 #include "aaIFact.h"
40 #include "aaIEvent.h"
41 #include "aaITransaction.h"
42 #include "aaILoadQuery.h"
43 #include "aaIFilter.h"
44 #include "aaIQuoteFilter.h"
45 #include "aaBaseLoaders.h"
46 #include "aaAccountLoaders.h"
47 #include "aaIBalance.h"
48 #include "aaAmountUtils.h"
50 #include "aaISession.h"
51 #include "aaIManager.h"
53 #include "aaBaseTestUtils.h"
54 #include "aaCurrencyTest.h"
56 /* nsITest */
57 NS_IMETHODIMP
58 aaCurrencyTest::Test(nsITestRunner *aTestRunner)
60 RAII res(this);
61 if (NS_FAILED( res.status )) {
62 aTestRunner->AddError(nsITestRunner::errorJS, \
63 AA_CURRENCY_TEST_CONTRACT_ID " not initialized");
64 return NS_ERROR_NOT_INITIALIZED;
66 testPurchase(aTestRunner);
67 testSaleAdvance(aTestRunner);
68 testForexSale(aTestRunner);
69 testRateChange(aTestRunner);
70 testForexSaleAfterChange(aTestRunner);
71 testTransferRollback(aTestRunner);
72 return NS_OK;
75 NS_IMPL_ISUPPORTS1(aaCurrencyTest, nsITest)
77 /* Helpers */
78 aaCurrencyTest::RAII::RAII(aaCurrencyTest *t)
79 :status(PR_FALSE), test(nsnull)
81 nsresult rv;
83 nsCOMPtr<aaIManager> manager =
84 do_CreateInstance(AA_MANAGER_CONTRACT_ID, &rv);
85 if (NS_UNLIKELY( ! manager))
86 return;
88 rv = manager->Backup("storage.sqlite");
89 if (NS_FAILED(rv)) return;
91 nsCOMPtr<aaISession> session(do_CreateInstance(AA_SESSION_CONTRACT_ID, &rv));
92 if (NS_UNLIKELY( ! session))
93 return;
95 status = PR_TRUE;
96 test = t;
97 test->mSession = session;
100 aaCurrencyTest::RAII::~RAII()
102 test->mFlows = nsnull;
103 test->mResources = nsnull;
104 test->mEntities = nsnull;
105 test->mBank = nsnull;
106 test->mSession = nsnull;
107 test = nsnull;
109 nsresult rv;
110 nsCOMPtr<aaIManager> manager =
111 do_CreateInstance(AA_MANAGER_CONTRACT_ID, &rv);
112 if (NS_UNLIKELY( ! manager))
113 return;
115 manager->Backup("currency.sqlite");
116 manager->Restore("storage.sqlite");
119 /* Private methods */
120 nsresult
121 aaCurrencyTest::testPurchase(nsITestRunner *aTestRunner)
123 nsresult rv;
124 NS_TEST_BEGIN(aTestRunner);
126 nsCOMPtr<aaIResource> cf, c1, c2, x, y;
128 nsCOMPtr<aaIEntity> B, S1, S2, P1, P2, K;
130 nsCOMPtr<aaIFlow> af, a1, a2, dx, dy, bx1, by2, sx1, sy2;
132 nsCOMPtr<aaIQuote> quote;
133 nsCOMPtr<aaIFact> fact;
134 nsCOMPtr<aaIEvent> event;
135 nsCOMPtr<nsIMutableArray> block;
136 nsCOMPtr<aaITransaction> txn;
137 PRExplodedTime tm = {0,0,0,12,25,2,2008};
140 /* Create resources and entities */
142 cf = do_CreateInstance("@aasii.org/base/resource;1", &rv);
143 NS_TEST_ASSERT_OK(rv);
144 NS_ENSURE_SUCCESS(rv, rv);
145 rv = cf->SetTag(NS_LITERAL_STRING("cf"));
146 NS_TEST_ASSERT_OK(rv);
147 NS_ENSURE_SUCCESS(rv, rv);
148 rv = mSession->Save(cf, nsnull);
149 NS_TEST_ASSERT_OK(rv);
150 NS_ENSURE_SUCCESS(rv, rv);
152 c1 = do_CreateInstance("@aasii.org/base/resource;1", &rv);
153 NS_TEST_ASSERT_OK(rv);
154 NS_ENSURE_SUCCESS(rv, rv);
155 rv = c1->SetTag(NS_LITERAL_STRING("c1"));
156 NS_TEST_ASSERT_OK(rv);
157 NS_ENSURE_SUCCESS(rv, rv);
158 rv = mSession->Save(c1, nsnull);
159 NS_TEST_ASSERT_OK(rv);
160 NS_ENSURE_SUCCESS(rv, rv);
162 c2 = do_CreateInstance("@aasii.org/base/resource;1", &rv);
163 NS_TEST_ASSERT_OK(rv);
164 NS_ENSURE_SUCCESS(rv, rv);
165 rv = c2->SetTag(NS_LITERAL_STRING("c2"));
166 NS_TEST_ASSERT_OK(rv);
167 NS_ENSURE_SUCCESS(rv, rv);
168 rv = mSession->Save(c2, nsnull);
169 NS_TEST_ASSERT_OK(rv);
170 NS_ENSURE_SUCCESS(rv, rv);
172 x = do_CreateInstance("@aasii.org/base/resource;1", &rv);
173 NS_TEST_ASSERT_OK(rv);
174 NS_ENSURE_SUCCESS(rv, rv);
175 rv = x->SetTag(NS_LITERAL_STRING("x"));
176 NS_TEST_ASSERT_OK(rv);
177 NS_ENSURE_SUCCESS(rv, rv);
178 rv = mSession->Save(x, nsnull);
179 NS_TEST_ASSERT_OK(rv);
180 NS_ENSURE_SUCCESS(rv, rv);
182 y = do_CreateInstance("@aasii.org/base/resource;1", &rv);
183 NS_TEST_ASSERT_OK(rv);
184 NS_ENSURE_SUCCESS(rv, rv);
185 rv = y->SetTag(NS_LITERAL_STRING("y"));
186 NS_TEST_ASSERT_OK(rv);
187 NS_ENSURE_SUCCESS(rv, rv);
188 rv = mSession->Save(y, nsnull);
189 NS_TEST_ASSERT_OK(rv);
190 NS_ENSURE_SUCCESS(rv, rv);
192 B = do_CreateInstance("@aasii.org/base/entity;1", &rv);
193 NS_TEST_ASSERT_OK(rv);
194 NS_ENSURE_SUCCESS(rv, rv);
195 rv = B->SetTag(NS_LITERAL_STRING("B"));
196 NS_TEST_ASSERT_OK(rv);
197 NS_ENSURE_SUCCESS(rv, rv);
198 rv = mSession->Save(B, nsnull);
199 NS_TEST_ASSERT_OK(rv);
200 NS_ENSURE_SUCCESS(rv, rv);
202 S1 = do_CreateInstance("@aasii.org/base/entity;1", &rv);
203 NS_TEST_ASSERT_OK(rv);
204 NS_ENSURE_SUCCESS(rv, rv);
205 rv = S1->SetTag(NS_LITERAL_STRING("S1"));
206 NS_TEST_ASSERT_OK(rv);
207 NS_ENSURE_SUCCESS(rv, rv);
208 rv = mSession->Save(S1, nsnull);
209 NS_TEST_ASSERT_OK(rv);
210 NS_ENSURE_SUCCESS(rv, rv);
212 S2 = do_CreateInstance("@aasii.org/base/entity;1", &rv);
213 NS_TEST_ASSERT_OK(rv);
214 NS_ENSURE_SUCCESS(rv, rv);
215 rv = S2->SetTag(NS_LITERAL_STRING("S2"));
216 NS_TEST_ASSERT_OK(rv);
217 NS_ENSURE_SUCCESS(rv, rv);
218 rv = mSession->Save(S2, nsnull);
219 NS_TEST_ASSERT_OK(rv);
220 NS_ENSURE_SUCCESS(rv, rv);
222 P1 = do_CreateInstance("@aasii.org/base/entity;1", &rv);
223 NS_TEST_ASSERT_OK(rv);
224 NS_ENSURE_SUCCESS(rv, rv);
225 rv = P1->SetTag(NS_LITERAL_STRING("P1"));
226 NS_TEST_ASSERT_OK(rv);
227 NS_ENSURE_SUCCESS(rv, rv);
228 rv = mSession->Save(P1, nsnull);
229 NS_TEST_ASSERT_OK(rv);
230 NS_ENSURE_SUCCESS(rv, rv);
232 P2 = do_CreateInstance("@aasii.org/base/entity;1", &rv);
233 NS_TEST_ASSERT_OK(rv);
234 NS_ENSURE_SUCCESS(rv, rv);
235 rv = P2->SetTag(NS_LITERAL_STRING("P2"));
236 NS_TEST_ASSERT_OK(rv);
237 NS_ENSURE_SUCCESS(rv, rv);
238 rv = mSession->Save(P2, nsnull);
239 NS_TEST_ASSERT_OK(rv);
240 NS_ENSURE_SUCCESS(rv, rv);
242 K = do_CreateInstance("@aasii.org/base/entity;1", &rv);
243 NS_TEST_ASSERT_OK(rv);
244 NS_ENSURE_SUCCESS(rv, rv);
245 rv = K->SetTag(NS_LITERAL_STRING("K"));
246 NS_TEST_ASSERT_OK(rv);
247 NS_ENSURE_SUCCESS(rv, rv);
248 rv = mSession->Save(K, nsnull);
249 NS_TEST_ASSERT_OK(rv);
250 NS_ENSURE_SUCCESS(rv, rv);
253 mBank = B;
254 /* Create accounts and init chart */
256 af = do_CreateInstance("@aasii.org/base/flow;1", &rv);
257 NS_TEST_ASSERT_OK(rv);
258 NS_ENSURE_SUCCESS(rv, rv);
259 af->SetEntity(B);
260 af->SetGiveResource(cf);
261 af->SetTakeResource(cf);
262 af->SetRate(1.0);
263 af->SetTag(NS_LITERAL_STRING("af"));
264 mSession->Save(af, nsnull);
265 NS_TEST_ASSERT_OK(rv);
266 NS_ENSURE_SUCCESS(rv, rv);
268 a1 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
269 NS_TEST_ASSERT_OK(rv);
270 NS_ENSURE_SUCCESS(rv, rv);
271 a1->SetEntity(B);
272 a1->SetGiveResource(c1);
273 a1->SetTakeResource(c1);
274 a1->SetRate(1.0);
275 a1->SetTag(NS_LITERAL_STRING("a1"));
276 mSession->Save(a1, nsnull);
277 NS_TEST_ASSERT_OK(rv);
278 NS_ENSURE_SUCCESS(rv, rv);
280 a2 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
281 NS_TEST_ASSERT_OK(rv);
282 NS_ENSURE_SUCCESS(rv, rv);
283 a2->SetEntity(B);
284 a2->SetGiveResource(c2);
285 a2->SetTakeResource(c2);
286 a2->SetRate(1.0);
287 a2->SetTag(NS_LITERAL_STRING("a2"));
288 mSession->Save(a2, nsnull);
289 NS_TEST_ASSERT_OK(rv);
290 NS_ENSURE_SUCCESS(rv, rv);
292 dx = do_CreateInstance("@aasii.org/base/flow;1", &rv);
293 NS_TEST_ASSERT_OK(rv);
294 NS_ENSURE_SUCCESS(rv, rv);
295 dx->SetEntity(K);
296 dx->SetGiveResource(x);
297 dx->SetTakeResource(x);
298 dx->SetRate(1.0);
299 dx->SetTag(NS_LITERAL_STRING("dx"));
300 mSession->Save(dx, nsnull);
301 NS_TEST_ASSERT_OK(rv);
302 NS_ENSURE_SUCCESS(rv, rv);
304 dy = do_CreateInstance("@aasii.org/base/flow;1", &rv);
305 NS_TEST_ASSERT_OK(rv);
306 NS_ENSURE_SUCCESS(rv, rv);
307 dy->SetEntity(K);
308 dy->SetGiveResource(y);
309 dy->SetTakeResource(y);
310 dy->SetRate(1.0);
311 dy->SetTag(NS_LITERAL_STRING("dy"));
312 mSession->Save(dy, nsnull);
313 NS_TEST_ASSERT_OK(rv);
314 NS_ENSURE_SUCCESS(rv, rv);
316 bx1 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
317 NS_TEST_ASSERT_OK(rv);
318 NS_ENSURE_SUCCESS(rv, rv);
319 bx1->SetEntity(S1);
320 bx1->SetGiveResource(c1);
321 bx1->SetTakeResource(x);
322 bx1->SetRate(1.0/100.0);
323 bx1->SetTag(NS_LITERAL_STRING("bx1"));
324 mSession->Save(bx1, nsnull);
325 NS_TEST_ASSERT_OK(rv);
326 NS_ENSURE_SUCCESS(rv, rv);
328 by2 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
329 NS_TEST_ASSERT_OK(rv);
330 NS_ENSURE_SUCCESS(rv, rv);
331 by2->SetEntity(S2);
332 by2->SetGiveResource(cf);
333 by2->SetTakeResource(y);
334 by2->SetRate(1.0/200.0);
335 by2->SetTag(NS_LITERAL_STRING("by2"));
336 mSession->Save(by2, nsnull);
337 NS_TEST_ASSERT_OK(rv);
338 NS_ENSURE_SUCCESS(rv, rv);
340 sx1 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
341 NS_TEST_ASSERT_OK(rv);
342 NS_ENSURE_SUCCESS(rv, rv);
343 sx1->SetEntity(P1);
344 sx1->SetGiveResource(x);
345 sx1->SetTakeResource(cf);
346 sx1->SetRate(200.0);
347 sx1->SetTag(NS_LITERAL_STRING("sx1"));
348 mSession->Save(sx1, nsnull);
349 NS_TEST_ASSERT_OK(rv);
350 NS_ENSURE_SUCCESS(rv, rv);
352 sy2 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
353 NS_TEST_ASSERT_OK(rv);
354 NS_ENSURE_SUCCESS(rv, rv);
355 sy2->SetEntity(P2);
356 sy2->SetGiveResource(y);
357 sy2->SetTakeResource(c2);
358 sy2->SetRate(150.0);
359 sy2->SetTag(NS_LITERAL_STRING("sy2"));
360 mSession->Save(sy2, nsnull);
361 NS_TEST_ASSERT_OK(rv);
362 NS_ENSURE_SUCCESS(rv, rv);
364 quote = do_CreateInstance("@aasii.org/base/quote;1", &rv);
365 NS_TEST_ASSERT_OK(rv);
366 NS_ENSURE_SUCCESS(rv, rv);
367 quote->SetResource(cf);
368 quote->SetRate(1.0);
369 quote->SetTime(PR_ImplodeTime(&tm));
370 mSession->Save(quote, nsnull);
371 NS_TEST_ASSERT_OK(rv);
372 NS_ENSURE_SUCCESS(rv, rv);
375 /* Add a quote for c1, and accept delivery under bx1 */
377 quote = do_CreateInstance("@aasii.org/base/quote;1", &rv);
378 NS_TEST_ASSERT_OK(rv);
379 NS_ENSURE_SUCCESS(rv, rv);
380 quote->SetResource(c1);
381 quote->SetRate(1.5);
382 quote->SetTime(PR_ImplodeTime(&tm));
383 rv = mSession->Save(quote, nsnull);
384 NS_TEST_ASSERT_OK(rv);
385 NS_ENSURE_SUCCESS(rv, rv);
387 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
388 NS_TEST_ASSERT_OK(rv);
389 NS_ENSURE_SUCCESS(rv, rv);
390 fact->SetTakeFrom(bx1);
391 fact->SetGiveTo(dx);
392 fact->SetAmount(300.0);
393 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
394 NS_TEST_ASSERT_OK(rv);
395 NS_ENSURE_SUCCESS(rv, rv);
396 event->SetTime(PR_ImplodeTime(&tm));
397 block = do_QueryInterface(event, &rv);
398 NS_TEST_ASSERT_OK(rv);
399 NS_ENSURE_SUCCESS(rv, rv);
400 block->AppendElement(fact, PR_FALSE);
401 rv = mSession->Save(event, nsnull);
402 NS_TEST_ASSERT_OK(rv);
403 NS_ENSURE_SUCCESS(rv, rv);
404 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
405 txn->SetFact(fact);
406 rv = mSession->Save(txn, nsnull);
407 NS_TEST_ASSERT_OK(rv);
408 NS_ENSURE_SUCCESS(rv, rv);
412 /* Test results */
414 nsCOMPtr<aaILoadQuery> set;
415 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
416 NS_TEST_ASSERT_OK(rv);
417 NS_ENSURE_TRUE(set, rv);
418 rv = set->Load();
419 NS_TEST_ASSERT_OK(rv);
421 nsCOMPtr<aaIBalance> balance;
422 balance = (do_QueryElementAt(set, 0));
423 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 6, 2, 30000.0,
424 45000.0, 0),
425 "[currency] flow 'bx1' is wrong");
426 balance = (do_QueryElementAt(set, 1));
427 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 4, 4, 300.0,
428 45000.0, 1),
429 "[currency] flow 'dx' is wrong");
432 return NS_OK;
435 nsresult
436 aaCurrencyTest::testSaleAdvance(nsITestRunner *aTestRunner)
438 nsresult rv;
439 NS_TEST_BEGIN(aTestRunner);
440 rv = mSession->CreateQuery(AA_LOADFLOW_CONTRACT_ID, getter_AddRefs(mFlows));
441 NS_TEST_ASSERT_OK(rv);
442 NS_ENSURE_SUCCESS(rv, rv);
444 rv = mFlows->Load();
445 NS_TEST_ASSERT_OK(rv);
446 NS_ENSURE_SUCCESS(rv, rv);
448 rv = mSession->CreateQuery(AA_LOADRESOURCE_CONTRACT_ID,
449 getter_AddRefs(mResources));
450 NS_TEST_ASSERT_OK(rv);
451 NS_ENSURE_SUCCESS(rv, rv);
453 rv = mResources->Load();
454 NS_TEST_ASSERT_OK(rv);
455 NS_ENSURE_SUCCESS(rv, rv);
457 nsCOMPtr<aaIResource> c2 = do_QueryElementAt(mResources, 2);
459 nsCOMPtr<aaIFlow> a2 = do_QueryElementAt(mFlows, 2);
460 nsCOMPtr<aaIFlow> sy2 = do_QueryElementAt(mFlows, 8);
462 nsCOMPtr<aaIQuote> quote;
463 nsCOMPtr<aaIFact> fact;
464 nsCOMPtr<aaIEvent> event;
465 nsCOMPtr<nsIMutableArray> block;
466 nsCOMPtr<aaITransaction> txn;
467 PRExplodedTime tm = {0,0,0,12,25,2,2008};
470 /* Add a quote for c2, and accept advance payment under sy2 */
472 quote = do_CreateInstance("@aasii.org/base/quote;1", &rv);
473 NS_TEST_ASSERT_OK(rv);
474 NS_ENSURE_SUCCESS(rv, rv);
475 quote->SetResource(c2);
476 quote->SetRate(2.0);
477 quote->SetTime(PR_ImplodeTime(&tm));
478 mSession->Save(quote, nsnull);
479 NS_TEST_ASSERT_OK(rv);
480 NS_ENSURE_SUCCESS(rv, rv);
482 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
483 NS_TEST_ASSERT_OK(rv);
484 NS_ENSURE_SUCCESS(rv, rv);
485 fact->SetTakeFrom(sy2);
486 fact->SetGiveTo(a2);
487 fact->SetAmount(60000.0);
488 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
489 NS_TEST_ASSERT_OK(rv);
490 NS_ENSURE_SUCCESS(rv, rv);
491 event->SetTime(PR_ImplodeTime(&tm));
492 block = do_QueryInterface(event, &rv);
493 NS_TEST_ASSERT_OK(rv);
494 NS_ENSURE_SUCCESS(rv, rv);
495 block->AppendElement(fact, PR_FALSE);
496 rv = mSession->Save(event, nsnull);
497 NS_TEST_ASSERT_OK(rv);
498 NS_ENSURE_SUCCESS(rv, rv);
499 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
500 txn->SetFact(fact);
501 rv = mSession->Save(txn, nsnull);
502 NS_TEST_ASSERT_OK(rv);
503 NS_ENSURE_SUCCESS(rv, rv);
505 nsCOMPtr<aaILoadQuery> set;
506 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
507 NS_TEST_ASSERT_OK(rv);
508 NS_ENSURE_TRUE(set, rv);
509 rv = set->Load();
510 NS_TEST_ASSERT_OK(rv);
512 nsCOMPtr<aaIBalance> balance;
513 balance = (do_QueryElementAt(set, 2));
514 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 9, 5, 400.0,
515 120000.0, 0),
516 "[currency] flow 'bx1' is wrong");
517 balance = (do_QueryElementAt(set, 3));
518 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 3, 60000.0,
519 120000.0, 1),
520 "[currency] flow 'dx' is wrong");
523 return NS_OK;
526 nsresult
527 aaCurrencyTest::testForexSale(nsITestRunner *aTestRunner)
529 nsresult rv;
530 NS_TEST_BEGIN(aTestRunner);
532 nsCOMPtr<aaIResource> cf = do_QueryElementAt(mResources, 0);
533 nsCOMPtr<aaIResource> c2 = do_QueryElementAt(mResources, 2);
535 nsCOMPtr<aaIFlow> f1, f2, f3;
536 nsCOMPtr<aaIFlow> a2 = do_QueryElementAt(mFlows, 2);
538 nsCOMPtr<aaIQuote> quote;
539 nsCOMPtr<aaIFact> fact;
540 nsCOMPtr<aaIEvent> event;
541 nsCOMPtr<nsIMutableArray> block;
542 nsCOMPtr<aaITransaction> txn;
543 PRExplodedTime tm = {0,0,0,12,25,2,2008};
544 nsCOMPtr<aaIBalance> balance;
546 /* Pay for forex deal 1 */
548 f1 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
549 NS_TEST_ASSERT_OK(rv);
550 NS_ENSURE_SUCCESS(rv, rv);
551 f1->SetEntity(mBank);
552 f1->SetGiveResource(c2);
553 f1->SetTakeResource(cf);
554 f1->SetRate(2.1);
555 f1->SetTag(NS_LITERAL_STRING("f1"));
556 mSession->Save(f1, nsnull);
557 NS_TEST_ASSERT_OK(rv);
558 NS_ENSURE_SUCCESS(rv, rv);
560 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
561 NS_TEST_ASSERT_OK(rv);
562 NS_ENSURE_SUCCESS(rv, rv);
563 fact->SetTakeFrom(a2);
564 fact->SetGiveTo(f1);
565 fact->SetAmount(10000.0);
566 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
567 NS_TEST_ASSERT_OK(rv);
568 NS_ENSURE_SUCCESS(rv, rv);
569 event->SetTime(PR_ImplodeTime(&tm));
570 block = do_QueryInterface(event, &rv);
571 NS_TEST_ASSERT_OK(rv);
572 NS_ENSURE_SUCCESS(rv, rv);
573 block->AppendElement(fact, PR_FALSE);
574 rv = mSession->Save(event, nsnull);
575 NS_TEST_ASSERT_OK(rv);
576 NS_ENSURE_SUCCESS(rv, rv);
577 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
578 txn->SetFact(fact);
579 rv = mSession->Save(txn, nsnull);
580 NS_TEST_ASSERT_OK(rv);
581 NS_ENSURE_SUCCESS(rv, rv);
583 nsCOMPtr<aaILoadQuery> set;
584 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
585 NS_TEST_ASSERT_OK(rv);
586 NS_ENSURE_TRUE(set, rv);
587 rv = set->Load();
588 NS_TEST_ASSERT_OK(rv);
590 balance = (do_QueryElementAt(set, 2));
591 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 9, 5, 400.0,
592 120000.0, 0),
593 "[currency] flow 'sy2' is wrong");
594 balance = (do_QueryElementAt(set, 3));
595 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 3, 50000.0,
596 100000.0, 1),
597 "[currency] flow 'a2' is wrong");
598 balance = (do_QueryElementAt(set, 4));
599 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 10, 1, 21000.0,
600 21000.0, 1),
601 "[currency] flow 'f1' is wrong");
604 /* Pay for forex deal 2 */
606 f2 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
607 NS_TEST_ASSERT_OK(rv);
608 NS_ENSURE_SUCCESS(rv, rv);
609 f2->SetEntity(mBank);
610 f2->SetGiveResource(c2);
611 f2->SetTakeResource(cf);
612 f2->SetRate(2.0);
613 f2->SetTag(NS_LITERAL_STRING("f2"));
614 mSession->Save(f2, nsnull);
615 NS_TEST_ASSERT_OK(rv);
616 NS_ENSURE_SUCCESS(rv, rv);
618 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
619 NS_TEST_ASSERT_OK(rv);
620 NS_ENSURE_SUCCESS(rv, rv);
621 fact->SetTakeFrom(a2);
622 fact->SetGiveTo(f2);
623 fact->SetAmount(10000.0);
624 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
625 NS_TEST_ASSERT_OK(rv);
626 NS_ENSURE_SUCCESS(rv, rv);
627 event->SetTime(PR_ImplodeTime(&tm));
628 block = do_QueryInterface(event, &rv);
629 NS_TEST_ASSERT_OK(rv);
630 NS_ENSURE_SUCCESS(rv, rv);
631 block->AppendElement(fact, PR_FALSE);
632 rv = mSession->Save(event, nsnull);
633 NS_TEST_ASSERT_OK(rv);
634 NS_ENSURE_SUCCESS(rv, rv);
635 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
636 txn->SetFact(fact);
637 rv = mSession->Save(txn, nsnull);
638 NS_TEST_ASSERT_OK(rv);
639 NS_ENSURE_SUCCESS(rv, rv);
641 nsCOMPtr<aaILoadQuery> set;
642 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
643 NS_TEST_ASSERT_OK(rv);
644 NS_ENSURE_TRUE(set, rv);
645 rv = set->Load();
646 NS_TEST_ASSERT_OK(rv);
648 balance = (do_QueryElementAt(set, 2));
649 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 9, 5, 400.0,
650 120000.0, 0),
651 "[currency] flow 'sy2' is wrong");
652 balance = (do_QueryElementAt(set, 3));
653 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 3, 40000.0,
654 80000.0, 1),
655 "[currency] flow 'a2' is wrong");
656 balance = (do_QueryElementAt(set, 5));
657 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 11, 1, 20000.0,
658 20000.0, 1),
659 "[currency] flow 'f2' is wrong");
662 /* Pay for forex deal 3 */
664 f3 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
665 NS_TEST_ASSERT_OK(rv);
666 NS_ENSURE_SUCCESS(rv, rv);
667 f3->SetEntity(mBank);
668 f3->SetGiveResource(c2);
669 f3->SetTakeResource(cf);
670 f3->SetRate(1.95);
671 f3->SetTag(NS_LITERAL_STRING("f3"));
672 mSession->Save(f3, nsnull);
673 NS_TEST_ASSERT_OK(rv);
674 NS_ENSURE_SUCCESS(rv, rv);
676 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
677 NS_TEST_ASSERT_OK(rv);
678 NS_ENSURE_SUCCESS(rv, rv);
679 fact->SetTakeFrom(a2);
680 fact->SetGiveTo(f3);
681 fact->SetAmount(10000.0);
682 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
683 NS_TEST_ASSERT_OK(rv);
684 NS_ENSURE_SUCCESS(rv, rv);
685 event->SetTime(PR_ImplodeTime(&tm));
686 block = do_QueryInterface(event, &rv);
687 NS_TEST_ASSERT_OK(rv);
688 NS_ENSURE_SUCCESS(rv, rv);
689 block->AppendElement(fact, PR_FALSE);
690 rv = mSession->Save(event, nsnull);
691 NS_TEST_ASSERT_OK(rv);
692 NS_ENSURE_SUCCESS(rv, rv);
693 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
694 txn->SetFact(fact);
695 rv = mSession->Save(txn, nsnull);
696 NS_TEST_ASSERT_OK(rv);
697 NS_ENSURE_SUCCESS(rv, rv);
699 nsCOMPtr<aaILoadQuery> set;
700 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
701 NS_TEST_ASSERT_OK(rv);
702 NS_ENSURE_TRUE(set, rv);
703 rv = set->Load();
704 NS_TEST_ASSERT_OK(rv);
706 balance = (do_QueryElementAt(set, 3));
707 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 3, 30000.0,
708 60000.0, 1),
709 "[currency] flow 'a2' is wrong");
710 balance = (do_QueryElementAt(set, 6));
711 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 12, 1, 19500.0,
712 19500.0, 1),
713 "[currency] flow 'f3' is wrong");
716 return NS_OK;
719 nsresult
720 aaCurrencyTest::testRateChange(nsITestRunner *aTestRunner)
722 nsresult rv;
723 NS_TEST_BEGIN(aTestRunner);
725 nsCOMPtr<aaIQuote> quote;
726 nsCOMPtr<aaIResource> c1 = do_QueryElementAt(mResources, 1);
727 nsCOMPtr<aaIResource> c2 = do_QueryElementAt(mResources, 2);
728 PRExplodedTime tm = {0,0,0,12,31,2,2008};
729 nsCOMPtr<aaIBalance> balance;
730 nsCOMPtr<aaILoadQuery> incomeSet;
731 nsCOMPtr<aaILoadQuery> quoteSet;
733 quote = do_CreateInstance("@aasii.org/base/quote;1", &rv);
734 NS_TEST_ASSERT_OK(rv);
735 NS_ENSURE_SUCCESS(rv, rv);
736 quote->SetResource(c1);
737 quote->SetRate(1.6);
738 quote->SetTime(PR_ImplodeTime(&tm));
739 rv = mSession->Save(quote, nsnull);
740 NS_TEST_ASSERT_OK(rv);
741 NS_ENSURE_SUCCESS(rv, rv);
743 rv = mSession->Save(quote, nsnull);
744 NS_TEST_ASSERT_MSG(NS_FAILED(rv), "[quote save] date constrain");
746 rv = mSession->CreateQuery(AA_LOADINCOME_CONTRACT_ID,
747 getter_AddRefs( incomeSet ));
748 NS_TEST_ASSERT_MSG(incomeSet, "[rate change] income set not created" );
749 NS_ENSURE_TRUE(incomeSet, rv);
750 rv = incomeSet->Load();
751 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[rate change] income set not loaded" );
753 balance = do_QueryElementAt(incomeSet, 0);
754 NS_TEST_ASSERT_MSG(balance, "[rate change] income not loaded" );
755 if (NS_LIKELY(balance)) {
756 NS_TEST_ASSERT_MSG(balance->PickSide() == 1,
757 "[rate change] wrong income sign");
758 NS_TEST_ASSERT_MSG(isZero(balance->PickValue() - 2500.0),
759 "[rate change] wrong income amount");
762 rv = mSession->CreateQuery(AA_LOADQUOTE_CONTRACT_ID,
763 getter_AddRefs( quoteSet ));
764 NS_TEST_ASSERT_MSG(quoteSet, "[rate change] query instance creation" );
765 NS_ENSURE_TRUE(quoteSet, rv);
766 nsCOMPtr<aaIStringFilter> filter = do_CreateInstance(
767 AA_FILTER_CONTRACT_ID, &rv);
768 NS_TEST_ASSERT_OK(rv);
769 NS_ENSURE_TRUE(filter, rv);
770 filter->SetExpression(NS_LITERAL_CSTRING(" WHERE quote.resource_id=2"));
772 quoteSet->SetFilter(filter);
773 rv = quoteSet->Load();
774 NS_TEST_ASSERT_OK(rv);
776 PRUint32 count;
777 quoteSet->GetLength(&count);
778 NS_TEST_ASSERT_MSG(count == 1, "[rate change] wrong quote count");
780 nsCOMPtr<aaIQuote> quote = do_QueryElementAt(quoteSet, 0, &rv);
781 NS_TEST_ASSERT_MSG(quote, "[rate change] quote not loaded" );
782 if (quote) {
783 NS_TEST_ASSERT_MSG(quote->PickResource() &&
784 quote->PickResource()->PickId() == 2,
785 "[rate change] wrong resource in the quote");
786 NS_TEST_ASSERT_MSG(isZero(quote->PickDiff() + 3000.0),
787 "[rate change] wrong difference in the quote");
792 quote = do_CreateInstance("@aasii.org/base/quote;1", &rv);
793 NS_TEST_ASSERT_OK(rv);
794 NS_ENSURE_SUCCESS(rv, rv);
795 quote->SetResource(c2);
796 quote->SetRate(2.1);
797 quote->SetTime(PR_ImplodeTime(&tm));
798 mSession->Save(quote, nsnull);
799 NS_TEST_ASSERT_OK(rv);
800 NS_ENSURE_SUCCESS(rv, rv);
802 rv = mSession->CreateQuery(AA_LOADINCOME_CONTRACT_ID,
803 getter_AddRefs( incomeSet ));
804 NS_TEST_ASSERT_MSG(incomeSet, "[rate change] income set not created" );
805 NS_ENSURE_TRUE(incomeSet, rv);
806 rv = incomeSet->Load();
807 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[rate change] income set not loaded" );
809 balance = do_QueryElementAt(incomeSet, 0);
810 NS_TEST_ASSERT_MSG(balance, "[rate change] income not loaded" );
811 if (NS_LIKELY(balance)) {
812 NS_TEST_ASSERT_MSG(balance->PickSide() == 0,
813 "[rate change] wrong income sign");
814 NS_TEST_ASSERT_MSG(isZero(balance->PickValue() - 500.0),
815 "[rate change] wrong income amount");
818 rv = mSession->CreateQuery(AA_LOADQUOTE_CONTRACT_ID,
819 getter_AddRefs( quoteSet ));
820 NS_TEST_ASSERT_MSG(quoteSet, "[rate change] query instance creation" );
821 NS_ENSURE_TRUE(quoteSet, rv);
822 nsCOMPtr<aaIQuoteFilter> filter = do_CreateInstance(
823 AA_QUOTEFILTER_CONTRACT_ID, &rv);
824 NS_TEST_ASSERT_OK(rv);
825 NS_ENSURE_TRUE(filter, rv);
826 filter->SetResource(c2);
828 quoteSet->SetFilter(filter);
829 rv = quoteSet->Load();
830 NS_TEST_ASSERT_OK(rv);
832 PRUint32 count;
833 quoteSet->GetLength(&count);
834 NS_TEST_ASSERT_MSG(count == 1, "[rate change] wrong quote count");
836 nsCOMPtr<aaIQuote> quote = do_QueryElementAt(quoteSet, 0, &rv);
837 NS_TEST_ASSERT_MSG(quote, "[rate change] quote not loaded" );
838 NS_ENSURE_TRUE(quote, NS_ERROR_FAILURE);
839 NS_TEST_ASSERT_MSG(quote->PickResource() &&
840 quote->PickResource()->PickId() == 3,
841 "[rate change] wrong resource in the quote");
842 NS_TEST_ASSERT_MSG(isZero(quote->PickDiff() - 3000.0),
843 "[rate change] wrong difference in the quote");
846 return NS_OK;
849 nsresult
850 aaCurrencyTest::testForexSaleAfterChange(nsITestRunner *aTestRunner)
852 nsresult rv;
853 NS_TEST_BEGIN(aTestRunner);
855 nsCOMPtr<aaIResource> c1 = do_QueryElementAt(mResources, 1);
856 nsCOMPtr<aaIResource> c2 = do_QueryElementAt(mResources, 2);
858 nsCOMPtr<aaIFlow> f4;
859 nsCOMPtr<aaIFlow> a2 = do_QueryElementAt(mFlows, 2);
861 nsCOMPtr<aaIQuote> quote;
862 nsCOMPtr<aaIFact> fact;
863 nsCOMPtr<aaIEvent> event;
864 nsCOMPtr<nsIMutableArray> block;
865 nsCOMPtr<aaITransaction> txn;
866 PRExplodedTime tm = {0,0,0,12,31,2,2008};
867 nsCOMPtr<aaIBalance> balance;
869 nsCOMPtr<aaILoadQuery> factSet;
870 nsCOMPtr<aaIStringFilter> filter;
871 /* Pay for forex deal 4 */
873 f4 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
874 NS_TEST_ASSERT_OK(rv);
875 NS_ENSURE_SUCCESS(rv, rv);
876 f4->SetEntity(mBank);
877 f4->SetGiveResource(c2);
878 f4->SetTakeResource(c1);
879 f4->SetRate(2.1/1.6);
880 f4->SetTag(NS_LITERAL_STRING("f4"));
881 mSession->Save(f4, nsnull);
882 NS_TEST_ASSERT_OK(rv);
883 NS_ENSURE_SUCCESS(rv, rv);
885 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
886 NS_TEST_ASSERT_OK(rv);
887 NS_ENSURE_SUCCESS(rv, rv);
888 fact->SetTakeFrom(a2);
889 fact->SetGiveTo(f4);
890 fact->SetAmount(10000.0);
891 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
892 NS_TEST_ASSERT_OK(rv);
893 NS_ENSURE_SUCCESS(rv, rv);
894 event->SetTime(PR_ImplodeTime(&tm));
895 block = do_QueryInterface(event, &rv);
896 NS_TEST_ASSERT_OK(rv);
897 NS_ENSURE_SUCCESS(rv, rv);
898 block->AppendElement(fact, PR_FALSE);
899 rv = mSession->Save(event, nsnull);
900 NS_TEST_ASSERT_OK(rv);
901 NS_ENSURE_SUCCESS(rv, rv);
902 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
903 txn->SetFact(fact);
904 rv = mSession->Save(txn, nsnull);
905 NS_TEST_ASSERT_OK(rv);
906 NS_ENSURE_SUCCESS(rv, rv);
908 nsCOMPtr<aaILoadQuery> set;
909 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
910 NS_TEST_ASSERT_OK(rv);
911 NS_ENSURE_TRUE(set, rv);
912 rv = set->Load();
913 NS_TEST_ASSERT_OK(rv);
915 balance = (do_QueryElementAt(set, 2));
916 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 9, 5, 400.0,
917 120000.0, 0),
918 "[currency] flow 'sy2' is wrong");
919 balance = (do_QueryElementAt(set, 6));
920 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 3, 20000.0,
921 42000.0, 1),
922 "[currency] flow 'a2' is wrong");
923 balance = (do_QueryElementAt(set, 7));
924 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 13, 2, 13125.0,
925 21000.0, 1),
926 "[currency] flow 'f4' is wrong");
928 rv = mSession->CreateQuery(AA_LOADFACTLIST_CONTRACT_ID,
929 getter_AddRefs( factSet ));
930 NS_TEST_ASSERT_MSG(factSet, "[rate change] query instance creation" );
931 NS_ENSURE_TRUE(factSet, rv);
933 filter = do_CreateInstance(AA_FILTER_CONTRACT_ID, &rv);
934 NS_TEST_ASSERT_OK(rv);
935 NS_ENSURE_TRUE(filter, rv);
936 filter->SetExpression(NS_LITERAL_CSTRING(" WHERE txn.day=2454557 \
937 AND txn.event_id=1 AND txn.transfer_id=1"));
939 factSet->SetFilter(filter);
940 rv = factSet->Load();
941 NS_TEST_ASSERT_OK(rv);
943 PRUint32 count;
944 factSet->GetLength(&count);
945 NS_TEST_ASSERT_MSG(count == 1, "[change effect] wrong transaction count");
947 txn = do_QueryElementAt(factSet, 0, &rv);
948 NS_TEST_ASSERT_MSG(testTxn(aTestRunner, txn, 3, 13, 10000,
949 21000), "[change effect] transaction is wrong");
952 return NS_OK;
955 nsresult
956 aaCurrencyTest::testTransferRollback(nsITestRunner *aTestRunner)
958 nsresult rv;
959 NS_TEST_BEGIN(aTestRunner);
961 rv = mSession->CreateQuery(AA_LOADENTITY_CONTRACT_ID,
962 getter_AddRefs(mEntities));
963 NS_TEST_ASSERT_OK(rv);
964 NS_ENSURE_SUCCESS(rv, rv);
966 rv = mEntities->Load();
967 NS_TEST_ASSERT_OK(rv);
968 NS_ENSURE_SUCCESS(rv, rv);
970 nsCOMPtr<aaIResource> c3, y;
971 y = do_QueryElementAt(mResources, 4);
973 nsCOMPtr<aaIEntity> S2;
974 S2 = do_QueryElementAt(mEntities, 2);
976 nsCOMPtr<aaIFlow> dy, by3;
977 dy = do_QueryElementAt(mFlows, 4);
979 nsCOMPtr<aaIQuote> quote;
980 nsCOMPtr<aaIFact> fact;
981 nsCOMPtr<aaIEvent> event;
982 nsCOMPtr<nsIMutableArray> block;
983 nsCOMPtr<aaITransaction> txn;
984 PRExplodedTime tm = {0,0,0,12,14,3,2008};
986 /* */
988 c3 = do_CreateInstance("@aasii.org/base/resource;1", &rv);
989 NS_TEST_ASSERT_OK(rv);
990 NS_ENSURE_SUCCESS(rv, rv);
991 rv = c3->SetTag(NS_LITERAL_STRING("c3"));
992 NS_TEST_ASSERT_OK(rv);
993 NS_ENSURE_SUCCESS(rv, rv);
994 rv = mSession->Save(c3, nsnull);
995 NS_TEST_ASSERT_OK(rv);
996 NS_ENSURE_SUCCESS(rv, rv);
998 by3 = do_CreateInstance("@aasii.org/base/flow;1", &rv);
999 NS_TEST_ASSERT_OK(rv);
1000 NS_ENSURE_SUCCESS(rv, rv);
1001 by3->SetEntity(S2);
1002 by3->SetGiveResource(c3);
1003 by3->SetTakeResource(y);
1004 by3->SetRate(1.0/200.0);
1005 by3->SetTag(NS_LITERAL_STRING("by3"));
1006 rv = mSession->Save(by3, nsnull);
1007 NS_TEST_ASSERT_OK(rv);
1008 NS_ENSURE_SUCCESS(rv, rv);
1010 quote = do_CreateInstance("@aasii.org/base/quote;1", &rv);
1011 NS_TEST_ASSERT_OK(rv);
1012 NS_ENSURE_SUCCESS(rv, rv);
1013 quote->SetResource(c3);
1014 quote->SetRate(0.8);
1015 quote->SetTime(PR_ImplodeTime(&tm));
1016 rv = mSession->Save(quote, nsnull);
1017 NS_TEST_ASSERT_OK(rv);
1018 NS_ENSURE_SUCCESS(rv, rv);
1022 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
1023 NS_TEST_ASSERT_OK(rv);
1024 NS_ENSURE_SUCCESS(rv, rv);
1025 fact->SetTakeFrom(by3);
1026 fact->SetGiveTo(dy);
1027 fact->SetAmount(100.0);
1028 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
1029 NS_TEST_ASSERT_OK(rv);
1030 NS_ENSURE_SUCCESS(rv, rv);
1031 tm.tm_mday = 11;
1032 event->SetTime(PR_ImplodeTime(&tm));
1033 block = do_QueryInterface(event, &rv);
1034 NS_TEST_ASSERT_OK(rv);
1035 NS_ENSURE_SUCCESS(rv, rv);
1036 block->AppendElement(fact, PR_FALSE);
1037 rv = mSession->Save(event, nsnull);
1038 NS_TEST_ASSERT_OK(rv);
1039 NS_ENSURE_SUCCESS(rv, rv);
1041 nsCOMPtr<aaILoadQuery> set, factSet;
1042 mSession->CreateQuery(AA_LOADFLOWSTATES_CONTRACT_ID, getter_AddRefs(set));
1043 NS_TEST_ASSERT_MSG(set, "[rollback] creating loader" );
1044 NS_ENSURE_SUCCESS(rv, rv);
1046 rv = set->Load();
1047 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[rollback] loading states" );
1049 PRUint32 count;
1050 set->GetLength(&count);
1051 NS_TEST_ASSERT_MSG(count == 10, "[rollback] wrong flow count");
1053 rv = mSession->CreateQuery(AA_LOADFACTLIST_CONTRACT_ID,
1054 getter_AddRefs( factSet ));
1055 NS_TEST_ASSERT_MSG(factSet, "[rollback] query instance creation" );
1056 NS_ENSURE_TRUE(factSet, rv);
1058 rv = factSet->Load();
1059 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[rollback] loading facts" );
1061 factSet->GetLength(&count);
1062 NS_TEST_ASSERT_MSG(count == 7, "[rollback] wrong fact count");
1064 rv = mSession->Save(event, event);
1065 NS_TEST_ASSERT_OK(rv);
1066 NS_ENSURE_SUCCESS(rv, rv);
1068 rv = set->Load();
1069 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[rollback] loading states" );
1071 set->GetLength(&count);
1072 NS_TEST_ASSERT_MSG(count == 8, "[rollback] wrong flow count");
1074 rv = factSet->Load();
1075 NS_TEST_ASSERT_MSG(NS_SUCCEEDED(rv), "[rollback] loading facts" );
1077 factSet->GetLength(&count);
1078 NS_TEST_ASSERT_MSG(count == 6, "[rollback] wrong fact count");
1081 return NS_OK;