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 }