00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef WPOLYNOMIALEQUATIONSOLVERS_TEST_H
00026 #define WPOLYNOMIALEQUATIONSOLVERS_TEST_H
00027
00028 #include <iomanip>
00029 #include <sstream>
00030 #include <string>
00031 #include <utility>
00032
00033 #include <cxxtest/TestSuite.h>
00034
00035 #include "../WPolynomialEquationSolvers.h"
00036
00037
00038
00039
00040 class WPolynomialEquationSolversTest : public CxxTest::TestSuite
00041 {
00042 public:
00043
00044
00045
00046 void testRealQuadraticEquationWithNoSolution( void )
00047 {
00048 TS_ASSERT_THROWS_EQUALS( solveRealQuadraticEquation( 0.0, 0.0, 1.0 ), const WEquationHasNoRoots &e,
00049 std::string( e.what() ), "The equation: 0x^2 + 0x + 1 = 0.0 has no solutions!" );
00050 }
00051
00052
00053
00054
00055 void testRealQuadraticEquationWithOnlyOneSolution( void )
00056 {
00057 typedef std::pair< std::complex< double >, std::complex< double > > ComplexPair;
00058 ComplexPair actual = solveRealQuadraticEquation( 1.0, 0.0, 0.0 );
00059 TS_ASSERT_EQUALS( actual.first, std::complex< double >( 0.0, 0.0 ) );
00060 TS_ASSERT_EQUALS( actual.second, actual.first );
00061 }
00062
00063
00064
00065
00066 void testRealQuadraticEquationWithTwoRealSolutions( void )
00067 {
00068 typedef std::pair< std::complex< double >, std::complex< double > > ComplexPair;
00069 ComplexPair actual = solveRealQuadraticEquation( 1.0, 0.0, -1.0 );
00070 ComplexPair expected = ComplexPair( std::complex< double >( -1.0, 0.0 ), std::complex< double >( 1.0, 0.0 ) );
00071 if( actual.first != expected.first )
00072 {
00073 std::cout << std::endl << "We assume the order of the pair is swaped, but both solutions are right" << std::endl;
00074 TS_ASSERT_EQUALS( actual.first, expected.second );
00075 TS_ASSERT_EQUALS( actual.second, expected.first );
00076 }
00077 else
00078 {
00079 TS_ASSERT_EQUALS( actual.first, expected.first );
00080 TS_ASSERT_EQUALS( actual.second, expected.second );
00081 }
00082 }
00083
00084
00085
00086
00087 void testRealQuadraticEquationWithTwoImaginarySolutions( void )
00088 {
00089 typedef std::pair< std::complex< double >, std::complex< double > > ComplexPair;
00090 ComplexPair actual = solveRealQuadraticEquation( 1.0, 0.0, 1.0 );
00091 ComplexPair expected = ComplexPair( std::complex< double >( 0.0, 1.0 ), std::complex< double >( 0.0, -1.0 ) );
00092 if( actual.first != expected.first )
00093 {
00094 std::cout << std::endl << "We assume the order of the pair is swaped, but both solutions are right" << std::endl;
00095 TS_ASSERT_EQUALS( actual.first, expected.second );
00096 TS_ASSERT_EQUALS( actual.second, expected.first );
00097 }
00098 else
00099 {
00100 TS_ASSERT_EQUALS( actual.first, expected.first );
00101 TS_ASSERT_EQUALS( actual.second, expected.second );
00102 }
00103 }
00104
00105
00106
00107
00108
00109
00110
00111 void testRealQuadraticEquationToTestNumericalIssuesAndPrecisions( void )
00112 {
00113 typedef std::pair< std::complex< double >, std::complex< double > > ComplexPair;
00114 ComplexPair actual = solveRealQuadraticEquation( 1.0, 9999999999.0, -9.0e10 );
00115 ComplexPair expected = ComplexPair( std::complex< double >( -1.00000000079999999928e10, 0.0 ), std::complex< double >( 8.99999999280000001224, 0.0 ) );
00116 double delta = 0.00000001;
00117 if( ( ( std::abs( actual.first - expected.first ) > delta ) && ( std::abs( actual.first - expected.second ) > delta ) ) ||
00118 ( ( std::abs( actual.second - expected.second ) > delta ) && ( std::abs( actual.second - expected.first ) > delta ) ) )
00119 {
00120 std::stringstream ss;
00121 ss << std::fixed << std::setprecision( 16 ) << std::endl;
00122 ss << "Invalid solutions: " << std::endl;
00123 ss << std::real( actual.first ) << " i" << std::imag( actual.first ) << " :::: ";
00124 ss << std::real( actual.second ) << " i" << std::imag( actual.second ) << std::endl;
00125 ss << " were invalid. I expected: " << std::endl;
00126 ss << std::real( expected.first ) << " i" << std::imag( expected.first ) << " :::: ";
00127 ss << std::real( expected.second ) << " i" << std::imag( expected.second ) << std::endl;
00128 std::cout << ss.str();
00129 TS_FAIL( "Check your numerical stability and the order of the solutions found." );
00130 }
00131 }
00132 };
00133
00134 #endif // WPOLYNOMIALEQUATIONSOLVERS_TEST_H