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 }