1 /**
2 * \file TestUtilsUnit.c
3 * \brief Utilities on units unit tests (no pun intended)
4 * \author Sarah Keating and Ralph Gauges
5 *
6 * <!--------------------------------------------------------------------------
7 * This file is part of libSBML. Please visit http://sbml.org for more
8 * information about SBML, and the latest version of libSBML.
9 *
10 * Copyright (C) 2020 jointly by the following organizations:
11 * 1. California Institute of Technology, Pasadena, CA, USA
12 * 2. University of Heidelberg, Heidelberg, Germany
13 * 3. University College London, London, UK
14 *
15 * Copyright (C) 2019 jointly by the following organizations:
16 * 1. California Institute of Technology, Pasadena, CA, USA
17 * 2. University of Heidelberg, Heidelberg, Germany
18 *
19 * Copyright (C) 2013-2018 jointly by the following organizations:
20 * 1. California Institute of Technology, Pasadena, CA, USA
21 * 2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
22 * 3. University of Heidelberg, Heidelberg, Germany
23 *
24 * Copyright (C) 2009-2013 jointly by the following organizations:
25 * 1. California Institute of Technology, Pasadena, CA, USA
26 * 2. EMBL European Bioinformatics Institute (EMBL-EBI), Hinxton, UK
27 *
28 * Copyright (C) 2006-2008 by the California Institute of Technology,
29 * Pasadena, CA, USA
30 *
31 * Copyright (C) 2002-2005 jointly by the following organizations:
32 * 1. California Institute of Technology, Pasadena, CA, USA
33 * 2. Japan Science and Technology Agency, Japan
34 *
35 * This library is free software; you can redistribute it and/or modify it
36 * under the terms of the GNU Lesser General Public License as published by
37 * the Free Software Foundation. A copy of the license agreement is provided
38 * in the file named "LICENSE.txt" included with this software distribution
39 * and also available online as http://sbml.org/software/libsbml/license.html
40 * ---------------------------------------------------------------------- -->*/
41
42 #include <sbml/common/common.h>
43
44 #include <sbml/Unit.h>
45 #include <sbml/UnitDefinition.h>
46 #include <sbml/math/ASTNode.h>
47
48 #include <check.h>
49
50 LIBSBML_CPP_NAMESPACE_USE
51
52 BEGIN_C_DECLS
53
START_TEST(test_unit_remove_scale)54 START_TEST(test_unit_remove_scale)
55 {
56 Unit * u = new Unit(2, 4);
57 u->setKind(UNIT_KIND_LITRE);
58 u->setScale(-3);
59
60 Unit::removeScale(u);
61
62 fail_unless(u->getMultiplier() == 0.001);
63 fail_unless(u->getScale() == 0);
64 fail_unless(u->getExponent() == 1);
65 fail_unless(u->getOffset() == 0.0);
66 fail_unless(u->getKind() == UNIT_KIND_LITRE);
67
68 delete u;
69 }
70 END_TEST
71
START_TEST(test_unit_merge_units)72 START_TEST(test_unit_merge_units)
73 {
74 Unit * u = new Unit(2, 4);
75 u->setKind(UNIT_KIND_LITRE);
76 u->setScale(-3);
77 u->setMultiplier(2);
78 Unit * u1 = new Unit(2, 4);
79 u1->setKind(UNIT_KIND_LITRE);
80 u1->setExponent(2);
81 u1->setMultiplier(2);
82
83 Unit::merge(u, u1);
84
85 fail_unless(u->getMultiplier() == 0.2);
86 fail_unless(u->getScale() == 0);
87 fail_unless(u->getExponent() == 3);
88 fail_unless(u->getOffset() == 0.0);
89 fail_unless(u->getKind() == UNIT_KIND_LITRE);
90
91 fail_unless(u1->getMultiplier() == 2);
92 fail_unless(u1->getScale() == 0);
93 fail_unless(u1->getExponent() == 2);
94 fail_unless(u1->getOffset() == 0.0);
95 fail_unless(u1->getKind() == UNIT_KIND_LITRE);
96
97 delete u;
98 delete u1;
99 }
100 END_TEST
101
START_TEST(test_unit_merge_units_1)102 START_TEST(test_unit_merge_units_1)
103 {
104 Unit * u = new Unit(2, 4);
105 u->setKind(UNIT_KIND_LITRE);
106 u->setScale(-3);
107 u->setMultiplier(2);
108 Unit * u1 = new Unit(2, 4);
109 u1->setKind(UNIT_KIND_LITRE);
110 u1->setExponent(0);
111 u1->setMultiplier(2);
112
113 Unit::merge(u, u1);
114
115 fail_unless(u->getMultiplier() == 0.004);
116 fail_unless(u->getScale() == 0);
117 fail_unless(u->getExponent() == 1);
118 fail_unless(u->getOffset() == 0.0);
119 fail_unless(u->getKind() == UNIT_KIND_LITRE);
120
121 delete u;
122 delete u1;
123 }
124 END_TEST
125
START_TEST(test_unit_convert_SI)126 START_TEST(test_unit_convert_SI)
127 {
128 UnitDefinition * ud;
129
130 /* Avogadro */
131 Unit * u1 = new Unit(3, 1);
132 u1->setKind(UNIT_KIND_AVOGADRO);
133 u1->initDefaults();
134
135 ud = Unit::convertToSI(u1);
136
137 fail_unless(ud->getNumUnits() == 1);
138
139 fail_unless(ud->getUnit(0)->getMultiplier() == 6.02214179e23);
140 fail_unless(ud->getUnit(0)->getScale() == 0);
141 fail_unless(ud->getUnit(0)->getExponent() == 1);
142 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_DIMENSIONLESS);
143 delete ud;
144
145 ///* Ampere */
146 Unit * u = new Unit(2, 4);
147 u->setKind(UNIT_KIND_AMPERE);
148 u->setScale(-3);
149 u->setMultiplier(2);
150
151 ud = Unit::convertToSI(u);
152
153 fail_unless(ud->getNumUnits() == 1);
154
155 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
156 fail_unless(ud->getUnit(0)->getScale() == 0);
157 fail_unless(ud->getUnit(0)->getExponent() == 1);
158 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
159 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
160 delete ud;
161
162 /* becquerel */
163 /* 1 becquerel = 1 sec^-1 = (0.1 sec)^-1 */
164 u->setKind(UNIT_KIND_BECQUEREL);
165 u->setMultiplier(2);
166 u->setScale(0);
167 u->setExponent(1);
168 u->setOffset(0.0);
169
170 ud = Unit::convertToSI(u);
171
172 fail_unless(ud->getNumUnits() == 1);
173
174 fail_unless(ud->getUnit(0)->getMultiplier() == 0.5);
175 fail_unless(ud->getUnit(0)->getScale() == 0);
176 fail_unless(ud->getUnit(0)->getExponent() == -1);
177 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
178 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_SECOND);
179 delete ud;
180
181 ///* candela */
182 u->setKind(UNIT_KIND_CANDELA);
183 u->setMultiplier(2);
184 u->setScale(0);
185 u->setExponent(1);
186 u->setOffset(0.0);
187
188 ud = Unit::convertToSI(u);
189
190 fail_unless(ud->getNumUnits() == 1);
191
192 fail_unless(ud->getUnit(0)->getMultiplier() == 2);
193 fail_unless(ud->getUnit(0)->getScale() == 0);
194 fail_unless(ud->getUnit(0)->getExponent() == 1);
195 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
196 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_CANDELA);
197 delete ud;
198
199 ///* Celsius
200 //u->setKind(UNIT_KIND_CELSIUS);
201 //u->setMultiplier(1);
202 //u->setScale(0);
203 //u->setExponent(1);
204 //u->setOffset(0.0);
205 //
206 //ud = Unit::convertToSI(u);
207
208 //fail_unless(ud->getNumUnits() == 1);
209
210 //fail_unless(ud->getUnit(0)->getMultiplier() == 1);
211 //fail_unless(ud->getUnit(0)->getScale() == 0);
212 //fail_unless(ud->getUnit(0)->getExponent() == 1);
213 //fail_unless(ud->getUnit(0)->getOffset() == 273.15);
214 //fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KELVIN);
215 //*/
216
217 ///* coulomb */
218 ///* 1 coulomb = 1 Ampere second */
219 u->setKind(UNIT_KIND_COULOMB);
220 u->setMultiplier(2);
221 u->setScale(0);
222 u->setExponent(1);
223 u->setOffset(0.0);
224
225 ud = Unit::convertToSI(u);
226
227 fail_unless(ud->getNumUnits() == 2);
228
229 fail_unless(ud->getUnit(0)->getMultiplier() == 2);
230 fail_unless(ud->getUnit(0)->getScale() == 0);
231 fail_unless(ud->getUnit(0)->getExponent() == 1);
232 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
233 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
234
235 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
236 fail_unless(ud->getUnit(1)->getScale() == 0);
237 fail_unless(ud->getUnit(1)->getExponent() == 1);
238 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
239 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND);
240 delete ud;
241
242 ///* dimensionless */
243 u->setKind(UNIT_KIND_DIMENSIONLESS);
244 u->setMultiplier(2);
245 u->setScale(0);
246 u->setExponent(1);
247 u->setOffset(0.0);
248
249 ud = Unit::convertToSI(u);
250
251 fail_unless(ud->getNumUnits() == 1);
252
253 fail_unless(ud->getUnit(0)->getMultiplier() == 2);
254 fail_unless(ud->getUnit(0)->getScale() == 0);
255 fail_unless(ud->getUnit(0)->getExponent() == 1);
256 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
257 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_DIMENSIONLESS);
258 delete ud;
259
260 ///* farad */
261 ///* 1 Farad = 1 m^-2 kg^-1 s^4 A^2 */
262 u->setKind(UNIT_KIND_FARAD);
263 u->setMultiplier(1);
264 u->setScale(0);
265 u->setExponent(1);
266 u->setOffset(0.0);
267
268 ud = Unit::convertToSI(u);
269
270 fail_unless(ud->getNumUnits() == 4);
271
272 fail_unless(ud->getUnit(0)->getMultiplier() == 1);
273 fail_unless(ud->getUnit(0)->getScale() == 0);
274 fail_unless(ud->getUnit(0)->getExponent() == 2);
275 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
276 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
277
278 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
279 fail_unless(ud->getUnit(1)->getScale() == 0);
280 fail_unless(ud->getUnit(1)->getExponent() == -1);
281 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
282 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
283
284 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
285 fail_unless(ud->getUnit(2)->getScale() == 0);
286 fail_unless(ud->getUnit(2)->getExponent() == -2);
287 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
288 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE);
289
290 fail_unless(ud->getUnit(3)->getMultiplier() == 1);
291 fail_unless(ud->getUnit(3)->getScale() == 0);
292 fail_unless(ud->getUnit(3)->getExponent() == 4);
293 fail_unless(ud->getUnit(3)->getOffset() == 0.0);
294 fail_unless(ud->getUnit(3)->getKind() == UNIT_KIND_SECOND);
295 delete ud;
296
297 ///* gram */
298 ///* 1 gram = 0.001 Kg */
299 u->setKind(UNIT_KIND_GRAM);
300 u->setMultiplier(2);
301 u->setScale(0);
302 u->setExponent(1);
303 u->setOffset(0.0);
304
305 ud = Unit::convertToSI(u);
306
307 fail_unless(ud->getNumUnits() == 1);
308
309 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
310 fail_unless(ud->getUnit(0)->getScale() == 0);
311 fail_unless(ud->getUnit(0)->getExponent() == 1);
312 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
313 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KILOGRAM);
314 delete ud;
315
316 ///* gray */
317 ///* 1 Gray = 1 m^2 sec^-2 */
318 u->setKind(UNIT_KIND_GRAY);
319 u->setMultiplier(1);
320 u->setScale(0);
321 u->setExponent(1);
322 u->setOffset(0.0);
323
324 ud = Unit::convertToSI(u);
325
326 fail_unless(ud->getNumUnits() == 2);
327
328 fail_unless(ud->getUnit(0)->getMultiplier() == 1);
329 fail_unless(ud->getUnit(0)->getScale() == 0);
330 fail_unless(ud->getUnit(0)->getExponent() == 2);
331 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
332 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE);
333
334 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
335 fail_unless(ud->getUnit(1)->getScale() == 0);
336 fail_unless(ud->getUnit(1)->getExponent() == -2);
337 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
338 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND);
339 delete ud;
340
341 ///* henry */
342 ///* 1 Henry = 1 m^2 kg s^-2 A^-2 */
343 u->setKind(UNIT_KIND_HENRY);
344 u->setMultiplier(4);
345 u->setScale(0);
346 u->setExponent(1);
347 u->setOffset(0.0);
348
349 ud = Unit::convertToSI(u);
350
351 fail_unless(ud->getNumUnits() == 4);
352
353 fail_unless(ud->getUnit(0)->getMultiplier() == 0.5);
354 fail_unless(ud->getUnit(0)->getScale() == 0);
355 fail_unless(ud->getUnit(0)->getExponent() == -2);
356 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
357 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
358
359 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
360 fail_unless(ud->getUnit(1)->getScale() == 0);
361 fail_unless(ud->getUnit(1)->getExponent() == 1);
362 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
363 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
364
365 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
366 fail_unless(ud->getUnit(2)->getScale() == 0);
367 fail_unless(ud->getUnit(2)->getExponent() == 2);
368 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
369 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE);
370
371 fail_unless(ud->getUnit(3)->getMultiplier() == 1);
372 fail_unless(ud->getUnit(3)->getScale() == 0);
373 fail_unless(ud->getUnit(3)->getExponent() == -2);
374 fail_unless(ud->getUnit(3)->getOffset() == 0.0);
375 fail_unless(ud->getUnit(3)->getKind() == UNIT_KIND_SECOND);
376 delete ud;
377
378 ///* hertz */
379 ///* 1 hertz = 1 sec^-1 = (0.1 sec)^-1 */
380 u->setKind(UNIT_KIND_HERTZ);
381 u->setMultiplier(1);
382 u->setScale(0);
383 u->setExponent(1);
384 u->setOffset(0.0);
385
386 ud = Unit::convertToSI(u);
387
388 fail_unless(ud->getNumUnits() == 1);
389
390 fail_unless(ud->getUnit(0)->getMultiplier() == 1);
391 fail_unless(ud->getUnit(0)->getScale() == 0);
392 fail_unless(ud->getUnit(0)->getExponent() == -1);
393 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
394 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_SECOND);
395 delete ud;
396
397 ///* item */
398 u->setKind(UNIT_KIND_ITEM);
399 u->setMultiplier(2);
400 u->setScale(0);
401 u->setExponent(1);
402 u->setOffset(0.0);
403
404 ud = Unit::convertToSI(u);
405
406 fail_unless(ud->getNumUnits() == 1);
407
408 fail_unless(ud->getUnit(0)->getMultiplier() == 2);
409 fail_unless(ud->getUnit(0)->getScale() == 0);
410 fail_unless(ud->getUnit(0)->getExponent() == 1);
411 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
412 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_ITEM);
413 delete ud;
414
415 ///* joule */
416 ///* 1 joule = 1 m^2 kg s^-2 */
417 u->setKind(UNIT_KIND_JOULE);
418 u->setMultiplier(2);
419 u->setScale(0);
420 u->setExponent(1);
421 u->setOffset(0.0);
422
423 ud = Unit::convertToSI(u);
424
425 fail_unless(ud->getNumUnits() == 3);
426
427 fail_unless(ud->getUnit(0)->getMultiplier() == 2.0);
428 fail_unless(ud->getUnit(0)->getScale() == 0);
429 fail_unless(ud->getUnit(0)->getExponent() == 1);
430 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
431 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KILOGRAM);
432
433 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
434 fail_unless(ud->getUnit(1)->getScale() == 0);
435 fail_unless(ud->getUnit(1)->getExponent() == 2);
436 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
437 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_METRE);
438
439 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
440 fail_unless(ud->getUnit(2)->getScale() == 0);
441 fail_unless(ud->getUnit(2)->getExponent() == -2);
442 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
443 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_SECOND);
444 delete ud;
445
446 ///* katal */
447 ///* 1 katal = 1 mol s^-1 */
448 u->setKind(UNIT_KIND_KATAL);
449 u->setMultiplier(2);
450 u->setScale(0);
451 u->setExponent(1);
452 u->setOffset(0.0);
453
454 ud = Unit::convertToSI(u);
455
456 fail_unless(ud->getNumUnits() == 2);
457
458 fail_unless(ud->getUnit(0)->getMultiplier() == 2.0);
459 fail_unless(ud->getUnit(0)->getScale() == 0);
460 fail_unless(ud->getUnit(0)->getExponent() == 1);
461 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
462 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE);
463
464 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
465 fail_unless(ud->getUnit(1)->getScale() == 0);
466 fail_unless(ud->getUnit(1)->getExponent() == -1);
467 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
468 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND);
469 delete ud;
470
471 ///* kelvin */
472 u->setKind(UNIT_KIND_KELVIN);
473 u->setMultiplier(2);
474 u->setScale(-3);
475 u->setExponent(1);
476 u->setOffset(0.0);
477
478 ud = Unit::convertToSI(u);
479
480 fail_unless(ud->getNumUnits() == 1);
481
482 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
483 fail_unless(ud->getUnit(0)->getScale() == 0);
484 fail_unless(ud->getUnit(0)->getExponent() == 1);
485 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
486 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KELVIN);
487 delete ud;
488
489 ///* kilogram */
490 u->setKind(UNIT_KIND_KILOGRAM);
491 u->setMultiplier(2);
492 u->setScale(-3);
493 u->setExponent(1);
494 u->setOffset(0.0);
495
496 ud = Unit::convertToSI(u);
497
498 fail_unless(ud->getNumUnits() == 1);
499
500 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
501 fail_unless(ud->getUnit(0)->getScale() == 0);
502 fail_unless(ud->getUnit(0)->getExponent() == 1);
503 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
504 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KILOGRAM);
505 delete ud;
506
507 ///* litre */
508 ///* 1 litre = 0.001 m^3 = (0.1 m)^3*/
509 u->setKind(UNIT_KIND_LITRE);
510 u->setMultiplier(8);
511 u->setScale(-3);
512 u->setExponent(1);
513 u->setOffset(0.0);
514
515 ud = Unit::convertToSI(u);
516
517 fail_unless(ud->getNumUnits() == 1);
518
519 fail_unless(ud->getUnit(0)->getMultiplier() == 0.02);
520 fail_unless(ud->getUnit(0)->getScale() == 0);
521 fail_unless(ud->getUnit(0)->getExponent() == 3);
522 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
523 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE);
524 delete ud;
525
526 // /* litre */
527 ///* 1 litre = 0.001 m^3 = (0.1 m)^3*/
528 u->setKind(UNIT_KIND_LITER);
529 u->setMultiplier(8);
530 u->setScale(-3);
531 u->setExponent(1);
532 u->setOffset(0.0);
533
534 ud = Unit::convertToSI(u);
535
536 fail_unless(ud->getNumUnits() == 1);
537
538 fail_unless(ud->getUnit(0)->getMultiplier() == 0.02);
539 fail_unless(ud->getUnit(0)->getScale() == 0);
540 fail_unless(ud->getUnit(0)->getExponent() == 3);
541 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
542 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE);
543 delete ud;
544
545 ///* lumen */
546 ///* 1 lumen = 1 candela*/
547 u->setKind(UNIT_KIND_LUMEN);
548 u->setMultiplier(2);
549 u->setScale(-3);
550 u->setExponent(1);
551 u->setOffset(0.0);
552
553 ud = Unit::convertToSI(u);
554
555 fail_unless(ud->getNumUnits() == 1);
556
557 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
558 fail_unless(ud->getUnit(0)->getScale() == 0);
559 fail_unless(ud->getUnit(0)->getExponent() == 1);
560 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
561 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_CANDELA);
562 delete ud;
563
564 ///* lux */
565 ///* 1 lux = 1 candela m^-2*/
566 u->setKind(UNIT_KIND_LUX);
567 u->setMultiplier(2);
568 u->setScale(0);
569 u->setExponent(1);
570 u->setOffset(0.0);
571
572 ud = Unit::convertToSI(u);
573
574 fail_unless(ud->getNumUnits() == 2);
575
576 fail_unless(ud->getUnit(0)->getMultiplier() == 2.0);
577 fail_unless(ud->getUnit(0)->getScale() == 0);
578 fail_unless(ud->getUnit(0)->getExponent() == 1);
579 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
580 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_CANDELA);
581
582 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
583 fail_unless(ud->getUnit(1)->getScale() == 0);
584 fail_unless(ud->getUnit(1)->getExponent() == -2);
585 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
586 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_METRE);
587 delete ud;
588
589 ///* metre */
590 u->setKind(UNIT_KIND_METRE);
591 u->setMultiplier(2);
592 u->setScale(-3);
593 u->setExponent(1);
594 u->setOffset(0.0);
595
596 ud = Unit::convertToSI(u);
597
598 fail_unless(ud->getNumUnits() == 1);
599
600 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
601 fail_unless(ud->getUnit(0)->getScale() == 0);
602 fail_unless(ud->getUnit(0)->getExponent() == 1);
603 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
604 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE);
605 delete ud;
606
607 ///* meter */
608 u->setKind(UNIT_KIND_METER);
609 u->setMultiplier(2);
610 u->setScale(-3);
611 u->setExponent(1);
612 u->setOffset(0.0);
613
614 ud = Unit::convertToSI(u);
615
616 fail_unless(ud->getNumUnits() == 1);
617
618 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
619 fail_unless(ud->getUnit(0)->getScale() == 0);
620 fail_unless(ud->getUnit(0)->getExponent() == 1);
621 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
622 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE);
623 delete ud;
624
625 ///* mole */
626 u->setKind(UNIT_KIND_MOLE);
627 u->setMultiplier(2);
628 u->setScale(-3);
629 u->setExponent(1);
630 u->setOffset(0.0);
631
632 ud = Unit::convertToSI(u);
633
634 fail_unless(ud->getNumUnits() == 1);
635
636 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
637 fail_unless(ud->getUnit(0)->getScale() == 0);
638 fail_unless(ud->getUnit(0)->getExponent() == 1);
639 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
640 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_MOLE);
641 delete ud;
642
643 ///* newton */
644 ///* 1 newton = 1 m kg s^-2 */
645 u->setKind(UNIT_KIND_NEWTON);
646 u->setMultiplier(2);
647 u->setScale(0);
648 u->setExponent(1);
649 u->setOffset(0.0);
650
651 ud = Unit::convertToSI(u);
652
653 fail_unless(ud->getNumUnits() == 3);
654
655 fail_unless(ud->getUnit(0)->getMultiplier() == 2.0);
656 fail_unless(ud->getUnit(0)->getScale() == 0);
657 fail_unless(ud->getUnit(0)->getExponent() == 1);
658 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
659 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KILOGRAM);
660
661 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
662 fail_unless(ud->getUnit(1)->getScale() == 0);
663 fail_unless(ud->getUnit(1)->getExponent() == 1);
664 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
665 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_METRE);
666
667 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
668 fail_unless(ud->getUnit(2)->getScale() == 0);
669 fail_unless(ud->getUnit(2)->getExponent() == -2);
670 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
671 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_SECOND);
672 delete ud;
673
674 ///* ohm */
675 ///* 1 ohm = 1 m^2 kg s^-3 A^-2 */
676 u->setKind(UNIT_KIND_OHM);
677 u->setMultiplier(4);
678 u->setScale(0);
679 u->setExponent(1);
680 u->setOffset(0.0);
681
682 ud = Unit::convertToSI(u);
683
684 fail_unless(ud->getNumUnits() == 4);
685
686 fail_unless(ud->getUnit(0)->getMultiplier() == 0.5);
687 fail_unless(ud->getUnit(0)->getScale() == 0);
688 fail_unless(ud->getUnit(0)->getExponent() == -2);
689 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
690 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
691
692 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
693 fail_unless(ud->getUnit(1)->getScale() == 0);
694 fail_unless(ud->getUnit(1)->getExponent() == 1);
695 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
696 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
697
698 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
699 fail_unless(ud->getUnit(2)->getScale() == 0);
700 fail_unless(ud->getUnit(2)->getExponent() == 2);
701 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
702 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE);
703
704 fail_unless(ud->getUnit(3)->getMultiplier() == 1);
705 fail_unless(ud->getUnit(3)->getScale() == 0);
706 fail_unless(ud->getUnit(3)->getExponent() == -3);
707 fail_unless(ud->getUnit(3)->getOffset() == 0.0);
708 fail_unless(ud->getUnit(3)->getKind() == UNIT_KIND_SECOND);
709 delete ud;
710
711 /* pascal */
712 /* 1 pascal = 1 m^-1 kg s^-2 */
713 u->setKind(UNIT_KIND_PASCAL);
714 u->setMultiplier(2);
715 u->setScale(0);
716 u->setExponent(1);
717 u->setOffset(0.0);
718
719 ud = Unit::convertToSI(u);
720
721 fail_unless(ud->getNumUnits() == 3);
722
723 fail_unless(ud->getUnit(0)->getMultiplier() == 2.0);
724 fail_unless(ud->getUnit(0)->getScale() == 0);
725 fail_unless(ud->getUnit(0)->getExponent() == 1);
726 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
727 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KILOGRAM);
728
729 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
730 fail_unless(ud->getUnit(1)->getScale() == 0);
731 fail_unless(ud->getUnit(1)->getExponent() == -1);
732 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
733 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_METRE);
734
735 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
736 fail_unless(ud->getUnit(2)->getScale() == 0);
737 fail_unless(ud->getUnit(2)->getExponent() == -2);
738 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
739 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_SECOND);
740 delete ud;
741
742 ///* radian */
743 u->setKind(UNIT_KIND_RADIAN);
744 u->setMultiplier(2);
745 u->setScale(0);
746 u->setExponent(1);
747 u->setOffset(0.0);
748
749 ud = Unit::convertToSI(u);
750
751 fail_unless(ud->getNumUnits() == 1);
752
753 fail_unless(ud->getUnit(0)->getMultiplier() == 2);
754 fail_unless(ud->getUnit(0)->getScale() == 0);
755 fail_unless(ud->getUnit(0)->getExponent() == 1);
756 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
757 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_DIMENSIONLESS);
758 delete ud;
759
760 ///* second */
761 u->setKind(UNIT_KIND_SECOND);
762 u->setMultiplier(2);
763 u->setScale(-3);
764 u->setExponent(1);
765 u->setOffset(0.0);
766
767 ud = Unit::convertToSI(u);
768
769 fail_unless(ud->getNumUnits() == 1);
770
771 fail_unless(ud->getUnit(0)->getMultiplier() == 0.002);
772 fail_unless(ud->getUnit(0)->getScale() == 0);
773 fail_unless(ud->getUnit(0)->getExponent() == 1);
774 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
775 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_SECOND);
776 delete ud;
777
778 ///* siemens */
779 ///* 1 siemen = 1 m^-2 kg^-1 s^3 A^2 */
780 u->setKind(UNIT_KIND_SIEMENS);
781 u->setMultiplier(1);
782 u->setScale(0);
783 u->setExponent(1);
784 u->setOffset(0.0);
785
786 ud = Unit::convertToSI(u);
787
788 fail_unless(ud->getNumUnits() == 4);
789
790 fail_unless(ud->getUnit(0)->getMultiplier() == 1);
791 fail_unless(ud->getUnit(0)->getScale() == 0);
792 fail_unless(ud->getUnit(0)->getExponent() == 2);
793 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
794 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
795
796 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
797 fail_unless(ud->getUnit(1)->getScale() == 0);
798 fail_unless(ud->getUnit(1)->getExponent() == -1);
799 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
800 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
801
802 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
803 fail_unless(ud->getUnit(2)->getScale() == 0);
804 fail_unless(ud->getUnit(2)->getExponent() == -2);
805 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
806 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE);
807
808 fail_unless(ud->getUnit(3)->getMultiplier() == 1);
809 fail_unless(ud->getUnit(3)->getScale() == 0);
810 fail_unless(ud->getUnit(3)->getExponent() == 3);
811 fail_unless(ud->getUnit(3)->getOffset() == 0.0);
812 fail_unless(ud->getUnit(3)->getKind() == UNIT_KIND_SECOND);
813 delete ud;
814
815 ///* sievert */
816 ///* 1 Sievert = 1 m^2 sec^-2 */
817 u->setKind(UNIT_KIND_SIEVERT);
818 u->setMultiplier(1);
819 u->setScale(0);
820 u->setExponent(1);
821 u->setOffset(0.0);
822
823 ud = Unit::convertToSI(u);
824
825 fail_unless(ud->getNumUnits() == 2);
826
827 fail_unless(ud->getUnit(0)->getMultiplier() == 1);
828 fail_unless(ud->getUnit(0)->getScale() == 0);
829 fail_unless(ud->getUnit(0)->getExponent() == 2);
830 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
831 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_METRE);
832
833 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
834 fail_unless(ud->getUnit(1)->getScale() == 0);
835 fail_unless(ud->getUnit(1)->getExponent() == -2);
836 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
837 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_SECOND);
838 delete ud;
839
840 ///* steradian */
841 u->setKind(UNIT_KIND_STERADIAN);
842 u->setMultiplier(2);
843 u->setScale(0);
844 u->setExponent(1);
845 u->setOffset(0.0);
846
847 ud = Unit::convertToSI(u);
848
849 fail_unless(ud->getNumUnits() == 1);
850
851 fail_unless(ud->getUnit(0)->getMultiplier() == 2);
852 fail_unless(ud->getUnit(0)->getScale() == 0);
853 fail_unless(ud->getUnit(0)->getExponent() == 1);
854 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
855 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_DIMENSIONLESS);
856 delete ud;
857
858 ///* tesla */
859 ///* 1 tesla = 1 kg s^-2 A^-1 */
860 u->setKind(UNIT_KIND_TESLA);
861 u->setMultiplier(2);
862 u->setScale(0);
863 u->setExponent(1);
864 u->setOffset(0.0);
865
866 ud = Unit::convertToSI(u);
867
868 fail_unless(ud->getNumUnits() == 3);
869
870 fail_unless(ud->getUnit(0)->getMultiplier() == 0.5);
871 fail_unless(ud->getUnit(0)->getScale() == 0);
872 fail_unless(ud->getUnit(0)->getExponent() == -1);
873 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
874 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
875
876 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
877 fail_unless(ud->getUnit(1)->getScale() == 0);
878 fail_unless(ud->getUnit(1)->getExponent() == 1);
879 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
880 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
881
882 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
883 fail_unless(ud->getUnit(2)->getScale() == 0);
884 fail_unless(ud->getUnit(2)->getExponent() == -2);
885 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
886 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_SECOND);
887 delete ud;
888
889 ///* volt */
890 ///* 1 volt = 1 m^2 kg s^-3 A^-1 */
891 u->setKind(UNIT_KIND_VOLT);
892 u->setMultiplier(2);
893 u->setScale(0);
894 u->setExponent(1);
895 u->setOffset(0.0);
896
897 ud = Unit::convertToSI(u);
898
899 fail_unless(ud->getNumUnits() == 4);
900
901 fail_unless(ud->getUnit(0)->getMultiplier() == 0.5);
902 fail_unless(ud->getUnit(0)->getScale() == 0);
903 fail_unless(ud->getUnit(0)->getExponent() == -1);
904 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
905 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
906
907 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
908 fail_unless(ud->getUnit(1)->getScale() == 0);
909 fail_unless(ud->getUnit(1)->getExponent() == 1);
910 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
911 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
912
913 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
914 fail_unless(ud->getUnit(2)->getScale() == 0);
915 fail_unless(ud->getUnit(2)->getExponent() == 2);
916 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
917 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE);
918
919 fail_unless(ud->getUnit(3)->getMultiplier() == 1);
920 fail_unless(ud->getUnit(3)->getScale() == 0);
921 fail_unless(ud->getUnit(3)->getExponent() == -3);
922 fail_unless(ud->getUnit(3)->getOffset() == 0.0);
923 fail_unless(ud->getUnit(3)->getKind() == UNIT_KIND_SECOND);
924 delete ud;
925
926 ///* watt */
927 ///* 1 watt = 1 m^2 kg s^-3 */
928 u->setKind(UNIT_KIND_WATT);
929 u->setMultiplier(2);
930 u->setScale(0);
931 u->setExponent(1);
932 u->setOffset(0.0);
933
934 ud = Unit::convertToSI(u);
935
936 fail_unless(ud->getNumUnits() == 3);
937
938 fail_unless(ud->getUnit(0)->getMultiplier() == 2.0);
939 fail_unless(ud->getUnit(0)->getScale() == 0);
940 fail_unless(ud->getUnit(0)->getExponent() == 1);
941 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
942 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_KILOGRAM);
943
944 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
945 fail_unless(ud->getUnit(1)->getScale() == 0);
946 fail_unless(ud->getUnit(1)->getExponent() == 2);
947 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
948 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_METRE);
949
950 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
951 fail_unless(ud->getUnit(2)->getScale() == 0);
952 fail_unless(ud->getUnit(2)->getExponent() == -3);
953 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
954 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_SECOND);
955 delete ud;
956
957 ///* weber */
958 ///* 1 weber = 1 m^2 kg s^-2 A^-1 */
959 u->setKind(UNIT_KIND_WEBER);
960 u->setMultiplier(2);
961 u->setScale(0);
962 u->setExponent(1);
963 u->setOffset(0.0);
964
965 ud = Unit::convertToSI(u);
966
967 fail_unless(ud->getNumUnits() == 4);
968
969 fail_unless(ud->getUnit(0)->getMultiplier() == 0.5);
970 fail_unless(ud->getUnit(0)->getScale() == 0);
971 fail_unless(ud->getUnit(0)->getExponent() == -1);
972 fail_unless(ud->getUnit(0)->getOffset() == 0.0);
973 fail_unless(ud->getUnit(0)->getKind() == UNIT_KIND_AMPERE);
974
975 fail_unless(ud->getUnit(1)->getMultiplier() == 1);
976 fail_unless(ud->getUnit(1)->getScale() == 0);
977 fail_unless(ud->getUnit(1)->getExponent() == 1);
978 fail_unless(ud->getUnit(1)->getOffset() == 0.0);
979 fail_unless(ud->getUnit(1)->getKind() == UNIT_KIND_KILOGRAM);
980
981 fail_unless(ud->getUnit(2)->getMultiplier() == 1);
982 fail_unless(ud->getUnit(2)->getScale() == 0);
983 fail_unless(ud->getUnit(2)->getExponent() == 2);
984 fail_unless(ud->getUnit(2)->getOffset() == 0.0);
985 fail_unless(ud->getUnit(2)->getKind() == UNIT_KIND_METRE);
986
987 fail_unless(ud->getUnit(3)->getMultiplier() == 1);
988 fail_unless(ud->getUnit(3)->getScale() == 0);
989 fail_unless(ud->getUnit(3)->getExponent() == -2);
990 fail_unless(ud->getUnit(3)->getOffset() == 0.0);
991 fail_unless(ud->getUnit(3)->getKind() == UNIT_KIND_SECOND);
992
993
994
995 delete u;
996 delete u1;
997 delete ud;
998
999 }
1000 END_TEST
1001
START_TEST(test_unit_areIdentical)1002 START_TEST(test_unit_areIdentical)
1003 {
1004 Unit * u = new Unit(2, 4);
1005 u->setKind(UNIT_KIND_LITRE);
1006 u->setScale(-3);
1007 Unit * u1 = new Unit(2, 4);
1008 u1->setKind(UNIT_KIND_LITRE);
1009 u1->setScale(-3);
1010
1011 int identical = Unit::areIdentical(u, u1);
1012
1013 fail_unless(identical == 1);
1014
1015 u->setKind(UNIT_KIND_KATAL);
1016 u->setMultiplier(2);
1017 u->setScale(0);
1018 u->setExponent(1);
1019 u->setOffset(0.0);
1020
1021 identical = Unit::areIdentical(u, u1);
1022
1023 fail_unless(identical == 0);
1024
1025 delete u;
1026 delete u1;
1027 }
1028 END_TEST
1029
START_TEST(test_unit_areEquivalent)1030 START_TEST(test_unit_areEquivalent)
1031 {
1032 Unit * u = new Unit(2, 4);
1033 u->setKind(UNIT_KIND_LITRE);
1034 Unit * u1 = new Unit(2, 4);
1035 u1->setKind(UNIT_KIND_LITRE);
1036 u1->setScale(-3);
1037
1038 int equivalent = Unit::areEquivalent(u, u1);
1039
1040 fail_unless(equivalent == 1);
1041
1042 u->setKind(UNIT_KIND_MOLE);
1043 u->setMultiplier(2);
1044 u->setScale(0);
1045 u->setExponent(1);
1046 u->setOffset(0.0);
1047
1048 equivalent = Unit::areEquivalent(u, u1);
1049
1050 fail_unless(equivalent == 0);
1051
1052 delete u;
1053 delete u1;
1054 }
1055 END_TEST
1056
1057
1058 Suite *
create_suite_UtilsUnit(void)1059 create_suite_UtilsUnit (void)
1060 {
1061 Suite *suite = suite_create("UtilsUnit");
1062 TCase *tcase = tcase_create("UtilsUnit");
1063
1064
1065 tcase_add_test( tcase, test_unit_remove_scale );
1066 tcase_add_test( tcase, test_unit_merge_units );
1067 tcase_add_test(tcase, test_unit_merge_units_1);
1068 tcase_add_test( tcase, test_unit_convert_SI );
1069 tcase_add_test( tcase, test_unit_areIdentical );
1070 tcase_add_test( tcase, test_unit_areEquivalent );
1071
1072 suite_add_tcase(suite, tcase);
1073
1074 return suite;
1075 }
1076
1077
1078 END_C_DECLS
1079