1 module tests.more_tests;
2 
3 import quantities;
4 import std.math : approxEqual;
5 
6 @("qVariant")
7 unittest
8 {
9     static assert(is(typeof(meter.qVariant) == QVariant!double));
10     static assert(meter == unit!double("L"));
11     static assert(QVariant!double(meter) == unit!double("L"));
12 }
13 
14 @("QVariant/Quantity")
15 @safe pure unittest
16 {
17     enum meterVariant = meter.qVariant;
18     static assert(meterVariant.value(meter) == 1);
19     static 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     static assert(meterVariant == meter);
29     static assert(meterVariant < 2 * meter);
30 
31     auto 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 @("Functions with QVariant parameters")
55 unittest
56 {
57     static QVariant!double catc(QVariant!double deltaAbs, QVariant!double deltaTime = 1 * minute)
58     out (result)
59     {
60         assert(result.isConsistentWith(katal / liter));
61     }
62     do
63     {
64         immutable epsilon = 6.3 * liter / milli(mole) / centi(meter);
65         immutable totalVolume = 285 * micro(liter);
66         immutable sampleVolume = 25 * micro(liter);
67         immutable lightPath = 0.6 * centi(meter);
68         return deltaAbs / deltaTime / (epsilon * lightPath) * totalVolume / sampleVolume;
69     }
70 
71     assert(catc(0.031.qVariant).value(parseSI("µmol/min/L")).approxEqual(93.5));
72 }
73 
74 @("Functions with Quantity parameters")
75 unittest
76 {
77     static auto catc(Dimensionless deltaAbs, Time deltaTime = 1 * minute)
78     {
79         enum epsilon = 6.3 * liter / milli(mole) / centi(meter);
80         enum totalVolume = 285 * micro(liter);
81         enum sampleVolume = 25 * micro(liter);
82         enum lightPath = 0.6 * centi(meter);
83         return deltaAbs / deltaTime / (epsilon * lightPath) * totalVolume / sampleVolume;
84     }
85 
86     static assert(catc(0.031 * one).value(si!"µmol/min/L").approxEqual(93.5));
87 }