Página principal | Lista de namespace | Jerarquía de la clase | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros

ADH_test.h

Ir a la documentación de este archivo.
00001 // ADH_test.h (C) 2006  [email protected]
00002 
00003 /** \file  ADH_test.h
00004     \brief Módulo para prueba unitaria de programas.
00005 
00006     \author Adolfo Di Mare <[email protected]>
00007     \date   2006
00008 */
00009 
00010 /** \mainpage
00011 
00012 \section sec-01 Módulo para prueba unitaria de programas
00013 
00014 El archivo de encabezado \c ADH_test.h apoya la escritura de módulos de prueba de
00015 unitaria programas. El modelo que se usa para esta implementación es
00016 similar al expuesto en este artículo "The Simplest Automated Unit
00017 Test Framework That Could Possibly Work" de Chuck Allison, que se
00018 puede obtener aquí:
00019 - http://www.stickyminds.com/getfile.asp?ot=XML&id=3129&fn=XDD3129filelistfilename1%2Epdf
00020 - http://www.google.com/search?num=100&as_q=Simplest+Unit+Test+Allison
00021 - http://search.yahoo.com/search?n=100&p=Simplest+Unit+Test+Allison
00022 
00023 - Este marco de pruebas es similar a JUnit, pues se presume que en
00024   el futuro los estudiantes usarán Java como su lenguaje principal
00025   para desarrollo de programas (pues usan C++ sólo para adiestrarse
00026   profundamente en técnicas de programación).
00027   \see http://search.yahoo.com/search?n=100&p=JUnit+Java
00028 - Como el lenguaje C++ no tiene un mecanismo similar al de "reflexión"
00029   de Java, en cada prueba fallida se registra la condición de prueba
00030   exacta, obtenida a través de una invocación de la macro \c TEST_THIS()
00031   que registra el nombre del archivo \c __FILE__ y el renglón \c __LINE__
00032   de la prueba.
00033   \see http://search.yahoo.com/search?n=100&p=reflection+Java
00034 - Para simplificar este marco de pruebas no se usa la clase \c TestResult
00035   que sirve para acumular resultados de las pruebas. En su lugar, se usa
00036   una hilera enorme, implementada con \c std::string.
00037 - Para simplificar esta plataforma de pruebas, no se hace diferencia entre
00038   un caso de prueba de prueba existoso y uno que tiene éxito porque se
00039   ha levantado la excepción adecuada. Esto contrasta con JUnit, que llama
00040   "falla" a un caso de prueba exitoso que ha levantado una excepción. Por 
00041   eso los valor
00042 - En JUnit la clase \c TestCase es una subclase de \c Assert; aquí no existe
00043   la clase \c Assert pero para mantener una leve compatibiliidad sí se provée
00044   una funcionalidad similar con macros cuyo nombres comienzan con "assert".
00045   \see http://search.yahoo.com/search?n=100&p=JUnit+Java+Assert+Method
00046 */
00047 
00048 #ifndef ADH_test_h
00049 #define ADH_test_h ///< Evita la inclusión múltiple
00050 
00051 #include <string>      // class std::string
00052 #include <sstream>     // class basic_ostringstream<T,Ch>
00053 //#include <limits.h>    //
00054 
00055 // using namespace std;
00056 /// Definido por la biblioteca C++ estándar.
00057 namespace std {} // Está acá para que Doxygen lo documente
00058 
00059 /// Escuela de Ciencias de la Computación e Informática.
00060 /// \see http:www.ecci.ucr.ac.cr
00061 namespace ECCI { }
00062 
00063 /// Establece el ambiente en que se realizará cada prueba.
00064 /// - \c TestSuite<TestCase>::run() invoca los métodos
00065 ///   \c TestCase::setUp() y \c TestCase::tearDown()
00066 ///   cuando ejecuta cada prueba.
00067 /// - Como \c TestCase::run() es un método abstracto,
00068 ///   para facilitar la programación lo usual es que el
00069 ///   programador no incluya invocaciones a
00070 ///   \c TestCase::setUp() y \c TestCase::tearDown()
00071 ///   pues es más simple dejar que lo haga
00072 ///   \c TestSuite<TestCase>::run().
00073 /// - Por eso, si el programador cliente quiere que cada
00074 ///   prueba se ejecute luego de establecer el ambiente con
00075 ///   su \c TestFixture, lo más práctico es que agregue sus
00076 ///   pruebas a una colección de pruebas \c TestSuite.
00077 class TestFixture {
00078 public:
00079     virtual void setUp() { } ///< Establece el ambiente de prueba
00080     virtual void tearDown() { } ///< Destruye el ambiente de prueba
00081 //  virtual ~TestCase() { tearDown(); } ///< Destructor
00082 }; // TestFixture
00083 
00084 /// NO IMPLEMENTADO ==> Colector genérico de resultados de prueba.
00085 /// - No está implementado para \c ADH_test.h
00086 /// - En \c ADH_test.h se usa una hilera \c std::string para colectar
00087 ///   todos los resultados. \see \c TestCase::toString().
00088 /// - C++ tiene la ventaja sobre Java porque el programador puede
00089 ///   usar las macros \c __FILE__ y \c __LINE__  para registrar el
00090 ///   sitio en que se produce un error en tiempo de ejecución.
00091 class TestResult {
00092     private: TestResult(); ///< Prohibe crear objetos de tipo \c TestResult.
00093 };
00094 
00095 /// NO IMPLEMENTADO ==> Clase abastracta para ejecutar las pruebas y recolectar los resultados.
00096 /// - No está implementado para \c ADH_test.h
00097 /// - En \c ADH_test.h se usa una hilera \c std::string para colectar
00098 ///   todos los resultados. \see \c TestCase::toString().
00099 class Test {
00100 private: Test(); ///< Prohibe crear objetos de tipo \c Test.
00101 public:
00102     /// Retorna la cantidad de pruebas a realizar
00103     virtual int countTestCases() = 0;
00104     /// Ejecuta la prueba y recolecta sus resultados en \c result
00105     virtual void run(TestResult& result) = 0;
00106 };
00107 
00108 #include <typeinfo.h>  // class std::type_info ==> char* typeid().name();
00109 
00110 /// Cada caso de prueba es una instancia derivada de esta clase abstracta.
00111 /// - Siempre es obligatorio implementar \c TestCase::run().
00112 class TestCase : public TestFixture {
00113 protected:
00114     int m_pass; ///< Cantidad de pruebas exitosas
00115     int m_error; ///< Cantidad de pruebas que han fallado
00116     const char * m_name; ///< Nombre del caso de prueba
00117     /// Hilera "enooorme" para registrar los mensajes de pruebas fallidas, separados por \c "\n"
00118     std::string m_errorString;
00119 public:
00120     TestCase(const char * name=0);
00121     virtual ~TestCase() { }  ///< Destructor
00122     virtual bool run() = 0; ///< Ejecuta la prueba y retorna \c "false" si falla
00123     bool Run()        { return run(); } ///< Sinónimo de \c run()
00124     bool runTest()    { return run(); } ///< Sinónimo de \c run()
00125     int nPass() const { return m_pass; } ///< Cantidad de pruebas exitosas
00126     int nError() const { return m_error; } ///< Cantidad de pruebas que han fallado
00127     void recordSuccess() { ++m_pass; } ///< Registra como exitoso el resultado de una prueba
00128     virtual void reset() { m_pass =  m_error = 0; m_errorString = ""; } ///< Anula los contadores de pruebas
00129 public:
00130     int countTestCases() const { return nPass()+nError(); } ///< Cantidad de pruebas realizadas
00131     /// Obtiene el nombre de la prueba
00132     std::string getName() const { return ( m_name != 0 ? m_name : typeid(*this).name()); }
00133     void setName( const char * name=0 ) { m_name = name; } ///< Le cambia el nombre a la prueba
00134     /// Hilera "enooorme" para registrar los mensajes de pruebas fallidas, separados por \c "\n"
00135     const std::string& toString() const { return m_errorString; }
00136     const std::string& errorString() const { return toString(); } ///< Sinónimo de \c toString()
00137 protected:
00138     void recordError( const std::string& lbl, const char* fname, int lineno);
00139     void testThis( bool cond, const std::string& lbl, const char* fname, long lineno);
00140     void testThis( bool cond, const char*        lbl, const char* fname, long lineno) {
00141          testThis( cond, std::string(lbl), fname, lineno);
00142     } ///< Sinónimo de \c testThis()
00143 private:
00144     TestCase(const TestCase&);            ///< \c "private" evita la copia de casos de prueba
00145     TestCase& operator=(const TestCase&); ///< \c "private" evita la copia de casos de prueba
00146 }; // TestCase
00147 
00148 /// NO IMPLEMENTADO ==> Colección de pruebas.
00149 class TestSuite : public TestCase { };
00150 
00151 inline TestCase::TestCase(const char * name) : m_pass(0), m_error(0), m_name(name), m_errorString() {
00152     m_errorString = "";
00153 }  ///< Constructor
00154 
00155 /** Efectúa la prueba y registra el resultado.
00156     - Si la prueba es exitosa sólo incrementa la cantidad de éxitos \c nPass().
00157     - Si la prueba falla reporta en \c toString()   el hecho.
00158     - La prueba es \c "cond".
00159     - Los valores \c "fname" y \c "lineno" indican el archivo y el renglón
00160       en donde se ejecuta la prueba.
00161     - Usualmente los valores de \c "fname" y \c "lineno" se obtienen con
00162       las macros globales \c "__FILE__" y \c "__LINE__".
00163 
00164     Este método es invocado usando la macro homónima \c TEST_THIS()  */
00165 inline void TestCase::testThis( bool cond, const std::string& lbl, const char* fname, long lineno) {
00166     if (cond) {
00167         recordSuccess();
00168     }
00169     else {
00170         recordError(lbl, fname, lineno);
00171     }
00172 }
00173 
00174 /** Registra la falla de la prueba y luego lo acumula en la hilera de fallas \c toString().
00175     - Los valores \c "fname" y \c "lineno" indican el archivo y el renglón
00176       en donde se ejecuta la prueba.
00177     - Usualmente los valores de \c "fname" y \c "lineno" se obtienen con
00178       las macros globales \c "__FILE__" y \c "__LINE__".
00179 
00180     Este método es invocado usando la macro \c TEST_ERROR() */
00181 inline void TestCase::recordError( const std::string& lbl, const char* fname, int lineno) {
00182 //  typedef basic_ostringstream<char> ostringstream;
00183     std::basic_ostringstream<char> ost; // ostringstream ost;
00184     ost << "=\\_error: " << lbl << " \n=/ (" << lineno << ") " << fname << "\n";
00185     m_errorString += ost.str();
00186     m_error++;
00187 }
00188 
00189 /// [ADH_test] Macros propios de \c ADH_test.h
00190 #define TEST_ADH_test()
00191 #undef  TEST_ADH_test
00192 
00193 /// [ADH_test] Efectúa la prueba \c cond y registra el resultado.
00194 /// - Si la prueba \c cond tiene éxito invoca el método
00195 ///   \c TestCase::recordSuccess()
00196 /// - Si la prueba \c cond falla invoca el método
00197 ///   \c TestCase::recordFail()
00198 /// - Esta es una una macro que invoca el método
00199 ///   \c TestCase::testThis()
00200 ///   \code
00201 ///   TEST_THIS("0 != 1"); // Siempre tiene éxito
00202 ///   testThis(0 != 1, "0 != 1", __FILE__, __LINE__ ); // Siempre tiene éxito
00203 ///   \endcode
00204 #define TEST_THIS(cond) testThis( cond, #cond, __FILE__, __LINE__ )
00205 
00206 /// [ADH_test] Macro similar a \c TEST_THIS() que usa el mensaje \c msg en caso de falla.
00207 /// - El mensaje \c msg debe ser una hilera literal o un objeto que pueda
00208 ///   convertirse en <code>const char *</code>
00209 #define TEST_THIS_Msg(msg, cond) testThis( cond, msg, __FILE__, __LINE__ )
00210 
00211 /// [ADH_test] Registra como "error" el resultado de una prueba.
00212 /// - El programador cliente es quien determinó que la prueba
00213 ///   falló y por eso quiere registrar ese hecho.
00214 /// - Está implementado comun una macro que invoca
00215 ///   el método \c TestCase::recordError()
00216 ///
00217 ///   \code
00218 ///   if (22==33) {
00219 ///       TEST_ERROR("22 != 33"); // Registra que la prueba falló
00220 ///   }
00221 ///   \endcode
00222 #define TEST_ERROR(str) recordError( str, __FILE__, __LINE__ )
00223 
00224 /// [ADH_test] Registra como "exitoso" el resultado de una prueba.
00225 /// - El programador cliente es quien determinó que la prueba
00226 ///   fue exitosa y por eso quiere registrar ese hecho.
00227 /// - Generalmente se usa después de atrapar una excepción que
00228 ///   se supone debió ser lanzada como resultado de la prueba.
00229 /// - Está implementado comun una macro que invoca
00230 ///   el método \c TestCase::recordSuccess()
00231 ///
00232 ///   \code
00233 ///   queue<T> Q(SIZE); // la cola "Q" está vacía ==> no tiene "front()"
00234 ///   try {
00235 ///       Q.front();  // Es incorrecto usar un valor de la cola si la cola está vacía
00236 ///       TEST_ERROR("Q.front();"); // Fallaría si "front()" no levanta la excepción
00237 ///    }
00238 ///    catch (std::logic_error&) {
00239 ///       TEST_SUCCESS(); // Esto es lo correcto pues "front()" levanta "logic_error" para unca cola vacía
00240 ///   }
00241 ///   \endcode
00242 #define TEST_SUCCESS() recordSuccess()
00243 
00244 /// [ADH_test] Efectúa la prueba para determinar si <code>expected == actual</code>.
00245 /// - Si la prueba tiene éxito invoca el método
00246 ///   \c TestCase::recordSuccess()
00247 /// - Si la prueba falla invoca el método
00248 ///   \c TestCase::recordFail()
00249 /// - Esta es una una macro que invoca el método
00250 ///   \c TestCase::testThis()
00251 #define TEST_EQUAL(expected, actual) \
00252         testThis( (expected) == (actual), #expected " == " #actual, __FILE__, __LINE__ )
00253 
00254 /// [ADH_test] Efectúa la prueba para determinar si <code>expected == actual</code>.
00255 /// - Si la prueba tiene éxito invoca el método
00256 ///   \c TestCase::recordSuccess()
00257 /// - Si la prueba falla invoca el método
00258 ///   \c TestCase::recordFail()
00259 /// - Esta es una una macro que invoca el método
00260 ///   \c TestCase::testThis()
00261 /// - Registra el mensaje \c MSG si la prueba falla.
00262 #define TEST_EQUAL_Msg(MSG, expected, actual) \
00263         testThis( (expected) == (actual), MSG, __FILE__, __LINE__ )
00264 
00265 /// Operación de grabado que permite reportar el resultado de la prueba \c test.
00266 /// - Graba en \c COUT el nombre, cantidad de éxitos y cantidad de errores.
00267 std::ostream & operator << (std::ostream& COUT, const TestCase& test) {
00268     COUT << "TestCase \""  << test.getName() << "\":\n"
00269          << "\tOK: "       << test.nPass()
00270          << "\tERROR: "    << test.nError() << "\n";
00271     return COUT;
00272 }
00273 
00274 /// Graba en \c "COUT" el resultado de la prueba \c test.
00275 /// - Retorna la cantidad total de errores \c test.nError().
00276 /// - Además, graba la cantidad de pruebas exitosas y erróneas.
00277 /// - Si hubo pruebas no exitosas, graba los mensajes de error correspondientes.
00278 inline long Report( std::ostream& COUT, const TestCase &test ) {
00279     COUT << test;
00280     if (test.nError() != 0) {
00281         COUT << test.errorString();
00282     }
00283     return test.nError();
00284 }
00285 
00286 // ¿¿¿ TestSuite ???
00287 
00288 //inline bool check_ok<int>( const int & )      { return true; }
00289 //template<class unsigned> inline bool check_ok( const unsigned & ) { return true; }
00290 //template<class int> inline bool check_ok( const long & )     { return true; }
00291 //template<class int> inline bool check_ok( const flota   & )  { return true; }
00292 //template<class int> inline bool check_ok( const double & )   { return true; }
00293 
00294 template <class T> bool check_ok( const T& ); ///< Declaración genérica para \c check_ok()
00295 inline bool check_ok( const signed char &   ) { return true; } ///< \c check_ok<>()
00296 inline bool check_ok( const unsigned char & ) { return true; } ///< \c check_ok<>()
00297 inline bool check_ok( const signed int &    ) { return true; } ///< \c check_ok<>()
00298 inline bool check_ok( const unsigned int&   ) { return true; } ///< \c check_ok<>()
00299 inline bool check_ok( const signed long &   ) { return true; } ///< \c check_ok<>()
00300 inline bool check_ok( const unsigned long & ) { return true; } ///< \c check_ok<>()
00301 inline bool check_ok( const float &       )   { return true; } ///< \c check_ok<>()
00302 inline bool check_ok( const double &      )   { return true; } ///< \c check_ok<>()
00303 inline bool check_ok( const long double & )   { return true; } ///< \c check_ok<>()
00304 
00305 /// Retorna una hilera que contiene el valor de \c val.
00306 /// - \c toString() with standard C++
00307 template <class T>
00308 std::string toString( const T & val ) {
00309 //  typedef basic_ostringstream<char> ostringstream;
00310     std::basic_ostringstream<char> temp; // ostringstream temp;
00311     temp << val;
00312     return temp.str( );
00313 }
00314 
00315 /// [CppUnit] Macros propios de \c CppUnit http://cppunit.sourceforge.net/doc/lastest
00316 #define CPPUNIT_ADH_test()
00317 #undef  CPPUNIT_ADH_test
00318 
00319 /// [CppUnit] Assertions that a condition is true.
00320 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga0
00321 #define CPPUNIT_ASSERT(condition) TEST_THIS(condition)
00322 
00323 /// [CppUnit] Assertion with a user specified message.
00324 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga1
00325 #define CPPUNIT_ASSERT_MESSAGE(message, condition) CPPUNIT_ASSERT(condition)
00326 
00327 /// [CppUnit] Fails with the specified message.
00328 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga2
00329 #define CPPUNIT_FAIL(message) TEST_ERROR(message)
00330 
00331 /// [CppUnit] Asserts that two values are equals.
00332 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga3
00333 #define CPPUNIT_ASSERT_EQUAL(expected, actual) TEST_EQUAL(expected, actual)
00334 
00335 /// [CppUnit] Asserts that two values are equals, provides additional messafe on failure.
00336 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga4
00337 #define CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) \
00338         TEST_EQUAL_Msg(message, expected, actual)
00339 
00340 /// [CppUnit] Macro for primitive value comparisons.
00341 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga5
00342 #define CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta)                 \
00343         assertEquals_Delta(expected, actual, delta)
00344 
00345 /// [CppUnit] Asserts that the given expression throws an exception of the specified type.
00346 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga6
00347 #define CPPUNIT_ASSERT_THROW(expression, ExceptionType)  \
00348         do {                                             \
00349             bool cpputExceptionThrown_ = false;          \
00350             try {                                        \
00351                 expression;                              \
00352             } catch ( const ExceptionType & ) {          \
00353                 cpputExceptionThrown_ = true;            \
00354             }                                            \
00355                                                          \
00356             if ( cpputExceptionThrown_ ) {               \
00357                 break;                                   \
00358             }                                            \
00359             TEST_ERROR(                                  \
00360                 "Expected exception: " #ExceptionType )  \
00361         } while ( false )
00362 
00363 /// [CppUnit] Asserts that the given expression does not throw any exceptions.
00364 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga7
00365 #define CPPUNIT_ASSERT_NO_THROW(expression)                  \
00366         do {                                                 \
00367             try {                                            \
00368                 expression;                                  \
00369             } catch ( ... ) {                                \
00370                 TEST_ERROR("Unexpected exception caught");   \
00371             }                                                \
00372         } while ( false )
00373 
00374 /// [CppUnit] Asserts that an assertion fail.
00375 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga8
00376 #define CPPUNIT_ASSERT_ASSERTION_FAIL(assertion)               \
00377         CPPUNIT_ASSERT_THROW( assertion, CPPUNIT_NS::Exception )
00378 
00379 /// [CppUnit] Asserts that an assertion pass.
00380 /// \see http://cppunit.sourceforge.net/doc/lastest/group___assertions.html#ga9
00381 #define CPPUNIT_ASSERT_ASSERTION_PASS(assertion) \
00382         CPPUNIT_ASSERT_NO_THROW( assertion )
00383 
00384 // /// Concatena la hilera \c THIS con la hilera \c THAT
00385 // #define ADH_test_CAT( THIS, THAT ) (std::string(THIS) + std::string(THAT).c_str()
00386 
00387 #define JUnit_ADH_test()
00388 #undef  JUnit_ADH_test
00389 
00390 /// [JUnit] Macros propios de \c JUnit http://junit.sourceforge.net/javadoc/junit/framework/Assert.html
00391 ///  Asserts that two objects are equal.
00392 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertEquals(java.lang.Object,%20java.lang.Object)
00393 #define assertEquals(          EXPECTED, ACTUAL ) TEST_EQUAL(EXPECTED, ACTUAL)
00394 ///  Asserts that two objects are equal (with message).
00395 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertEquals(java.lang.String,%20java.lang.Object,%20java.lang.Object)
00396 #define assertEquals_Msg( MSG, EXPECTED, ACTUAL ) TEST_EQUAL_Msg(MSG, EXPECTED, ACTUAL)
00397 
00398 /// [JUnit] Asserts that a condition is true.
00399 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertTrue(boolean)
00400 #define assertTrue(           CONDITION ) testThis( CONDITION, #CONDITION, __FILE__, __LINE__ )
00401 /// [JUnit] Asserts that a condition is true (with message).
00402 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertTrue(java.lang.String,%20boolean)
00403 #define assertTrue_Msg( MSG,  CONDITION ) testThis( CONDITION,  MSG,       __FILE__, __LINE__ )
00404 
00405 /// [JUnit] Asserts that a condition is false.
00406 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertFalse(boolean)
00407 #define assertFalse(          CONDITION ) testThis( !(CONDITION), "!(" #CONDITION ")", __FILE__, __LINE__ )
00408 /// [JUnit] Asserts that a condition is false (with message).
00409 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertFalse(java.lang.String,%20boolean)
00410 #define assertFalse_Msg( MSG, CONDITION ) testThis( !(CONDITION),       MSG,           __FILE__, __LINE__ )
00411 
00412 #include <math.h> // fabs()
00413 /// [JUnit] Asserts that two doubles are equal concerning a delta.
00414 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertEquals(double,%20double,%20double)
00415 #define assertEquals_Delta(EXPECTED, ACTUAL, DELTA ) \
00416         testThis( fabs( double(EXPECTED) -  double(ACTUAL) ) < double(DELTA), \
00417         "|"  #EXPECTED "-" #ACTUAL "| < " #DELTA,  __FILE__, __LINE__ )
00418 
00419 /// [JUnit] Asserts that two doubles are equal concerning a delta (with message).
00420 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertEquals(java.lang.String,%20double,%20double,%20double)
00421 #define assertEquals_Delta_Msg( MSG, EXPECTED, ACTUAL, DELTA ) \
00422         testThis( fabs( double(EXPECTED) -  double(ACTUAL) ) < double(DELTA), \
00423         MSG, __FILE__, __LINE__ )
00424 
00425 /// [JUnit] Asserts that an object is null.
00426 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertNull(java.lang.Object)
00427 #define assertNull(OBJECT)    testThis( 0==&(OBJECT), "assertNull("    #OBJECT ")", __FILE__, __LINE__ )
00428 /// [JUnit] Asserts that an object isn't null.
00429 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertNotNull(java.lang.Object)
00430 #define assertNotNull(OBJECT) testThis( 0!=&(OBJECT), "assertNotNull(" #OBJECT ")", __FILE__, __LINE__ )
00431 
00432 /// [JUnit] Asserts that two objects refer to the same object.
00433 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertSame(java.lang.Object,%20java.lang.Object)
00434 #define assertSame(THIS, THAT) testThis(    &(THIS)==&(THAT), "assertSame("    #THIS ", " #THAT ")", __FILE__, __LINE__ )
00435 ///  Asserts that two objects do not refer to the same object.
00436 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#assertNotSame(java.lang.Object,%20java.lang.Object)
00437 #define assertNotSame(THIS, THAT) testThis( &(THIS)!=&(THAT), "assertNotSame(" #THIS ", " #THAT ")", __FILE__, __LINE__ )
00438 
00439 /// [JUnit] Fails a test with no message.
00440 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#fail()
00441 #define fail(     )     TEST_ERROR("ERROR")
00442 /// [JUnit] Fails a test with the given message.
00443 /// \see http://junit.sourceforge.net/javadoc/junit/framework/Assert.html#fail(java.lang.String)
00444 #define fail_Msg( MSG ) TEST_ERROR(MSG)
00445 
00446 #endif // ADH_test_h
00447 
00448 // EOF: ADH_test.h

Generado el Thu Sep 20 12:33:06 2007 para Clase decimal: por  doxygen 1.4.1
Hosted by www.Geocities.ws

1