SDL  2.0
SDL_test_harness.h File Reference
#include "begin_code.h"
#include "close_code.h"
+ Include dependency graph for SDL_test_harness.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  SDLTest_TestCaseReference
 
struct  SDLTest_TestSuiteReference
 

Macros

#define TEST_ENABLED   1
 
#define TEST_DISABLED   0
 
#define TEST_ABORTED   -1
 
#define TEST_STARTED   0
 
#define TEST_COMPLETED   1
 
#define TEST_SKIPPED   2
 
#define TEST_RESULT_PASSED   0
 
#define TEST_RESULT_FAILED   1
 
#define TEST_RESULT_NO_ASSERT   2
 
#define TEST_RESULT_SKIPPED   3
 
#define TEST_RESULT_SETUP_FAILURE   4
 

Typedefs

typedef void(* SDLTest_TestCaseSetUpFp) (void *arg)
 
typedef int(* SDLTest_TestCaseFp) (void *arg)
 
typedef void(* SDLTest_TestCaseTearDownFp) (void *arg)
 

Functions

int SDLTest_RunSuites (SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations)
 Execute a test suite using the given run seed and execution key. More...
 

Detailed Description

Include file for SDL test framework.

This code is a part of the SDL2_test library, not the main SDL library.

Definition in file SDL_test_harness.h.

Macro Definition Documentation

#define TEST_COMPLETED   1

Definition at line 53 of file SDL_test_harness.h.

Referenced by audio_buildAudioCVT(), audio_buildAudioCVTNegative(), audio_convertAudio(), audio_enumerateAndNameAudioDevices(), audio_enumerateAndNameAudioDevicesNegativeTests(), audio_getAudioStatus(), audio_initOpenCloseQuitAudio(), audio_initQuitAudio(), audio_lockUnlockOpenAudioDevice(), audio_openCloseAndGetAudioStatus(), audio_openCloseAudioDeviceConnected(), audio_pauseUnpauseAudio(), audio_printAudioDrivers(), audio_printCurrentAudioDriver(), audio_quitInitAudioSubSystem(), clipboard_testClipboardTextFunctions(), clipboard_testGetClipboardText(), clipboard_testHasClipboardText(), clipboard_testSetClipboardText(), events_addDelEventWatch(), events_addDelEventWatchWithUserdata(), events_pushPumpAndPollUserevent(), hints_getHint(), hints_setHint(), keyboard_getKeyboardFocus(), keyboard_getKeyboardState(), keyboard_getKeyFromName(), keyboard_getKeyFromScancode(), keyboard_getKeyName(), keyboard_getKeyNameNegative(), keyboard_getScancodeFromKey(), keyboard_getScancodeFromName(), keyboard_getScancodeFromNameNegative(), keyboard_getScancodeNameNegative(), keyboard_getSetModState(), keyboard_setTextInputRect(), keyboard_setTextInputRectNegative(), keyboard_startStopTextInput(), main_testImpliedJoystickInit(), main_testImpliedJoystickQuit(), main_testInitQuitJoystickHaptic(), main_testInitQuitSubSystem(), mouse_createFreeColorCursor(), mouse_createFreeCursor(), mouse_getCursor(), mouse_getMouseFocus(), mouse_getMouseState(), mouse_getRelativeMouseState(), mouse_getSetRelativeMouseMode(), mouse_setCursor(), mouse_showCursor(), mouse_warpMouseInWindow(), pixels_allocFreeFormat(), pixels_allocFreePalette(), pixels_calcGammaRamp(), pixels_getPixelFormatName(), platform_testDefaultInit(), platform_testEndianessAndSwap(), platform_testGetFunctions(), platform_testGetPowerInfo(), platform_testGetSetClearError(), platform_testGetVersion(), platform_testHasFunctions(), platform_testSDLVersion(), platform_testSetErrorEmptyInput(), platform_testSetErrorInvalidInput(), platform_testTypes(), rect_testEnclosePoints(), rect_testEnclosePointsParam(), rect_testEnclosePointsRepeatedInput(), rect_testEnclosePointsWithClipping(), rect_testHasIntersectionEmpty(), rect_testHasIntersectionInside(), rect_testHasIntersectionOutside(), rect_testHasIntersectionParam(), rect_testHasIntersectionPartial(), rect_testHasIntersectionPoint(), rect_testIntersectRectAndLine(), rect_testIntersectRectAndLineEmpty(), rect_testIntersectRectAndLineInside(), rect_testIntersectRectAndLineOutside(), rect_testIntersectRectAndLineParam(), rect_testIntersectRectEmpty(), rect_testIntersectRectInside(), rect_testIntersectRectOutside(), rect_testIntersectRectParam(), rect_testIntersectRectPartial(), rect_testIntersectRectPoint(), rect_testRectEmpty(), rect_testRectEmptyParam(), rect_testRectEquals(), rect_testRectEqualsParam(), rect_testUnionRectEmpty(), rect_testUnionRectInside(), rect_testUnionRectOutside(), rect_testUnionRectParam(), render_testBlit(), render_testBlitAlpha(), render_testBlitBlend(), render_testBlitColor(), render_testGetNumRenderDrivers(), render_testPrimitives(), render_testPrimitivesBlend(), rwops_testAllocFree(), rwops_testCompareRWFromMemWithRWFromFile(), rwops_testConstMem(), rwops_testFileRead(), rwops_testFileWrite(), rwops_testFileWriteReadEndian(), rwops_testFPRead(), rwops_testFPWrite(), rwops_testMem(), rwops_testParamNegative(), sdltest_generateRunSeed(), sdltest_getFuzzerInvocationCount(), sdltest_randomAsciiString(), sdltest_randomAsciiStringOfSize(), sdltest_randomAsciiStringWithMaximumLength(), sdltest_randomBoundaryNumberSint16(), sdltest_randomBoundaryNumberSint32(), sdltest_randomBoundaryNumberSint64(), sdltest_randomBoundaryNumberSint8(), sdltest_randomBoundaryNumberUint16(), sdltest_randomBoundaryNumberUint32(), sdltest_randomBoundaryNumberUint64(), sdltest_randomBoundaryNumberUint8(), sdltest_randomIntegerInRange(), sdltest_randomNumber(), stdlib_getsetenv(), stdlib_snprintf(), stdlib_strlcpy(), surface_testBlit(), surface_testBlitAlphaMod(), surface_testBlitBlendAdd(), surface_testBlitBlendBlend(), surface_testBlitBlendLoop(), surface_testBlitBlendMod(), surface_testBlitBlendNone(), surface_testBlitColorMod(), surface_testCompleteSurfaceConversion(), surface_testLoadFailure(), surface_testSaveLoadBitmap(), surface_testSurfaceConversion(), syswm_getWindowWMInfo(), timer_addRemoveTimer(), timer_delayAndGetTicks(), timer_getPerformanceCounter(), timer_getPerformanceFrequency(), video_createWindowVariousFlags(), video_createWindowVariousPositions(), video_createWindowVariousSizes(), video_enableDisableScreensaver(), video_getClosestDisplayModeCurrentResolution(), video_getClosestDisplayModeRandomResolution(), video_getNumDisplayModes(), video_getNumDisplayModesNegative(), video_getSetWindowData(), video_getSetWindowGrab(), video_getSetWindowMaximumSize(), video_getSetWindowMinimumSize(), video_getSetWindowPosition(), video_getSetWindowSize(), video_getWindowBrightness(), video_getWindowBrightnessNegative(), video_getWindowDisplayMode(), video_getWindowDisplayModeNegative(), video_getWindowFlags(), video_getWindowGammaRamp(), video_getWindowGammaRampNegative(), video_getWindowId(), and video_getWindowPixelFormat().

#define TEST_DISABLED   0

Definition at line 48 of file SDL_test_harness.h.

#define TEST_ENABLED   1

Definition at line 47 of file SDL_test_harness.h.

#define TEST_RESULT_FAILED   1
#define TEST_RESULT_NO_ASSERT   2

Definition at line 59 of file SDL_test_harness.h.

Referenced by SDLTest_AssertSummaryToTestResult(), and SDLTest_RunSuites().

#define TEST_RESULT_PASSED   0

Definition at line 57 of file SDL_test_harness.h.

Referenced by SDLTest_AssertSummaryToTestResult(), and SDLTest_RunSuites().

#define TEST_RESULT_SETUP_FAILURE   4

Definition at line 61 of file SDL_test_harness.h.

Referenced by SDLTest_RunTest().

#define TEST_RESULT_SKIPPED   3

Definition at line 60 of file SDL_test_harness.h.

Referenced by SDLTest_RunSuites(), and SDLTest_RunTest().

#define TEST_STARTED   0

Definition at line 52 of file SDL_test_harness.h.

Referenced by SDLTest_RunTest().

Typedef Documentation

typedef int(* SDLTest_TestCaseFp) (void *arg)

Definition at line 67 of file SDL_test_harness.h.

typedef void(* SDLTest_TestCaseSetUpFp) (void *arg)

Definition at line 64 of file SDL_test_harness.h.

typedef void(* SDLTest_TestCaseTearDownFp) (void *arg)

Definition at line 70 of file SDL_test_harness.h.

Function Documentation

int SDLTest_RunSuites ( SDLTest_TestSuiteReference testSuites[],
const char *  userRunSeed,
Uint64  userExecKey,
const char *  filter,
int  testIterations 
)

Execute a test suite using the given run seed and execution key.

Parameters
testSuitesSuites containing the test case.
userRunSeedCustom run seed provided by user, or NULL to autogenerate one.
userExecKeyCustom execution key provided by user, or 0 to autogenerate one.
filterFilter specification. NULL disables. Case sensitive.
testIterationsNumber of iterations to run each test case.
Returns
Test run result; 0 when all tests passed, 1 if any tests failed.

The filter string is matched to the suite name (full comparison) to select a single suite, or if no suite matches, it is matched to the test names (full comparison) to select a single test.

Parameters
testSuitesSuites containing the test case.
userRunSeedCustom run seed provided by user, or NULL to autogenerate one.
userExecKeyCustom execution key provided by user, or 0 to autogenerate one.
filterFilter specification. NULL disables. Case sensitive.
testIterationsNumber of iterations to run each test case.
Returns
Test run result; 0 when all tests passed, 1 if any tests failed.

Definition at line 365 of file SDL_test_harness.c.

References SDLTest_TestCaseReference::description, SDLTest_TestCaseReference::enabled, GetClock(), SDLTest_TestCaseReference::name, SDLTest_TestSuiteReference::name, NULL, SDL_ENOMEM, SDL_Error, SDL_FALSE, SDL_free(), SDL_malloc, SDL_PRIu64, SDL_strcmp, SDL_TRUE, SDLTest_FinalResultFormat, SDLTest_GenerateExecKey(), SDLTest_GenerateRunSeed(), SDLTest_InvalidNameFormat, SDLTest_Log(), SDLTest_LogError(), SDLTest_LogSummaryFormat, SDLTest_RunTest(), TEST_RESULT_FAILED, TEST_RESULT_NO_ASSERT, TEST_RESULT_PASSED, TEST_RESULT_SKIPPED, and SDLTest_TestSuiteReference::testCases.

Referenced by main().

366 {
367  int totalNumberOfTests = 0;
368  int failedNumberOfTests = 0;
369  int suiteCounter;
370  int testCounter;
371  int iterationCounter;
372  SDLTest_TestSuiteReference *testSuite;
373  SDLTest_TestCaseReference *testCase;
374  const char *runSeed = NULL;
375  char *currentSuiteName;
376  char *currentTestName;
377  Uint64 execKey;
378  float runStartSeconds;
379  float suiteStartSeconds;
380  float testStartSeconds;
381  float runEndSeconds;
382  float suiteEndSeconds;
383  float testEndSeconds;
384  float runtime;
385  int suiteFilter = 0;
386  char *suiteFilterName = NULL;
387  int testFilter = 0;
388  char *testFilterName = NULL;
389  SDL_bool forceTestRun = SDL_FALSE;
390  int testResult = 0;
391  int runResult = 0;
392  Uint32 totalTestFailedCount = 0;
393  Uint32 totalTestPassedCount = 0;
394  Uint32 totalTestSkippedCount = 0;
395  Uint32 testFailedCount = 0;
396  Uint32 testPassedCount = 0;
397  Uint32 testSkippedCount = 0;
398  Uint32 countSum = 0;
399  char *logFormat = (char *)SDLTest_LogSummaryFormat;
400  SDLTest_TestCaseReference **failedTests;
401 
402  /* Sanitize test iterations */
403  if (testIterations < 1) {
404  testIterations = 1;
405  }
406 
407  /* Generate run see if we don't have one already */
408  if (userRunSeed == NULL || userRunSeed[0] == '\0') {
409  runSeed = SDLTest_GenerateRunSeed(16);
410  if (runSeed == NULL) {
411  SDLTest_LogError("Generating a random seed failed");
412  return 2;
413  }
414  } else {
415  runSeed = userRunSeed;
416  }
417 
418 
419  /* Reset per-run counters */
420  totalTestFailedCount = 0;
421  totalTestPassedCount = 0;
422  totalTestSkippedCount = 0;
423 
424  /* Take time - run start */
425  runStartSeconds = GetClock();
426 
427  /* Log run with fuzzer parameters */
428  SDLTest_Log("::::: Test Run /w seed '%s' started\n", runSeed);
429 
430  /* Count the total number of tests */
431  suiteCounter = 0;
432  while (testSuites[suiteCounter]) {
433  testSuite=(SDLTest_TestSuiteReference *)testSuites[suiteCounter];
434  suiteCounter++;
435  testCounter = 0;
436  while (testSuite->testCases[testCounter])
437  {
438  testCounter++;
439  totalNumberOfTests++;
440  }
441  }
442 
443  /* Pre-allocate an array for tracking failed tests (potentially all test cases) */
444  failedTests = (SDLTest_TestCaseReference **)SDL_malloc(totalNumberOfTests * sizeof(SDLTest_TestCaseReference *));
445  if (failedTests == NULL) {
446  SDLTest_LogError("Unable to allocate cache for failed tests");
448  return -1;
449  }
450 
451  /* Initialize filtering */
452  if (filter != NULL && filter[0] != '\0') {
453  /* Loop over all suites to check if we have a filter match */
454  suiteCounter = 0;
455  while (testSuites[suiteCounter] && suiteFilter == 0) {
456  testSuite=(SDLTest_TestSuiteReference *)testSuites[suiteCounter];
457  suiteCounter++;
458  if (testSuite->name != NULL && SDL_strcmp(filter, testSuite->name) == 0) {
459  /* Matched a suite name */
460  suiteFilter = 1;
461  suiteFilterName = testSuite->name;
462  SDLTest_Log("Filtering: running only suite '%s'", suiteFilterName);
463  break;
464  }
465 
466  /* Within each suite, loop over all test cases to check if we have a filter match */
467  testCounter = 0;
468  while (testSuite->testCases[testCounter] && testFilter == 0)
469  {
470  testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];
471  testCounter++;
472  if (testCase->name != NULL && SDL_strcmp(filter, testCase->name) == 0) {
473  /* Matched a test name */
474  suiteFilter = 1;
475  suiteFilterName = testSuite->name;
476  testFilter = 1;
477  testFilterName = testCase->name;
478  SDLTest_Log("Filtering: running only test '%s' in suite '%s'", testFilterName, suiteFilterName);
479  break;
480  }
481  }
482  }
483 
484  if (suiteFilter == 0 && testFilter == 0) {
485  SDLTest_LogError("Filter '%s' did not match any test suite/case.", filter);
486  SDLTest_Log("Exit code: 2");
487  SDL_free(failedTests);
488  return 2;
489  }
490  }
491 
492  /* Loop over all suites */
493  suiteCounter = 0;
494  while(testSuites[suiteCounter]) {
495  testSuite=(SDLTest_TestSuiteReference *)testSuites[suiteCounter];
496  currentSuiteName = (char *)((testSuite->name) ? testSuite->name : SDLTest_InvalidNameFormat);
497  suiteCounter++;
498 
499  /* Filter suite if flag set and we have a name */
500  if (suiteFilter == 1 && suiteFilterName != NULL && testSuite->name != NULL &&
501  SDL_strcmp(suiteFilterName, testSuite->name) != 0) {
502  /* Skip suite */
503  SDLTest_Log("===== Test Suite %i: '%s' skipped\n",
504  suiteCounter,
505  currentSuiteName);
506  } else {
507 
508  /* Reset per-suite counters */
509  testFailedCount = 0;
510  testPassedCount = 0;
511  testSkippedCount = 0;
512 
513  /* Take time - suite start */
514  suiteStartSeconds = GetClock();
515 
516  /* Log suite started */
517  SDLTest_Log("===== Test Suite %i: '%s' started\n",
518  suiteCounter,
519  currentSuiteName);
520 
521  /* Loop over all test cases */
522  testCounter = 0;
523  while(testSuite->testCases[testCounter])
524  {
525  testCase=(SDLTest_TestCaseReference *)testSuite->testCases[testCounter];
526  currentTestName = (char *)((testCase->name) ? testCase->name : SDLTest_InvalidNameFormat);
527  testCounter++;
528 
529  /* Filter tests if flag set and we have a name */
530  if (testFilter == 1 && testFilterName != NULL && testCase->name != NULL &&
531  SDL_strcmp(testFilterName, testCase->name) != 0) {
532  /* Skip test */
533  SDLTest_Log("===== Test Case %i.%i: '%s' skipped\n",
534  suiteCounter,
535  testCounter,
536  currentTestName);
537  } else {
538  /* Override 'disabled' flag if we specified a test filter (i.e. force run for debugging) */
539  if (testFilter == 1 && !testCase->enabled) {
540  SDLTest_Log("Force run of disabled test since test filter was set");
541  forceTestRun = SDL_TRUE;
542  }
543 
544  /* Take time - test start */
545  testStartSeconds = GetClock();
546 
547  /* Log test started */
548  SDLTest_Log("----- Test Case %i.%i: '%s' started",
549  suiteCounter,
550  testCounter,
551  currentTestName);
552  if (testCase->description != NULL && testCase->description[0] != '\0') {
553  SDLTest_Log("Test Description: '%s'",
554  (testCase->description) ? testCase->description : SDLTest_InvalidNameFormat);
555  }
556 
557  /* Loop over all iterations */
558  iterationCounter = 0;
559  while(iterationCounter < testIterations)
560  {
561  iterationCounter++;
562 
563  if (userExecKey != 0) {
564  execKey = userExecKey;
565  } else {
566  execKey = SDLTest_GenerateExecKey((char *)runSeed, testSuite->name, testCase->name, iterationCounter);
567  }
568 
569  SDLTest_Log("Test Iteration %i: execKey %" SDL_PRIu64, iterationCounter, execKey);
570  testResult = SDLTest_RunTest(testSuite, testCase, execKey, forceTestRun);
571 
572  if (testResult == TEST_RESULT_PASSED) {
573  testPassedCount++;
574  totalTestPassedCount++;
575  } else if (testResult == TEST_RESULT_SKIPPED) {
576  testSkippedCount++;
577  totalTestSkippedCount++;
578  } else {
579  testFailedCount++;
580  totalTestFailedCount++;
581  }
582  }
583 
584  /* Take time - test end */
585  testEndSeconds = GetClock();
586  runtime = testEndSeconds - testStartSeconds;
587  if (runtime < 0.0f) runtime = 0.0f;
588 
589  if (testIterations > 1) {
590  /* Log test runtime */
591  SDLTest_Log("Runtime of %i iterations: %.1f sec", testIterations, runtime);
592  SDLTest_Log("Average Test runtime: %.5f sec", runtime / (float)testIterations);
593  } else {
594  /* Log test runtime */
595  SDLTest_Log("Total Test runtime: %.1f sec", runtime);
596  }
597 
598  /* Log final test result */
599  switch (testResult) {
600  case TEST_RESULT_PASSED:
601  SDLTest_Log((char *)SDLTest_FinalResultFormat, "Test", currentTestName, "Passed");
602  break;
603  case TEST_RESULT_FAILED:
604  SDLTest_LogError((char *)SDLTest_FinalResultFormat, "Test", currentTestName, "Failed");
605  break;
607  SDLTest_LogError((char *)SDLTest_FinalResultFormat,"Test", currentTestName, "No Asserts");
608  break;
609  }
610 
611  /* Collect failed test case references for repro-step display */
612  if (testResult == TEST_RESULT_FAILED) {
613  failedTests[failedNumberOfTests] = testCase;
614  failedNumberOfTests++;
615  }
616  }
617  }
618 
619  /* Take time - suite end */
620  suiteEndSeconds = GetClock();
621  runtime = suiteEndSeconds - suiteStartSeconds;
622  if (runtime < 0.0f) runtime = 0.0f;
623 
624  /* Log suite runtime */
625  SDLTest_Log("Total Suite runtime: %.1f sec", runtime);
626 
627  /* Log summary and final Suite result */
628  countSum = testPassedCount + testFailedCount + testSkippedCount;
629  if (testFailedCount == 0)
630  {
631  SDLTest_Log(logFormat, "Suite", countSum, testPassedCount, testFailedCount, testSkippedCount);
632  SDLTest_Log((char *)SDLTest_FinalResultFormat, "Suite", currentSuiteName, "Passed");
633  }
634  else
635  {
636  SDLTest_LogError(logFormat, "Suite", countSum, testPassedCount, testFailedCount, testSkippedCount);
637  SDLTest_LogError((char *)SDLTest_FinalResultFormat, "Suite", currentSuiteName, "Failed");
638  }
639 
640  }
641  }
642 
643  /* Take time - run end */
644  runEndSeconds = GetClock();
645  runtime = runEndSeconds - runStartSeconds;
646  if (runtime < 0.0f) runtime = 0.0f;
647 
648  /* Log total runtime */
649  SDLTest_Log("Total Run runtime: %.1f sec", runtime);
650 
651  /* Log summary and final run result */
652  countSum = totalTestPassedCount + totalTestFailedCount + totalTestSkippedCount;
653  if (totalTestFailedCount == 0)
654  {
655  runResult = 0;
656  SDLTest_Log(logFormat, "Run", countSum, totalTestPassedCount, totalTestFailedCount, totalTestSkippedCount);
657  SDLTest_Log((char *)SDLTest_FinalResultFormat, "Run /w seed", runSeed, "Passed");
658  }
659  else
660  {
661  runResult = 1;
662  SDLTest_LogError(logFormat, "Run", countSum, totalTestPassedCount, totalTestFailedCount, totalTestSkippedCount);
663  SDLTest_LogError((char *)SDLTest_FinalResultFormat, "Run /w seed", runSeed, "Failed");
664  }
665 
666  /* Print repro steps for failed tests */
667  if (failedNumberOfTests > 0) {
668  SDLTest_Log("Harness input to repro failures:");
669  for (testCounter = 0; testCounter < failedNumberOfTests; testCounter++) {
670  SDLTest_Log(" --seed %s --filter %s", runSeed, failedTests[testCounter]->name);
671  }
672  }
673  SDL_free(failedTests);
674 
675  SDLTest_Log("Exit code: %d", runResult);
676  return runResult;
677 }
const char * SDLTest_FinalResultFormat
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
char * SDLTest_GenerateRunSeed(const int length)
const char * SDLTest_InvalidNameFormat
GLfloat f
float GetClock()
GLuint const GLchar * name
#define SDL_Error
uint64_t Uint64
An unsigned 64-bit integer type.
Definition: SDL_stdinc.h:164
const SDLTest_TestCaseReference ** testCases
Uint64 SDLTest_GenerateExecKey(char *runSeed, char *suiteName, char *testName, int iteration)
SDL_bool
Definition: SDL_stdinc.h:126
#define TEST_RESULT_FAILED
void SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt,...) SDL_PRINTF_VARARG_FUNC(1)
Prints given message with a timestamp in the TEST category and the ERROR priority.
Definition: SDL_test_log.c:89
void SDL_free(void *mem)
#define TEST_RESULT_NO_ASSERT
#define NULL
Definition: begin_code.h:143
const char * SDLTest_LogSummaryFormat
#define TEST_RESULT_PASSED
#define SDL_PRIu64
Definition: SDL_stdinc.h:186
int SDLTest_RunTest(SDLTest_TestSuiteReference *testSuite, SDLTest_TestCaseReference *testCase, Uint64 execKey, SDL_bool forceTestRun)
Execute a test using the given execution key.
void SDLTest_Log(SDL_PRINTF_FORMAT_STRING const char *fmt,...) SDL_PRINTF_VARARG_FUNC(1)
Prints given message with a timestamp in the TEST category and INFO priority.
Definition: SDL_test_log.c:71
#define SDL_malloc
#define SDL_strcmp
#define TEST_RESULT_SKIPPED
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter