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)