tPolynomialTest Class Reference

Collaboration diagram for tPolynomialTest:

Collaboration graph
[legend]

List of all members.

Public Member Functions

 CPPUNIT_TEST_SUITE (tPolynomialTest)
 CPPUNIT_TEST (testEquality)
 CPPUNIT_TEST (testAddition)
 CPPUNIT_TEST (testMultiplication)
 CPPUNIT_TEST (testEvaluateAndBaseArgument)
 CPPUNIT_TEST (testParse)
 CPPUNIT_TEST (testTranslate)
 CPPUNIT_TEST (testSubstitute)
 CPPUNIT_TEST_SUITE_END ()
void setUp ()
void tearDown ()
void testEquality ()
void testAddition ()
void testMultiplication ()
void testEvaluateAndBaseArgument ()
void testParse ()
 validate the parsing mechanism
void testTranslate ()
void testSubstitute ()

Private Attributes

tPolynomial< nMessageMocktpEmpty
tPolynomial< nMessageMocktpOne
tPolynomial< nMessageMocktpZero
tPolynomial< nMessageMocktpTwo


Detailed Description

Definition at line 6 of file tPolynomialTest.cpp.


Member Function Documentation

tPolynomialTest::CPPUNIT_TEST_SUITE ( tPolynomialTest   ) 

tPolynomialTest::CPPUNIT_TEST ( testEquality   ) 

tPolynomialTest::CPPUNIT_TEST ( testAddition   ) 

tPolynomialTest::CPPUNIT_TEST ( testMultiplication   ) 

tPolynomialTest::CPPUNIT_TEST ( testEvaluateAndBaseArgument   ) 

tPolynomialTest::CPPUNIT_TEST ( testParse   ) 

tPolynomialTest::CPPUNIT_TEST ( testTranslate   ) 

tPolynomialTest::CPPUNIT_TEST ( testSubstitute   ) 

tPolynomialTest::CPPUNIT_TEST_SUITE_END (  ) 

void tPolynomialTest::setUp (  )  [inline]

Definition at line 23 of file tPolynomialTest.cpp.

References tpOne, tpTwo, and tpZero.

00023                  {
00024         //        tpEmpty = tPolynomial<nMessageMock> ;
00025         tpZero  = tPolynomial<nMessageMock>(1);
00026         tpZero[(unsigned)0] = 0.0;
00027         tpOne   = tPolynomial<nMessageMock>(1);
00028         tpOne[0] = 1.0;
00029         tpTwo   = tPolynomial<nMessageMock>(1);
00030         tpTwo[0] = 2.0;
00031     }

void tPolynomialTest::tearDown (  )  [inline]

Definition at line 33 of file tPolynomialTest.cpp.

00033                     {
00034         // Empty
00035     }

void tPolynomialTest::testEquality (  )  [inline]

Definition at line 37 of file tPolynomialTest.cpp.

References tpEmpty, tpOne, tpTwo, and tpZero.

00037                         {
00038         CPPUNIT_ASSERT( tpEmpty == tpEmpty );
00039         CPPUNIT_ASSERT( tpOne == tpOne );
00040         CPPUNIT_ASSERT( tpEmpty == tpZero );
00041         CPPUNIT_ASSERT( !(tpZero == tpOne) );
00042         // testing the copy constructor
00043         CPPUNIT_ASSERT( tpOne == tPolynomial<nMessageMock>(tpOne) );
00044 
00045         // testing the tArray constructor
00046         float values[] = {1, 3, 5, 7};
00047         int size = sizeof(values)/sizeof(values[0]);
00048         tArray<float> tValues(size);
00049         for (int i=0; i<size; i++) {
00050             tValues[i] = values[i];
00051         }
00052         tPolynomial<nMessageMock> tpByArray(values, size);
00053         tPolynomial<nMessageMock> tpBytArray(tValues);
00054 
00055         CPPUNIT_ASSERT(tpByArray == tpBytArray);
00056 
00057         // Testing the assignment operator
00058         float randomData[] = {3, 5, 7};
00059         tPolynomial<nMessageMock> initiated(randomData, sizeof(randomData)/sizeof(randomData[0]));
00060         tPolynomial<nMessageMock> uninitiated;
00061 
00062         initiated = tpTwo;
00063         uninitiated = tpTwo;
00064         CPPUNIT_ASSERT( 2.0 == tpTwo[0] );
00065         CPPUNIT_ASSERT( 2.0 == initiated[0] );
00066         CPPUNIT_ASSERT( tpTwo == initiated );
00067         CPPUNIT_ASSERT( tpTwo == uninitiated );
00068     }

void tPolynomialTest::testAddition (  )  [inline]

Definition at line 70 of file tPolynomialTest.cpp.

References a, tPolynomial< T >::adaptToNewReferenceVarValue(), b, c, tpEmpty, tpOne, tpTwo, and tpZero.

00070                         {
00071         // {0} = {-} + {0}
00072         CPPUNIT_ASSERT( tpZero == tpEmpty + tpZero );
00073         // {1} = {0} + {1}
00074         CPPUNIT_ASSERT( tpOne == tpZero + tpOne );
00075         // {2} = {1} + {1}
00076         CPPUNIT_ASSERT( tpTwo == tpOne + tpOne );
00077         // a = b + c
00078         float a[] = {3, 5, 7, 11};
00079         float b[] = {0, 5, 3, -5};
00080         float c[] = {3, 0, 4, 16};
00081         tPolynomial<nMessageMock> tpA(a, sizeof(a)/sizeof(a[0]));
00082         tPolynomial<nMessageMock> tpB(b, sizeof(b)/sizeof(b[0]));
00083         tPolynomial<nMessageMock> tpC(c, sizeof(c)/sizeof(c[0]));
00084 
00085         CPPUNIT_ASSERT( tpA == tpB + tpC );
00086 
00087         // {0} = {-} + 0
00088         CPPUNIT_ASSERT( tpZero == tpEmpty + 0.0 );
00089         // {1} = {0} + 1
00090         CPPUNIT_ASSERT( tpOne == tpZero + 1.0 );
00091         // {2} = {1} + 1
00092         CPPUNIT_ASSERT( tpTwo == tpOne + 1.0 );
00093 
00094         // {a} + 1 == ({b} + 2) + {c} + -1
00095         CPPUNIT_ASSERT( (tpA + 1.0) == (tpB + 2.0) + tpC + -1.0);
00096 
00097 
00098         tPolynomial<nMessageMock> tpAat5 = tpA.adaptToNewReferenceVarValue(5.0);
00099         tPolynomial<nMessageMock> tpBat5 = tpB.adaptToNewReferenceVarValue(5.0);
00100         tPolynomial<nMessageMock> tpCat5 = tpC.adaptToNewReferenceVarValue(5.0);
00101         CPPUNIT_ASSERT( tpAat5 == tpBat5 + tpCat5 );
00102 
00103         //
00104         // Adding 2 polynomial having different referenceVarValue
00105         //
00106         tPolynomial<nMessageMock> tpAat3 = tpA.adaptToNewReferenceVarValue(3.0);
00107         tPolynomial<nMessageMock> tpCat7 = tpC.adaptToNewReferenceVarValue(7.0);
00108 
00109         // Addition
00110         tPolynomial<nMessageMock> tpAat3at5 = tpAat3.adaptToNewReferenceVarValue(5.0);
00111         tPolynomial<nMessageMock> tpCat7at5 = tpCat7.adaptToNewReferenceVarValue(5.0);
00112         tPolynomial<nMessageMock> sum = (tpBat5 + tpCat7);
00113         CPPUNIT_ASSERT( tpAat3 == tpBat5 + tpCat7 );
00114 
00115         // Addition with operator+=
00116         // This modified tpBat5
00117         CPPUNIT_ASSERT( tpAat3 == (tpBat5 += tpCat7) );
00118     }

Here is the call graph for this function:

void tPolynomialTest::testMultiplication (  )  [inline]

Definition at line 120 of file tPolynomialTest.cpp.

References a, b, c, d, tpEmpty, tpOne, and tpZero.

00120                               {
00121         // {0} = {-} * {0}
00122         CPPUNIT_ASSERT( tpZero == tpEmpty * tpZero );
00123         // {0} = {0} * {1}
00124         CPPUNIT_ASSERT( tpZero == tpZero * tpOne );
00125         // {1} = {1} * {1}
00126         CPPUNIT_ASSERT( tpOne == tpOne * tpOne );
00127         // {1,0,0} = {1,0} * {1,0}
00128         float onePower2[] = {0, 1};
00129         tPolynomial<nMessageMock> tpOnePower2( onePower2, sizeof(onePower2)/sizeof(onePower2[0]) );
00130         float onePower3[] = {0, 0, 1};
00131         tPolynomial<nMessageMock> tpOnePower3( onePower3, sizeof(onePower3)/sizeof(onePower3[0]) );
00132 
00133         CPPUNIT_ASSERT( tpOnePower3 == (tpOnePower2 * tpOnePower2) );
00134 
00135         {
00136             // a = b * c
00137             float a[] = {3.0, 2.5, -6.0, -17, -5, 12, 12};
00138             float b[] = {1, 0.0, -2, -2};
00139             float c[] = {3, 2.5, 0, -6};
00140             tPolynomial<nMessageMock> tpA(a, sizeof(a)/sizeof(a[0]));
00141             tPolynomial<nMessageMock> tpB(b, sizeof(b)/sizeof(b[0]));
00142             tPolynomial<nMessageMock> tpC(c, sizeof(c)/sizeof(c[0]));
00143 
00144             CPPUNIT_ASSERT( tpA == tpB * tpC );
00145 
00146             // {0} = {-} * 0
00147             CPPUNIT_ASSERT( tpZero == tpEmpty * 0.0 );
00148             // {0} = {0} * 1
00149             CPPUNIT_ASSERT( tpZero == tpZero * 1.0 );
00150             // {1} = {1} * 1
00151             CPPUNIT_ASSERT( tpOne == tpOne * 1.0 );
00152             // {a} * -2 == ({b} * 2) * ({c} * -1)
00153             CPPUNIT_ASSERT( (tpA * -2.0) == (tpB * 2.0) * (tpC * -1.0));
00154         }
00155 
00156         // Can a tPolynomial be used to make a zone shape turn?
00157         // Zone rotation are described by 4 term:
00158         // a : basic orientation angle
00159         // b : orientation angle in function of the conquest state
00160         // c : basic rotation speed
00161         // d : rotation speed in function of the conquest state
00162         //
00163         // The polynomial used to describe the actual rotation gets computed from both
00164         // a + conquestRate * b + t * (c + conquestRate * d)
00165         //
00166         {
00167             float a = 1.0;
00168             float b = 2.0;
00169             float c = 3.0;
00170             float d = 4.0;
00171             float conquestState[] = {3, 5, 7};
00172             // Manually resolving the following:
00173             // a + conquestRate * b + t * (c + conquestRate * d)
00174             // 1 + {3, 5, 7} * 2 + t * ( 3 + {3, 5, 7} * 4 }
00175             // 1 + {6, 10, 14} + t * ( 3 + {12, 20, 28} }
00176             // {7, 10, 14} + t * ( {15, 20, 28} }
00177             // {7, 10, 14} + {0, 15, 20, 28}
00178             // {7, 25, 34, 28}
00179             //
00180             float resValue[] = {7, 25, 34, 28};
00181             tPolynomial<nMessageMock> res(resValue, sizeof(resValue)/sizeof(resValue[0]));
00182 
00183             float t[] = {0.0, 1.0};
00184             tPolynomial<nMessageMock> tpT( t, sizeof(t)/sizeof(t[0]) );
00185             tPolynomial<nMessageMock> tpConquestState( conquestState, sizeof(conquestState)/sizeof(conquestState[0])  );
00186 
00187             tPolynomial<nMessageMock> tf =
00188                 ( (tpConquestState * b) + a)
00189                 + tpT * ( (tpConquestState * d) + c);
00190 
00191             CPPUNIT_ASSERT(res == tf);
00192         }
00193     }

void tPolynomialTest::testEvaluateAndBaseArgument (  )  [inline]

Definition at line 197 of file tPolynomialTest.cpp.

References a, tPolynomial< T >::adaptToNewReferenceVarValue(), b, tPolynomial< T >::changeRate(), DELTA, and tPolynomial< T >::evaluate().

00197                                        {
00198         float accelA = 10.0;
00199         float accelB = -10.0;
00200         float a[] = {0, 0, accelA};
00201         float b[] = {50, 45, accelB};
00202         tPolynomial<nMessageMock> tfA(a, sizeof(a)/sizeof(a[0]));
00203         tPolynomial<nMessageMock> tfB(b, sizeof(b)/sizeof(b[0]));
00204 
00205         CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, tfA.evaluate(0), DELTA);
00206         CPPUNIT_ASSERT_DOUBLES_EQUAL( 125.0, tfA.evaluate(5), DELTA);
00207 
00208         CPPUNIT_ASSERT_DOUBLES_EQUAL( 50.0, tfB.evaluate(0), DELTA);
00209         CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, tfB.evaluate(10), DELTA);
00210 
00211         // change the base argument and adjust the coefs to time 5
00212         float NEW_REFERENCE_TIME = 5.0;
00213         tfA = tfA.adaptToNewReferenceVarValue(NEW_REFERENCE_TIME);
00214         tfB = tfB.adaptToNewReferenceVarValue(NEW_REFERENCE_TIME);
00215 
00216         // These should still be true
00217         CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, tfA.evaluate(0), DELTA);
00218         CPPUNIT_ASSERT_DOUBLES_EQUAL( 125.0, tfA.evaluate(5), DELTA);
00219 
00220         CPPUNIT_ASSERT_DOUBLES_EQUAL( 50.0, tfB.evaluate(0), DELTA);
00221         CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, tfB.evaluate(10), DELTA);
00222 
00223         // changing the acceleration
00224         tfA.changeRate(2.0*accelA, 2, NEW_REFERENCE_TIME);
00225         tfB.changeRate(2.0*accelB, 2, NEW_REFERENCE_TIME);
00226 
00227         CPPUNIT_ASSERT_DOUBLES_EQUAL( 125.0 + 50*0 + 20/2.0*0*0, tfA.evaluate(5), DELTA);
00228         CPPUNIT_ASSERT_DOUBLES_EQUAL( 125.0 + 50*5 + 20/2.0*5*5, tfA.evaluate(10), DELTA);
00229 
00230         CPPUNIT_ASSERT_DOUBLES_EQUAL( 150.0 - 5*0 - 20.0/2.0*0*0, tfB.evaluate(5), DELTA);
00231         CPPUNIT_ASSERT_DOUBLES_EQUAL( 150.0 - 5*5 - 20.0/2.0*5*5, tfB.evaluate(10), DELTA);
00232     }

Here is the call graph for this function:

void tPolynomialTest::testParse (  )  [inline]

validate the parsing mechanism

Validate the parsing mechanism by loading different strings.

Definition at line 258 of file tPolynomialTest.cpp.

References a, b, c, tPolynomial< T >::parse(), tpEmpty, and tpTwo.

00258                    {
00259     tPolynomial<nMessageMock> tp;
00260 
00261     // Happy sunshine flow
00262     {
00263       tp.parse("");
00264       CPPUNIT_ASSERT( tpEmpty == tp );
00265       
00266       tp.parse("2");
00267       CPPUNIT_ASSERT( tpTwo == tp );
00268       
00269       tp.parse("3;5;7;11");
00270       float b[] = {3, 5, 7, 11};
00271       tPolynomial<nMessageMock> tpB(b, sizeof(b)/sizeof(b[0]));
00272       CPPUNIT_ASSERT( tpB == tp );
00273       
00274       // Try with a smaller polynomial now, ensuring that there is no leakage
00275       tp.parse("3;5");
00276       float a[] = {3, 5};
00277       tPolynomial<nMessageMock> tpA(a, sizeof(a)/sizeof(a[0]));
00278       CPPUNIT_ASSERT( tpA == tp );
00279 
00280       // Quick notation
00281       tp.parse(";;3;5");
00282       float c[] = {0, 0, 3, 5};
00283       tPolynomial<nMessageMock> tpC(c, sizeof(c)/sizeof(c[0]));
00284       CPPUNIT_ASSERT( tpC == tp );
00285 
00286     }
00287 
00288     // not the happy sunshine flow
00289     {
00290       // no elements should be created
00291       tp.parse(";;;;;");
00292       CPPUNIT_ASSERT( tpEmpty == tp );
00293       
00294       // quick notation with extra delimiters
00295       tp.parse(";;3;5;;");
00296       float a[] = {0, 0, 3, 5};
00297       tPolynomial<nMessageMock> tpA(a, sizeof(a)/sizeof(a[0]));
00298       CPPUNIT_ASSERT( tpA == tp );
00299 
00300       // non-numerical information
00301       tp.parse("Hello world!;0;");
00302       CPPUNIT_ASSERT( tpEmpty == tp );
00303     }
00304   }

Here is the call graph for this function:

void tPolynomialTest::testTranslate (  )  [inline]

Definition at line 307 of file tPolynomialTest.cpp.

References tPolynomial< T >::toString(), and tPolynomial< T >::translate().

00307                        {
00308     tPolynomial<nMessageMock> tpSource("0;0;1");
00309     tPolynomial<nMessageMock> tpRes("9;6;1");
00310     std::cout << std::endl;
00311     std::cout << "translate" << std::endl;
00312     std::cout << tpSource.toString() << std::endl;
00313     std::cout << tpSource.translate(3).toString() << std::endl;
00314     std::cout << tpRes.toString() << std::endl;
00315     CPPUNIT_ASSERT( tpRes == tpSource.translate(3) );
00316   }

Here is the call graph for this function:

void tPolynomialTest::testSubstitute (  )  [inline]

Definition at line 318 of file tPolynomialTest.cpp.

References tPolynomial< T >::adaptToNewReferenceVarValue(), tPolynomial< T >::parse(), tPolynomial< T >::substitute(), and tPolynomial< T >::toString().

00318                         {
00319     // This test will use the following notation:
00320     // tpResultat == tpTransformer.substitute(tpValue);
00321     tPolynomial<nMessageMock> tpValue;
00322     tPolynomial<nMessageMock> tpTransformer;
00323     tPolynomial<nMessageMock> tpResultat;
00324 
00325 
00326     // Similar size
00327     tpValue.parse("3;5");
00328     tpTransformer.parse("7;9");
00329     // V(x) = {3, 5}
00330     // T(y) = {7, 9}
00331     // T(V(x)) :
00332     // a + b*y
00333     // 7 + 9*y
00334     // 7 + 9*(3 + 5*x)
00335     // 7 + 27 + 45*x
00336     // 34 + 45*x
00337     tpResultat.parse("34;45");
00338     CPPUNIT_ASSERT( tpResultat == tpTransformer.substitute(tpValue) );
00339 
00340     // Different size : Much longer value
00341     tpValue.parse("3;5;7;11;13;17");
00342     tpTransformer.parse("7;11");
00343     // V(x) = {3, 5, 7, 11, 13, 17}
00344     // T(y) = {7, 11}
00345     // T(V(x)) :
00346     // a + b*y
00347     // 7 + 11*y
00348     // 7 + 11*(3 + 5*x + 7*x^2 + 11*x^3 + 13*x^4 + 17*x^5)
00349     // 7 + 33 + 55*x + 77*x^2 + 121*x^3 + 143*x^4 + 187*x^5
00350     // 40 + 55*x + 77*x^2 + 121*x^3 + 143*x^4 + 187*x^5
00351     tpResultat.parse("40;55;77;121;143;187");
00352     CPPUNIT_ASSERT( tpResultat == tpTransformer.substitute(tpValue) );
00353 
00354     // Different size : Much longer transformer
00355     tpValue.parse("3;5");
00356     tpTransformer.parse("3;5;7;11;13;17");
00357     // V(x) = {3, 5}
00358     // T(y) = {3, 5, 7, 11, 13, 17}
00359     // T(V(x)) :
00360     // a + b*y + c*y^2 + d*y^3 + e*y^4 + f*y^5
00361     // 3 + 5*y + 7*y^2 + 11*y^3 + 13*y^4 + 17*y^5
00362     // 3 + 5*(3 + 5*x) + 7*(3 + 5*x)^2 + 11*(3 + 5*x)^3 + 13*(3 + 5*x)^4 + 17*(3 + 5*x)^5
00363     // computed using yacas:
00364     // In> Expand(3 + 5*(3 + 5*x) + 7*(3 + 5*x)^2 + 11*(3 + 5*x)^3 + 13*(3 + 5*x)^4 + 17*(3 + 5*x)^5)
00365     // Out> 53125*x^5+167500*x^4+212125*x^3+134950*x^2+43165*x+5562
00366     tpResultat.parse("5562;43165;134950;212125;167500;53125");
00367     CPPUNIT_ASSERT( tpResultat == tpTransformer.substitute(tpValue) );
00368 
00369     // Substitution on a polynomial which reference point has been moved:
00370     // Source@t=0 : {0; 1} ;; both are equivalent, only the ref point has been moved
00371     // Source@t=3 : {3; 1}
00372     // Transform  : {0;0;1} ;; the transform shouldn't have any ref point
00373     tPolynomial<nMessageMock> tpSourceA("0;1");
00374     tPolynomial<nMessageMock> tpSourceB = tpSourceA.adaptToNewReferenceVarValue(3);
00375     tPolynomial<nMessageMock> tpTransform("0;0;1");
00376 
00377     std::cout << std::endl << "#######"  << std::endl;
00378     std::cout << tpSourceA.toString() << std::endl;
00379     std::cout << tpSourceB.toString() << std::endl;
00380     std::cout << tpTransform.substitute(tpSourceA).toString() << std::endl;
00381     std::cout << tpTransform.substitute(tpSourceB).toString() << std::endl;
00382     std::cout << tpTransform.substitute(tpSourceA).adaptToNewReferenceVarValue(3).toString() << std::endl;
00383 
00384   }

Here is the call graph for this function:


Member Data Documentation

tPolynomial<nMessageMock> tPolynomialTest::tpEmpty [private]

Definition at line 8 of file tPolynomialTest.cpp.

Referenced by testAddition(), testEquality(), testMultiplication(), and testParse().

tPolynomial<nMessageMock> tPolynomialTest::tpOne [private]

Definition at line 8 of file tPolynomialTest.cpp.

Referenced by setUp(), testAddition(), testEquality(), and testMultiplication().

tPolynomial<nMessageMock> tPolynomialTest::tpZero [private]

Definition at line 8 of file tPolynomialTest.cpp.

Referenced by setUp(), testAddition(), testEquality(), and testMultiplication().

tPolynomial<nMessageMock> tPolynomialTest::tpTwo [private]

Definition at line 8 of file tPolynomialTest.cpp.

Referenced by setUp(), testAddition(), testEquality(), and testParse().


The documentation for this class was generated from the following file:
Generated on Sat Mar 15 23:58:20 2008 for Armagetron Advanced by  doxygen 1.5.4