Mercurial > sdl-ios-xcode
diff test/automated/SDL_at.c @ 3259:22ac66da0765
Merged Edgar's code changes from Google Summer of Code 2009
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 07 Sep 2009 05:06:34 +0000 |
parents | |
children | 1f1a41879fe4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/automated/SDL_at.c Mon Sep 07 05:06:34 2009 +0000 @@ -0,0 +1,308 @@ +/* + * Common code for automated test suite. + * + * Written by Edgar Simo "bobbens" + * + * Released under Public Domain. + */ + + +#include "SDL_at.h" + +#include <stdio.h> /* printf/fprintf */ +#include <stdarg.h> /* va_list */ +#include <string.h> /* strdup */ +#include <stdlib.h> /* free */ + + +/* + * Internal usage SDL_AT variables. + */ +static char *at_suite_msg = NULL; /**< Testsuite message. */ +static char *at_test_msg = NULL; /**< Testcase message. */ +static int at_success = 0; /**< Number of successful testcases. */ +static int at_failure = 0; /**< Number of failed testcases. */ + + +/* + * Global properties. + */ +static int at_verbose = 0; /**< Verbosity. */ +static int at_quiet = 0; /**< Quietness. */ + + +/* + * Prototypes. + */ +static void SDL_ATcleanup (void); +static void SDL_ATendWith( int success ); +static void SDL_ATassertFailed( const char *msg ); + + +/** + * @brief Cleans up the automated testsuite state. + */ +static void SDL_ATcleanup (void) +{ + if (at_suite_msg != NULL) + free(at_suite_msg); + at_suite_msg = NULL; + if (at_test_msg != NULL) + free(at_test_msg); + at_test_msg = NULL; + at_success = 0; + at_failure = 0; +} + + +/** + * @brief Begin testsuite. + */ +void SDL_ATinit( const char *suite ) +{ + /* Do not open twice. */ + if (at_suite_msg) { + SDL_ATprintErr( "AT suite '%s' not closed before opening suite '%s'\n", + at_suite_msg, suite ); + } + /* Must have a name. */ + if (suite == NULL) { + SDL_ATprintErr( "AT testsuite does not have a name.\n"); + } + SDL_ATcleanup(); + at_suite_msg = strdup(suite); + + /* Verbose message. */ + SDL_ATprintVerbose( 2, "--+---> Started Test Suite '%s'\n", at_suite_msg ); +} + + +/** + * @brief Finish testsuite. + */ +int SDL_ATfinish (void) +{ + int failed; + + /* Make sure initialized. */ + if (at_suite_msg == NULL) { + SDL_ATprintErr("Ended testcase without initializing.\n"); + return 1; + } + + /* Finished without closing testcase. */ + if (at_test_msg) { + SDL_ATprintErr( "AT suite '%s' finished without closing testcase '%s'\n", + at_suite_msg, at_test_msg ); + } + + /* Verbose message. */ + SDL_ATprintVerbose( 2, "<-+---- Finished Test Suite '%s'\n", at_suite_msg ); + + /* Display message if verbose on failed. */ + failed = at_failure; + if (at_failure > 0) { + SDL_ATprintErr( "%s : Failed %d out of %d testcases!\n", + at_suite_msg, at_failure, at_failure+at_success ); + } + else { + SDL_ATprint( "%s : All tests successful (%d)\n", + at_suite_msg, at_success ); + } + + /* Clean up. */ + SDL_ATcleanup(); + + /* Return failed. */ + return failed; +} + + +/** + * @brief Sets a property. + */ +void SDL_ATseti( int property, int value ) +{ + switch (property) { + case SDL_AT_VERBOSE: + at_verbose = value; + break; + + case SDL_AT_QUIET: + at_quiet = value; + break; + } +} + + +/** + * @brief Gets a property. + */ +void SDL_ATgeti( int property, int *value ) +{ + switch (property) { + case SDL_AT_VERBOSE: + *value = at_verbose; + break; + + case SDL_AT_QUIET: + *value = at_quiet; + break; + } +} + + +/** + * @brief Begin testcase. + */ +void SDL_ATbegin( const char *testcase ) +{ + /* Do not open twice. */ + if (at_test_msg) { + SDL_ATprintErr( "AT testcase '%s' not closed before opening testcase '%s'\n", + at_test_msg, testcase ); + } + /* Must have a name. */ + if (testcase == NULL) { + SDL_ATprintErr( "AT testcase does not have a name.\n"); + } + at_test_msg = strdup(testcase); + + /* Verbose message. */ + SDL_ATprintVerbose( 2, " +---> StartedTest Case '%s'\n", testcase ); +} + + +/** + * @brief Ends the testcase with a succes or failure. + */ +static void SDL_ATendWith( int success ) +{ + /* Make sure initialized. */ + if (at_test_msg == NULL) { + SDL_ATprintErr("Ended testcase without initializing.\n"); + return; + } + + /* Mark as success or failure. */ + if (success) + at_success++; + else + at_failure++; + + /* Verbose message. */ + SDL_ATprintVerbose( 2, " +---- Finished Test Case '%s'\n", at_test_msg ); + + /* Clean up. */ + if (at_test_msg != NULL) + free(at_test_msg); + at_test_msg = NULL; +} + + +/** + * @brief Display failed assert message. + */ +static void SDL_ATassertFailed( const char *msg ) +{ + /* Print. */ + SDL_ATprintErr( "Assert Failed!\n" ); + SDL_ATprintErr( " %s\n", msg ); + SDL_ATprintErr( " Test Case '%s'\n", at_test_msg ); + SDL_ATprintErr( " Test Suite '%s'\n", at_suite_msg ); + /* End. */ + SDL_ATendWith(0); +} + + +/** + * @brief Testcase test. + */ +int SDL_ATassert( const char *msg, int condition ) +{ + /* Condition failed. */ + if (!condition) { + /* Failed message. */ + SDL_ATassertFailed(msg); + } + return !condition; +} + + +/** + * @brief Testcase test. + */ +int SDL_ATvassert( int condition, const char *msg, ... ) +{ + va_list args; + char buf[256]; + + /* Condition failed. */ + if (!condition) { + /* Get message. */ + va_start( args, msg ); + vsnprintf( buf, sizeof(buf), msg, args ); + va_end( args ); + /* Failed message. */ + SDL_ATassertFailed( buf ); + } + return !condition; +} + + +/** + * @brief End testcase. + */ +void SDL_ATend (void) +{ + SDL_ATendWith(1); +} + + +/** + * @brief Displays an error. + */ +int SDL_ATprintErr( const char *msg, ... ) +{ + va_list ap; + int ret; + + /* Make sure there is something to print. */ + if (msg == NULL) + return 0; + else { + va_start(ap, msg); + ret = vfprintf( stderr, msg, ap ); + va_end(ap); + } + + return ret; +} + + +/** + * @brief Displays a verbose message. + */ +int SDL_ATprintVerbose( int level, const char *msg, ... ) +{ + va_list ap; + int ret; + + /* Only print if not quiet. */ + if (at_quiet || (at_verbose < level)) + return 0; + + /* Make sure there is something to print. */ + if (msg == NULL) + return 0; + else { + va_start(ap, msg); + ret = vfprintf( stdout, msg, ap ); + va_end(ap); + } + + return ret; +} + + +