1 module tests.more_tests;
2 
3 import quantities;
4 import std.math : approxEqual;
5 
6 @("qVariant")
7 unittest
8 {
9     assert(is(typeof(meter.qVariant) == QVariant!double));
10     assert(meter == unit!double("L", 1));
11     assert(QVariant!double(meter) == unit!double("L", 1));
12 }
13 
14 @("QVariant/Quantity")
15 @safe pure unittest
16 {
17     enum meterVariant = meter.qVariant;
18     assert(meterVariant.value(meter) == 1);
19     assert(meterVariant.isConsistentWith(meter));
20     meterVariant = meter + (meter * meter) / meter;
21     assert(meterVariant.value(meter) == 1);
22     meterVariant += meter;
23     meterVariant -= meter;
24     assert(meterVariant.value(meter) == 1);
25     meterVariant *= meter;
26     meterVariant /= meter;
27     assert(meterVariant.value(meter) == 1);
28     assert(meterVariant == meter);
29     assert(meterVariant < 2 * meter);
30 
31     immutable secondVariant = (2 * second).qVariant;
32     auto test = secondVariant + second;
33     assert(test.value(second).approxEqual(3));
34     test = second + secondVariant;
35     assert(test.value(second).approxEqual(3));
36     test = secondVariant - second;
37     assert(test.value(second).approxEqual(1));
38     test = second - secondVariant;
39     assert(test.value(second).approxEqual(-1));
40     test = second * secondVariant;
41     assert(test.value(square(second)).approxEqual(2));
42     test = secondVariant * second;
43     assert(test.value(square(second)).approxEqual(2));
44     test = second / secondVariant;
45     assert(test.value(one).approxEqual(0.5));
46     test = secondVariant / second;
47     assert(test.value(one).approxEqual(2));
48     test = secondVariant % second;
49     assert(test.value(second).approxEqual(0));
50     test = (4 * second) % secondVariant;
51     assert(test.value(second).approxEqual(0));
52 }
53 
54 @("Quantity/QVariant")
55 unittest
56 {
57     Time duration = Time(parseSI("60 min"));
58     assert(duration.value(parseSI("min")) == 60);
59     duration = parseSI("60 s");
60     assert(duration.value(parseSI("s")) == 60);
61     assert(duration.isConsistentWith(parseSI("1 h")));
62 }
63 
64 @("Functions with QVariant parameters")
65 unittest
66 {
67     static QVariant!double catc(QVariant!double deltaAbs, QVariant!double deltaTime = 1 * minute)
68     out (result)
69     {
70         assert(result.isConsistentWith(katal / liter));
71     }
72     do
73     {
74         immutable epsilon = 6.3 * liter / milli(mole) / centi(meter);
75         immutable totalVolume = 285 * micro(liter);
76         immutable sampleVolume = 25 * micro(liter);
77         immutable lightPath = 0.6 * centi(meter);
78         return deltaAbs / deltaTime / (epsilon * lightPath) * totalVolume / sampleVolume;
79     }
80 
81     assert(catc(0.031.qVariant).value(parseSI("µmol/min/L")).approxEqual(93.5));
82 }
83 
84 @("Functions with Quantity parameters")
85 pure unittest
86 {
87     static auto catc(Dimensionless deltaAbs, Time deltaTime = 1 * minute)
88     {
89         enum epsilon = 6.3 * liter / milli(mole) / centi(meter);
90         enum totalVolume = 285 * micro(liter);
91         enum sampleVolume = 25 * micro(liter);
92         enum lightPath = 0.6 * centi(meter);
93         return deltaAbs / deltaTime / (epsilon * lightPath) * totalVolume / sampleVolume;
94     }
95 
96     static assert(catc(0.031 * one).value(si!"µmol/min/L").approxEqual(93.5));
97 }
98 
99 @("toString")
100 unittest
101 {
102     import std.conv : text;
103 
104     auto resistance = 4000 * ohm;
105     assert(resistance.text == "4000 [L^2 M T^-3 I^-2]");
106 }
107 
108 @("siFormat RT")
109 unittest
110 {
111     QVariant!double speed = 12.5 * kilo(meter) / hour;
112 
113     assert(siFormat("%.2f m/s", speed) == "3.47 m/s");
114     assert(siFormat("%.2f m/s"w, speed) == "3.47 m/s"w);
115     assert(siFormat("%.2f m/s"d, speed) == "3.47 m/s"d);
116 }