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