Mercurial > flash_v2
diff packages/infra/current/include/testcase.h @ 2:443894e2e912 ecos-v1_2_1-release
Block commit of eCos version 1.2.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 12:24:34 +0000 |
| parents | 3111d98ba7b3 |
| children | c38311975d4f |
line wrap: on
line diff
--- a/packages/infra/current/include/testcase.h +++ b/packages/infra/current/include/testcase.h @@ -24,16 +24,16 @@ // September 30, 1998. // // The Initial Developer of the Original Code is Cygnus. Portions created -// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved. // ------------------------------------------- // //####COPYRIGHTEND#### //========================================================================== //#####DESCRIPTIONBEGIN#### // -// Author(s): ctarpy -// Contributors: ctarpy -// Date: 1998/16/3 +// Author(s): ctarpy +// Contributors: ctarpy, jlarmour +// Date: 1999-02-16 // // //####DESCRIPTIONEND#### @@ -41,13 +41,24 @@ #include <cyg/infra/cyg_type.h> // Common type definitions and support -// The values of status have the following meaning: -// 0 fail -// 1 pass -// 2 exit -// 3 info +// CONSTANTS + +// Status codes + +typedef enum { + CYGNUM_TEST_FAIL, + CYGNUM_TEST_PASS, + CYGNUM_TEST_EXIT, + CYGNUM_TEST_INFO, + CYGNUM_TEST_GDBCMD, + CYGNUM_TEST_NA +} Cyg_test_code; + +// FUNCTION PROTOTYPES + externC void -cyg_test_output(int status, char* msg, int line_number, char* file); +cyg_test_output(Cyg_test_code _status_, const char* _msg_, int _line_number_, + const char* _file_); // This should be called at the start of each test file externC void @@ -55,8 +66,13 @@ cyg_test_init(void); // This causes the test to exit externC void -cyg_test_exit(void) __attribute__ ((__noreturn__)); +cyg_test_exit(void) CYGBLD_ATTRIB_NORET; + +// GLOBALS +externC int cyg_test_is_simulator; // infrastructure changes as necessary + +// MACROS // ----------- Info ----------- // @@ -82,62 +98,89 @@ cyg_test_exit(void) __attribute__ ((__no #define CYG_TEST_INIT() cyg_test_init() #define CYG_TEST_INFO( _msg_ ) \ - cyg_test_output(3, _msg_, __LINE__, __FILE__) + cyg_test_output(CYGNUM_TEST_INFO, _msg_, __LINE__, __FILE__) #define CYG_TEST_PASS( _msg_ ) \ - cyg_test_output(1, _msg_, __LINE__, __FILE__) + cyg_test_output(CYGNUM_TEST_PASS, _msg_, __LINE__, __FILE__) #define CYG_TEST_FAIL( _msg_ ) \ - cyg_test_output(0, _msg_, __LINE__, __FILE__) + cyg_test_output(CYGNUM_TEST_FAIL, _msg_, __LINE__, __FILE__) #define CYG_TEST_EXIT( _msg_ ) \ - (cyg_test_output(2, _msg_, __LINE__, __FILE__), \ + (cyg_test_output(CYGNUM_TEST_EXIT, _msg_, __LINE__, __FILE__), \ cyg_test_exit()) +// Use the following macro to instruct GDB to run a command when using +// the automatic testing infrastructure. This must be used *before* +// CYG_TEST_INIT() is called + +#define CYG_TEST_GDBCMD( _command_ ) \ + CYG_MACRO_START \ + cyg_test_output(CYGNUM_TEST_GDBCMD, _command_, __LINE__, __FILE__); \ + CYG_MACRO_END + +// Use the following macro to declare that a test is not applicable for +// some reason - perhaps not appropriate due to chosen hardware, +// configuration options governing the presence of a tested feature, or +// even configuration options governing the presence of a feature the +// test relies on _in_order_ to test the feature (despite being +// unrelated!) + +#define CYG_TEST_NA( _msg_ ) \ + CYG_MACRO_START \ + cyg_test_output(CYGNUM_TEST_NA, _msg_, __LINE__, __FILE__); \ + cyg_test_exit(); \ + CYG_MACRO_END + #ifdef CYG_COMPOUND_TEST -# define CYG_TEST_FINISH( _msg_ ) \ - (cyg_test_output(2, _msg_, __LINE__, __FILE__), \ - return 0; +# define CYG_TEST_FINISH( _msg_ ) \ + CYG_MACRO_START \ + cyg_test_output(CYGNUM_TEST_EXIT, _msg_, __LINE__, __FILE__); \ + return 0; \ + CYG_MACRO_END #else -# define CYG_TEST_FINISH( _msg_ ) \ - (cyg_test_output(2, _msg_, __LINE__, __FILE__), \ - cyg_test_exit()) +# define CYG_TEST_FINISH( _msg_ ) CYG_TEST_EXIT( _msg_ ) #endif #define CYG_TEST_STILL_ALIVE( _ctr_ , _msg_ ) CYG_TEST_INFO( _msg_ ) - - // ----- The following are convenience functions #define CYG_TEST_PASS_FINISH( _msg_ ) \ - (cyg_test_output(1, _msg_, __LINE__, __FILE__), \ - CYG_TEST_FINISH("done")) + CYG_MACRO_START \ + CYG_TEST_PASS( _msg_ ); \ + CYG_TEST_FINISH("done"); \ + CYG_MACRO_END #define CYG_TEST_FAIL_FINISH( _msg_ ) \ - (cyg_test_output(0, _msg_, __LINE__, __FILE__), \ - CYG_TEST_FINISH("done")) + CYG_MACRO_START \ + CYG_TEST_FAIL( _msg_ ); \ + CYG_TEST_FINISH("done"); \ + CYG_MACRO_END -#define CYG_TEST_CHECK( _chk_ , _msg_) \ - (void)(( _chk_ ) || ( cyg_test_output(0, _msg_, __LINE__, __FILE__), \ - cyg_test_exit(), 1) ) +#define CYG_TEST_CHECK( _chk_ , _msg_) \ + CYG_MACRO_START \ + (void)(( _chk_ ) || ( CYG_TEST_FAIL( _msg_ ) , cyg_test_exit(), 1)); \ + CYG_MACRO_END -#define CYG_TEST_PASS_FAIL( _cdn_, _msg_ ) \ -if ( _cdn_ ) CYG_TEST_PASS( _msg_ ); else CYG_TEST_FAIL( _msg_ ) +#define CYG_TEST_PASS_FAIL( _cdn_, _msg_ ) \ + CYG_MACRO_START \ + if ( _cdn_ ) CYG_TEST_PASS( _msg_ ); else CYG_TEST_FAIL( _msg_ ); \ + CYG_MACRO_END // CYG_TEST_PASS_EXIT and CYG_TEST_FAIL_EXIT are now obscelete, // but are here for now // to avoid breaking testcases which still use them. They will // soon go away. -#define CYG_TEST_PASS_EXIT( _msg_ ) \ - (cyg_test_output(1, _msg_, __LINE__, __FILE__), \ +#define CYG_TEST_PASS_EXIT( _msg_ ) \ + (cyg_test_output(CYGNUM_TEST_PASS, _msg_, __LINE__, __FILE__), \ CYG_TEST_EXIT("done")) -#define CYG_TEST_FAIL_EXIT( _msg_ ) \ - (cyg_test_output(0, _msg_, __LINE__, __FILE__), \ +#define CYG_TEST_FAIL_EXIT( _msg_ ) \ + (cyg_test_output(CYGNUM_TEST_FAIL, _msg_, __LINE__, __FILE__), \ CYG_TEST_EXIT("done"))
