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
00038
00039 using namespace fennel;
00040 using namespace std;
00041
00042
00043 class CalcExtStringTest : virtual public TestBase, public TraceSource
00044 {
00045 void testCalcExtStringCatA2();
00046 void testCalcExtStringCatA3();
00047 void testCalcExtStringCmpA();
00048 void testCalcExtStringCmpOct();
00049 void testCalcExtStringLenBitA();
00050 void testCalcExtStringLenCharA();
00051 void testCalcExtStringLenOctA();
00052 void testCalcExtStringOverlayA4();
00053 void testCalcExtStringOverlayA5();
00054 void testCalcExtStringPosA();
00055 void testCalcExtStringSubStringA3();
00056 void testCalcExtStringSubStringA4();
00057 void testCalcExtStringToANull();
00058 void testCalcExtStringToLower();
00059 void testCalcExtStringToUpper();
00060 void testCalcExtStringTrim();
00061
00062 int cmpTupStr(
00063 TupleDatum const & tup,
00064 char const * const str);
00065 int cmpTupInt(
00066 TupleDatum const & tup,
00067 int val);
00068 int cmpTupNull(TupleDatum const & tup);
00069 void printOutput(
00070 TupleData const & tup,
00071 Calculator const & calc);
00072 void refLocalOutput(
00073 ostringstream& pg,
00074 int count);
00075 static const char* truncErr;
00076 static const char* substrErr;
00077
00078 public:
00079 explicit CalcExtStringTest()
00080 : TraceSource(shared_from_this(),"CalcExtStringTest")
00081 {
00082 srand(time(NULL));
00083 CalcInit::instance();
00084 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringCatA2);
00085 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringCatA3);
00086 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringCmpA);
00087 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringCmpOct);
00088 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringLenBitA);
00089 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringLenCharA);
00090 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringLenOctA);
00091 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringOverlayA4);
00092 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringOverlayA5);
00093 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringPosA);
00094 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringSubStringA3);
00095 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringSubStringA4);
00096 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringToANull);
00097 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringToLower);
00098 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringToUpper);
00099 FENNEL_UNIT_TEST_CASE(CalcExtStringTest, testCalcExtStringTrim);
00100 }
00101
00102 virtual ~CalcExtStringTest()
00103 {
00104 }
00105 };
00106
00107 const char *
00108 CalcExtStringTest::truncErr = "22001";
00109
00110 const char *
00111 CalcExtStringTest::substrErr = "22011";
00112
00113 int
00114 CalcExtStringTest::cmpTupStr(
00115 TupleDatum const & tup,
00116 char const * const str)
00117 {
00118 int len = strlen(str);
00119 BOOST_CHECK_EQUAL(len, tup.cbData);
00120 return strncmp(
00121 reinterpret_cast<char *>(const_cast<PBuffer>(tup.pData)),
00122 str,
00123 len);
00124 }
00125
00126 int
00127 CalcExtStringTest::cmpTupInt(
00128 TupleDatum const & tup,
00129 int val)
00130 {
00131 return *(reinterpret_cast<int*>(
00132 const_cast<PBuffer>(tup.pData)))
00133 - val;
00134 }
00135
00136 int
00137 CalcExtStringTest::cmpTupNull(TupleDatum const & tup)
00138 {
00139 if ((const_cast<PBuffer>(tup.pData)) == NULL) {
00140 return 1;
00141 }
00142 return 0;
00143 }
00144
00145
00146 void
00147 CalcExtStringTest::printOutput(
00148 TupleData const & tup,
00149 Calculator const & calc)
00150 {
00151 #if 0
00152 TuplePrinter tuplePrinter;
00153 tuplePrinter.print(cout, calc.getOutputRegisterDescriptor(), tup);
00154 cout << endl;
00155 #endif
00156 }
00157
00158
00159 void
00160 CalcExtStringTest::refLocalOutput(
00161 ostringstream& pg,
00162 int count)
00163 {
00164 int i;
00165
00166 for (i = 0; i < count; i++) {
00167 pg << "REF O" << i << ", L" << i << ";" << endl;
00168 }
00169 }
00170
00171
00172 void
00173 CalcExtStringTest::testCalcExtStringCatA2()
00174 {
00175 ostringstream pg(""), outloc("");
00176 int i;
00177
00178 for (i = 0; i <= 2; i++) {
00179 outloc << "vc,5, ";
00180 }
00181 outloc << "c,5, ";
00182 outloc << "vc,1, c,1;" << endl;
00183
00184 pg << "O " << outloc.str();
00185 pg << "L " << outloc.str();
00186 pg << "C vc,5, vc,2, vc,2, ";
00187 pg << "c,5, ";
00188 pg << "vc,5, c,5;" << endl;
00189 pg << "V 0x" << stringToHex("AB");
00190 pg << ", 0x" << stringToHex("CD");
00191 pg << ", 0x" << stringToHex("");
00192 pg << ", 0x" << stringToHex("GHIJ ");
00193 pg << ",,;" << endl;
00194 pg << "T;" << endl;
00195
00196
00197 pg << "CALL 'strCpyA(L0, C2);" << endl;
00198 pg << "CALL 'strCatA2(L0, C0);" << endl;
00199
00200 pg << "CALL 'strCatA2(L0, C1);" << endl;
00201
00202
00203 pg << "CALL 'strCpyA(L1, C2);" << endl;
00204 pg << "CALL 'strCatA2(L1, C2);" << endl;
00205
00206 pg << "CALL 'strCatA2(L2, C4);" << endl;
00207
00208 pg << "CALL 'strCatA2(L4, C0);" << endl;
00209
00210
00211
00212
00213
00214 pg << "CALL 'strCatA2(L3, C5);" << endl;
00215
00216 pg << "CALL 'strCatA2(L5, C3);" << endl;
00217
00218 refLocalOutput(pg, 6);
00219
00220 Calculator calc(0);
00221
00222 try {
00223 calc.assemble(pg.str().c_str());
00224 } catch (FennelExcn& ex) {
00225 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00226 BOOST_MESSAGE(pg.str());
00227 BOOST_REQUIRE(0);
00228 }
00229
00230 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00231 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00232
00233 calc.bind(&inTuple, &outTuple);
00234 calc.exec();
00235 printOutput(outTuple, calc);
00236 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00237
00238
00239 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "ABCD"));
00240
00241 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], ""));
00242
00243 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
00244
00245 BOOST_CHECK_EQUAL(iter->pc, 6);
00246 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00247 iter++;
00248
00249 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
00250
00251 BOOST_CHECK_EQUAL(iter->pc, 8);
00252 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00253 iter++;
00254 BOOST_CHECK(iter == calc.mWarnings.end());
00255 }
00256 void
00257 CalcExtStringTest::testCalcExtStringCatA3()
00258 {
00259 ostringstream pg(""), outloc("");
00260 int i;
00261
00262 for (i = 0; i <= 3; i++) {
00263 outloc << "vc,5, ";
00264 }
00265 for (i = 4; i <= 6; i++) {
00266 outloc << "c,5, ";
00267 }
00268 outloc << "vc,1, c,1;" << endl;
00269
00270 pg << "O " << outloc.str();
00271 pg << "L " << outloc.str();
00272 pg << "C vc,5, vc,2, vc,2, ";
00273 pg << "c,3, c,2, ";
00274 pg << "vc,5, c,5;" << endl;
00275 pg << "V 0x" << stringToHex("AB");
00276 pg << ", 0x" << stringToHex("CD");
00277 pg << ", 0x" << stringToHex("");
00278 pg << ", 0x" << stringToHex("GHI");
00279 pg << ", 0x" << stringToHex("JK");
00280 pg << ",,;" << endl;
00281 pg << "T;" << endl;
00282
00283 pg << "CALL 'strCatA3(L0, C0, C1);" << endl;
00284
00285 pg << "CALL 'strCatA3(L1, C2, C2);" << endl;
00286
00287 pg << "CALL 'strCatA3(L2, C5, C1);" << endl;
00288 pg << "CALL 'strCatA3(L3, C0, C5);" << endl;
00289
00290 pg << "CALL 'strCatA3(L7, C0, C0);" << endl;
00291
00292
00293 pg << "CALL 'strCatA3(L4, C3, C4);" << endl;
00294
00295 pg << "CALL 'strCatA3(L5, C6, C4);" << endl;
00296 pg << "CALL 'strCatA3(L6, C3, C6);" << endl;
00297
00298 pg << "CALL 'strCatA3(L8, C3, C4);" << endl;
00299
00300 refLocalOutput(pg, 9);
00301
00302 Calculator calc(0);
00303
00304 try {
00305 calc.assemble(pg.str().c_str());
00306 } catch (FennelExcn& ex) {
00307 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00308 BOOST_MESSAGE(pg.str());
00309 BOOST_REQUIRE(0);
00310 }
00311
00312 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00313 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00314
00315 calc.bind(&inTuple, &outTuple);
00316 calc.exec();
00317 printOutput(outTuple, calc);
00318 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00319
00320
00321 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "ABCD"));
00322
00323 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], ""));
00324
00325 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
00326 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
00327
00328 BOOST_CHECK_EQUAL(iter->pc, 4);
00329 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00330 iter++;
00331
00332 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[4], "GHIJK"));
00333
00334 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[5]));
00335 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[6]));
00336
00337 BOOST_CHECK_EQUAL(iter->pc, 8);
00338 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00339 iter++;
00340 BOOST_CHECK(iter == calc.mWarnings.end());
00341 }
00342
00343 void
00344 CalcExtStringTest::testCalcExtStringCmpA()
00345 {
00346 ostringstream pg(""), outloc("");
00347 int i;
00348
00349 for (i = 0; i <= 11; i++) {
00350 outloc << "s4, ";
00351 }
00352 outloc << "s4;" << endl;
00353
00354 pg << "O " << outloc.str();
00355 pg << "L " << outloc.str();
00356 pg << "C vc,2, vc,2, vc,2, ";
00357 pg << "c,2, c,2, c,2, ";
00358 pg << "vc,5, c,5;" << endl;
00359 pg << "V 0x" << stringToHex("AB");
00360 pg << ", 0x" << stringToHex("CD");
00361 pg << ", 0x" << stringToHex("EF");
00362 pg << ", 0x" << stringToHex("GH");
00363 pg << ", 0x" << stringToHex("IJ");
00364 pg << ", 0x" << stringToHex("EF");
00365 pg << ",,;" << endl;
00366 pg << "T;" << endl;
00367
00368 pg << "CALL 'strCmpA(L0, C0, C0);" << endl;
00369 pg << "CALL 'strCmpA(L1, C1, C0);" << endl;
00370 pg << "CALL 'strCmpA(L2, C0, C1);" << endl;
00371
00372 pg << "CALL 'strCmpA(L3, C6, C0);" << endl;
00373 pg << "CALL 'strCmpA(L4, C0, C6);" << endl;
00374
00375 pg << "CALL 'strCmpA(L5, C3, C3);" << endl;
00376 pg << "CALL 'strCmpA(L6, C4, C3);" << endl;
00377 pg << "CALL 'strCmpA(L7, C3, C4);" << endl;
00378
00379 pg << "CALL 'strCmpA(L8, C7, C2);" << endl;
00380 pg << "CALL 'strCmpA(L9, C2, C7);" << endl;
00381
00382 pg << "CALL 'strCmpA(L10, C2, C5);" << endl;
00383 pg << "CALL 'strCmpA(L11, C0, C3);" << endl;
00384 pg << "CALL 'strCmpA(L12, C3, C0);" << endl;
00385
00386
00387 refLocalOutput(pg, 13);
00388
00389 Calculator calc(0);
00390
00391 try {
00392 calc.assemble(pg.str().c_str());
00393 } catch (FennelExcn& ex) {
00394 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00395 BOOST_MESSAGE(pg.str());
00396 BOOST_REQUIRE(0);
00397 }
00398
00399 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00400 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00401
00402 calc.bind(&inTuple, &outTuple);
00403 calc.exec();
00404 printOutput(outTuple, calc);
00405
00406
00407 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[0], 0));
00408 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 1));
00409 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], -1));
00410
00411 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
00412 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[4]));
00413
00414 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 0));
00415 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[6], 1));
00416 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[7], -1));
00417
00418 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[8]));
00419 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[9]));
00420
00421 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[10], 0));
00422 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[11], -1));
00423 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[12], 1));
00424 }
00425
00426 void
00427 CalcExtStringTest::testCalcExtStringCmpOct()
00428 {
00429 ostringstream pg(""), outloc("");
00430 int i;
00431
00432 for (i = 0; i <= 11; i++) {
00433 outloc << "s4, ";
00434 }
00435 outloc << "s4;" << endl;
00436
00437 pg << "O " << outloc.str();
00438 pg << "L " << outloc.str();
00439 pg << "C vb,1, vb,1, vb,1, ";
00440
00441 pg << "b,1, b,1, b,1, ";
00442 pg << "vb,0, b,0; " << endl;
00443 pg << "V 0xAA";
00444 pg << ", 0xBB";
00445 pg << ", 0xCC";
00446 pg << ", 0xDD";
00447 pg << ", 0xEE";
00448 pg << ", 0xCC";
00449 pg << ",,;" << endl;
00450
00451 pg << "T;" << endl;
00452
00453 pg << "CALL 'strCmpOct(L0, C0, C0);" << endl;
00454 pg << "CALL 'strCmpOct(L1, C1, C0);" << endl;
00455 pg << "CALL 'strCmpOct(L2, C0, C1);" << endl;
00456
00457 pg << "CALL 'strCmpOct(L3, C6, C0);" << endl;
00458 pg << "CALL 'strCmpOct(L4, C0, C6);" << endl;
00459
00460 pg << "CALL 'strCmpOct(L5, C3, C3);" << endl;
00461 pg << "CALL 'strCmpOct(L6, C4, C3);" << endl;
00462 pg << "CALL 'strCmpOct(L7, C3, C4);" << endl;
00463
00464 pg << "CALL 'strCmpOct(L8, C7, C3);" << endl;
00465 pg << "CALL 'strCmpOct(L9, C3, C7);" << endl;
00466
00467 pg << "CALL 'strCmpOct(L10, C2, C2);" << endl;
00468 pg << "CALL 'strCmpOct(L11, C0, C3);" << endl;
00469 pg << "CALL 'strCmpOct(L12, C3, C0);" << endl;
00470
00471 refLocalOutput(pg, 13);
00472
00473 Calculator calc(0);
00474
00475 try {
00476 calc.assemble(pg.str().c_str());
00477 } catch (FennelExcn& ex) {
00478 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00479 BOOST_MESSAGE(pg.str());
00480 BOOST_REQUIRE(0);
00481 }
00482
00483 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00484 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00485
00486 calc.bind(&inTuple, &outTuple);
00487 calc.exec();
00488 printOutput(outTuple, calc);
00489
00490
00491 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[0], 0));
00492 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 1));
00493 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[2], -1));
00494
00495 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
00496 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[4]));
00497
00498 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 0));
00499 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[6], 1));
00500 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[7], -1));
00501
00502 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[8]));
00503 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[9]));
00504
00505 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[10], 0));
00506 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[11], -1));
00507 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[12], 1));
00508 }
00509
00510 void
00511 CalcExtStringTest::testCalcExtStringLenBitA()
00512 {
00513 ostringstream pg(""), outloc("");
00514 int i;
00515
00516 for (i = 0; i <= 8; i++) {
00517 outloc << "s4, ";
00518 }
00519 outloc << "s4;" << endl;
00520
00521 pg << "O " << outloc.str();
00522 pg << "L " << outloc.str();
00523 pg << "C vc,2, vc,2, ";
00524 pg << "c,2, c,2, ";
00525 pg << "vc,5, c,5;" << endl;
00526 pg << "V 0x" << stringToHex("AB");
00527 pg << ", 0x" << stringToHex("");
00528 pg << ", 0x" << stringToHex("GH");
00529 pg << ", 0x" << stringToHex(" ");
00530 pg << ",,;" << endl;
00531 pg << "T;" << endl;
00532
00533 pg << "CALL 'strLenBitA(L0, C0);" << endl;
00534 pg << "CALL 'strLenBitA(L1, C1);" << endl;
00535
00536 pg << "CALL 'strLenBitA(L2, C4);" << endl;
00537
00538 pg << "CALL 'strLenBitA(L3, C2);" << endl;
00539 pg << "CALL 'strLenBitA(L4, C3);" << endl;
00540
00541 pg << "CALL 'strLenBitA(L5, C5);" << endl;
00542
00543 refLocalOutput(pg, 6);
00544
00545 Calculator calc(0);
00546
00547 try {
00548 calc.assemble(pg.str().c_str());
00549 } catch (FennelExcn& ex) {
00550 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00551 BOOST_MESSAGE(pg.str());
00552 BOOST_REQUIRE(0);
00553 }
00554
00555 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00556 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00557
00558 calc.bind(&inTuple, &outTuple);
00559 calc.exec();
00560 printOutput(outTuple, calc);
00561
00562
00563 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[0], 16));
00564 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 0));
00565
00566 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
00567
00568 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[3], 16));
00569 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 16));
00570
00571 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[5]));
00572 }
00573
00574 void
00575 CalcExtStringTest::testCalcExtStringLenCharA()
00576 {
00577 ostringstream pg(""), outloc("");
00578 int i;
00579
00580 for (i = 0; i <= 8; i++) {
00581 outloc << "s4, ";
00582 }
00583 outloc << "s4;" << endl;
00584
00585 pg << "O " << outloc.str();
00586 pg << "L " << outloc.str();
00587 pg << "C vc,2, vc,2, ";
00588 pg << "c,2, c,2, ";
00589 pg << "vc,5, c,5;" << endl;
00590 pg << "V 0x" << stringToHex("AB");
00591 pg << ", 0x" << stringToHex("");
00592 pg << ", 0x" << stringToHex("GH");
00593 pg << ", 0x" << stringToHex(" ");
00594 pg << ",,;" << endl;
00595 pg << "T;" << endl;
00596
00597 pg << "CALL 'strLenCharA(L0, C0);" << endl;
00598 pg << "CALL 'strLenCharA(L1, C1);" << endl;
00599
00600 pg << "CALL 'strLenCharA(L2, C4);" << endl;
00601
00602 pg << "CALL 'strLenCharA(L3, C2);" << endl;
00603 pg << "CALL 'strLenCharA(L4, C3);" << endl;
00604
00605 pg << "CALL 'strLenCharA(L5, C5);" << endl;
00606
00607 refLocalOutput(pg, 10);
00608
00609 Calculator calc(0);
00610
00611 try {
00612 calc.assemble(pg.str().c_str());
00613 } catch (FennelExcn& ex) {
00614 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00615 BOOST_MESSAGE(pg.str());
00616 BOOST_REQUIRE(0);
00617 }
00618
00619 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00620 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00621
00622 calc.bind(&inTuple, &outTuple);
00623 calc.exec();
00624 printOutput(outTuple, calc);
00625
00626
00627 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[0], 2));
00628 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 0));
00629
00630 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
00631
00632 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[3], 2));
00633 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 2));
00634
00635 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[5]));
00636 }
00637
00638 void
00639 CalcExtStringTest::testCalcExtStringLenOctA()
00640 {
00641 ostringstream pg(""), outloc("");
00642 int i;
00643
00644 for (i = 0; i <= 8; i++) {
00645 outloc << "s4, ";
00646 }
00647 outloc << "s4;" << endl;
00648
00649 pg << "O " << outloc.str();
00650 pg << "L " << outloc.str();
00651 pg << "C vc,2, vc,2, ";
00652 pg << "c,2, c,2, ";
00653 pg << "vc,5, c,5;" << endl;
00654 pg << "V 0x" << stringToHex("AB");
00655 pg << ", 0x" << stringToHex("");
00656 pg << ", 0x" << stringToHex("GH");
00657 pg << ", 0x" << stringToHex(" ");
00658 pg << ",,;" << endl;
00659 pg << "T;" << endl;
00660
00661 pg << "CALL 'strLenOctA(L0, C0);" << endl;
00662 pg << "CALL 'strLenOctA(L1, C1);" << endl;
00663
00664 pg << "CALL 'strLenOctA(L2, C4);" << endl;
00665
00666 pg << "CALL 'strLenOctA(L3, C2);" << endl;
00667 pg << "CALL 'strLenOctA(L4, C3);" << endl;
00668
00669 pg << "CALL 'strLenOctA(L5, C5);" << endl;
00670
00671 refLocalOutput(pg, 6);
00672
00673 Calculator calc(0);
00674
00675 try {
00676 calc.assemble(pg.str().c_str());
00677 } catch (FennelExcn& ex) {
00678 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00679 BOOST_MESSAGE(pg.str());
00680 BOOST_REQUIRE(0);
00681 }
00682
00683 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00684 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00685
00686 calc.bind(&inTuple, &outTuple);
00687 calc.exec();
00688 printOutput(outTuple, calc);
00689
00690
00691 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[0], 2));
00692 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 0));
00693
00694 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
00695
00696 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[3], 2));
00697 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 2));
00698
00699 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[5]));
00700 }
00701
00702 void
00703 CalcExtStringTest::testCalcExtStringOverlayA4()
00704 {
00705 ostringstream pg(""), outloc("");
00706 int i;
00707
00708 for (i = 0; i <= 9; i++) {
00709 outloc << "vc,5, ";
00710 }
00711 outloc << "vc,1, vc,1;" << endl;
00712
00713 pg << "O " << outloc.str();
00714 pg << "L " << outloc.str();
00715 pg << "C vc,5, vc,2, c,5, c,2, s4, ";
00716 pg << "s4, ";
00717 pg << "vc,5, c,5, s4;" << endl;
00718 pg << "V 0x" << stringToHex("ABCD");
00719 pg << ", 0x" << stringToHex("EF");
00720 pg << ", 0x" << stringToHex("GHIJ ");
00721 pg << ", 0x" << stringToHex("KL");
00722 pg << ", 2,-2,,,;" << endl;
00723 pg << "T;" << endl;
00724
00725 pg << "CALL 'strOverlayA4(L0, C0, C1, C4);" << endl;
00726
00727 pg << "CALL 'strOverlayA4(L1, C6, C1, C4);" << endl;
00728 pg << "CALL 'strOverlayA4(L2, C0, C6, C4);" << endl;
00729 pg << "CALL 'strOverlayA4(L3, C0, C1, C8);" << endl;
00730
00731 pg << "CALL 'strOverlayA4(L4, C0, C1, C5);" << endl;
00732
00733 pg << "CALL 'strOverlayA4(L10, C0, C1, C4);" << endl;
00734
00735
00736 pg << "CALL 'strOverlayA4(L5, C2, C3, C4);" << endl;
00737
00738 pg << "CALL 'strOverlayA4(L6, C7, C3, C4);" << endl;
00739 pg << "CALL 'strOverlayA4(L7, C2, C7, C4);" << endl;
00740 pg << "CALL 'strOverlayA4(L8, C2, C3, C8);" << endl;
00741
00742 pg << "CALL 'strOverlayA4(L9, C2, C3, C5);" << endl;
00743
00744 pg << "CALL 'strOverlayA4(L11, C2, C3, C4);" << endl;
00745
00746 refLocalOutput(pg, 12);
00747
00748 Calculator calc(0);
00749
00750 try {
00751 calc.assemble(pg.str().c_str());
00752 } catch (FennelExcn& ex) {
00753 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00754 BOOST_MESSAGE(pg.str());
00755 BOOST_REQUIRE(0);
00756 }
00757
00758 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00759 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00760
00761 calc.bind(&inTuple, &outTuple);
00762 calc.exec();
00763 printOutput(outTuple, calc);
00764 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00765
00766
00767 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "AEFD"));
00768
00769 for (i = 1; i <= 3; i++) {
00770 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[i]));
00771 }
00772
00773 BOOST_CHECK_EQUAL(iter->pc, 4);
00774 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
00775 iter++;
00776
00777 BOOST_CHECK_EQUAL(iter->pc, 5);
00778 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00779 iter++;
00780
00781 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[5], "GKLJ "));
00782
00783 for (i = 6; i <= 8; i++) {
00784 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[i]));
00785 }
00786
00787 BOOST_CHECK_EQUAL(iter->pc, 10);
00788 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
00789 iter++;
00790
00791 BOOST_CHECK_EQUAL(iter->pc, 11);
00792 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00793 iter++;
00794 BOOST_CHECK(iter == calc.mWarnings.end());
00795 }
00796
00797 void
00798 CalcExtStringTest::testCalcExtStringOverlayA5()
00799 {
00800 ostringstream pg(""), outloc("");
00801 int i;
00802
00803 for (i = 0; i <= 13; i++) {
00804 outloc << "vc,5, ";
00805 }
00806 outloc << "vc,1, vc,1;" << endl;
00807
00808 pg << "O " << outloc.str();
00809 pg << "L " << outloc.str();
00810 pg << "C vc,5, vc,2, c,5, c,2, s4, s4, ";
00811 pg << "s4, ";
00812 pg << "vc,5, c,5, s4;" << endl;
00813 pg << "V 0x" << stringToHex("ABCD");
00814 pg << ", 0x" << stringToHex("EF");
00815 pg << ", 0x" << stringToHex("GHIJ ");
00816 pg << ", 0x" << stringToHex("KL");
00817 pg << ", 1, 2,-2,,,;" << endl;
00818 pg << "T;" << endl;
00819
00820 pg << "CALL 'strOverlayA5(L0, C0, C1, C4, C5);" << endl;
00821
00822 pg << "CALL 'strOverlayA5(L1, C7, C1, C4, C5);" << endl;
00823 pg << "CALL 'strOverlayA5(L2, C0, C7, C4, C5);" << endl;
00824 pg << "CALL 'strOverlayA5(L3, C0, C1, C9, C5);" << endl;
00825 pg << "CALL 'strOverlayA5(L4, C0, C1, C4, C9);" << endl;
00826
00827 pg << "CALL 'strOverlayA5(L5, C0, C1, C6, C5);" << endl;
00828 pg << "CALL 'strOverlayA5(L6, C0, C1, C4, C6);" << endl;
00829
00830 pg << "CALL 'strOverlayA5(L14, C0, C1, C4, C5);" << endl;
00831
00832
00833 pg << "CALL 'strOverlayA5(L7, C2, C3, C4, C5);" << endl;
00834
00835 pg << "CALL 'strOverlayA5(L8, C8, C3, C4, C5);" << endl;
00836 pg << "CALL 'strOverlayA5(L9, C2, C8, C4, C5);" << endl;
00837 pg << "CALL 'strOverlayA5(L10, C2, C3, C9, C5);" << endl;
00838 pg << "CALL 'strOverlayA5(L11, C2, C3, C4, C9);" << endl;
00839
00840 pg << "CALL 'strOverlayA5(L12, C2, C3, C6, C5);" << endl;
00841 pg << "CALL 'strOverlayA5(L13, C2, C3, C4, C6);" << endl;
00842
00843 pg << "CALL 'strOverlayA5(L15, C2, C3, C4, C5);" << endl;
00844
00845 refLocalOutput(pg, 16);
00846
00847 Calculator calc(0);
00848
00849 try {
00850 calc.assemble(pg.str().c_str());
00851 } catch (FennelExcn& ex) {
00852 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00853 BOOST_MESSAGE(pg.str());
00854 BOOST_REQUIRE(0);
00855 }
00856
00857 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00858 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00859
00860 calc.bind(&inTuple, &outTuple);
00861 calc.exec();
00862 printOutput(outTuple, calc);
00863 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
00864
00865
00866 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "EFCD"));
00867
00868 for (i = 1; i <= 4; i++) {
00869 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[i]));
00870 }
00871
00872 BOOST_CHECK_EQUAL(iter->pc, 5);
00873 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
00874 iter++;
00875 BOOST_CHECK_EQUAL(iter->pc, 6);
00876 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
00877 iter++;
00878
00879 BOOST_CHECK_EQUAL(iter->pc, 7);
00880 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00881 iter++;
00882
00883 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "KLIJ "));
00884
00885 for (i = 8; i <= 11; i++) {
00886 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[i]));
00887 }
00888
00889 BOOST_CHECK_EQUAL(iter->pc, 13);
00890 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
00891 iter++;
00892 BOOST_CHECK_EQUAL(iter->pc, 14);
00893 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
00894 iter++;
00895
00896 BOOST_CHECK_EQUAL(iter->pc, 15);
00897 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
00898 iter++;
00899 BOOST_CHECK(iter == calc.mWarnings.end());
00900 }
00901
00902 void
00903 CalcExtStringTest::testCalcExtStringPosA()
00904 {
00905 ostringstream pg(""), outloc("");
00906 int i;
00907
00908 for (i = 0; i <= 7; i++) {
00909 outloc << "s4, ";
00910 }
00911 outloc << "s4;" << endl;
00912
00913 pg << "O " << outloc.str();
00914 pg << "L " << outloc.str();
00915 pg << "C vc,5, vc,4, vc,4, ";
00916 pg << "c,5, c,2, c,2, ";
00917 pg << "vc,5, c,5";
00918 pg << ";" << endl;
00919 pg << "V 0x" << stringToHex("ABCD");
00920 pg << ", 0x" << stringToHex("BC");
00921 pg << ", 0x" << stringToHex("XX");
00922 pg << ", 0x" << stringToHex("GHIJ ");
00923 pg << ", 0x" << stringToHex("HI");
00924 pg << ", 0x" << stringToHex("XX");
00925 pg << ",,;" << endl;
00926 pg << "T;" << endl;
00927
00928 pg << "CALL 'strPosA(L0, C1, C0);" << endl;
00929 pg << "CALL 'strPosA(L1, C2, C0);" << endl;
00930
00931 pg << "CALL 'strPosA(L2, C1, C6);" << endl;
00932 pg << "CALL 'strPosA(L3, C6, C0);" << endl;
00933
00934 pg << "CALL 'strPosA(L4, C4, C3);" << endl;
00935 pg << "CALL 'strPosA(L5, C5, C3);" << endl;
00936
00937 pg << "CALL 'strPosA(L6, C4, C7);" << endl;
00938 pg << "CALL 'strPosA(L7, C7, C3);" << endl;
00939
00940 refLocalOutput(pg, 8);
00941
00942 Calculator calc(0);
00943
00944 try {
00945 calc.assemble(pg.str().c_str());
00946 } catch (FennelExcn& ex) {
00947 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00948 BOOST_MESSAGE(pg.str());
00949 BOOST_REQUIRE(0);
00950 }
00951
00952 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
00953 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
00954
00955 calc.bind(&inTuple, &outTuple);
00956 calc.exec();
00957 printOutput(outTuple, calc);
00958
00959 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[0], 2));
00960 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[1], 0));
00961 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
00962 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
00963 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[4], 2));
00964 BOOST_CHECK_EQUAL(0, cmpTupInt(outTuple[5], 0));
00965 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[6]));
00966 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[7]));
00967 }
00968
00969 void
00970 CalcExtStringTest::testCalcExtStringSubStringA3()
00971 {
00972 ostringstream pg(""), outloc("");
00973 int i;
00974
00975 for (i = 0; i <= 5; i++) {
00976 outloc << "vc,5, ";
00977 }
00978 outloc << "vc,1, vc,1;" << endl;
00979
00980 pg << "O " << outloc.str();
00981 pg << "L " << outloc.str();
00982 pg << "C vc,5, c,5, s4, ";
00983 pg << "vc,5, c,5, s4;" << endl;
00984
00985 pg << "V 0x" << stringToHex("ABCD");
00986 pg << ", 0x" << stringToHex("GHIJ ");
00987 pg << ", 2,,,;" << endl;
00988 pg << "T;" << endl;
00989
00990 pg << "CALL 'strSubStringA3(L0, C0, C2);" << endl;
00991
00992 pg << "CALL 'strSubStringA3(L1, C3, C2);" << endl;
00993 pg << "CALL 'strSubStringA3(L2, C0, C5);" << endl;
00994
00995
00996 pg << "CALL 'strSubStringA3(L6, C0, C2);" << endl;
00997
00998 pg << "CALL 'strSubStringA3(L3, C1, C2);" << endl;
00999
01000 pg << "CALL 'strSubStringA3(L4, C4, C2);" << endl;
01001 pg << "CALL 'strSubStringA3(L5, C1, C5);" << endl;
01002
01003
01004 pg << "CALL 'strSubStringA3(L7, C1, C2);" << endl;
01005
01006 refLocalOutput(pg, 8);
01007
01008 Calculator calc(0);
01009
01010 try {
01011 calc.assemble(pg.str().c_str());
01012 } catch (FennelExcn& ex) {
01013 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01014 BOOST_MESSAGE(pg.str());
01015 BOOST_REQUIRE(0);
01016 }
01017
01018 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01019 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01020
01021 calc.bind(&inTuple, &outTuple);
01022 calc.exec();
01023 printOutput(outTuple, calc);
01024 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01025
01026
01027 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "BCD"));
01028
01029 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[1]));
01030 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
01031
01032 BOOST_CHECK_EQUAL(iter->pc, 3);
01033 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01034 iter++;
01035
01036 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], "HIJ "));
01037
01038 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[4]));
01039 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[5]));
01040
01041 BOOST_CHECK_EQUAL(iter->pc, 7);
01042 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01043 iter++;
01044 BOOST_CHECK(iter == calc.mWarnings.end());
01045 }
01046
01047 void
01048 CalcExtStringTest::testCalcExtStringSubStringA4()
01049 {
01050 ostringstream pg(""), outloc("");
01051 int i;
01052
01053 for (i = 0; i <= 11; i++) {
01054 outloc << "vc,5, ";
01055 }
01056 outloc << "vc,1, vc,1;" << endl;
01057
01058 pg << "O " << outloc.str();
01059 pg << "L " << outloc.str();
01060 pg << "C vc,5, c,5, s4, s4, ";
01061 pg << "s4, ";
01062 pg << "vc,5, c,5, s4;" << endl;
01063 pg << "V 0x" << stringToHex("ABCD");
01064 pg << ", 0x" << stringToHex("GHIJ ");
01065 pg << ", 1, 2, -2,,,;" << endl;
01066 pg << "T;" << endl;
01067
01068 pg << "CALL 'strSubStringA4(L0, C0, C3, C2);" << endl;
01069 pg << "CALL 'strSubStringA4(L1, C0, C2, C3);" << endl;
01070
01071 pg << "CALL 'strSubStringA4(L2, C5, C3, C2);" << endl;
01072 pg << "CALL 'strSubStringA4(L3, C0, C7, C2);" << endl;
01073 pg << "CALL 'strSubStringA4(L4, C0, C3, C7);" << endl;
01074
01075 pg << "CALL 'strSubStringA4(L5, C0, C3, C4);" << endl;
01076
01077 pg << "CALL 'strSubStringA4(L12, C0, C2, C3);" << endl;
01078
01079 pg << "CALL 'strSubStringA4(L6, C1, C3, C2);" << endl;
01080 pg << "CALL 'strSubStringA4(L7, C1, C2, C3);" << endl;
01081
01082 pg << "CALL 'strSubStringA4(L8, C6, C3, C2);" << endl;
01083 pg << "CALL 'strSubStringA4(L9, C1, C7, C2);" << endl;
01084 pg << "CALL 'strSubStringA4(L10, C1, C3, C7);" << endl;
01085
01086 pg << "CALL 'strSubStringA4(L11, C1, C3, C4);" << endl;
01087
01088 pg << "CALL 'strSubStringA4(L13, C1, C2, C3);" << endl;
01089
01090 refLocalOutput(pg, 14);
01091
01092 Calculator calc(0);
01093
01094 try {
01095 calc.assemble(pg.str().c_str());
01096 } catch (FennelExcn& ex) {
01097 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01098 BOOST_MESSAGE(pg.str());
01099 BOOST_REQUIRE(0);
01100 }
01101
01102 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01103 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01104
01105 calc.bind(&inTuple, &outTuple);
01106 calc.exec();
01107 printOutput(outTuple, calc);
01108 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01109
01110
01111 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "B"));
01112 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "AB"));
01113
01114 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[2]));
01115 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
01116 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[4]));
01117
01118 BOOST_CHECK_EQUAL(iter->pc, 5);
01119 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
01120 iter++;
01121
01122 BOOST_CHECK_EQUAL(iter->pc, 6);
01123 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01124 iter++;
01125
01126 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[6], "H"));
01127 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[7], "GH"));
01128
01129 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[8]));
01130 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[9]));
01131 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[10]));
01132
01133 BOOST_CHECK_EQUAL(iter->pc, 12);
01134 BOOST_CHECK_EQUAL(0, strcmp(iter->str, substrErr));
01135 iter++;
01136
01137 BOOST_CHECK_EQUAL(iter->pc, 13);
01138 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01139 iter++;
01140 BOOST_CHECK(iter == calc.mWarnings.end());
01141 }
01142
01143
01144
01145
01146 void
01147 CalcExtStringTest::testCalcExtStringToANull()
01148 {
01149 ostringstream pg(""), outloc(""), outlocchar("");
01150 int i;
01151
01152 for (i = 0; i <= 4; i++) {
01153 outlocchar << "c,5, ";
01154 }
01155
01156 for (i = 5; i <= 13; i++) {
01157 outloc << "vc,5, ";
01158 }
01159 outloc << "vc,5;" << endl;
01160
01161 pg << "O " << outlocchar.str() << outloc.str();
01162 pg << "L " << outlocchar.str() << outloc.str();
01163 pg << "C vc,5, c,5, s4, vc,5, c,5;" << endl;
01164 pg << "V 0x" << stringToHex(" abc ");
01165 pg << ", 0x" << stringToHex(" hij ");
01166 pg << ", 1,,;" << endl;
01167 pg << "T;" << endl;
01168
01169 for (i = 0; i <= 14; i++) {
01170 pg << "TONULL L" << i << ";" << endl;
01171 }
01172
01173
01174 pg << "CALL 'strCatA2(L0, C1);" << endl;
01175 pg << "CALL 'strCatA3(L1, C1, C1);" << endl;
01176 pg << "CALL 'strCpyA(L2, C1);" << endl;
01177 pg << "CALL 'strToLowerA(L3, C1);" << endl;
01178 pg << "CALL 'strToUpperA(L4, C1);" << endl;
01179
01180
01181 pg << "CALL 'strCatA2(L5, C0);" << endl;
01182 pg << "CALL 'strCatA3(L6, C0, C0);" << endl;
01183 pg << "CALL 'strCpyA(L7, C0);" << endl;
01184 pg << "CALL 'strOverlayA4(L8, C0, C0, C2);" << endl;
01185 pg << "CALL 'strOverlayA5(L9, C0, C0, C2, C2);" << endl;
01186 pg << "CALL 'strSubStringA3(L10, C0, C2);" << endl;
01187 pg << "CALL 'strSubStringA4(L11, C0, C2, C2);" << endl;
01188 pg << "CALL 'strToLowerA(L12, C0);" << endl;
01189 pg << "CALL 'strToUpperA(L13, C0);" << endl;
01190 pg << "CALL 'strTrimA(L14, C0, C0, C2, C2);" << endl;
01191
01192
01193 refLocalOutput(pg, 15);
01194 Calculator calc(0);
01195
01196 try {
01197 calc.assemble(pg.str().c_str());
01198 } catch (FennelExcn& ex) {
01199 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01200 BOOST_MESSAGE(pg.str());
01201 BOOST_REQUIRE(0);
01202 }
01203
01204 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01205 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01206
01207 calc.bind(&inTuple, &outTuple);
01208 calc.exec();
01209 printOutput(outTuple, calc);
01210
01211 for (i = 0; i <= 14 ;i++) {
01212 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[i]));
01213 }
01214
01215 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01216 deque<CalcMessage>::iterator end = calc.mWarnings.end();
01217
01218 BOOST_CHECK(iter == end);
01219 }
01220
01221
01222 void
01223 CalcExtStringTest::testCalcExtStringToLower()
01224 {
01225 ostringstream pg(""), outloc("");
01226 int i;
01227
01228 for (i = 0; i <= 1; i++) {
01229 outloc << "vc,5, ";
01230 }
01231 for (i = 1; i <= 2; i++) {
01232 outloc << "c,5, ";
01233 }
01234 outloc << "vc,1;" << endl;
01235
01236 pg << "O " << outloc.str();
01237 pg << "L " << outloc.str();
01238 pg << "C vc,5, c,5, ";
01239 pg << "vc,5, c,5;" << endl;
01240 pg << "V 0x" << stringToHex("ABC");
01241 pg << ", 0x" << stringToHex("GHIJ ");
01242 pg << ",,;" << endl;
01243 pg << "T;" << endl;
01244
01245 pg << "CALL 'strToLowerA(L0, C0);" << endl;
01246
01247 pg << "CALL 'strToLowerA(L1, C2);" << endl;
01248
01249 pg << "CALL 'strToLowerA(L4, C0);" << endl;
01250
01251 pg << "CALL 'strToLowerA(L2, C1);" << endl;
01252
01253 pg << "CALL 'strToLowerA(L3, C3);" << endl;
01254
01255
01256
01257 refLocalOutput(pg, 5);
01258
01259 Calculator calc(0);
01260
01261 try {
01262 calc.assemble(pg.str().c_str());
01263 } catch (FennelExcn& ex) {
01264 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01265 BOOST_MESSAGE(pg.str());
01266 BOOST_REQUIRE(0);
01267 }
01268
01269 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01270 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01271
01272 calc.bind(&inTuple, &outTuple);
01273 calc.exec();
01274 printOutput(outTuple, calc);
01275 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01276
01277
01278 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "abc"));
01279
01280 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[1]));
01281
01282 BOOST_CHECK_EQUAL(iter->pc, 2);
01283 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01284 iter++;
01285 BOOST_CHECK(iter == calc.mWarnings.end());
01286
01287 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "ghij "));
01288
01289 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
01290 }
01291
01292 void
01293 CalcExtStringTest::testCalcExtStringToUpper()
01294 {
01295 ostringstream pg(""), outloc("");
01296 int i;
01297
01298 for (i = 0; i <= 1; i++) {
01299 outloc << "vc,5, ";
01300 }
01301 for (i = 1; i <= 2; i++) {
01302 outloc << "c,5, ";
01303 }
01304 outloc << "vc,1;" << endl;
01305
01306 pg << "O " << outloc.str();
01307 pg << "L " << outloc.str();
01308 pg << "C vc,5, c,5, ";
01309 pg << "vc,5, c,5;" << endl;
01310 pg << "V 0x" << stringToHex("abc");
01311 pg << ", 0x" << stringToHex("ghij ");
01312 pg << ",,;" << endl;
01313 pg << "T;" << endl;
01314
01315 pg << "CALL 'strToUpperA(L0, C0);" << endl;
01316
01317 pg << "CALL 'strToUpperA(L1, C2);" << endl;
01318
01319 pg << "CALL 'strToUpperA(L4, C0);" << endl;
01320
01321 pg << "CALL 'strToUpperA(L2, C1);" << endl;
01322
01323 pg << "CALL 'strToUpperA(L3, C3);" << endl;
01324
01325
01326
01327 refLocalOutput(pg, 5);
01328
01329 Calculator calc(0);
01330
01331 try {
01332 calc.assemble(pg.str().c_str());
01333 } catch (FennelExcn& ex) {
01334 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01335 BOOST_MESSAGE(pg.str());
01336 BOOST_REQUIRE(0);
01337 }
01338
01339 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01340 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01341
01342 calc.bind(&inTuple, &outTuple);
01343 calc.exec();
01344 printOutput(outTuple, calc);
01345 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01346
01347
01348 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "ABC"));
01349
01350 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[1]));
01351
01352 BOOST_CHECK_EQUAL(iter->pc, 2);
01353 BOOST_CHECK_EQUAL(0, strcmp(iter->str, truncErr));
01354 iter++;
01355 BOOST_CHECK(iter == calc.mWarnings.end());
01356
01357 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], "GHIJ "));
01358
01359 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[3]));
01360 }
01361
01362 void
01363 CalcExtStringTest::testCalcExtStringTrim()
01364 {
01365 ostringstream pg(""), outloc("");
01366 int i;
01367
01368 for (i = 0; i <= 28; i++) {
01369 outloc << "vc,10, ";
01370 }
01371 outloc << "vc,10;" << endl;
01372
01373 pg << "O " << outloc.str();
01374 pg << "L " << outloc.str();
01375 pg << "C vc,5, c,5, s4, s4, ";
01376 pg << "vc,5, c,5, s4, ";
01377 pg << "c,1, vc,1, vc,1, vc,2, vc,1, ";
01378 pg << "vc,10;" << endl;
01379 pg << "V 0x" << stringToHex(" abc ");
01380 pg << ", 0x" << stringToHex(" hij ");
01381 pg << ", 1, 0,,,";
01382 pg << ", 0x" << stringToHex(" ");
01383 pg << ", 0x" << stringToHex(" ");
01384 pg << ", 0x" << stringToHex("");
01385 pg << ", 0x" << stringToHex(" a");
01386 pg << ", 0x" << stringToHex("x");
01387 pg << ", 0x" << stringToHex("xx pqr xx");
01388 pg << ";" << endl;
01389 pg << "T;" << endl;
01390
01391
01392 pg << "CALL 'strTrimA(L0, C0, C8, C2, C2);" << endl;
01393 pg << "CALL 'strTrimA(L1, C0, C8, C2, C3);" << endl;
01394 pg << "CALL 'strTrimA(L2, C0, C8, C3, C2);" << endl;
01395 pg << "CALL 'strTrimA(L3, C0, C8, C3, C3);" << endl;
01396
01397 pg << "CALL 'strTrimA(L4, C0, C4, C2, C2);" << endl;
01398 pg << "CALL 'strTrimA(L5, C4, C8, C2, C2);" << endl;
01399 pg << "CALL 'strTrimA(L6, C0, C8, C6, C2);" << endl;
01400 pg << "CALL 'strTrimA(L7, C0, C8, C2, C6);" << endl;
01401
01402 pg << "CALL 'strTrimA(L8, C1, C7, C2, C2);" << endl;
01403 pg << "CALL 'strTrimA(L9, C1, C7, C2, C3);" << endl;
01404 pg << "CALL 'strTrimA(L10, C1, C7, C3, C2);" << endl;
01405 pg << "CALL 'strTrimA(L11, C1, C7, C3, C3);" << endl;
01406
01407 pg << "CALL 'strTrimA(L12, C5, C7, C2, C2);" << endl;
01408 pg << "CALL 'strTrimA(L13, C1, C5, C2, C2);" << endl;
01409 pg << "CALL 'strTrimA(L14, C1, C7, C6, C2);" << endl;
01410 pg << "CALL 'strTrimA(L15, C1, C7, C2, C6);" << endl;
01411
01412 pg << "CALL 'strTrimA(L16, C0, C7, C2, C2);" << endl;
01413 pg << "CALL 'strTrimA(L17, C1, C7, C2, C2);" << endl;
01414 pg << "CALL 'strTrimA(L18, C0, C8, C2, C2);" << endl;
01415 pg << "CALL 'strTrimA(L19, C1, C8, C2, C2);" << endl;
01416
01417 pg << "CALL 'strTrimA(L20, C4, C7, C2, C2);" << endl;
01418 pg << "CALL 'strTrimA(L21, C0, C5, C2, C2);" << endl;
01419 pg << "CALL 'strTrimA(L22, C1, C4, C6, C2);" << endl;
01420 pg << "CALL 'strTrimA(L23, C5, C8, C2, C6);" << endl;
01421
01422
01423
01424
01425
01426
01427
01428 pg << "CALL 'strTrimA(L24, C0, C9, C2, C2);"
01429 << endl;
01430 pg << "CALL 'strTrimA(L25, C0, C10, C2, C2);"
01431 << endl;
01432
01433
01434 pg << "CALL 'strTrimA(L26, C12, C11, C2, C2);" << endl;
01435 pg << "CALL 'strTrimA(L27, C12, C11, C2, C3);" << endl;
01436 pg << "CALL 'strTrimA(L28, C12, C11, C3, C2);" << endl;
01437 pg << "CALL 'strTrimA(L29, C12, C11, C3, C3);" << endl;
01438
01439
01440 refLocalOutput(pg, 30);
01441
01442 Calculator calc(0);
01443
01444 try {
01445 calc.assemble(pg.str().c_str());
01446 } catch (FennelExcn& ex) {
01447 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
01448 BOOST_MESSAGE(pg.str());
01449 BOOST_REQUIRE(0);
01450 }
01451
01452 TupleDataWithBuffer outTuple(calc.getOutputRegisterDescriptor());
01453 TupleDataWithBuffer inTuple(calc.getInputRegisterDescriptor());
01454
01455 calc.bind(&inTuple, &outTuple);
01456 calc.exec();
01457 printOutput(outTuple, calc);
01458 BOOST_MESSAGE("Calculator Warnings: |" << calc.warnings() << "|");
01459
01460
01461 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[0], "abc"));
01462 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[1], "abc "));
01463 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[2], " abc"));
01464 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[3], " abc "));
01465
01466 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[4]));
01467 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[5]));
01468 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[6]));
01469 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[7]));
01470
01471
01472 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[8], "hij"));
01473 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[9], "hij "));
01474 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[10], " hij"));
01475 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[11], " hij "));
01476
01477 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[12]));
01478 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[13]));
01479 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[14]));
01480 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[15]));
01481
01482
01483 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[16], "abc"));
01484 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[17], "hij"));
01485 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[18], "abc"));
01486 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[19], "hij"));
01487
01488 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[20]));
01489 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[21]));
01490 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[22]));
01491 BOOST_CHECK_EQUAL(1, cmpTupNull(outTuple[23]));
01492
01493
01494 deque<CalcMessage>::iterator iter = calc.mWarnings.begin();
01495 deque<CalcMessage>::iterator end = calc.mWarnings.end();
01496
01497 BOOST_CHECK(iter != end);
01498 BOOST_CHECK_EQUAL(iter->pc, 24);
01499 BOOST_CHECK_EQUAL(0, strcmp(iter->str, "22027"));
01500 iter++;
01501 BOOST_CHECK_EQUAL(iter->pc, 25);
01502 BOOST_CHECK_EQUAL(0, strcmp(iter->str, "22027"));
01503 iter++;
01504 BOOST_CHECK(iter == end);
01505
01506
01507 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[26], " pqr "));
01508 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[27], " pqr xx"));
01509 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[28], "xx pqr "));
01510 BOOST_CHECK_EQUAL(0, cmpTupStr(outTuple[29], "xx pqr xx"));
01511
01512 }
01513
01514
01515 FENNEL_UNIT_TEST_SUITE(CalcExtStringTest);
01516
01517