1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
4 * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "xpcom-config.h"
24 #include "nsIGenericFactory.h"
25 #include "nsComponentManagerUtils.h"
26 #include "nsStringAPI.h"
27 #include "nsEmbedString.h"
28 #include "nsIMutableArray.h"
29 #include "nsArrayUtils.h"
32 #include "mozIStorageConnection.h"
33 #include "nsTestUtils.h"
34 #include "nsITestRunner.h"
36 /* Project includes */
37 #include "aaIResource.h"
38 #include "aaIEntity.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"
55 aaBug133Test::Test(nsITestRunner
*aTestRunner
)
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
);
67 NS_IMPL_ISUPPORTS1(aaBug133Test
, nsITest
)
70 aaBug133Test::RAII::RAII(aaBug133Test
*t
)
71 :status(PR_FALSE
), test(nsnull
)
75 nsCOMPtr
<aaIManager
> manager
=
76 do_CreateInstance(AA_MANAGER_CONTRACT_ID
, &rv
);
77 if (NS_UNLIKELY( ! manager
))
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
))
89 test
->mSession
= session
;
92 aaBug133Test::RAII::~RAII()
94 test
->mSession
= nsnull
;
98 nsCOMPtr
<aaIManager
> manager
=
99 do_CreateInstance(AA_MANAGER_CONTRACT_ID
, &rv
);
100 if (NS_UNLIKELY( ! manager
))
103 manager
->Backup("bug133.sqlite");
104 manager
->Restore("storage.sqlite");
107 /* Private methods */
109 aaBug133Test::testRounding(nsITestRunner
*aTestRunner
)
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
);
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
);
208 b
->SetGiveResource(y
);
209 b
->SetTakeResource(y
);
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
);
220 c
->SetGiveResource(y
);
221 c
->SetTakeResource(x
);
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
);
232 d
->SetGiveResource(x
);
233 d
->SetTakeResource(x
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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,
336 "[bug 133] flow 'c' is wrong");