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
00044 class CalcInstFactoryTest : virtual public TestBase, public TraceSource
00045 {
00046 void testBool();
00047 void testBoolNative();
00048 void testBoolPointer();
00049 void testIntegralNative();
00050 void testIntegralPointer();
00051 void testJump();
00052 void testNativeNative();
00053 void testPointerIntegral();
00054 void testPointerPointer();
00055 void testReturn();
00056
00057 static char const * const all;
00058 static char const * const nativeNotBool;
00059 static char const * const nativeNotBoolValues;
00060 static char const * const pointerArray;
00061 static char const * const nativeIntegral;
00062 static char const * const nativeIntegralValues;
00063
00064 public:
00065 explicit CalcInstFactoryTest()
00066 : TraceSource(shared_from_this(),"CalcInstFactoryTest")
00067 {
00068 srand(time(NULL));
00069 CalcInit::instance();
00070 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testBool);
00071 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testBoolNative);
00072 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testBoolPointer);
00073 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testIntegralNative);
00074 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testIntegralPointer);
00075 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testJump);
00076 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testNativeNative);
00077 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testPointerIntegral);
00078 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testPointerPointer);
00079 FENNEL_UNIT_TEST_CASE(CalcInstFactoryTest, testReturn);
00080 }
00081
00082 virtual ~CalcInstFactoryTest()
00083 {
00084 }
00085 };
00086
00087 char const * const
00088 CalcInstFactoryTest::all =
00089 "s1, u1, s2, u2, s4, u4, s8, u8, bo, r, d, c, vc, b, vb";
00090
00091
00092 char const * const
00093 CalcInstFactoryTest::nativeNotBool =
00094 "s1, u1, s2, u2, s4, u4, s8, u8, r, d";
00095
00096 char const * const
00097 CalcInstFactoryTest::nativeNotBoolValues =
00098 "1, 2, 3, 4, 5, 6, 7, 8, 9.0, 10.0";
00099
00100
00101 char const * const
00102 CalcInstFactoryTest::pointerArray =
00103 "vc,1, c,1, u4, bo, bo";
00104
00105
00106 char const * const
00107 CalcInstFactoryTest::nativeIntegral =
00108 "s1, u1, s2, u2, s4, u4, s8, u8";
00109
00110 char const * const
00111 CalcInstFactoryTest::nativeIntegralValues =
00112 "1, 2, 3, 4, 5, 6, 7, 8";
00113
00114
00115
00116
00117 void
00118 CalcInstFactoryTest::testBool()
00119 {
00120 ostringstream pg("");
00121
00122 const char* Bool[][2] = {
00123 { "OR", "3" },
00124 { "AND", "3" },
00125 { "NOT", "2" },
00126 { "MOVE", "2" },
00127 { "REF", "2" },
00128 { "IS", "3" },
00129 { "ISNOT", "3" },
00130 { "EQ", "3" },
00131 { "NE", "3" },
00132 { "GT", "3" },
00133 { "GE", "3" },
00134 { "LT", "3" },
00135 { "LE", "3" },
00136 { "ISNULL", "2" },
00137 { "ISNOTNULL", "2" },
00138 { "TONULL", "1" },
00139 { "", "" },
00140 };
00141
00142 pg << "O bo;" << endl;
00143 pg << "C bo,bo;" << endl;
00144 pg << "V 1,0;" << endl;
00145 pg << "T;" << endl;
00146
00147 int inst;
00148 for (inst = 0; *(Bool[inst][0]); inst++) {
00149 BOOST_MESSAGE(Bool[inst][0]);
00150 pg << Bool[inst][0] << " O0";
00151 if (atoi(Bool[inst][1]) >= 2) {
00152 pg << ", C0";
00153 }
00154 if (atoi(Bool[inst][1]) >= 3) {
00155 pg << ", C1";
00156 }
00157 pg << ";" << endl;
00158 }
00159
00160 BOOST_MESSAGE(pg.str());
00161
00162 Calculator calc(0);
00163
00164 try {
00165 calc.assemble(pg.str().c_str());
00166 } catch (FennelExcn& ex) {
00167 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00168 BOOST_REQUIRE(0);
00169 }
00170
00171
00172 }
00173
00174 void
00175 CalcInstFactoryTest::testBoolNative()
00176 {
00177 ostringstream pg("");
00178
00179 const char* boolnative[][2] = {
00180 { "EQ", "3" },
00181 { "NE" , "3" },
00182 { "GT", "3" },
00183 { "GE", "3" },
00184 { "LT", "3" },
00185 { "LE", "3" },
00186 { "ISNULL", "2" },
00187 { "ISNOTNULL", "2" },
00188 { "", "" },
00189 };
00190
00191 pg << "O " << nativeNotBool << ", bo;" << endl;
00192 pg << "C " << nativeNotBool << ";" << endl;
00193 pg << "V " << nativeNotBoolValues << ";" << endl;
00194 pg << "T;" << endl;
00195
00196 int inst, type;
00197 for (inst = 0; *(boolnative[inst][0]); inst++) {
00198 BOOST_MESSAGE(boolnative[inst][0]);
00199 for (type = 0; type <= 9; type++) {
00200 pg << boolnative[inst][0] << " O10";
00201 if (atoi(boolnative[inst][1]) >= 2) {
00202 pg << ", C" << type;
00203 }
00204 if (atoi(boolnative[inst][1]) >= 3) {
00205 pg << ", C" << type;
00206 }
00207 pg << ";" << endl;
00208 }
00209 }
00210
00211 BOOST_MESSAGE(pg.str());
00212
00213 Calculator calc(0);
00214
00215 try {
00216 calc.assemble(pg.str().c_str());
00217 } catch (FennelExcn& ex) {
00218 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00219 BOOST_REQUIRE(0);
00220 }
00221
00222
00223 }
00224
00225 void
00226 CalcInstFactoryTest::testIntegralNative()
00227 {
00228 ostringstream pg("");
00229
00230 const char* integralnative[][2] = {
00231 { "MOD", "3" },
00232 { "AND", "3" },
00233 { "OR", "3" },
00234 { "SHFL", "3" },
00235 { "SHFR", "3" },
00236 { "", "" },
00237 };
00238
00239 pg << "O " << nativeIntegral << ";" << endl;
00240 pg << "C " << nativeIntegral << ";" << endl;
00241 pg << "V " << nativeIntegralValues << ";" << endl;
00242 pg << "T;" << endl;
00243
00244 int inst, type;
00245 for (inst = 0; *(integralnative[inst][0]); inst++) {
00246 BOOST_MESSAGE(integralnative[inst][0]);
00247 for (type = 0; type <= 7; type++) {
00248 pg << integralnative[inst][0] << " O" << type;
00249 if (atoi(integralnative[inst][1]) >= 2) {
00250 pg << ", C" << type;
00251 }
00252 if (atoi(integralnative[inst][1]) >= 3) {
00253 pg << ", C" << type;
00254 }
00255 pg << ";" << endl;
00256 }
00257 }
00258
00259 BOOST_MESSAGE(pg.str());
00260
00261 Calculator calc(0);
00262
00263 try {
00264 calc.assemble(pg.str().c_str());
00265 } catch (FennelExcn& ex) {
00266 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00267 BOOST_REQUIRE(0);
00268 }
00269
00270
00271 }
00272
00273 void
00274 CalcInstFactoryTest::testIntegralPointer()
00275 {
00276 ostringstream pg("");
00277
00278 const char* integralpointer[][2] = {
00279 { "GETS", "2", },
00280 { "GETMS" , "2", },
00281 { "", "" },
00282 };
00283
00284 pg << "O " << pointerArray << ";" << endl;
00285 pg << "C " << pointerArray << ";" << endl;
00286 pg << "V 0x" << stringToHex("a") << ", 0x" << stringToHex("b") <<
00287 ", 1, 0, 1;" << endl;
00288 pg << "T;" << endl;
00289
00290 int inst, type;
00291 for (inst = 0; *(integralpointer[inst][0]); inst++) {
00292 BOOST_MESSAGE(integralpointer[inst][0]);
00293 for (type = 0; type <= 1; type++) {
00294 pg << integralpointer[inst][0] << " O2";
00295 if (atoi(integralpointer[inst][1]) >= 2) {
00296 pg << ", C" << type;
00297 }
00298 if (atoi(integralpointer[inst][1]) >= 3) {
00299 pg << ", C" << type;
00300 }
00301 pg << ";" << endl;
00302 }
00303 }
00304
00305 BOOST_MESSAGE(pg.str());
00306
00307 Calculator calc(0);
00308
00309 try {
00310 calc.assemble(pg.str().c_str());
00311 } catch (FennelExcn& ex) {
00312 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00313 BOOST_REQUIRE(0);
00314 }
00315
00316
00317 }
00318
00319 void
00320 CalcInstFactoryTest::testPointerIntegral()
00321 {
00322 ostringstream pg("");
00323
00324 const char* pointerintegral[][2] = {
00325 { "PUTS", "2", },
00326 { "", "" },
00327 };
00328
00329 pg << "O " << pointerArray << ";" << endl;
00330 pg << "C " << pointerArray << ";" << endl;
00331 pg << "V 0x" << stringToHex("a") << ", 0x" << stringToHex("b") <<
00332 ", 1, 0, 1;" << endl;
00333 pg << "T;" << endl;
00334
00335 int inst, type;
00336 for (inst = 0; *(pointerintegral[inst][0]); inst++) {
00337 BOOST_MESSAGE(pointerintegral[inst][0]);
00338 for (type = 0; type <= 1; type++) {
00339 pg << pointerintegral[inst][0] << " O" << type;
00340 pg << ", C2;" << endl;
00341 }
00342 }
00343
00344 BOOST_MESSAGE(pg.str());
00345
00346 Calculator calc(0);
00347
00348 try {
00349 calc.assemble(pg.str().c_str());
00350 } catch (FennelExcn& ex) {
00351 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00352 BOOST_REQUIRE(0);
00353 }
00354
00355
00356 }
00357
00358 void
00359 CalcInstFactoryTest::testBoolPointer()
00360 {
00361 ostringstream pg("");
00362
00363 const char* boolpointer[][2] = {
00364 { "EQ", "3", },
00365 { "NE" , "3", },
00366 { "GT", "3", },
00367 { "GE", "3", },
00368 { "LT", "3", },
00369 { "LE", "3", },
00370 { "ISNULL", "2", },
00371 { "ISNOTNULL", "2", },
00372 { "", "" },
00373 };
00374
00375 pg << "O " << pointerArray << ";" << endl;
00376 pg << "C " << pointerArray << ";" << endl;
00377 pg << "V 0x" << stringToHex("a") << ", 0x" << stringToHex("b") <<
00378 ", 1, 0, 1;" << endl;
00379 pg << "T;" << endl;
00380
00381 int inst, type;
00382 for (inst = 0; *(boolpointer[inst][0]); inst++) {
00383 BOOST_MESSAGE(boolpointer[inst][0]);
00384 for (type = 0; type <= 1; type++) {
00385 pg << boolpointer[inst][0] << " O3";
00386 if (atoi(boolpointer[inst][1]) >= 2) {
00387 pg << ", C" << type;
00388 }
00389 if (atoi(boolpointer[inst][1]) >= 3) {
00390 pg << ", C" << type;
00391 }
00392 pg << ";" << endl;
00393 }
00394 }
00395
00396 BOOST_MESSAGE(pg.str());
00397
00398 Calculator calc(0);
00399
00400 try {
00401 calc.assemble(pg.str().c_str());
00402 } catch (FennelExcn& ex) {
00403 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00404 BOOST_REQUIRE(0);
00405 }
00406
00407
00408 }
00409
00410 void
00411 CalcInstFactoryTest::testJump()
00412 {
00413 ostringstream pg("");
00414
00415 const char* Jump[][2] = {
00416 { "JMP", "0" },
00417 { "JMPT", "1" },
00418 { "JMPF", "1" },
00419 { "JMPN", "1" },
00420 { "JMPNN", "1" },
00421 { "", "" },
00422 };
00423
00424 pg << "O bo;" << endl;
00425 pg << "C bo,bo;" << endl;
00426 pg << "V 1,0;" << endl;
00427 pg << "T;" << endl;
00428
00429 int inst;
00430 for (inst = 0; *(Jump[inst][0]); inst++) {
00431 pg << Jump[inst][0] << " @1";
00432 if (atoi(Jump[inst][1]) >= 1) {
00433 pg << ", C0";
00434 }
00435 pg << ";" << endl;
00436 }
00437
00438 BOOST_MESSAGE("|" << pg.str() << "|");
00439
00440 Calculator calc(0);
00441
00442 try {
00443 calc.assemble(pg.str().c_str());
00444 } catch (FennelExcn& ex) {
00445 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00446 BOOST_REQUIRE(0);
00447 }
00448
00449
00450 }
00451
00452 void
00453 CalcInstFactoryTest::testNativeNative()
00454 {
00455 ostringstream pg("");
00456
00457 const char* nativenative[][2] = {
00458 { "ADD", "3" },
00459 { "SUB" , "3" },
00460 { "MUL", "3" },
00461 { "DIV", "3" },
00462 { "NEG", "2" },
00463 { "MOVE", "2" },
00464 { "REF", "2" },
00465 { "TONULL", "1" },
00466 { "", "" },
00467 };
00468
00469 pg << "O " << nativeNotBool << ";" << endl;
00470 pg << "C " << nativeNotBool << ";" << endl;
00471 pg << "V " << nativeNotBoolValues << ";" << endl;
00472 pg << "T;" << endl;
00473
00474 int inst, type;
00475 for (inst = 0; *(nativenative[inst][0]); inst++) {
00476 BOOST_MESSAGE(nativenative[inst][0]);
00477 for (type = 0; type <= 9; type++) {
00478 pg << nativenative[inst][0] << " O" << type;
00479 if (atoi(nativenative[inst][1]) >= 2) {
00480 pg << ", C" << type;
00481 }
00482 if (atoi(nativenative[inst][1]) >= 3) {
00483 pg << ", C" << type;
00484 }
00485 pg << ";" << endl;
00486 }
00487 }
00488
00489 BOOST_MESSAGE(pg.str());
00490
00491 Calculator calc(0);
00492
00493 try {
00494 calc.assemble(pg.str().c_str());
00495 } catch (FennelExcn& ex) {
00496 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00497 BOOST_REQUIRE(0);
00498 }
00499
00500
00501 }
00502
00503 void
00504 CalcInstFactoryTest::testPointerPointer()
00505 {
00506 ostringstream pg("");
00507
00508 const char* pointerpointer[][3] = {
00509 { "ADD", "2", "1" },
00510 { "SUB" , "2", "1" },
00511 { "MOVE", "2", "0" },
00512 { "REF", "2", "0" },
00513 { "TONULL", "1", "0" },
00514 { "", "" },
00515 };
00516
00517 pg << "O " << pointerArray << ";" << endl;
00518 pg << "C " << pointerArray << ";" << endl;
00519 pg << "V 0x" << stringToHex("a") << ", 0x" << stringToHex("b") <<
00520 ", 1, 0, 1;" << endl;
00521 pg << "T;" << endl;
00522
00523 int inst, type;
00524 for (inst = 0; *(pointerpointer[inst][0]); inst++) {
00525 BOOST_MESSAGE(pointerpointer[inst][0]);
00526 for (type = 0; type <= 1; type++) {
00527 pg << pointerpointer[inst][0] << " O" << type;
00528 if (atoi(pointerpointer[inst][1]) >= 2) {
00529 pg << ", C" << type;
00530 }
00531 if (atoi(pointerpointer[inst][2]) >= 1) {
00532 pg << ", C2";
00533 }
00534 pg << ";" << endl;
00535 }
00536 }
00537
00538 BOOST_MESSAGE(pg.str());
00539
00540 Calculator calc(0);
00541
00542 try {
00543 calc.assemble(pg.str().c_str());
00544 } catch (FennelExcn& ex) {
00545 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00546 BOOST_REQUIRE(0);
00547 }
00548
00549
00550 }
00551
00552 void
00553 CalcInstFactoryTest::testReturn()
00554 {
00555 ostringstream pg("");
00556
00557 pg << "O bo;" << endl;
00558 pg << "C bo,bo;" << endl;
00559 pg << "V 1,0;" << endl;
00560 pg << "T;" << endl;
00561 pg << "RETURN;" << endl;
00562
00563 BOOST_MESSAGE(pg.str());
00564
00565 Calculator calc(0);
00566
00567 try {
00568 calc.assemble(pg.str().c_str());
00569 } catch (FennelExcn& ex) {
00570 BOOST_MESSAGE("Assemble exception " << ex.getMessage());
00571 BOOST_REQUIRE(0);
00572 }
00573
00574
00575 }
00576
00577 FENNEL_UNIT_TEST_SUITE(CalcInstFactoryTest);
00578
00579