File indexing completed on 2024-05-12 16:35:55
0001 /* This file is part of the KDE project 0002 Copyright 2007 Stefan Nikolaus <stefan.nikolaus@kdemail.net> 0003 Copyright 2006 Ariya Hidayat <ariya@kde.org> 0004 0005 This library is free software; you can redistribute it and/or 0006 modify it under the terms of the GNU Library General Public 0007 License as published by the Free Software Foundation; only 0008 version 2 of the License. 0009 0010 This library is distributed in the hope that it will be useful, 0011 but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0013 Library General Public License for more details. 0014 0015 You should have received a copy of the GNU Library General Public License 0016 along with this library; see the file COPYING.LIB. If not, write to 0017 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0018 Boston, MA 02110-1301, USA. 0019 */ 0020 #include "TestEngineeringFunctions.h" 0021 0022 #include "TestKspreadCommon.h" 0023 0024 void TestEngineeringFunctions::initTestCase() 0025 { 0026 FunctionModuleRegistry::instance()->loadFunctionModules(); 0027 } 0028 0029 // NOTE: we do not compare the numbers _exactly_ because it is difficult 0030 // to get one "true correct" expected values for the functions due to: 0031 // - different algorithms among spreadsheet programs 0032 // - precision limitation of floating-point number representation 0033 // - accuracy problem due to propagated error in the implementation 0034 #define CHECK_EVAL(x,y) QCOMPARE(evaluate(x),RoundNumber(y)) 0035 #define ROUND(x) (roundf(1e10 * x) / 1e10) 0036 0037 // round to get at most 10-digits number 0038 static Value RoundNumber(double f) 0039 { 0040 return Value(ROUND(f)); 0041 } 0042 0043 // round to get at most 10-digits number 0044 static Value RoundNumber(const Value& v) 0045 { 0046 if (v.isComplex()) { 0047 const double imag = numToDouble(v.asComplex().imag()); 0048 QString complex = QString::number(ROUND(numToDouble(v.asComplex().real())), 'g', 10); 0049 if (imag >= 0.0) 0050 complex += '+'; 0051 complex += QString::number(ROUND(imag), 'g', 10); 0052 complex += 'i'; 0053 return Value(complex); 0054 } else if (v.isNumber()) 0055 return Value(ROUND(numToDouble(v.asFloat()))); 0056 else 0057 return v; 0058 } 0059 0060 Value TestEngineeringFunctions::evaluate(const QString& formula) 0061 { 0062 Formula f; 0063 QString expr = formula; 0064 if (expr[0] != '=') 0065 expr.prepend('='); 0066 f.setExpression(expr); 0067 Value result = f.eval(); 0068 0069 #if 0 0070 // this magically generates the CHECKs 0071 printf(" CHECK_EVAL( \"%s\", %.14e) );\n", qPrintable(formula), result.asFloat()); 0072 #endif 0073 0074 return RoundNumber(result); 0075 } 0076 0077 void TestEngineeringFunctions::testBIN2DEC() 0078 { 0079 // ODF-tests 0080 CHECK_EVAL("BIN2DEC(1010)", Value(10)); 0081 CHECK_EVAL("BIN2DEC(11111)", Value(31)); 0082 // alternate function name 0083 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETBIN2DEC(1010)", Value(10)); 0084 } 0085 0086 void TestEngineeringFunctions::testBIN2OCT() 0087 { 0088 // ODF-tests 0089 CHECK_EVAL("BIN2OCT(1010)", Value("12")); 0090 CHECK_EVAL("BIN2OCT(11111)", Value("37")); 0091 // alternate function name 0092 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETBIN2OCT(1010)", Value("12")); 0093 } 0094 0095 void TestEngineeringFunctions::testBIN2HEX() 0096 { 0097 // ODF-tests 0098 CHECK_EVAL("BIN2HEX(1010)", Value("A")); 0099 CHECK_EVAL("BIN2HEX(11111)", Value("1F")); 0100 // alternate function name 0101 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETBIN2HEX(1010)", Value("A")); 0102 } 0103 0104 void TestEngineeringFunctions::testCOMPLEX() 0105 { 0106 CHECK_EVAL("=IMREAL(COMPLEX(1;-3))", 1.0); 0107 CHECK_EVAL("=IMAGINARY(COMPLEX(0;-2))", -2.0); 0108 CHECK_EVAL("=IMAGINARY(COMPLEX(0;-2;\"i\"))", -2.0 ); 0109 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETCOMPLEX(1;-3))", 1.0); 0110 } 0111 0112 void TestEngineeringFunctions::testCONVERT() 0113 { 0114 CHECK_EVAL("=CONVERT(32;\"C\";\"F\")", Value(89.6)); 0115 // CHECK_EVAL("=CONVERT(3;\"lbm\";\"kg\")", Value(1.3608)); 0116 // CHECK_EVAL("=CONVERT(7.9;\"cal\";\"J\")", Value(33.0757)); 0117 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETCONVERT(32;\"C\";\"F\")", Value(89.6)); 0118 } 0119 0120 void TestEngineeringFunctions::testDEC2HEX() 0121 { 0122 CHECK_EVAL("DEC2HEX(12)", Value("C")); 0123 CHECK_EVAL("DEC2HEX(55)", Value("37")); 0124 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETDEC2HEX(12)", Value("C")); 0125 } 0126 0127 void TestEngineeringFunctions::testDEC2BIN() 0128 { 0129 CHECK_EVAL("DEC2BIN(12)", Value("1100")); 0130 CHECK_EVAL("DEC2BIN(55)", Value("110111")); 0131 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETDEC2BIN(12)", Value("1100")); 0132 } 0133 0134 void TestEngineeringFunctions::testDEC2OCT() 0135 { 0136 CHECK_EVAL("DEC2OCT(12)", Value("14")); 0137 CHECK_EVAL("DEC2OCT(55)", Value("67")); 0138 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETDEC2OCT(12)", Value("14")); 0139 } 0140 0141 void TestEngineeringFunctions::testDELTA() 0142 { 0143 CHECK_EVAL("DELTA(1.2; 3.4)", Value(0)); 0144 CHECK_EVAL("DELTA(3;3)", Value(1)); 0145 // CHECK_EVAL("DELTA(1;TRUE)", Value(1)); 0146 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETDELTA(1.2; 3.4)", Value(0)); 0147 } 0148 0149 void TestEngineeringFunctions::testERF() 0150 { 0151 CHECK_EVAL("ERF(0.5)", Value(0.52049987781)); 0152 CHECK_EVAL("ERF(0.1)", Value(0.1124629160)); 0153 CHECK_EVAL("ABS(ERF(0.1; 0.5) - 0.40803696174) < 1e-6", Value(true)); 0154 CHECK_EVAL("ABS(ERF(0.1) - ERF(0.5) + 0.40803696174) < 1e-6", Value(true)); 0155 CHECK_EVAL("ABS(ERF(0.5; 0.1) + 0.40803696174) < 1e-6", Value(true)); 0156 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETERF(0.5)", Value(0.52049987781)); 0157 } 0158 0159 void TestEngineeringFunctions::testERFC() 0160 { 0161 CHECK_EVAL("ERFC(3)", Value(0.000022090497)); 0162 CHECK_EVAL("ABS(ERFC(0.1)-(1-ERF(0.1))) < 1e-6", Value(true)); 0163 CHECK_EVAL("COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETERFC(3)", Value(0.000022090497)); 0164 } 0165 0166 void TestEngineeringFunctions::testGESTEP() 0167 { 0168 CHECK_EVAL("=GESTEP(1.2; 3.4)", Value(0)); 0169 CHECK_EVAL("=GESTEP(3; 3)", Value(1)); 0170 // CHECK_EVAL("=GESTEP(0.4; TRUE)", Value(0)); 0171 CHECK_EVAL("=GESTEP(4; 3)", Value(1)); 0172 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETGESTEP(1.2; 3.4)", Value(0)); 0173 } 0174 0175 void TestEngineeringFunctions::testHEX2BIN() 0176 { 0177 CHECK_EVAL("=HEX2BIN(\"a\")", Value("1010")); 0178 CHECK_EVAL("=HEX2BIN(37)", Value("110111")); 0179 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETHEX2BIN(\"a\")", Value("1010")); 0180 } 0181 0182 void TestEngineeringFunctions::testHEX2DEC() 0183 { 0184 CHECK_EVAL("=HEX2DEC(\"a\")", Value(10)); 0185 CHECK_EVAL("=HEX2DEC(37)", Value(55)); 0186 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETHEX2DEC(\"a\")", Value(10)); 0187 } 0188 0189 void TestEngineeringFunctions::testHEX2OCT() 0190 { 0191 CHECK_EVAL("=HEX2OCT(\"a\")", Value("12")); 0192 CHECK_EVAL("=HEX2OCT(37)", Value("67")); 0193 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETHEX2OCT(\"a\")", Value("12")); 0194 } 0195 0196 void TestEngineeringFunctions::testIMABS() 0197 { 0198 CHECK_EVAL("=IMABS(COMPLEX(4;3))", 5.0); 0199 CHECK_EVAL("=IMABS(COMPLEX(4;-3))", 5.0); 0200 CHECK_EVAL("=IMABS(COMPLEX(-4;3))", 5.0); 0201 CHECK_EVAL("=IMABS(COMPLEX(-4;-3))", 5.0); 0202 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMABS(COMPLEX(4;3))", 5.0); 0203 } 0204 0205 void TestEngineeringFunctions::testIMAGINARY() 0206 { 0207 CHECK_EVAL("=IMAGINARY(COMPLEX(4;-3))", -3.0); 0208 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMAGINARY(COMPLEX(4;-3))", -3.0); 0209 } 0210 0211 void TestEngineeringFunctions::testIMARGUMENT() 0212 { 0213 CHECK_EVAL("=IMARGUMENT(COMPLEX(3;4))", 0.927295218001612); 0214 CHECK_EVAL("=IMARGUMENT(COMPLEX(3;-4))", -0.927295218001612); 0215 CHECK_EVAL("=IMARGUMENT(COMPLEX(-3;4))", 2.214297435588180); 0216 CHECK_EVAL("=IMARGUMENT(COMPLEX(-3;-4))", -2.214297435588180); 0217 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMARGUMENT(COMPLEX(3;4))", 0.927295218001612); 0218 } 0219 0220 void TestEngineeringFunctions::testIMCONJUGATE() 0221 { 0222 CHECK_EVAL("=IMABS(IMSUB(IMCONJUGATE(COMPLEX( 3; 4));COMPLEX( 3;-4)))", 0.0); 0223 CHECK_EVAL("=IMABS(IMSUB(IMCONJUGATE(COMPLEX(-3;-4));COMPLEX(-3;4)))", 0.0); 0224 CHECK_EVAL("=IMABS(IMSUB(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMCONJUGATE(COMPLEX( 3; 4));COMPLEX( 3;-4)))", 0.0); 0225 } 0226 0227 void TestEngineeringFunctions::testIMCOS() 0228 { 0229 CHECK_EVAL("=IMREAL ( IMCOS(COMPLEX(1;1)) )", 0.833730025131149); 0230 CHECK_EVAL("=IMAGINARY( IMCOS(COMPLEX(1;1)) )", -0.988897705762865); 0231 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMCOS(COMPLEX(1;1)))", 0.833730025131149); 0232 } 0233 0234 void TestEngineeringFunctions::testIMCOSH() 0235 { 0236 CHECK_EVAL("=IMREAL ( IMCOSH(COMPLEX(1;1)) )", 0.833730025131149); 0237 CHECK_EVAL("=IMAGINARY( IMCOSH(COMPLEX(1;1)) )", 0.988897705762865); 0238 } 0239 0240 void TestEngineeringFunctions::testIMCOT() 0241 { 0242 CHECK_EVAL("=IMREAL ( IMCOT(COMPLEX(1;1)) )", 0.2176215618544027); 0243 CHECK_EVAL("=IMAGINARY( IMCOT(COMPLEX(1;1)) )", -0.8680141428959249); 0244 } 0245 0246 void TestEngineeringFunctions::testIMCSC() 0247 { 0248 CHECK_EVAL("=IMREAL ( IMCSC(COMPLEX(1;1)) )", 0.6215180171704284); 0249 CHECK_EVAL("=IMAGINARY( IMCSC(COMPLEX(1;1)) )", -0.3039310016284264); 0250 } 0251 0252 void TestEngineeringFunctions::testIMCSCH() 0253 { 0254 CHECK_EVAL("=IMREAL ( IMCSCH(COMPLEX(1;1)) )", 0.3039310016284264); 0255 CHECK_EVAL("=IMAGINARY( IMCSCH(COMPLEX(1;1)) )", -0.6215180171704284); 0256 } 0257 0258 void TestEngineeringFunctions::testIMDIV() 0259 { 0260 CHECK_EVAL("=IMREAL( IMDIV(COMPLEX(5;3); COMPLEX(1;-1)) )", 1.0); 0261 CHECK_EVAL("=IMAGINARY( IMDIV(COMPLEX(5;3); COMPLEX(1;-1)) )", 4.0); 0262 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMDIV(COMPLEX(5;3);COMPLEX(1;-1)))", 1.0); 0263 } 0264 0265 void TestEngineeringFunctions::testIMEXP() 0266 { 0267 CHECK_EVAL("=IMREAL( IMEXP(COMPLEX(1;2)) )", -1.13120438375681); 0268 CHECK_EVAL("=IMAGINARY( IMEXP(COMPLEX(1;2)) )", 2.47172667200482); 0269 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMEXP(COMPLEX(1;2)))", -1.13120438375681); 0270 } 0271 0272 void TestEngineeringFunctions::testIMLN() 0273 { 0274 CHECK_EVAL("=IMREAL( IMLN(COMPLEX(1;2)) )", 0.80471895621705); 0275 CHECK_EVAL("=IMAGINARY( IMLN(COMPLEX(1;2)) )", 1.10714871779409); 0276 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMLN(COMPLEX(1;2)))", 0.80471895621705); 0277 } 0278 0279 void TestEngineeringFunctions::testIMLOG10() 0280 { 0281 CHECK_EVAL("=IMREAL(IMLOG10(COMPLEX(1;2)) )", 0.349485002168009); 0282 CHECK_EVAL("=IMAGINARY( IMLOG10(COMPLEX(1;2)) )", 0.480828578784234); 0283 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMLOG10(COMPLEX(1;2)) )", 0.349485002168009); 0284 } 0285 0286 void TestEngineeringFunctions::testIMLOG2() 0287 { 0288 CHECK_EVAL("=IMREAL( IMLOG2(COMPLEX(1;2)) )", 1.16096404744368); 0289 CHECK_EVAL("=IMAGINARY(IMLOG2(COMPLEX(1;2)) )", 1.59727796468811); 0290 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMLOG2(COMPLEX(1;2)) )", 1.16096404744368); 0291 } 0292 0293 void TestEngineeringFunctions::testIMPOWER() 0294 { 0295 CHECK_EVAL("=IMREAL( IMPOWER(COMPLEX(-1;2); 3) )", 11.0); 0296 CHECK_EVAL("=IMAGINARY( IMPOWER(COMPLEX(-1;2); 3) )", -2.0); 0297 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMPOWER(COMPLEX(-1;2);3))", 11.0); 0298 } 0299 0300 void TestEngineeringFunctions::testIMPRODUCT() 0301 { 0302 CHECK_EVAL("=IMREAL( IMPRODUCT(COMPLEX(1;2); COMPLEX(-1;-2); COMPLEX(2;-3) ))", -6.0); 0303 CHECK_EVAL("=IMAGINARY( IMPRODUCT(COMPLEX(1;2); COMPLEX(-1;-2); COMPLEX(2;-3) ))", -17.0); 0304 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMPRODUCT(COMPLEX(1;2);COMPLEX(-1;-2);COMPLEX(2;-3)))", -6.0); 0305 } 0306 0307 void TestEngineeringFunctions::testIMREAL() 0308 { 0309 CHECK_EVAL("=IMREAL(COMPLEX(4;-3))", 4.0); 0310 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMREAL(COMPLEX(4;-3))", 4.0); 0311 } 0312 0313 void TestEngineeringFunctions::testIMSEC() 0314 { 0315 CHECK_EVAL("=IMREAL ( IMSEC(COMPLEX(1;1)) )", 0.4983370305551868); 0316 CHECK_EVAL("=IMAGINARY( IMSEC(COMPLEX(1;1)) )", 0.5910838417210450); 0317 } 0318 0319 void TestEngineeringFunctions::testIMSECH() 0320 { 0321 CHECK_EVAL("=IMREAL ( IMSECH(COMPLEX(1;1)) )", 0.4983370305551868); 0322 CHECK_EVAL("=IMAGINARY( IMSECH(COMPLEX(1;1)) )", -0.5910838417210450); 0323 } 0324 0325 void TestEngineeringFunctions::testIMSIN() 0326 { 0327 CHECK_EVAL("=IMREAL ( IMSIN(COMPLEX(1;1)) )", 1.298457581415980); 0328 CHECK_EVAL("=IMAGINARY( IMSIN(COMPLEX(1;1)) )", 0.634963914784736); 0329 CHECK_EVAL("=IMREAL ( COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMSIN(COMPLEX(1;1)) )", 1.298457581415980); 0330 } 0331 0332 void TestEngineeringFunctions::testIMSINH() 0333 { 0334 CHECK_EVAL("=IMREAL ( IMSINH(COMPLEX(1;1)) )", 0.634963914784736); 0335 CHECK_EVAL("=IMAGINARY( IMSINH(COMPLEX(1;1)) )", 1.298457581415980); 0336 } 0337 0338 void TestEngineeringFunctions::testIMSQRT() 0339 { 0340 CHECK_EVAL("=IMREAL(IMSQRT(COMPLEX(1;-2)))", 1.272019649514070); 0341 CHECK_EVAL("=IMAGINARY(IMSQRT(COMPLEX(1;-2)))", -0.786151377757423); 0342 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMSQRT(COMPLEX(1;-2)))", 1.272019649514070); 0343 } 0344 0345 void TestEngineeringFunctions::testIMSUB() 0346 { 0347 CHECK_EVAL("=IMREAL( IMSUB(COMPLEX(5;3); COMPLEX(3;2)) )", 2.0); 0348 CHECK_EVAL("=IMAGINARY( IMSUB(COMPLEX(5;3); COMPLEX(3;2)) )", 1.0); 0349 CHECK_EVAL("=IMREAL(IMSUB(\"5-3i\";\"2i\"))", 5.0); 0350 CHECK_EVAL("=IMAGINARY(IMSUB(\"5-3i\";\"2i\"))", -5.0); 0351 CHECK_EVAL("=IMREAL( COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMSUB(COMPLEX(5;3); COMPLEX(3;2)) )", 2.0); 0352 } 0353 0354 void TestEngineeringFunctions::testIMSUM() 0355 { 0356 CHECK_EVAL("=IMREAL(IMSUM(COMPLEX(1;2); COMPLEX(2;3) ))", 3.0); 0357 CHECK_EVAL("=IMAGINARY(IMSUM( COMPLEX(1;2); COMPLEX(2;3) ))", 5.0); 0358 // CHECK_EVAL( "=IMREAL( IMSUM(COMPLEX(1;2);B4:B5))", 6.0 ); 0359 // CHECK_EVAL( "=IMAGINARY( IMSUM(COMPLEX(1;2);B4:B5))", 9.0 ); 0360 CHECK_EVAL("=IMREAL(COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETIMSUM(COMPLEX(1;2); COMPLEX(2;3) ))", 3.0); 0361 } 0362 0363 void TestEngineeringFunctions::testIMTAN() 0364 { 0365 CHECK_EVAL("=IMREAL ( IMTAN(COMPLEX(1;1)) )", 0.271752585319512); 0366 CHECK_EVAL("=IMAGINARY( IMTAN(COMPLEX(1;1)) )", 1.083923327338690); 0367 } 0368 0369 void TestEngineeringFunctions::testIMTANH() 0370 { 0371 CHECK_EVAL("=IMREAL ( IMTANH(COMPLEX(1;1)) )", 1.083923327338690); 0372 CHECK_EVAL("=IMAGINARY( IMTANH(COMPLEX(1;1)) )", 0.271752585319512); 0373 } 0374 0375 void TestEngineeringFunctions::testOCT2BIN() 0376 { 0377 CHECK_EVAL("=OCT2BIN(\"12\")", Value("1010")); 0378 CHECK_EVAL("=OCT2BIN(\"55\")", Value("101101")); 0379 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETOCT2BIN(\"12\")", Value("1010")); 0380 } 0381 0382 void TestEngineeringFunctions::testOCT2DEC() 0383 { 0384 CHECK_EVAL("=OCT2DEC(\"12\")", Value(10)); 0385 CHECK_EVAL("=OCT2DEC(\"55\")", Value(45)); 0386 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETOCT2DEC(\"12\")", Value(10)); 0387 } 0388 0389 void TestEngineeringFunctions::testOCT2HEX() 0390 { 0391 CHECK_EVAL("=OCT2HEX(\"12\")", Value("A")); 0392 CHECK_EVAL("=OCT2HEX(\"55\")", Value("2D")); 0393 CHECK_EVAL("=COM.SUN.STAR.SHEET.ADDIN.ANALYSIS.GETOCT2HEX(\"12\")", Value("A")); 0394 } 0395 0396 QTEST_MAIN(TestEngineeringFunctions)