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
1.4.1