00001 /* @HEADER@ */ 00002 // 00003 /* @HEADER@ */ 00004 00005 00006 #ifndef PLAYA_TESTERBASE_HPP 00007 #define PLAYA_TESTERBASE_HPP 00008 00009 #include "PlayaLinearOperatorDecl.hpp" 00010 #include "PlayaTestSpecifier.hpp" 00011 #include "Teuchos_ScalarTraits.hpp" 00012 #include "PlayaOut.hpp" 00013 00014 00015 using namespace Teuchos; 00016 00017 00018 00019 namespace Playa 00020 { 00021 00022 /** */ 00023 template <class Scalar> 00024 class TesterBase 00025 { 00026 public: 00027 /** \brief Local typedef for promoted scalar magnitude */ 00028 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType ScalarMag; 00029 00030 /** */ 00031 TesterBase(){;} 00032 00033 /** */ 00034 virtual ~TesterBase(){;} 00035 00036 /** */ 00037 virtual bool runAllTests() const = 0 ; 00038 00039 00040 /** */ 00041 bool checkTest(const TestSpecifier<Scalar>& spec, 00042 const ScalarMag& err, 00043 const std::string& testName) const ; 00044 00045 /** */ 00046 void randomizeVec(Vector<Scalar>& x) const ; 00047 00048 }; 00049 00050 template <class Scalar> 00051 inline void TesterBase<Scalar> 00052 ::randomizeVec(Vector<Scalar>& x) const 00053 { 00054 typedef Teuchos::ScalarTraits<Scalar> ST; 00055 x.randomize(); 00056 00057 } 00058 00059 template <class Scalar> 00060 inline bool TesterBase<Scalar> 00061 ::checkTest(const TestSpecifier<Scalar>& spec, 00062 const ScalarMag& err, 00063 const std::string& testName) const 00064 { 00065 bool rtn = true; 00066 if (err > spec.errorTol()) 00067 { 00068 Out::root() << testName << " test FAILED: err=" << err << ", tol = " 00069 << spec.errorTol() << std::endl; 00070 rtn = false; 00071 } 00072 else if (err > spec.warningTol()) 00073 { 00074 Out::root() << "WARNING: " << testName << " test err=" 00075 << err << " could not beat tol = " 00076 << spec.warningTol() << std::endl; 00077 } 00078 else 00079 { 00080 Out::root() << "test " << testName << " PASSED with tol=" << spec.errorTol() << std::endl; 00081 } 00082 return rtn; 00083 } 00084 00085 } 00086 #endif