00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "fennel/common/CommonPreamble.h"
00024 #include "fennel/test/TestBase.h"
00025 #include "fennel/common/TraceSource.h"
00026
00027 #include "fennel/tuple/TupleDataWithBuffer.h"
00028 #include "fennel/tuple/TuplePrinter.h"
00029 #include "fennel/calculator/CalcCommon.h"
00030 #include "fennel/calculator/StringToHex.h"
00031 #include "fennel/common/FennelExcn.h"
00032
00033 #include <boost/test/test_tools.hpp>
00034 #include <boost/scoped_array.hpp>
00035 #include <string>
00036 #include <limits>
00037 #include <math.h>
00038
00039
00040 using namespace fennel;
00041 using namespace std;
00042
00043 class CalcExtCastTest : virtual public TestBase, public TraceSource
00044 {
00045 void testCalcExtCastStringToChar();
00046 void testCalcExtCastStringToVarChar();
00047 void testCalcExtCastBooleanToChar();
00048 void testCalcExtCastBooleanToVarChar();
00049 void testCalcExtCastExactToChar();
00050 void testCalcExtCastExactToVarChar();
00051 void testCalcExtCastDecimalToChar();
00052 void testCalcExtCastDecimalToVarChar();
00053 void testCalcExtCastBigExactToString();
00054 void testCalcExtCastExactToStringTruncates();
00055 void testCalcExtCastDecimalToStringTruncates();
00056 void testCalcExtCastCharToBoolean();
00057 void testCalcExtCastVarCharToBoolean();
00058 void testCalcExtCastCharToExact();
00059 void testCalcExtCastVarCharToExact();
00060 void testCalcExtCastCharToDecimal();
00061 void testCalcExtCastVarCharToDecimal();
00062 void testCalcExtCastStringToExactFails();
00063 void testCalcExtCastStringToDecimalFails();
00064 void testCalcExtCastStringToDecimalMinMax();
00065 void testCalcExtCastStringToDecimalRange();
00066 void testCalcExtCastStringToApprox();
00067 void testCalcExtCastApproxToString();
00068
00069
00070
00071
00072 int cmpTupStr(TupleDatum const & tup, char const * const str);
00073 int cmpTupStr(TupleDatum const & tup, const string& str);
00074 int cmpTupBool(TupleDatum const & tup, bool val);
00075 int cmpTupInt(TupleDatum const & tup, int val);
00076 int cmpTupInt64(TupleDatum const & tup, int64_t val);
00077 int cmpTupNull(TupleDatum const & tup);
00078 int cmpTupDouble(TupleDatum const & tup, double val);
00079 void printOutput(TupleData const & tup, Calculator const & calc);
00080 void refLocalOutput(ostringstream& pg, int count);
00081 string minInt64String();
00082 string maxInt64String();
00083 string rpad(string s, int size, char pad = ' ');
00084
00085 static const bool verbose = true;
00086
00087 static const char* truncErr;
00088 static const char* invalidCharErr;
00089 static const char* outOfRangeErr;
00090
00091 public:
00092 explicit CalcExtCastTest()
00093 : TraceSource(shared_from_this(),"CalcExtCastTest")
00094 {
00095 srand(time(NULL));
00096 CalcInit::instance();
00097 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastStringToChar);
00098 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastStringToVarChar);
00099 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastBooleanToVarChar);
00100 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastBooleanToChar);
00101 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastExactToVarChar);
00102 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastExactToChar);
00103 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastDecimalToChar);
00104 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastDecimalToVarChar);
00105 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastBigExactToString);
00106 FENNEL_UNIT_TEST_CASE(
00107 CalcExtCastTest, testCalcExtCastExactToStringTruncates);
00108 FENNEL_UNIT_TEST_CASE(
00109 CalcExtCastTest, testCalcExtCastDecimalToStringTruncates);
00110 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastCharToBoolean);
00111 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastVarCharToBoolean);
00112 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastCharToExact);
00113 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastVarCharToExact);
00114 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastCharToDecimal);
00115 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastVarCharToDecimal);
00116 FENNEL_UNIT_TEST_CASE(
00117 CalcExtCastTest, testCalcExtCastStringToExactFails);
00118 FENNEL_UNIT_TEST_CASE(
00119 CalcExtCastTest, testCalcExtCastStringToDecimalFails);
00120 FENNEL_UNIT_TEST_CASE(
00121 CalcExtCastTest, testCalcExtCastStringToDecimalMinMax);
00122 FENNEL_UNIT_TEST_CASE(
00123 CalcExtCastTest, testCalcExtCastStringToDecimalRange);
00124 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastStringToApprox);
00125 FENNEL_UNIT_TEST_CASE(CalcExtCastTest, testCalcExtCastApproxToString);
00126 }
00127
00128 virtual ~CalcExtCastTest()
00129 {
00130 }
00131 };
00132
00133 const char * CalcExtCastTest::truncErr = "22001";
00134 const char * CalcExtCastTest::invalidCharErr = "22018";
00135 const char * CalcExtCastTest::outOfRangeErr = "22003";
00136
00137
00138 string CalcExtCastTest::minInt64String()
00139 {
00140 ostringstream os("");
00141 os << dec << numeric_limits<int64_t>::min();
00142 return os.str();
00143 }
00144
00145
00146 string CalcExtCastTest::maxInt64String()
00147 {
00148 ostringstream os("");
00149 os << dec << numeric_limits<int64_t>::max();
00150 return os.str();
00151 }
00152
00153
00154 string
00155 CalcExtCastTest::rpad(string s, int size, char pad)
00156 {
00157 int n = size - s.size();
00158 if (n > 0) {
00159 s.append(n, pad);
00160 }
00161 return s;
00162 }
00163
00164 int
00165 CalcExtCastTest::cmpTupInt(TupleDatum const & tup, int val)
00166 {
00167 if (cmpTupNull(tup)) {
00168 return 1;
00169 }
00170 return *(reinterpret_cast<int*>
00171 (const_cast<PBuffer>(tup.pData))) - val;
00172 }
00173
00174 int
00175 CalcExtCastTest::cmpTupDouble(TupleDatum const & tup, double val)
00176 {
00177 if (cmpTupNull(tup)) {
00178 return 1;
00179 }
00180 double tval = * reinterpret_cast<double*>
00181 (const_cast<PBuffer>(tup.pData));
00182 if (fabs(tval - val) < 0.00001) {
00183 return 0;
00184 }
00185 return (tval > val) ? 1 : -1;
00186 }
00187
00188 int
00189 CalcExtCastTest::cmpTupInt64(
00190 TupleDatum const & tup,
00191 int64_t val)
00192 {
00193 if (cmpTupNull(tup)) {
00194 return 1;
00195 }
00196 return *(reinterpret_cast<int64_t*>
00197 (const_cast<PBuffer>(tup.pData))) - val;
00198 }
00199
00200 int
00201 CalcExtCastTest::cmpTupStr(
00202 TupleDatum const & tup,
00203 const string& s)
00204 {
00205 return cmpTupStr(tup, s.c_str());
00206 }
00207
00208 int
00209 CalcExtCastTest::cmpTupStr(
00210 TupleDatum const & tup,
00211 char const * const str)
00212 {
00213 if (cmpTupNull(tup)) {
00214 return 1;
00215 }
00216 int len = strlen(str);
00217 BOOST_CHECK_EQUAL(len, tup.cbData);
00218 return strncmp(
00219 reinterpret_cast<char *>(const_cast<PBuffer>(tup.pData)),
00220 str,
00221 len);
00222 }
00223
00224 int
00225 CalcExtCastTest::cmpTupBool(TupleDatum const & tup, bool val)
00226 {
00227 if (cmpTupNull(tup)) {
00228 return 0;
00229 }
00230 return *(reinterpret_cast<bool*>
00231 (const_cast<PBuffer>(tup.pData))) == val;
00232 }
00233
00234 int
00235 CalcExtCastTest::cmpTupNull(TupleDatum const & tup)
00236 {
00237 return ((const_cast<PBuffer>(tup.pData)) == NULL)? 1 : 0;
00238 }
00239
00240
00241 void
00242 CalcExtCastTest::printOutput(
00243 TupleData const & tup,
00244 Calculator const & calc)
00245 {
00246 if (verbose) {
00247 TuplePrinter tuplePrinter;
00248 tuplePrinter.print(cout, calc.getOutputRegisterDescriptor(), tup);
00249 cout << endl;
00250 }
00251 }
00252
00253
00254
00255 void
00256 CalcExtCastTest::refLocalOutput(
00257 ostringstream& pg,
00258 int count)
00259 {
00260 int i;
00261
00262 for (i = 0; i < count; i++) {
00263 pg << "REF O" << i << ", L" << i << ";" << endl;
00264 }
00265 }
00266
00267
00268 void
00269 CalcExtCastTest::testCalcExtCastStringToChar()
00270 {
00271 ostringstream pg(""), outloc("");
00272
00273 outloc << "c,5, c,5, c,5, c,5, c,5, c,5, c,5, c,5;" << endl;
00274
00275 pg << "O " << outloc.str();
00276 pg << "L " << outloc.str();
00277 pg << "C vc,3, vc,8, c,3, c,8, vc,8, c,8, vc,8, c,8;" << endl;
00278 pg << "V 0x" << stringToHex("ABC");
00279 pg << ", 0x" << stringToHex("DEFGH");
00280 pg << ", 0x" << stringToHex("ZYX");
00281 pg << ", 0x" << stringToHex("WVUTS ");
00282 pg << ", 0x" << stringToHex("IJKLMNOP");
00283 pg << ", 0x" << stringToHex("RQPONMLK");
00284 pg << ",,;" << endl;
00285 pg << "T;" << endl;
00286
00287
00288 pg << "CALL 'castA(L0, C0);" << endl;
00289
00290
00291 pg << "CALL 'castA(L1, C1);" << endl;
00292
00293
00294 pg << "CALL 'castA(L2, C2);" << endl;
00295
00296
00297 pg << "CALL 'castA(L3, C3);" << endl;
00298
00299
00300 pg << "CALL 'castA(L4, C4);" << endl;
00301
00302
00303 pg << "CALL 'castA(L5, C5);" << endl;
00304
00305
00306 pg << "CALL 'castA(L6, C6);" << endl;
00307
00308
00309 pg << "CALL 'castA(L7, C7);" << endl;
00310
00311
00312 refLocalOutput(pg, 8);
00313
00314 Calculator calc(0);
00315
00316 try {
00317 calc.assemble(pg.str().c_str());
00318 } catch (FennelExcn& ex) {
00319 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00320 BOOST_MESSAGE(pg.str());
00321 BOOST_REQUIRE(0);
00322 }
00323
00324 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00325 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00326
00327 calc.bind(&inTuple, &outTuple);
00328 calc.exec();
00329 printOutput(outTuple, calc);
00330 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00331
00332
00333 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "ABC "));
00334
00335
00336 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "DEFGH"));
00337
00338
00339 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "ZYX "));
00340
00341
00342 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "WVUTS"));
00343
00344
00345 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "IJKLM"));
00346
00347
00348
00349
00350
00351
00352 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "RQPON"));
00353
00354
00355
00356
00357
00358
00359 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[6]));
00360
00361
00362 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[7]));
00363
00364 BOOST_CHECK(iter == calc.mWarnings.end());
00365 }
00366
00367
00368 void
00369 CalcExtCastTest::testCalcExtCastStringToVarChar()
00370 {
00371 ostringstream pg(""), outloc("");
00372
00373 outloc << "vc,5, vc,5, vc,5, vc,5, vc,5, vc,5, vc,5, vc,5;" << endl;
00374
00375 pg << "O " << outloc.str();
00376 pg << "L " << outloc.str();
00377 pg << "C vc,3, vc,8, c,3, c,8, vc,8, c,8, vc,8, c,8;" << endl;
00378 pg << "V 0x" << stringToHex("ABC");
00379 pg << ", 0x" << stringToHex("DEFGH");
00380 pg << ", 0x" << stringToHex("ZYX");
00381 pg << ", 0x" << stringToHex("WVUTS ");
00382 pg << ", 0x" << stringToHex("IJKLMNOP");
00383 pg << ", 0x" << stringToHex("RQPONMLK");
00384 pg << ",,;" << endl;
00385 pg << "T;" << endl;
00386
00387
00388 pg << "CALL 'castA(L0, C0);" << endl;
00389
00390
00391 pg << "CALL 'castA(L1, C1);" << endl;
00392
00393
00394 pg << "CALL 'castA(L2, C2);" << endl;
00395
00396
00397 pg << "CALL 'castA(L3, C3);" << endl;
00398
00399
00400 pg << "CALL 'castA(L4, C4);" << endl;
00401
00402
00403 pg << "CALL 'castA(L5, C5);" << endl;
00404
00405
00406 pg << "CALL 'castA(L6, C6);" << endl;
00407
00408
00409 pg << "CALL 'castA(L7, C7);" << endl;
00410
00411
00412 refLocalOutput(pg, 8);
00413
00414 Calculator calc(0);
00415
00416 try {
00417 calc.assemble(pg.str().c_str());
00418 } catch (FennelExcn& ex) {
00419 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00420 BOOST_MESSAGE(pg.str());
00421 BOOST_REQUIRE(0);
00422 }
00423
00424 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00425 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00426
00427 calc.bind(&inTuple, &outTuple);
00428 calc.exec();
00429 printOutput(outTuple, calc);
00430 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00431
00432
00433 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "ABC"));
00434
00435
00436 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "DEFGH"));
00437
00438
00439 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "ZYX"));
00440
00441
00442 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "WVUTS"));
00443
00444
00445 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "IJKLM"));
00446
00447
00448
00449
00450
00451
00452 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "RQPON"));
00453
00454
00455
00456
00457
00458
00459 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[6]));
00460
00461
00462 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[7]));
00463
00464 BOOST_CHECK(iter == calc.mWarnings.end());
00465 }
00466
00467
00468 void
00469 CalcExtCastTest::testCalcExtCastBooleanToChar()
00470 {
00471
00472
00473 ostringstream pg(""), outloc("");
00474 outloc << "c,3, c,3, c,3, c,4, c,4, c,4, c,5, c,5, c,5;" << endl;
00475 pg << "O " << outloc.str();
00476 pg << "L " << outloc.str();
00477 pg << "C bo, bo, bo;" << endl;
00478 pg << "V , 1, 0;" << endl;
00479 pg << "T;" << endl;
00480
00481 for (int i = 0; i < 3; i++) {
00482 pg << "CALL 'castA(L" << i << ", C" << i << ");" << endl;
00483 }
00484
00485 for (int i = 0; i < 3; i++) {
00486 pg << "CALL 'castA(L" << (i + 3) << ", C" << i << ");" << endl;
00487 }
00488
00489 for (int i = 0; i < 3; i++) {
00490 pg << "CALL 'castA(L" << (i + 6) << ", C" << i << ");" << endl;
00491 }
00492 refLocalOutput(pg, 9);
00493
00494 Calculator calc(0);
00495 try {
00496 calc.assemble(pg.str().c_str());
00497 } catch (FennelExcn& ex) {
00498 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00499 BOOST_MESSAGE(pg.str());
00500 BOOST_REQUIRE(0);
00501 }
00502
00503 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00504 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00505 calc.bind(&inTuple, &outTuple);
00506 calc.exec();
00507 printOutput(outTuple, calc);
00508 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00509
00510
00511 BOOST_CHECK(cmpTupNull(outTuple[0]));
00512
00513
00514 BOOST_CHECK_EQUAL(iter->pc, 1);
00515 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
00516 iter++;
00517
00518
00519 BOOST_CHECK_EQUAL(iter->pc, 2);
00520 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
00521 iter++;
00522
00523 BOOST_CHECK(cmpTupNull(outTuple[3]));
00524 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "TRUE"));
00525
00526
00527 BOOST_CHECK_EQUAL(iter->pc, 5);
00528 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
00529 iter++;
00530
00531 BOOST_CHECK(cmpTupNull(outTuple[6]));
00532 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "TRUE "));
00533 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[8], "FALSE"));
00534 BOOST_CHECK(iter == calc.mWarnings.end());
00535 }
00536
00537
00538 void
00539 CalcExtCastTest::testCalcExtCastBooleanToVarChar()
00540 {
00541
00542
00543 ostringstream pg(""), outloc("");
00544 outloc << "vc,3, vc,3, vc,3, vc,4, vc,4, vc,4, vc,5, vc,5, vc,5;" << endl;
00545 pg << "O " << outloc.str();
00546 pg << "L " << outloc.str();
00547 pg << "C bo, bo, bo;" << endl;
00548 pg << "V , 1, 0;" << endl;
00549 pg << "T;" << endl;
00550
00551 for (int i = 0; i < 3; i++) {
00552 pg << "CALL 'castA(L" << i << ", C" << i << ");" << endl;
00553 }
00554
00555 for (int i = 0; i < 3; i++) {
00556 pg << "CALL 'castA(L" << (i + 3) << ", C" << i << ");" << endl;
00557 }
00558
00559 for (int i = 0; i < 3; i++) {
00560 pg << "CALL 'castA(L" << (i + 6) << ", C" << i << ");" << endl;
00561 }
00562 refLocalOutput(pg, 9);
00563
00564 Calculator calc(0);
00565 try {
00566 calc.assemble(pg.str().c_str());
00567 } catch (FennelExcn& ex) {
00568 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00569 BOOST_MESSAGE(pg.str());
00570 BOOST_REQUIRE(0);
00571 }
00572
00573 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00574 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00575 calc.bind(&inTuple, &outTuple);
00576 calc.exec();
00577 printOutput(outTuple, calc);
00578 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00579
00580
00581 BOOST_CHECK(cmpTupNull(outTuple[0]));
00582
00583
00584 BOOST_CHECK_EQUAL(iter->pc, 1);
00585 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
00586 iter++;
00587
00588
00589 BOOST_CHECK_EQUAL(iter->pc, 2);
00590 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
00591 iter++;
00592
00593 BOOST_CHECK(cmpTupNull(outTuple[3]));
00594 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "TRUE"));
00595
00596
00597 BOOST_CHECK_EQUAL(iter->pc, 5);
00598 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
00599 iter++;
00600
00601 BOOST_CHECK(cmpTupNull(outTuple[6]));
00602 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "TRUE"));
00603 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[8], "FALSE"));
00604 BOOST_CHECK(iter == calc.mWarnings.end());
00605 }
00606
00607
00608 void
00609 CalcExtCastTest::testCalcExtCastExactToChar()
00610 {
00611
00612 ostringstream pg(""), outloc("");
00613 outloc << "c,3, c,3, c,3, c,3, c,16, c,16, c,16, c,16;" << endl;
00614 pg << "O " << outloc.str();
00615 pg << "L " << outloc.str();
00616 pg << "C s8, s8, s8, s8;" << endl;
00617 pg << "V , 0, 10, -10;" << endl;
00618 pg << "T;" << endl;
00619
00620 for (int i = 0; i < 4; i++) {
00621 pg << "CALL 'castA(L" << i << ", C" << i << ");" << endl;
00622 }
00623
00624 for (int i = 0; i < 4; i++) {
00625 pg << "CALL 'castA(L" << (i + 4) << ", C" << i << ");" << endl;
00626 }
00627 refLocalOutput(pg, 8);
00628
00629 Calculator calc(0);
00630 try {
00631 calc.assemble(pg.str().c_str());
00632 } catch (FennelExcn& ex) {
00633 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00634 BOOST_MESSAGE(pg.str());
00635 BOOST_REQUIRE(0);
00636 }
00637
00638 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00639 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00640 calc.bind(&inTuple, &outTuple);
00641 calc.exec();
00642 printOutput(outTuple, calc);
00643 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00644
00645
00646 BOOST_CHECK(cmpTupNull(outTuple[0]));
00647 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "0 "));
00648 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "10 "));
00649 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "-10"));
00650 BOOST_CHECK(cmpTupNull(outTuple[4]));
00651 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "0 "));
00652 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[6], "10 "));
00653 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "-10 "));
00654 BOOST_CHECK(iter == calc.mWarnings.end());
00655 }
00656
00657
00658 void
00659 CalcExtCastTest::testCalcExtCastExactToVarChar()
00660 {
00661
00662 ostringstream pg(""), outloc("");
00663 outloc << "vc,3, vc,3, vc,3, vc,3, vc,16, vc,16, vc,16, vc,16;" << endl;
00664 pg << "O " << outloc.str();
00665 pg << "L " << outloc.str();
00666 pg << "C s8, s8, s8, s8;" << endl;
00667 pg << "V , 0, 10, -10;" << endl;
00668 pg << "T;" << endl;
00669
00670 for (int i = 0; i < 4; i++) {
00671 pg << "CALL 'castA(L" << i << ", C" << i << ");" << endl;
00672 }
00673
00674 for (int i = 0; i < 4; i++) {
00675 pg << "CALL 'castA(L" << (i + 4) << ", C" << i << ");" << endl;
00676 }
00677 refLocalOutput(pg, 8);
00678
00679 Calculator calc(0);
00680 try {
00681 calc.assemble(pg.str().c_str());
00682 } catch (FennelExcn& ex) {
00683 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00684 BOOST_MESSAGE(pg.str());
00685 BOOST_REQUIRE(0);
00686 }
00687
00688 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00689 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00690 calc.bind(&inTuple, &outTuple);
00691 calc.exec();
00692 printOutput(outTuple, calc);
00693 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00694
00695
00696 BOOST_CHECK(cmpTupNull(outTuple[0]));
00697 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "0"));
00698 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "10"));
00699 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "-10"));
00700 BOOST_CHECK(cmpTupNull(outTuple[4]));
00701 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "0"));
00702 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[6], "10"));
00703 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "-10"));
00704 BOOST_CHECK(iter == calc.mWarnings.end());
00705 }
00706
00707
00708 void
00709 CalcExtCastTest::testCalcExtCastDecimalToChar()
00710 {
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720 ostringstream pg(""), outloc("");
00721 outloc << "c,6, c,6, c,6, c,6, c,6, c,6, c,6, "
00722 << "c,16, c,16, c,16, c,16, c,16, c,16, c,16, "
00723 << "c,5, c,5, c,5, c,5, c,5, c,5, c,5, "
00724 << "c,16, c,16, c,16, c,16, c,16, c,16, c,16, "
00725 << "c,7, c,7, c,7, c,7, c,7, c,7, c,7, "
00726 << "c,16, c,16, c,16, c,16, c,16, c,16, c,16;" << endl;
00727 pg << "O " << outloc.str();
00728 pg << "L " << outloc.str();
00729 pg << "C s8, s8, s8, s8, s8, s8, s8, s4, s4, s4, s4;" << endl;
00730 pg << "V , 0, 1000, -1090, 430, -9, 30, 5, 2, 0, -2;" << endl;
00731 pg << "T;" << endl;
00732
00733 for (int i = 0; i < 7; i++) {
00734 pg << "CALL 'castA(L" << i << ", C" << i << ", C7, C8 );" << endl;
00735 }
00736
00737 for (int i = 0; i < 7; i++) {
00738 pg << "CALL 'castA(L" << (i + 7) << ", C" << i << ", C7, C8 );" << endl;
00739 }
00740
00741
00742 for (int i = 0; i < 7; i++) {
00743 pg << "CALL 'castA(L" << (i + 14) << ", C" << i << ", C7, C9 );"
00744 << endl;
00745 }
00746
00747 for (int i = 0; i < 7; i++) {
00748 pg << "CALL 'castA(L" << (i + 21) << ", C" << i << ", C7, C9 );"
00749 << endl;
00750 }
00751
00752
00753 for (int i = 0; i < 7; i++) {
00754 pg << "CALL 'castA(L" << (i + 28) << ", C" << i << ", C7, C10 );"
00755 << endl;
00756 }
00757
00758 for (int i = 0; i < 7; i++) {
00759 pg << "CALL 'castA(L" << (i + 35) << ", C" << i << ", C7, C10 );"
00760 << endl;
00761 }
00762
00763 refLocalOutput(pg, 7*6);
00764
00765 Calculator calc(0);
00766 try {
00767 calc.assemble(pg.str().c_str());
00768 } catch (FennelExcn& ex) {
00769 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00770 BOOST_MESSAGE(pg.str());
00771 BOOST_REQUIRE(0);
00772 }
00773
00774 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00775 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00776 calc.bind(&inTuple, &outTuple);
00777 calc.exec();
00778 printOutput(outTuple, calc);
00779 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00780
00781
00782
00783 BOOST_CHECK(cmpTupNull(outTuple[0]));
00784 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], ".00 "));
00785 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "10.00 "));
00786 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "-10.90"));
00787 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "4.30 "));
00788 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "-.09 "));
00789 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[6], ".30 "));
00790 BOOST_CHECK(cmpTupNull(outTuple[7]));
00791 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[8], ".00 "));
00792 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[9], "10.00 "));
00793 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[10], "-10.90 "));
00794 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[11], "4.30 "));
00795 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[12], "-.09 "));
00796 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[13], ".30 "));
00797
00798
00799 BOOST_CHECK(cmpTupNull(outTuple[14]));
00800 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[15], "0 "));
00801 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[16], "1000 "));
00802 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[17], "-1090"));
00803 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[18], "430 "));
00804 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[19], "-9 "));
00805 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[20], "30 "));
00806 BOOST_CHECK(cmpTupNull(outTuple[21]));
00807 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[22], "0 "));
00808 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[23], "1000 "));
00809 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[24], "-1090 "));
00810 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[25], "430 "));
00811 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[26], "-9 "));
00812 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[27], "30 "));
00813
00814
00815 BOOST_CHECK(cmpTupNull(outTuple[28]));
00816 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[29], "0 "));
00817 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[30], "100000 "));
00818 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[31], "-109000"));
00819 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[32], "43000 "));
00820 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[33], "-900 "));
00821 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[34], "3000 "));
00822 BOOST_CHECK(cmpTupNull(outTuple[35]));
00823 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[36], "0 "));
00824 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[37], "100000 "));
00825 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[38], "-109000 "));
00826 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[39], "43000 "));
00827 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[40], "-900 "));
00828 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[41], "3000 "));
00829 }
00830
00831
00832 void
00833 CalcExtCastTest::testCalcExtCastDecimalToVarChar()
00834 {
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844 ostringstream pg(""), outloc("");
00845 outloc << "vc,6, vc,6, vc,6, vc,6, vc,6, vc,6, vc,6, "
00846 << "vc,16, vc,16, vc,16, vc,16, vc,16, vc,16, vc,16, "
00847 << "vc,5, vc,5, vc,5, vc,5, vc,5, vc,5, vc,5, "
00848 << "vc,16, vc,16, vc,16, vc,16, vc,16, vc,16, vc,16, "
00849 << "vc,7, vc,7, vc,7, vc,7, vc,7, vc,7, vc,7, "
00850 << "vc,16, vc,16, vc,16, vc,16, vc,16, vc,16, vc,16;" << endl;
00851 pg << "O " << outloc.str();
00852 pg << "L " << outloc.str();
00853 pg << "C s8, s8, s8, s8, s8, s8, s8, s4, s4, s4, s4;" << endl;
00854 pg << "V , 0, 1000, -1090, 430, -9, 30, 5, 2, 0, -2;" << endl;
00855 pg << "T;" << endl;
00856
00857 for (int i = 0; i < 7; i++) {
00858 pg << "CALL 'castA(L" << i << ", C" << i << ", C7, C8 );" << endl;
00859 }
00860
00861 for (int i = 0; i < 7; i++) {
00862 pg << "CALL 'castA(L" << (i + 7) << ", C" << i << ", C7, C8 );" << endl;
00863 }
00864
00865 for (int i = 0; i < 7; i++) {
00866 pg << "CALL 'castA(L" << (i + 14) << ", C" << i << ", C7, C9 );"
00867 << endl;
00868 }
00869
00870 for (int i = 0; i < 7; i++) {
00871 pg << "CALL 'castA(L" << (i + 21) << ", C" << i << ", C7, C9 );"
00872 << endl;
00873 }
00874
00875 for (int i = 0; i < 7; i++) {
00876 pg << "CALL 'castA(L" << (i + 28) << ", C" << i << ", C7, C10 );"
00877 << endl;
00878 }
00879
00880 for (int i = 0; i < 7; i++) {
00881 pg << "CALL 'castA(L" << (i + 35) << ", C" << i << ", C7, C10 );"
00882 << endl;
00883 }
00884 refLocalOutput(pg, 7 * 6);
00885
00886 Calculator calc(0);
00887 try {
00888 calc.assemble(pg.str().c_str());
00889 } catch (FennelExcn& ex) {
00890 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00891 BOOST_MESSAGE(pg.str());
00892 BOOST_REQUIRE(0);
00893 }
00894
00895 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00896 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00897 calc.bind(&inTuple, &outTuple);
00898 calc.exec();
00899 printOutput(outTuple, calc);
00900 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00901
00902
00903
00904 BOOST_CHECK(cmpTupNull(outTuple[0]));
00905 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], ".00"));
00906 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "10.00"));
00907 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "-10.90"));
00908 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "4.30"));
00909 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "-.09"));
00910 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[6], ".30"));
00911 BOOST_CHECK(cmpTupNull(outTuple[7]));
00912 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[8], ".00"));
00913 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[9], "10.00"));
00914 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[10], "-10.90"));
00915 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[11], "4.30"));
00916 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[12], "-.09"));
00917 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[13], ".30"));
00918
00919
00920 BOOST_CHECK(cmpTupNull(outTuple[14]));
00921 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[15], "0"));
00922 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[16], "1000"));
00923 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[17], "-1090"));
00924 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[18], "430"));
00925 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[19], "-9"));
00926 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[20], "30"));
00927 BOOST_CHECK(cmpTupNull(outTuple[21]));
00928 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[22], "0"));
00929 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[23], "1000"));
00930 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[24], "-1090"));
00931 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[25], "430"));
00932 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[26], "-9"));
00933 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[27], "30"));
00934
00935
00936 BOOST_CHECK(cmpTupNull(outTuple[28]));
00937 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[29], "0"));
00938 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[30], "100000"));
00939 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[31], "-109000"));
00940 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[32], "43000"));
00941 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[33], "-900"));
00942 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[34], "3000"));
00943 BOOST_CHECK(cmpTupNull(outTuple[35]));
00944 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[36], "0"));
00945 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[37], "100000"));
00946 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[38], "-109000"));
00947 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[39], "43000"));
00948 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[40], "-900"));
00949 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[41], "3000"));
00950 }
00951
00952
00953 void
00954 CalcExtCastTest::testCalcExtCastBigExactToString()
00955 {
00956
00957 ostringstream pg(""), outloc("");
00958 outloc << "vc,32, vc,32, c,32, c,32;" << endl;
00959 pg << "O " << outloc.str();
00960 pg << "L " << outloc.str();
00961 pg << "C s8, s8;" << endl;
00962 pg << "V " << maxInt64String() << ", " << minInt64String() << ";" << endl;
00963 pg << "T;" << endl;
00964 pg << "CALL 'castA(L0, C0);" << endl;
00965 pg << "CALL 'castA(L1, C1);" << endl;
00966 pg << "CALL 'castA(L2, C0);" << endl;
00967 pg << "CALL 'castA(L3, C1);" << endl;
00968 refLocalOutput(pg, 4);
00969
00970 Calculator calc(0);
00971 try {
00972 calc.assemble(pg.str().c_str());
00973 } catch (FennelExcn& ex) {
00974 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00975 BOOST_MESSAGE(pg.str());
00976 BOOST_REQUIRE(0);
00977 }
00978
00979 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00980 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00981 calc.bind(&inTuple, &outTuple);
00982 calc.exec();
00983 printOutput(outTuple, calc);
00984 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00985
00986
00987 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], maxInt64String()));
00988 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], minInt64String()));
00989 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], rpad(maxInt64String(), 32)));
00990 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], rpad(minInt64String(), 32)));
00991 BOOST_CHECK(iter == calc.mWarnings.end());
00992 }
00993
00994
00995 void
00996 CalcExtCastTest::testCalcExtCastExactToStringTruncates()
00997 {
00998
00999 ostringstream pg(""), outloc("");
01000 outloc << "vc,3, vc,3, c,3, c,3;" << endl;
01001 pg << "O " << outloc.str();
01002 pg << "L " << outloc.str();
01003 pg << "C s8, s8;" << endl;
01004 pg << "V 1666, -1666;" << endl;
01005 pg << "T;" << endl;
01006 pg << "CALL 'castA(L0, C0);" << endl;
01007 pg << "CALL 'castA(L1, C1);" << endl;
01008 pg << "CALL 'castA(L2, C0);" << endl;
01009 pg << "CALL 'castA(L3, C1);" << endl;
01010 refLocalOutput(pg, 4);
01011
01012 Calculator calc(0);
01013 try {
01014 calc.assemble(pg.str().c_str());
01015 } catch (FennelExcn& ex) {
01016 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01017 BOOST_MESSAGE(pg.str());
01018 BOOST_REQUIRE(0);
01019 }
01020
01021 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01022 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01023 calc.bind(&inTuple, &outTuple);
01024 calc.exec();
01025 printOutput(outTuple, calc);
01026 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01027
01028
01029
01030 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "166"));
01031 BOOST_CHECK_EQUAL(iter->pc, 0);
01032 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01033 iter++;
01034
01035
01036 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "-16"));
01037 BOOST_CHECK_EQUAL(iter->pc, 1);
01038 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01039 iter++;
01040
01041
01042 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "166"));
01043 BOOST_CHECK_EQUAL(iter->pc, 2);
01044 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01045 iter++;
01046
01047
01048 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "-16"));
01049 BOOST_CHECK_EQUAL(iter->pc, 3);
01050 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01051 iter++;
01052 BOOST_CHECK(iter == calc.mWarnings.end());
01053 }
01054
01055
01056
01057 void
01058 CalcExtCastTest::testCalcExtCastDecimalToStringTruncates()
01059 {
01060
01061
01062
01063
01064
01065 ostringstream pg(""), outloc("");
01066 outloc << "vc,3, vc,3, vc,3, c,3, c,3, c,3, "
01067 << "vc,3, vc,3, vc,3, c,3, c,3, c,3, "
01068 << "vc,3, vc,3, vc,3, c,3, c,3, c,3;" << endl;
01069 pg << "O " << outloc.str();
01070 pg << "L " << outloc.str();
01071 pg << "C s8, s8, s8, s4, s4, s4, s4;" << endl;
01072 pg << "V -1090, -9, 30, 5, 2, 0, -2;" << endl;
01073 pg << "T;" << endl;
01074
01075 pg << "CALL 'castA(L0, C0, C3, C4);" << endl;
01076 pg << "CALL 'castA(L1, C1, C3, C4);" << endl;
01077 pg << "CALL 'castA(L2, C2, C3, C4);" << endl;
01078 pg << "CALL 'castA(L3, C0, C3, C4);" << endl;
01079 pg << "CALL 'castA(L4, C1, C3, C4);" << endl;
01080 pg << "CALL 'castA(L5, C2, C3, C4);" << endl;
01081
01082 pg << "CALL 'castA(L6, C0, C3, C5);" << endl;
01083 pg << "CALL 'castA(L7, C1, C3, C5);" << endl;
01084 pg << "CALL 'castA(L8, C2, C3, C5);" << endl;
01085 pg << "CALL 'castA(L9, C0, C3, C5);" << endl;
01086 pg << "CALL 'castA(L10, C1, C3, C5);" << endl;
01087 pg << "CALL 'castA(L11, C2, C3, C5);" << endl;
01088
01089 pg << "CALL 'castA(L12, C0, C3, C6);" << endl;
01090 pg << "CALL 'castA(L13, C1, C3, C6);" << endl;
01091 pg << "CALL 'castA(L14, C2, C3, C6);" << endl;
01092 pg << "CALL 'castA(L15, C0, C3, C6);" << endl;
01093 pg << "CALL 'castA(L16, C1, C3, C6);" << endl;
01094 pg << "CALL 'castA(L17, C2, C3, C6);" << endl;
01095
01096 refLocalOutput(pg, 18);
01097
01098 Calculator calc(0);
01099 try {
01100 calc.assemble(pg.str().c_str());
01101 } catch (FennelExcn& ex) {
01102 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01103 BOOST_MESSAGE(pg.str());
01104 BOOST_REQUIRE(0);
01105 }
01106
01107 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01108 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01109 calc.bind(&inTuple, &outTuple);
01110 calc.exec();
01111 printOutput(outTuple, calc);
01112 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01113
01114
01115
01116
01117 BOOST_CHECK_EQUAL(iter->pc, 0);
01118 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01119 iter++;
01120
01121
01122 BOOST_CHECK_EQUAL(iter->pc, 1);
01123 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01124 iter++;
01125
01126
01127 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], ".30"));
01128
01129
01130 BOOST_CHECK_EQUAL(iter->pc, 3);
01131 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01132 iter++;
01133
01134
01135 BOOST_CHECK_EQUAL(iter->pc, 4);
01136 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01137 iter++;
01138
01139
01140 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], ".30"));
01141
01142
01143
01144 BOOST_CHECK_EQUAL(iter->pc, 6);
01145 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01146 iter++;
01147
01148
01149 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "-9"));
01150
01151
01152 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[8], "30"));
01153
01154
01155 BOOST_CHECK_EQUAL(iter->pc, 9);
01156 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01157 iter++;
01158
01159
01160 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[10], "-9 "));
01161
01162
01163 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[11], "30 "));
01164
01165
01166
01167 BOOST_CHECK_EQUAL(iter->pc, 12);
01168 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01169 iter++;
01170
01171
01172 BOOST_CHECK_EQUAL(iter->pc, 13);
01173 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01174 iter++;
01175
01176
01177 BOOST_CHECK_EQUAL(iter->pc, 14);
01178 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01179 iter++;
01180
01181
01182 BOOST_CHECK_EQUAL(iter->pc, 15);
01183 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01184 iter++;
01185
01186
01187 BOOST_CHECK_EQUAL(iter->pc, 16);
01188 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01189 iter++;
01190
01191
01192 BOOST_CHECK_EQUAL(iter->pc, 17);
01193 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01194 iter++;
01195
01196 BOOST_CHECK(iter == calc.mWarnings.end());
01197 }
01198
01199 void CalcExtCastTest::testCalcExtCastCharToBoolean()
01200 {
01201
01202 ostringstream pg(""), outloc("");
01203 outloc << "bo, bo, bo, bo, bo, bo, bo, bo;" << endl;
01204 pg << "O " << outloc.str();
01205 pg << "L " << outloc.str();
01206 pg << "C c,4, c,4, c,8, c,5, c,9, c,7, c,11, c,13;" << endl;
01207 pg << "V "
01208 << ", 0x" << stringToHex("tRUe")
01209 << ", 0x" << stringToHex(" true ")
01210 << ", 0x" << stringToHex("faLSe")
01211 << ", 0x" << stringToHex(" FALSE ")
01212 << ", 0x" << stringToHex("UnknowN")
01213 << ", 0x" << stringToHex(" UnknowN ")
01214 << ", 0x" << stringToHex(" Invalid ")
01215 << ";" << endl;
01216 pg << "T;" << endl;
01217 for (int i = 0; i < 8; i++) {
01218 pg << "CALL 'castA(L"<<i<<",C"<<i<<");"<< endl;
01219 }
01220 refLocalOutput(pg, 8);
01221
01222 Calculator calc(0);
01223 try {
01224 calc.assemble(pg.str().c_str());
01225 } catch (FennelExcn& ex) {
01226 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01227 BOOST_MESSAGE(pg.str());
01228 BOOST_REQUIRE(0);
01229 }
01230
01231 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01232 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01233 calc.bind(&inTuple, &outTuple);
01234 calc.exec();
01235 printOutput(outTuple, calc);
01236 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01237
01238 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[0]));
01239 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[1], true));
01240 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[2], true));
01241 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[3], false));
01242 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[4], false));
01243
01244
01245
01246 BOOST_CHECK_EQUAL(iter->pc, 5);
01247 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01248 iter++;
01249
01250 BOOST_CHECK_EQUAL(iter->pc, 6);
01251 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01252 iter++;
01253
01254
01255 BOOST_CHECK_EQUAL(iter->pc, 7);
01256 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01257 iter++;
01258
01259 BOOST_CHECK(iter == calc.mWarnings.end());
01260 }
01261
01262 void CalcExtCastTest::testCalcExtCastVarCharToBoolean()
01263 {
01264
01265 ostringstream pg(""), outloc("");
01266 outloc << "bo, bo, bo, bo, bo, bo, bo, bo;" << endl;
01267 pg << "O " << outloc.str();
01268 pg << "L " << outloc.str();
01269 pg << "C vc,4, vc,8, vc,8, vc,9, vc,9, vc,7, vc,11, vc,13;" << endl;
01270 pg << "V "
01271 << ", 0x" << stringToHex("tRUe")
01272 << ", 0x" << stringToHex(" true ")
01273 << ", 0x" << stringToHex("faLSe")
01274 << ", 0x" << stringToHex(" FALSE ")
01275 << ", 0x" << stringToHex("UnknowN")
01276 << ", 0x" << stringToHex(" UnknowN ")
01277 << ", 0x" << stringToHex(" Invalid ")
01278 << ";" << endl;
01279 pg << "T;" << endl;
01280 for (int i = 0; i < 8; i++) {
01281 pg << "CALL 'castA(L" << i << ",C" << i << ");" << endl;
01282 }
01283 refLocalOutput(pg, 8);
01284
01285 Calculator calc(0);
01286 try {
01287 calc.assemble(pg.str().c_str());
01288 } catch (FennelExcn& ex) {
01289 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01290 BOOST_MESSAGE(pg.str());
01291 BOOST_REQUIRE(0);
01292 }
01293
01294 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01295 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01296 calc.bind(&inTuple, &outTuple);
01297 calc.exec();
01298 printOutput(outTuple, calc);
01299 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01300
01301 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[0]));
01302 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[1], true));
01303 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[2], true));
01304 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[3], false));
01305 BOOST_CHECK_EQUAL(1, cmpTupBool(outTuple[4], false));
01306
01307
01308
01309 BOOST_CHECK_EQUAL(iter->pc, 5);
01310 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01311 iter++;
01312
01313 BOOST_CHECK_EQUAL(iter->pc, 6);
01314 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01315 iter++;
01316
01317
01318 BOOST_CHECK_EQUAL(iter->pc, 7);
01319 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01320 iter++;
01321
01322 BOOST_CHECK(iter == calc.mWarnings.end());
01323 }
01324
01325
01326 void CalcExtCastTest::testCalcExtCastVarCharToExact()
01327 {
01328
01329 ostringstream pg(""), outloc("");
01330 outloc << "s8, s8, s8, s8, s8, s8, s8, s8, s8;" << endl;
01331 pg << "O " << outloc.str();
01332 pg << "L " << outloc.str();
01333 pg << "C vc,4, vc,4, vc,4, vc,20, vc,21, vc,8, vc,8, vc,32, vc,32;" << endl;
01334 pg << "V "
01335 << ", 0x" << stringToHex("123") << ", 0x" << stringToHex("-123")
01336 << ", 0x" << stringToHex(maxInt64String())
01337 << ", 0x" << stringToHex(minInt64String())
01338 << ", 0x" << stringToHex("123 ") << ", 0x" << stringToHex("-123 ")
01339 << ", 0x" << stringToHex(rpad(maxInt64String(), 32))
01340 << ", 0x" << stringToHex(rpad(minInt64String(), 32))
01341 << ";" << endl;
01342 pg << "T;" << endl;
01343 for (int i = 0; i < 9; i++) {
01344 pg << "CALL 'castA(L" << i << ",C" << i << ");" << endl;
01345 }
01346 refLocalOutput(pg, 9);
01347
01348 Calculator calc(0);
01349 try {
01350 calc.assemble(pg.str().c_str());
01351 } catch (FennelExcn& ex) {
01352 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01353 BOOST_MESSAGE(pg.str());
01354 BOOST_REQUIRE(0);
01355 }
01356
01357 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01358 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01359 calc.bind(&inTuple, &outTuple);
01360 calc.exec();
01361 printOutput(outTuple, calc);
01362 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01363
01364 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[0]));
01365 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 123));
01366 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], -123));
01367 BOOST_CHECK_EQUAL(
01368 0, cmpTupInt64(outTuple[3], numeric_limits<int64_t>::max()));
01369 BOOST_CHECK_EQUAL(
01370 0, cmpTupInt64(outTuple[4], numeric_limits<int64_t>::min()));
01371 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 123));
01372 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[6], -123));
01373 BOOST_CHECK_EQUAL(
01374 0, cmpTupInt64(outTuple[7], numeric_limits<int64_t>::max()));
01375 BOOST_CHECK_EQUAL(
01376 0, cmpTupInt64(outTuple[8], numeric_limits<int64_t>::min()));
01377 BOOST_CHECK(iter == calc.mWarnings.end());
01378 }
01379
01380 void CalcExtCastTest::testCalcExtCastCharToExact()
01381 {
01382
01383 ostringstream pg(""), outloc("");
01384 outloc << "s8, s8, s8, s8, s8, s8, s8, s8, s8;" << endl;
01385 pg << "O " << outloc.str();
01386 pg << "L " << outloc.str();
01387 pg << "C c,3, c,3, c,4, c,19, c,20, c,8, c,8, c,32, c,32;" << endl;
01388 pg << "V "
01389 << ", 0x" << stringToHex("123") << ", 0x" << stringToHex("-123")
01390 << ", 0x" << stringToHex(maxInt64String())
01391 << ", 0x" << stringToHex(minInt64String())
01392 << ", 0x" << stringToHex("123 ") << ", 0x" << stringToHex("-123 ")
01393 << ", 0x" << stringToHex(rpad(maxInt64String(), 32))
01394 << ", 0x" << stringToHex(rpad(minInt64String(), 32))
01395 << ";" << endl;
01396 pg << "T;" << endl;
01397 for (int i = 0; i < 9; i++) {
01398 pg << "CALL 'castA(L" << i << ",C" << i << ");" << endl;
01399 }
01400 refLocalOutput(pg, 9);
01401
01402 Calculator calc(0);
01403 try {
01404 calc.assemble(pg.str().c_str());
01405 } catch (FennelExcn& ex) {
01406 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01407 BOOST_MESSAGE(pg.str());
01408 BOOST_REQUIRE(0);
01409 }
01410
01411 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01412 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01413 calc.bind(&inTuple, &outTuple);
01414 calc.exec();
01415 printOutput(outTuple, calc);
01416 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01417
01418 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[0]));
01419 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 123));
01420 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], -123));
01421 BOOST_CHECK_EQUAL(
01422 0, cmpTupInt64(outTuple[3], numeric_limits<int64_t>::max()));
01423 BOOST_CHECK_EQUAL(
01424 0, cmpTupInt64(outTuple[4], numeric_limits<int64_t>::min()));
01425 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 123));
01426 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[6], -123));
01427 BOOST_CHECK_EQUAL(
01428 0, cmpTupInt64(outTuple[7], numeric_limits<int64_t>::max()));
01429 BOOST_CHECK_EQUAL(
01430 0, cmpTupInt64(outTuple[8], numeric_limits<int64_t>::min()));
01431 BOOST_CHECK(iter == calc.mWarnings.end());
01432 }
01433
01434 void CalcExtCastTest::testCalcExtCastVarCharToDecimal()
01435 {
01436
01437
01438
01439
01440
01441 ostringstream pg(""), outloc("");
01442 outloc << "s8, s8, s8, s8, s8, s8, s8, s8, s8, "
01443 << "s8, s8, s8, s8, s8, s8, s8, s8, s8, "
01444 << "s8, s8, s8, s8, s8, s8, s8, s8, s8;"
01445 << endl;
01446 pg << "O " << outloc.str();
01447 pg << "L " << outloc.str();
01448 pg << "C vc,1, vc,5, vc,9, vc,6, vc,7, vc,10, vc,10, vc,10, vc,10, "
01449 << " s4, s4, s4, s4;" << endl;
01450 pg << "V "
01451 << ", 0x" << stringToHex("99.99")
01452 << ", 0x" << stringToHex("-105.0e-3")
01453 << ", 0x" << stringToHex("950.00")
01454 << ", 0x" << stringToHex("234.446")
01455 << ", 0x" << stringToHex("99.99 ")
01456 << ", 0x" << stringToHex("-105.0e-3 ")
01457 << ", 0x" << stringToHex("950.00 ")
01458 << ", 0x" << stringToHex("234.446 ")
01459 << ", 5, 2, 0, -2;" << endl;
01460 pg << "T;" << endl;
01461
01462 for (int i = 0; i < 9; i++) {
01463 pg << "CALL 'castA(L" << i << ",C" << i << ",C9, C10);" << endl;
01464 }
01465 for (int i = 0; i < 9; i++) {
01466 pg << "CALL 'castA(L" << (i + 9) << ",C" << i << ",C9, C11);" << endl;
01467 }
01468 for (int i = 0; i < 9; i++) {
01469 pg << "CALL 'castA(L" << (i + 18) << ",C" << i << ",C9, C12);" << endl;
01470 }
01471 refLocalOutput(pg, 9*3);
01472
01473 Calculator calc(0);
01474 try {
01475 calc.assemble(pg.str().c_str());
01476 } catch (FennelExcn& ex) {
01477 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01478 BOOST_MESSAGE(pg.str());
01479 BOOST_REQUIRE(0);
01480 }
01481
01482 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01483 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01484 calc.bind(&inTuple, &outTuple);
01485 calc.exec();
01486 printOutput(outTuple, calc);
01487 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01488
01489
01490 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[0]));
01491 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 9999));
01492 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], -11));
01493 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[3], 95000));
01494 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 23445));
01495 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 9999));
01496 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[6], -11));
01497 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[7], 95000));
01498 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[8], 23445));
01499
01500
01501 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[9]));
01502 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[10], 100));
01503 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[11], 0));
01504 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[12], 950));
01505 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[13], 234));
01506 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[14], 100));
01507 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[15], 0));
01508 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[16], 950));
01509 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[17], 234));
01510
01511
01512 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[18]));
01513 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[19], 1));
01514 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[20], 0));
01515 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[21], 10));
01516 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[22], 2));
01517 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[23], 1));
01518 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[24], 0));
01519 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[25], 10));
01520 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[26], 2));
01521
01522 BOOST_CHECK(iter == calc.mWarnings.end());
01523 }
01524
01525 void CalcExtCastTest::testCalcExtCastCharToDecimal()
01526 {
01527
01528
01529
01530
01531
01532 ostringstream pg(""), outloc("");
01533 outloc << "s8, s8, s8, s8, s8, s8, s8, s8, s8, "
01534 << "s8, s8, s8, s8, s8, s8, s8, s8, s8, "
01535 << "s8, s8, s8, s8, s8, s8, s8, s8, s8;"
01536 << endl;
01537 pg << "O " << outloc.str();
01538 pg << "L " << outloc.str();
01539 pg << "C c,1, c,5, c,7, c,4, c,20, c,10, c,10, c,10, c,32, "
01540 << " s4, s4, s4, s4;" << endl;
01541 pg << "V "
01542 << ", 0x" << stringToHex(".8987")
01543 << ", 0x" << stringToHex("-0005.2")
01544 << ", 0x" << stringToHex("+980")
01545 << ", 0x" << stringToHex("0.000000000000355e14")
01546 << ", 0x" << stringToHex(".8987 ")
01547 << ", 0x" << stringToHex("-0005.2 ")
01548 << ", 0x" << stringToHex("+980 ")
01549 << ", 0x" << stringToHex("0.000000000000355e14 ")
01550 << ", 5, 2, 0, -2;" << endl;
01551 pg << "T;" << endl;
01552
01553 for (int i = 0; i < 9; i++) {
01554 pg << "CALL 'castA(L" << i << ",C" << i << ",C9, C10);" << endl;
01555 }
01556 for (int i = 0; i < 9; i++) {
01557 pg << "CALL 'castA(L" << (i + 9) << ",C" << i << ",C9, C11);" << endl;
01558 }
01559 for (int i = 0; i < 9; i++) {
01560 pg << "CALL 'castA(L" << (i + 18) << ",C" << i << ",C9, C12);" << endl;
01561 }
01562 refLocalOutput(pg, 9*3);
01563
01564 Calculator calc(0);
01565 try {
01566 calc.assemble(pg.str().c_str());
01567 } catch (FennelExcn& ex) {
01568 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01569 BOOST_MESSAGE(pg.str());
01570 BOOST_REQUIRE(0);
01571 }
01572
01573 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01574 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01575 calc.bind(&inTuple, &outTuple);
01576 calc.exec();
01577 printOutput(outTuple, calc);
01578 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01579
01580
01581 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[0]));
01582 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 90));
01583 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], -520));
01584 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[3], 98000));
01585 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 3550));
01586 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 90));
01587 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[6], -520));
01588 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[7], 98000));
01589 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[8], 3550));
01590
01591
01592 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[9]));
01593 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[10], 1));
01594 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[11], -5));
01595 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[12], 980));
01596 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[13], 36));
01597 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[14], 1));
01598 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[15], -5));
01599 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[16], 980));
01600 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[17], 36));
01601
01602
01603 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[18]));
01604 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[19], 0));
01605 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[20], 0));
01606 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[21], 10));
01607 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[22], 0));
01608 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[23], 0));
01609 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[24], 0));
01610 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[25], 10));
01611 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[26], 0));
01612
01613 BOOST_CHECK(iter == calc.mWarnings.end());
01614 }
01615
01616 void CalcExtCastTest::testCalcExtCastStringToExactFails()
01617 {
01618
01619 ostringstream pg(""), outloc("");
01620 outloc << "s8, s8, s8, s8;" << endl;
01621 pg << "O " << outloc.str();
01622 pg << "L " << outloc.str();
01623 pg << "C vc,3, vc,3, c,3, c,3;" << endl;
01624 pg << "V 0x" << stringToHex("abc") << ", 0x" << stringToHex("12z")
01625 << ", 0x" << stringToHex("abc") << ", 0x" << stringToHex("12z")
01626 << ";" << endl;
01627 pg << "T;" << endl;
01628 pg << "CALL 'castA(L0, C0);" << endl;
01629 pg << "CALL 'castA(L1, C1);" << endl;
01630 pg << "CALL 'castA(L2, C0);" << endl;
01631 pg << "CALL 'castA(L3, C1);" << endl;
01632 refLocalOutput(pg, 4);
01633
01634 Calculator calc(0);
01635 try {
01636 calc.assemble(pg.str().c_str());
01637 } catch (FennelExcn& ex) {
01638 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01639 BOOST_MESSAGE(pg.str());
01640 BOOST_REQUIRE(0);
01641 }
01642
01643 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01644 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01645 calc.bind(&inTuple, &outTuple);
01646 calc.exec();
01647 printOutput(outTuple, calc);
01648
01649
01650 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01651 for (int pc = 0; pc < 4; pc++, iter++) {
01652 BOOST_CHECK_EQUAL(iter->pc, pc);
01653 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01654 }
01655 BOOST_CHECK(iter == calc.mWarnings.end());
01656 }
01657
01658 void CalcExtCastTest::testCalcExtCastStringToDecimalFails()
01659 {
01660
01661
01662 ostringstream pg(""), outloc("");
01663 outloc << "s8, s8, s8, s8, s8, s8, s8, s8;" << endl;
01664 pg << "O " << outloc.str();
01665 pg << "L " << outloc.str();
01666 pg << "C vc,3, vc,9, vc,14, vc,7, c,3, c,9, c,14, c,7, "
01667 << " s4, s4;" << endl;
01668 pg << "V 0x" << stringToHex("12c")
01669 << ", 0x" << stringToHex("34.54.243")
01670 << ", 0x" << stringToHex("342.342e453.23")
01671 << ", 0x" << stringToHex("234e 23")
01672 << ", 0x" << stringToHex("12c")
01673 << ", 0x" << stringToHex("34.54.243")
01674 << ", 0x" << stringToHex("342.342e453.23")
01675 << ", 0x" << stringToHex("234e 23")
01676 << ", 5, 2;" << endl;
01677 pg << "T;" << endl;
01678
01679 for (int i = 0; i < 8; i++) {
01680 pg << "CALL 'castA(L" << i << ",C" << i << ",C8, C9);" << endl;
01681 }
01682 refLocalOutput(pg, 8);
01683
01684 Calculator calc(0);
01685 try {
01686 calc.assemble(pg.str().c_str());
01687 } catch (FennelExcn& ex) {
01688 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01689 BOOST_MESSAGE(pg.str());
01690 BOOST_REQUIRE(0);
01691 }
01692
01693 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01694 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01695 calc.bind(&inTuple, &outTuple);
01696 calc.exec();
01697 printOutput(outTuple, calc);
01698
01699
01700 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01701 for (int pc = 0; pc < 8; pc++, iter++) {
01702 BOOST_CHECK_EQUAL(iter->pc, pc);
01703 BOOST_CHECK_EQUAL(0, strcmp(iter->str, invalidCharErr));
01704 }
01705 BOOST_CHECK(iter == calc.mWarnings.end());
01706 }
01707
01708 void CalcExtCastTest::testCalcExtCastStringToDecimalMinMax()
01709 {
01710
01711
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721
01722 ostringstream pg(""), outloc("");
01723 outloc << "s8, s8, s8, s8, s8, s8, s8, s8, s8, s8, s8, "
01724 << "s8, s8, s8, s8, s8, s8, s8, s8, s8, s8, s8;" << endl;
01725 pg << "O " << outloc.str();
01726 pg << "L " << outloc.str();
01727 pg << "C vc,30, vc,30, vc,30, vc,30, vc,30, "
01728 << " vc,30, vc,30, vc,30, vc,30, vc,30, vc,30, "
01729 << " s4, s4, s4, s4;" << endl;
01730 pg << "V 0x" << stringToHex(minInt64String())
01731 << ", 0x" << stringToHex(maxInt64String())
01732 << ", 0x" << stringToHex("9223372036854775808")
01733 << ", 0x" << stringToHex("9223372036854775807.12345")
01734 << ", 0x" << stringToHex("9223372036854775807.9")
01735 << ", 0x" << stringToHex("-9223372036854775809")
01736 << ", 0x" << stringToHex("-9223372036854775807.9")
01737 << ", 0x" << stringToHex("-9223372036854775808.9")
01738 << ", 0x" << stringToHex("9323415432153452535")
01739 << ", 0x" << stringToHex("9.78E+18")
01740 << ", 0x" << stringToHex("9.78E+20")
01741 << ", 19, 0, 9, -10;" << endl;
01742 pg << "T;" << endl;
01743
01744 for (int i = 0; i < 11; i++) {
01745 pg << "CALL 'castA(L" << i << ",C" << i << ",C11, C12);" << endl;
01746 }
01747 for (int i = 0; i < 11; i++) {
01748 pg << "CALL 'castA(L" << (i + 11) << ",C" << i << ",C13, C14);" << endl;
01749 }
01750 refLocalOutput(pg, 22);
01751
01752 Calculator calc(0);
01753 try {
01754 calc.assemble(pg.str().c_str());
01755 } catch (FennelExcn& ex) {
01756 cout << ex.getMessage();
01757 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01758 BOOST_MESSAGE(pg.str());
01759 BOOST_REQUIRE(0);
01760 }
01761
01762 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01763 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01764 calc.bind(&inTuple, &outTuple);
01765 calc.exec();
01766 printOutput(outTuple, calc);
01767
01768
01769 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01770
01771
01772
01773 BOOST_CHECK_EQUAL(
01774 0, cmpTupInt64(outTuple[0], std::numeric_limits<int64_t>::min()));
01775
01776
01777 BOOST_CHECK_EQUAL(
01778 0, cmpTupInt64(outTuple[1], std::numeric_limits<int64_t>::max()));
01779
01780
01781 BOOST_CHECK_EQUAL(iter->pc, 2);
01782 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01783 iter++;
01784
01785
01786 BOOST_CHECK_EQUAL(
01787 0, cmpTupInt64(outTuple[3], std::numeric_limits<int64_t>::max()));
01788
01789
01790 BOOST_CHECK_EQUAL(iter->pc, 4);
01791 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01792 iter++;
01793
01794
01795 BOOST_CHECK_EQUAL(iter->pc, 5);
01796 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01797 iter++;
01798
01799
01800 BOOST_CHECK_EQUAL(
01801 0, cmpTupInt64(outTuple[6], std::numeric_limits<int64_t>::min()));
01802
01803
01804 BOOST_CHECK_EQUAL(iter->pc, 7);
01805 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01806 iter++;
01807
01808
01809 BOOST_CHECK_EQUAL(iter->pc, 8);
01810 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01811 iter++;
01812
01813
01814 BOOST_CHECK_EQUAL(iter->pc, 9);
01815 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01816 iter++;
01817
01818
01819 BOOST_CHECK_EQUAL(iter->pc, 10);
01820 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01821 iter++;
01822
01823
01824 int64_t factor = 1;
01825 for (int i = 0; i < 10; i++) {
01826 factor *= 10;
01827 }
01828 int64_t smax = std::numeric_limits<int64_t>::max()/factor + 1;
01829 int64_t smin = std::numeric_limits<int64_t>::min()/factor - 1;
01830
01831
01832 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[11], smin));
01833
01834
01835 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[12], smax));
01836
01837
01838 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[13], smax));
01839
01840
01841 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[14], smax));
01842
01843
01844 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[15], smax));
01845
01846
01847 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[16], smin));
01848
01849
01850 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[17], smin));
01851
01852
01853 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[18], smin));
01854
01855
01856 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[19], 932341543ll));
01857
01858
01859 BOOST_CHECK_EQUAL(0, cmpTupInt64(outTuple[20], 978000000ll));
01860
01861
01862 BOOST_CHECK_EQUAL(iter->pc, 21);
01863 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01864 iter++;
01865
01866 BOOST_CHECK(iter == calc.mWarnings.end());
01867 }
01868
01869
01870 void CalcExtCastTest::testCalcExtCastStringToDecimalRange()
01871 {
01872
01873
01874 ostringstream pg(""), outloc("");
01875 outloc << "s8, s8, s8, s8, s8, s8;" << endl;
01876 pg << "O " << outloc.str();
01877 pg << "L " << outloc.str();
01878 pg << "C vc,30, vc,30, vc,30, vc,30, vc,30, vc,30, "
01879 << " s4, s4;" << endl;
01880 pg << "V 0x" << stringToHex("1000")
01881 << ", 0x" << stringToHex("999.999")
01882 << ", 0x" << stringToHex("999.991")
01883 << ", 0x" << stringToHex("9.99999e2")
01884 << ", 0x" << stringToHex("9.9999e2")
01885 << ", 0x" << stringToHex("99999999990000000000e-20")
01886 << ", 5, 2;" << endl;
01887 pg << "T;" << endl;
01888
01889 for (int i = 0; i < 6; i++) {
01890 pg << "CALL 'castA(L" << i << ",C" << i << ",C6, C7);" << endl;
01891 }
01892 refLocalOutput(pg, 6);
01893
01894 Calculator calc(0);
01895 try {
01896 calc.assemble(pg.str().c_str());
01897 } catch (FennelExcn& ex) {
01898 cout << ex.getMessage();
01899 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01900 BOOST_MESSAGE(pg.str());
01901 BOOST_REQUIRE(0);
01902 }
01903
01904 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01905 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01906 calc.bind(&inTuple, &outTuple);
01907 calc.exec();
01908 printOutput(outTuple, calc);
01909
01910
01911 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01912
01913
01914
01915 BOOST_CHECK_EQUAL(iter->pc, 0);
01916 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01917 iter++;
01918
01919
01920 BOOST_CHECK_EQUAL(iter->pc, 1);
01921 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01922 iter++;
01923
01924
01925 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], 99999));
01926
01927
01928 BOOST_CHECK_EQUAL(iter->pc, 3);
01929 BOOST_CHECK_EQUAL(0, strcmp(iter->str, outOfRangeErr));
01930 iter++;
01931
01932
01933 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 99999));
01934
01935
01936 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 100));
01937 BOOST_CHECK(iter == calc.mWarnings.end());
01938 }
01939
01940
01941 void CalcExtCastTest::testCalcExtCastStringToApprox()
01942 {
01943
01944
01945 ostringstream pg(""), outloc("");
01946 outloc << "d, d, d, d, d, d, d, d, "
01947 << "d, d, d, d, d, d, d, d, "
01948 << "d, d, d, d, d, d, d, d;" << endl;
01949 pg << "O " << outloc.str();
01950 pg << "L " << outloc.str();
01951 pg << "C "
01952 << "vc,8, vc,8, vc,8, vc,8, vc,8, vc,8, vc,8, vc,8, "
01953 << "c,1, c,1, c,3, c,2, c,4, c,5, c,5, c,7, "
01954 << "c,16, c,16, c,16, c,16, c,16, c,16, c,16, c,16;" << endl;
01955 pg << "V ";
01956 for (int i = 0; i < 2; i++) {
01957 pg << ","
01958 << "0x" << stringToHex("0") << ","
01959 << "0x" << stringToHex("0.0") << ","
01960 << "0x" << stringToHex(".0") << ","
01961 << "0x" << stringToHex("1.98") << ","
01962 << "0x" << stringToHex("-1.98") << ","
01963 << "0x" << stringToHex("0.001") << ","
01964 << "0x" << stringToHex("0.00100") << ",";
01965 }
01966
01967 pg << ","
01968 << "0x" << stringToHex("0 ") << ","
01969 << "0x" << stringToHex("0.0 ") << ","
01970 << "0x" << stringToHex(".0 ") << ","
01971 << "0x" << stringToHex("1.98 ") << ","
01972 << "0x" << stringToHex("-1.98 ") << ","
01973 << "0x" << stringToHex("0.001 ") << ","
01974 << "0x" << stringToHex("0.00100 ") << ";" << endl;
01975 pg << "T;" << endl;
01976 for (int i = 0; i < 8; i++) {
01977 pg << "CALL 'castA(L" << i << ", C" << i << ");" << endl;
01978 }
01979 for (int i = 0; i < 8; i++) {
01980 pg << "CALL 'castA(L" << (i + 8) << ", C" << i << ");" << endl;
01981 }
01982 for (int i = 0; i < 8; i++) {
01983 pg << "CALL 'castA(L" << (i + 16) << ", C" << i << ");" << endl;
01984 }
01985 refLocalOutput(pg, 24);
01986
01987 Calculator calc(0);
01988 try {
01989 calc.assemble(pg.str().c_str());
01990 } catch (FennelExcn& ex) {
01991 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01992 BOOST_MESSAGE(pg.str());
01993 BOOST_REQUIRE(0);
01994 }
01995
01996 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01997 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01998 calc.bind(&inTuple, &outTuple);
01999 calc.exec();
02000 printOutput(outTuple, calc);
02001
02002 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
02003
02004 for (int pass = 0, i = 0; pass < 3; pass++) {
02005 BOOST_CHECK(cmpTupNull(outTuple[i++]));
02006 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], 0));
02007 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], 0));
02008 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], 0));
02009 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], 1.98));
02010 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], -1.98));
02011 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], 0.001));
02012 BOOST_CHECK_EQUAL(0, cmpTupDouble(outTuple[i++], 0.001));
02013 }
02014 BOOST_CHECK(iter == calc.mWarnings.end());
02015 }
02016
02017 void CalcExtCastTest::testCalcExtCastApproxToString()
02018 {
02019
02020
02021 ostringstream pg(""), outloc("");
02022 outloc << "vc,16, vc,16, vc,16, vc,16, vc,16, vc,16, "
02023 << "c,16, c,16, c,16, c,16, c,16, c,16;" << endl;
02024 pg << "O " << outloc.str();
02025 pg << "L " << outloc.str();
02026 pg << "C d,d,d,d,d,d;" << endl;
02027 pg << "V , 0.0, 1.98, -1.98, 0.001, -0.001;" << endl;
02028 pg << "T;" << endl;
02029 for (int i = 0; i < 6; i++) {
02030 pg << "CALL 'castA(L" << i << ", C" << i << ");" << endl;
02031 }
02032 for (int i = 0; i < 6; i++) {
02033 pg << "CALL 'castA(L" << (i + 6) << ", C" << i << ");" << endl;
02034 }
02035 refLocalOutput(pg, 12);
02036
02037
02038 Calculator calc(0);
02039 try {
02040 calc.assemble(pg.str().c_str());
02041 } catch (FennelExcn& ex) {
02042 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
02043 BOOST_MESSAGE(pg.str());
02044 BOOST_REQUIRE(0);
02045 }
02046
02047 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
02048 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
02049 calc.bind(&inTuple, &outTuple);
02050 calc.exec();
02051 printOutput(outTuple, calc);
02052
02053 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
02054
02055 int i = 0;
02056
02057
02058 BOOST_CHECK(cmpTupNull(outTuple[i++]));
02059 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "0E0"));
02060 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "1.98E0"));
02061 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "-1.98E0"));
02062 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "1E-3"));
02063 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "-1E-3"));
02064
02065 BOOST_CHECK(cmpTupNull(outTuple[i++]));
02066 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "0E0 "));
02067 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "1.98E0 "));
02068 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "-1.98E0 "));
02069 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "1E-3 "));
02070 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[i++], "-1E-3 "));
02071 BOOST_CHECK(iter == calc.mWarnings.end());
02072 }
02073
02074 FENNEL_UNIT_TEST_SUITE(CalcExtCastTest);
02075
02076