00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/calctest/CalcExecStreamTestSuite.h"
00026 #include "fennel/calculator/CalcExecStream.h"
00027 #include "fennel/tuple/TupleOverflowExcn.h"
00028 #include "fennel/exec/MockProducerExecStream.h"
00029 #include "fennel/exec/ExecStreamEmbryo.h"
00030
00031 using namespace fennel;
00032
00033 CalcExecStreamTestSuite::CalcExecStreamTestSuite(bool addAllTests)
00034 {
00035 StandardTypeDescriptorFactory stdTypeFactory;
00036 TupleAttributeDescriptor attrDesc(
00037 stdTypeFactory.newDataType(STANDARD_TYPE_UINT_64));
00038 uint64Desc = attrDesc;
00039
00040 if (addAllTests) {
00041 FENNEL_UNIT_TEST_CASE(CalcExecStreamTestSuite,testConstantOneForOne);
00042 FENNEL_UNIT_TEST_CASE(CalcExecStreamTestSuite,testEmptyInput);
00043 FENNEL_UNIT_TEST_CASE(CalcExecStreamTestSuite,testConstantTwoForOne);
00044 FENNEL_UNIT_TEST_CASE(CalcExecStreamTestSuite,testConstantOneForTwo);
00045 FENNEL_UNIT_TEST_CASE(CalcExecStreamTestSuite,testTupleOverflow);
00046 }
00047 }
00048
00049 void CalcExecStreamTestSuite::testConstantOneForOneImpl(uint nRowsInput)
00050 {
00051 std::string program =
00052 "O u8; "
00053 "I u8; "
00054 "L u8; "
00055 "C u8; "
00056 "V 18446744073709551615; "
00057 "T; "
00058 "ADD L0, I0, C0; "
00059 "REF O0, L0; "
00060 "RETURN; ";
00061
00062 TupleDescriptor tupleDesc;
00063 tupleDesc.push_back(uint64Desc);
00064
00065 testConstant(program, tupleDesc, tupleDesc, sizeof(uint64_t), nRowsInput);
00066 }
00067
00068 void CalcExecStreamTestSuite::testConstantOneForOne()
00069 {
00070 testConstantOneForOneImpl();
00071 }
00072
00073 void CalcExecStreamTestSuite::testEmptyInput()
00074 {
00075 testConstantOneForOneImpl(0);
00076 }
00077
00078 void CalcExecStreamTestSuite::testConstantTwoForOne()
00079 {
00080 std::string program =
00081 "O u8, u8; "
00082 "I u8; "
00083 "L u8; "
00084 "C u8; "
00085 "V 18446744073709551615; "
00086 "T; "
00087 "ADD L0, I0, C0; "
00088 "REF O0, L0; "
00089 "REF O1, L0; "
00090 "RETURN; ";
00091
00092 TupleDescriptor outputDesc;
00093 outputDesc.push_back(uint64Desc);
00094 outputDesc.push_back(uint64Desc);
00095
00096 TupleDescriptor inputDesc;
00097 inputDesc.push_back(uint64Desc);
00098
00099 testConstant(program, inputDesc, outputDesc, 2*sizeof(uint64_t));
00100 }
00101
00102 void CalcExecStreamTestSuite::testConstantOneForTwo()
00103 {
00104 std::string program =
00105 "O u8; "
00106 "I u8, u8; "
00107 "L u8, u8, u8; "
00108 "C u8; "
00109 "V 18446744073709551615; "
00110 "T; "
00111 "ADD L0, I0, C0; "
00112 "ADD L1, I0, I1; "
00113 "ADD L2, L0, L1; "
00114 "REF O0, L2; "
00115 "RETURN; ";
00116
00117 TupleDescriptor outputDesc;
00118 outputDesc.push_back(uint64Desc);
00119
00120 TupleDescriptor inputDesc;
00121 inputDesc.push_back(uint64Desc);
00122 inputDesc.push_back(uint64Desc);
00123
00124 testConstant(program, inputDesc, outputDesc, sizeof(uint64_t));
00125 }
00126
00127 void CalcExecStreamTestSuite::testTupleOverflow()
00128 {
00129 std::string program =
00130 "O c,40000; "
00131 "I u8; "
00132 "L c,40000; "
00133 "C vc, 5; "
00134 "V 0x68656C6C6F; "
00135 "T; "
00136 "CALL 'castA(L0, C0); "
00137 "REF O0, L0; "
00138 "RETURN; ";
00139
00140 TupleDescriptor inputDesc;
00141 inputDesc.push_back(uint64Desc);
00142
00143 TupleDescriptor outputDesc;
00144 StandardTypeDescriptorFactory stdTypeFactory;
00145 TupleAttributeDescriptor charDesc(
00146 stdTypeFactory.newDataType(STANDARD_TYPE_CHAR),
00147 false,
00148 40000);
00149 outputDesc.push_back(charDesc);
00150
00151 BOOST_CHECK_THROW(
00152 testConstant(program, inputDesc, outputDesc, 0),
00153 TupleOverflowExcn);
00154 }
00155
00156 void CalcExecStreamTestSuite::testConstant(
00157 std::string program,
00158 TupleDescriptor const &inputDesc,
00159 TupleDescriptor const &outputDesc,
00160 uint expectedFactor,
00161 uint nRowsInput)
00162 {
00163 MockProducerExecStreamParams mockParams;
00164 mockParams.outputTupleDesc = inputDesc;
00165 mockParams.nRows = nRowsInput;
00166
00167 CalcExecStreamParams calcParams;
00168 calcParams.outputTupleDesc = outputDesc;
00169 calcParams.program = program;
00170 calcParams.isFilter = false;
00171
00172 ExecStreamEmbryo mockStreamEmbryo;
00173 mockStreamEmbryo.init(new MockProducerExecStream(), mockParams);
00174 mockStreamEmbryo.getStream()->setName("MockProducerExecStream");
00175
00176 ExecStreamEmbryo calcStreamEmbryo;
00177 calcStreamEmbryo.init(new CalcExecStream(), calcParams);
00178 calcStreamEmbryo.getStream()->setName("CalcExecStream");
00179
00180 SharedExecStream pOutputStream = prepareTransformGraph(
00181 mockStreamEmbryo, calcStreamEmbryo);
00182
00183
00184 uint64_t fff = 0xFFFFFFFFFFFFFFFFLL;
00185 TupleData expectedTuple;
00186 expectedTuple.compute(outputDesc);
00187 for (uint i = 0; i < expectedTuple.size(); ++i) {
00188 expectedTuple[i].pData = reinterpret_cast<PBuffer>(&fff);
00189 }
00190 verifyConstantOutput(
00191 *pOutputStream,
00192 expectedTuple,
00193 mockParams.nRows);
00194 }
00195
00196