[accounts] Add a test container (bug 141)
[abstract.git] / storage / account / test / aaBug133Test.cpp
blobcfc8a1d6ddd050f2e62a8061fbb1469448047890
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
3 /*
4 * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "xpcom-config.h"
24 #include "nsIGenericFactory.h"
25 #include "nsComponentManagerUtils.h"
26 #include "nsStringAPI.h"
27 #include "nsEmbedString.h"
28 #include "nsIMutableArray.h"
29 #include "nsArrayUtils.h"
31 /* Unfrozen API */
32 #include "mozIStorageConnection.h"
33 #include "nsTestUtils.h"
34 #include "nsITestRunner.h"
36 /* Project includes */
37 #include "aaIResource.h"
38 #include "aaIEntity.h"
39 #include "aaIFlow.h"
40 #include "aaIQuote.h"
41 #include "aaIFact.h"
42 #include "aaIEvent.h"
43 #include "aaITransaction.h"
44 #include "aaIBalance.h"
45 #include "aaISession.h"
46 #include "aaIManager.h"
47 #include "aaILoadQuery.h"
48 #include "aaBaseLoaders.h"
49 #include "aaAccountLoaders.h"
50 #include "aaAccountTestUtils.h"
51 #include "aaBug133Test.h"
53 /* nsITest */
54 NS_IMETHODIMP
55 aaBug133Test::Test(nsITestRunner *aTestRunner)
57 RAII res(this);
58 if (NS_FAILED( res.status )) {
59 aTestRunner->AddError(nsITestRunner::errorJS, \
60 AA_BUG133_TEST_CONTRACT_ID " not initialized");
61 return NS_ERROR_NOT_INITIALIZED;
63 testRounding(aTestRunner);
64 return NS_OK;
67 NS_IMPL_ISUPPORTS1(aaBug133Test, nsITest)
69 /* Helpers */
70 aaBug133Test::RAII::RAII(aaBug133Test *t)
71 :status(PR_FALSE), test(nsnull)
73 nsresult rv;
75 nsCOMPtr<aaIManager> manager =
76 do_CreateInstance(AA_MANAGER_CONTRACT_ID, &rv);
77 if (NS_UNLIKELY( ! manager))
78 return;
80 rv = manager->Backup("storage.sqlite");
81 if (NS_FAILED(rv)) return;
83 nsCOMPtr<aaISession> session(do_CreateInstance(AA_SESSION_CONTRACT_ID, &rv));
84 if (NS_UNLIKELY( ! session))
85 return;
87 status = PR_TRUE;
88 test = t;
89 test->mSession = session;
92 aaBug133Test::RAII::~RAII()
94 test->mSession = nsnull;
95 test = nsnull;
97 nsresult rv;
98 nsCOMPtr<aaIManager> manager =
99 do_CreateInstance(AA_MANAGER_CONTRACT_ID, &rv);
100 if (NS_UNLIKELY( ! manager))
101 return;
103 manager->Backup("bug133.sqlite");
104 manager->Restore("storage.sqlite");
107 /* Private methods */
108 nsresult
109 aaBug133Test::testRounding(nsITestRunner *aTestRunner)
111 nsresult rv;
112 NS_TEST_BEGIN(aTestRunner);
114 nsCOMPtr<aaIResource> x, y;
116 nsCOMPtr<aaIEntity> K, L, M, N;
118 nsCOMPtr<aaIFlow> a, b, c, d;
120 nsCOMPtr<aaIFact> fact;
121 nsCOMPtr<aaIEvent> event;
122 nsCOMPtr<nsIMutableArray> block;
123 PRExplodedTime tm = {0,0,0,12,26,1,2008};
125 nsCOMPtr<aaITransaction> txn;
127 /* Create resources and entities */
129 x = do_CreateInstance("@aasii.org/base/resource;1", &rv);
130 NS_TEST_ASSERT_OK(rv);
131 NS_ENSURE_SUCCESS(rv, rv);
132 rv = x->SetTag(NS_LITERAL_STRING("x"));
133 NS_TEST_ASSERT_OK(rv);
134 NS_ENSURE_SUCCESS(rv, rv);
135 rv = mSession->Save(x, nsnull);
136 NS_TEST_ASSERT_OK(rv);
137 NS_ENSURE_SUCCESS(rv, rv);
139 y = do_CreateInstance("@aasii.org/base/resource;1", &rv);
140 NS_TEST_ASSERT_OK(rv);
141 NS_ENSURE_SUCCESS(rv, rv);
142 rv = y->SetTag(NS_LITERAL_STRING("y"));
143 NS_TEST_ASSERT_OK(rv);
144 NS_ENSURE_SUCCESS(rv, rv);
145 rv = mSession->Save(y, nsnull);
146 NS_TEST_ASSERT_OK(rv);
147 NS_ENSURE_SUCCESS(rv, rv);
149 K = do_CreateInstance("@aasii.org/base/entity;1", &rv);
150 NS_TEST_ASSERT_OK(rv);
151 NS_ENSURE_SUCCESS(rv, rv);
152 rv = K->SetTag(NS_LITERAL_STRING("K"));
153 NS_TEST_ASSERT_OK(rv);
154 NS_ENSURE_SUCCESS(rv, rv);
155 rv = mSession->Save(K, nsnull);
156 NS_TEST_ASSERT_OK(rv);
157 NS_ENSURE_SUCCESS(rv, rv);
159 L = do_CreateInstance("@aasii.org/base/entity;1", &rv);
160 NS_TEST_ASSERT_OK(rv);
161 NS_ENSURE_SUCCESS(rv, rv);
162 rv = L->SetTag(NS_LITERAL_STRING("L"));
163 NS_TEST_ASSERT_OK(rv);
164 NS_ENSURE_SUCCESS(rv, rv);
165 rv = mSession->Save(L, nsnull);
166 NS_TEST_ASSERT_OK(rv);
167 NS_ENSURE_SUCCESS(rv, rv);
169 M = do_CreateInstance("@aasii.org/base/entity;1", &rv);
170 NS_TEST_ASSERT_OK(rv);
171 NS_ENSURE_SUCCESS(rv, rv);
172 rv = M->SetTag(NS_LITERAL_STRING("M"));
173 NS_TEST_ASSERT_OK(rv);
174 NS_ENSURE_SUCCESS(rv, rv);
175 rv = mSession->Save(M, nsnull);
176 NS_TEST_ASSERT_OK(rv);
177 NS_ENSURE_SUCCESS(rv, rv);
179 N = do_CreateInstance("@aasii.org/base/entity;1", &rv);
180 NS_TEST_ASSERT_OK(rv);
181 NS_ENSURE_SUCCESS(rv, rv);
182 rv = N->SetTag(NS_LITERAL_STRING("N"));
183 NS_TEST_ASSERT_OK(rv);
184 NS_ENSURE_SUCCESS(rv, rv);
185 rv = mSession->Save(N, nsnull);
186 NS_TEST_ASSERT_OK(rv);
187 NS_ENSURE_SUCCESS(rv, rv);
190 /* Create accounts and init chart */
192 a = do_CreateInstance("@aasii.org/base/flow;1", &rv);
193 NS_TEST_ASSERT_OK(rv);
194 NS_ENSURE_SUCCESS(rv, rv);
195 a->SetEntity(K);
196 a->SetGiveResource(x);
197 a->SetTakeResource(y);
198 a->SetRate(1.0/100.0);
199 a->SetTag(NS_LITERAL_STRING("a"));
200 mSession->Save(a, nsnull);
201 NS_TEST_ASSERT_OK(rv);
202 NS_ENSURE_SUCCESS(rv, rv);
204 b = do_CreateInstance("@aasii.org/base/flow;1", &rv);
205 NS_TEST_ASSERT_OK(rv);
206 NS_ENSURE_SUCCESS(rv, rv);
207 b->SetEntity(L);
208 b->SetGiveResource(y);
209 b->SetTakeResource(y);
210 b->SetRate(1.0);
211 b->SetTag(NS_LITERAL_STRING("b"));
212 mSession->Save(b, nsnull);
213 NS_TEST_ASSERT_OK(rv);
214 NS_ENSURE_SUCCESS(rv, rv);
216 c = do_CreateInstance("@aasii.org/base/flow;1", &rv);
217 NS_TEST_ASSERT_OK(rv);
218 NS_ENSURE_SUCCESS(rv, rv);
219 c->SetEntity(M);
220 c->SetGiveResource(y);
221 c->SetTakeResource(x);
222 c->SetRate(150.0);
223 c->SetTag(NS_LITERAL_STRING("c"));
224 mSession->Save(c, nsnull);
225 NS_TEST_ASSERT_OK(rv);
226 NS_ENSURE_SUCCESS(rv, rv);
228 d = do_CreateInstance("@aasii.org/base/flow;1", &rv);
229 NS_TEST_ASSERT_OK(rv);
230 NS_ENSURE_SUCCESS(rv, rv);
231 d->SetEntity(N);
232 d->SetGiveResource(x);
233 d->SetTakeResource(x);
234 d->SetRate(1.0);
235 d->SetTag(NS_LITERAL_STRING("d"));
236 mSession->Save(d, nsnull);
237 NS_TEST_ASSERT_OK(rv);
238 NS_ENSURE_SUCCESS(rv, rv);
240 nsCOMPtr<aaIQuote> quote =
241 do_CreateInstance("@aasii.org/base/quote;1", &rv);
242 NS_TEST_ASSERT_OK(rv);
243 NS_ENSURE_SUCCESS(rv, rv);
244 quote->SetResource(x);
245 quote->SetRate(1.0);
246 quote->SetTime(PR_ImplodeTime(&tm));
247 mSession->Save(quote, nsnull);
248 NS_TEST_ASSERT_OK(rv);
249 NS_ENSURE_SUCCESS(rv, rv);
252 /* Execute transfers and measurement */
254 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
255 NS_TEST_ASSERT_OK(rv);
256 NS_ENSURE_SUCCESS(rv, rv);
257 fact->SetTakeFrom(a);
258 fact->SetGiveTo(b);
259 fact->SetAmount(300.0);
260 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
261 NS_TEST_ASSERT_OK(rv);
262 NS_ENSURE_SUCCESS(rv, rv);
263 event->SetTime(PR_ImplodeTime(&tm));
264 block = do_QueryInterface(event, &rv);
265 NS_TEST_ASSERT_OK(rv);
266 NS_ENSURE_SUCCESS(rv, rv);
267 block->AppendElement(fact, PR_FALSE);
268 rv = mSession->Save(event, nsnull);
269 NS_TEST_ASSERT_OK(rv);
270 NS_ENSURE_SUCCESS(rv, rv);
271 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
272 txn->SetFact(fact);
273 rv = mSession->Save(txn, nsnull);
274 NS_TEST_ASSERT_OK(rv);
275 NS_ENSURE_SUCCESS(rv, rv);
277 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
278 NS_TEST_ASSERT_OK(rv);
279 NS_ENSURE_SUCCESS(rv, rv);
280 fact->SetTakeFrom(b);
281 fact->SetGiveTo(c);
282 fact->SetAmount(200.0);
283 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
284 NS_TEST_ASSERT_OK(rv);
285 NS_ENSURE_SUCCESS(rv, rv);
286 event->SetTime(PR_ImplodeTime(&tm));
287 block = do_QueryInterface(event, &rv);
288 NS_TEST_ASSERT_OK(rv);
289 NS_ENSURE_SUCCESS(rv, rv);
290 block->AppendElement(fact, PR_FALSE);
291 rv = mSession->Save(event, nsnull);
292 NS_TEST_ASSERT_OK(rv);
293 NS_ENSURE_SUCCESS(rv, rv);
294 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
295 txn->SetFact(fact);
296 rv = mSession->Save(txn, nsnull);
297 NS_TEST_ASSERT_OK(rv);
298 NS_ENSURE_SUCCESS(rv, rv);
300 fact = do_CreateInstance("@aasii.org/base/fact;1", &rv);
301 NS_TEST_ASSERT_OK(rv);
302 NS_ENSURE_SUCCESS(rv, rv);
303 fact->SetTakeFrom(c);
304 fact->SetGiveTo(d);
305 fact->SetAmount(20000.0);
306 event = do_CreateInstance("@aasii.org/base/event;1", &rv);
307 NS_TEST_ASSERT_OK(rv);
308 NS_ENSURE_SUCCESS(rv, rv);
309 event->SetTime(PR_ImplodeTime(&tm));
310 block = do_QueryInterface(event, &rv);
311 NS_TEST_ASSERT_OK(rv);
312 NS_ENSURE_SUCCESS(rv, rv);
313 block->AppendElement(fact, PR_FALSE);
314 rv = mSession->Save(event, nsnull);
315 NS_TEST_ASSERT_OK(rv);
316 NS_ENSURE_SUCCESS(rv, rv);
317 txn = do_CreateInstance("@aasii.org/base/transaction;1", &rv);
318 txn->SetFact(fact);
319 rv = mSession->Save(txn, nsnull);
320 NS_TEST_ASSERT_OK(rv);
321 NS_ENSURE_SUCCESS(rv, rv);
324 /* Test error condition */
326 nsCOMPtr<aaILoadQuery> set;
327 rv = mSession->CreateQuery(AA_LOADBALANCE_CONTRACT_ID, getter_AddRefs( set ));
328 NS_TEST_ASSERT_OK(rv);
329 NS_ENSURE_TRUE(set, rv);
330 rv = set->Load();
331 NS_TEST_ASSERT_OK(rv);
333 nsCOMPtr<aaIBalance> balance(do_QueryElementAt(set, 2));
334 NS_TEST_ASSERT_MSG(testBalance(aTestRunner, balance, 3, 1, 10000.0,
335 10000.0, 1),
336 "[bug 133] flow 'c' is wrong");
339 return NS_OK;