Files
libsst/ZTestSuite/ZTestSuiteMain.cpp
2026-04-03 00:22:39 -05:00

321 lines
7.5 KiB
C++

#include "ZUnitTest.hpp"
#include <stdlib.h> //for NULL
#include <string.h> //strcmp
#include <stdio.h> //for printf
#include <ZUtil/ZAlloc.hpp> //for ZENGINE_MEM_DUMP_LEAKS
#include <SST/SST_OS.h>
extern ZUnitTestBlock SST_SafeArithmeticTests;
extern ZUnitTestBlock SST_AtomicTests;
extern ZUnitTestBlock SST_EndianTests;
extern ZUnitTestBlock SST_FileSysTests;
extern ZUnitTestBlock ZArrayTests;
extern ZUnitTestBlock ZArrayAlgoTests;
extern ZUnitTestBlock ZListTests;
extern ZUnitTestBlock ZListAlgoTests;
extern ZUnitTestBlock ZRingBufferTests;
extern ZUnitTestBlock ZBasicStringTests;
extern ZUnitTestBlock ZBasicStringAlgoTests;
extern ZUnitTestBlock ZHashMapTests;
extern ZUnitTestBlock ZAssertTests;
extern ZUnitTestBlock ZAllocTests;
extern ZUnitTestBlock ZConcurrencyTests;
extern ZUnitTestBlock ZNameTests;
extern ZUnitTestBlock ZReferenceCounterTests;
extern ZUnitTestBlock ZSmartPointerTests;
extern ZUnitTestBlock ZWeakPointerTests;
extern ZUnitTestBlock ZSlabAllocatorTests;
extern ZUnitTestBlock ZRandomGeneratorTests;
extern ZUnitTestBlock ZSimplexNoiseTests;
extern ZUnitTestBlock ZTaskStreamTests;
extern ZUnitTestBlock ZKVTreeTests;
extern ZUnitTestBlock ZIniReaderTests;
extern ZUnitTestBlock ZIniWriterTests;
extern ZUnitTestBlock ZJSONReaderTests;
extern ZUnitTestBlock ZJSONWriterTests;
extern ZUnitTestBlock ZXMLReaderTests;
extern ZUnitTestBlock ZXMLWriterTests;
extern ZUnitTestBlock ZRegistryTests;
extern ZUnitTestBlock ZAllocWindowTests;
extern ZUnitTestBlock SST_Math_Mat22fTests;
extern ZUnitTestBlock SST_Math_Mat22dTests;
extern ZUnitTestBlock SST_Math_Mat22iTests;
extern ZUnitTestBlock SST_Math_Mat22uTests;
extern ZUnitTestBlock SST_Math_Mat33fTests;
extern ZUnitTestBlock SST_Math_Mat33dTests;
extern ZUnitTestBlock SST_Math_Mat33iTests;
extern ZUnitTestBlock SST_Math_Mat33uTests;
extern ZUnitTestBlock SST_Math_Mat44fTests;
extern ZUnitTestBlock SST_Math_Mat44dTests;
extern ZUnitTestBlock SST_Math_Mat44iTests;
extern ZUnitTestBlock SST_Math_Mat44uTests;
extern ZUnitTestBlock SST_Math_Vec2fTests;
extern ZUnitTestBlock SST_Math_Vec2dTests;
extern ZUnitTestBlock SST_Math_Vec2iTests;
extern ZUnitTestBlock SST_Math_Vec2uTests;
extern ZUnitTestBlock SST_Math_Vec3fTests;
extern ZUnitTestBlock SST_Math_Vec3dTests;
extern ZUnitTestBlock SST_Math_Vec3iTests;
extern ZUnitTestBlock SST_Math_Vec3uTests;
extern ZUnitTestBlock SST_Math_Vec4fTests;
extern ZUnitTestBlock SST_Math_Vec4dTests;
extern ZUnitTestBlock SST_Math_Vec4iTests;
extern ZUnitTestBlock SST_Math_Vec4uTests;
extern ZUnitTestBlock SST_Math_TransformTests;
extern ZUnitTestBlock SST_Math_GeoTests;
static ZUnitTestBlock* g_tests [] =
{
&SST_SafeArithmeticTests,
&SST_AtomicTests,
&SST_EndianTests,
&SST_FileSysTests,
&SST_Math_Mat22fTests,
&SST_Math_Mat22dTests,
&SST_Math_Mat22iTests,
&SST_Math_Mat22uTests,
&SST_Math_Mat33fTests,
&SST_Math_Mat33dTests,
&SST_Math_Mat33iTests,
&SST_Math_Mat33uTests,
&SST_Math_Mat44fTests,
&SST_Math_Mat44dTests,
&SST_Math_Mat44iTests,
&SST_Math_Mat44uTests,
&SST_Math_Vec2fTests,
&SST_Math_Vec2dTests,
&SST_Math_Vec2iTests,
&SST_Math_Vec2uTests,
&SST_Math_Vec3fTests,
&SST_Math_Vec3dTests,
&SST_Math_Vec3iTests,
&SST_Math_Vec3uTests,
&SST_Math_Vec4fTests,
&SST_Math_Vec4dTests,
&SST_Math_Vec4iTests,
&SST_Math_Vec4uTests,
&SST_Math_TransformTests,
&SST_Math_GeoTests,
&ZArrayTests,
&ZArrayAlgoTests,
&ZListTests,
&ZListAlgoTests,
&ZRingBufferTests,
&ZBasicStringTests,
&ZBasicStringAlgoTests,
&ZHashMapTests,
&ZAssertTests,
&ZAllocTests,
&ZConcurrencyTests,
&ZNameTests,
&ZReferenceCounterTests,
&ZSmartPointerTests,
&ZWeakPointerTests,
&ZSlabAllocatorTests,
&ZRandomGeneratorTests,
&ZSimplexNoiseTests,
&ZTaskStreamTests,
&ZKVTreeTests,
&ZIniReaderTests,
&ZIniWriterTests,
&ZJSONReaderTests,
&ZJSONWriterTests,
&ZXMLReaderTests,
&ZXMLWriterTests,
&ZRegistryTests,
&ZAllocWindowTests,
};
static size_t g_numtests = sizeof(g_tests)/sizeof(g_tests[0]);
/*************************************************************************/
const char* g_assert_message = NULL;
bool g_assert_triggered = false;
int ZTEST_HandleAssert(const char* _msg, void* _arg)
{
(void)_arg;
g_assert_triggered = true;
g_assert_message = _msg;
return 1;
}
void ZTEST_BeginHandleAssert()
{
SST_OS_SetRuntimeAssertHandler(ZTEST_HandleAssert, NULL);
}
bool ZTEST_CheckAssert()
{
bool result = g_assert_triggered;
g_assert_triggered = false;
return result;
}
void ZTEST_EndHandleAssert()
{
SST_OS_SetRuntimeAssertHandler(NULL, NULL);
}
/*************************************************************************/
static bool doFullTestRun()
{
bool success = true;
for (size_t i = 0; i < g_numtests; i++)
success &= RunUnitTests(g_tests[i]);
return success;
}
/*************************************************************************/
int main(int argc, char **argv)
{
//Make sure we set these values
ZUnitTestGlobals::ARGC = argc;
ZUnitTestGlobals::ARGV = argv;
if(SST_OS_Init() == 0)
{
printf("Failed to initialize OS library, exiting.\n");
exit(0xff);
}
//Check our input arguments for test conditions
for(size_t i=1; i<(size_t)argc; i++)
{
if(!strcmp(argv[i], "-n"))
ZUnitTestGlobals::NonInteractive = 1;
else if(!strcmp(argv[i], "-c"))
{
printf("%lu\n", g_numtests);
exit(0);
}
else if(!strcmp(argv[i], "-r")) //Run a specific test
{
if(i == (size_t)argc-1)
{
printf("Invalid usage of -r");
exit(1);
}
ZUnitTestGlobals::TestNumber = atoi(argv[i+1]);
if(ZUnitTestGlobals::TestNumber >= (int)g_numtests)
{
printf("Invalid test number \"%s\"\n",
argv[i+1]);
exit(1);
}
ZUnitTestGlobals::NonInteractive = 1;
// Skip already parsed arg.
i++;
}
else if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
{
printf(
"-h : help (this screen)\n"
"-n : non-interactive (don't wait for keys)\n"
"-r <N> : run test number <N>"
"-c : print number of tests available\n");
exit(0);
}
else
{
printf("ERROR: Option \"%s\" not recognized", argv[1]);
exit(1);
}
}
if(ZUnitTestGlobals::TestNumber >= 0)
{
return (RunUnitTests(g_tests[ZUnitTestGlobals::TestNumber]) ? 0 : 1);
}
bool success = true;
if (ZUnitTestGlobals::NonInteractive == 1)
success = doFullTestRun();
else
{
char inputbuff[512];
for(;;)
{
printf("===============\nAVAILABLE TESTS\n===============\n");
for (size_t i = 0; i < g_numtests; i++)
printf("%lu. %s\n",i+1,g_tests[i]->blockName);
printf("(q to quit)\n");
printf("(0 for all tests)\n");
memset(inputbuff,0,512);
fgets(inputbuff,512,stdin);
inputbuff[511] = '\0';
if (inputbuff[0]=='q')
break;
int selection = atoi(inputbuff);
if (selection < 0 || selection > (int)g_numtests)
continue;
else if (selection == 0)
{
success &= doFullTestRun();
printf("\nPress ENTER to continue...\n");
fgetc(stdin);
}
else
{
success &= RunUnitTests(g_tests[selection-1]);
printf("\nPress ENTER to continue...\n");
fgetc(stdin);
}
}
}
/***********************/
/* End Unit Tests Here */
/***********************/
if (success)
printf("**************\nALL TESTS SUCCESSFUL!\n**************\n\n");
else
printf("**************\nWARNING! SOME TESTS FAILED!\n**************\n\n");
ZALLOC_MEM_DUMP_LEAKS(NULL);
if (g_assert_triggered)
printf("WARNING: Unit tests completed with assert flag tripped!\n\nMESSAGE: %s\n\n", g_assert_message);
if(!ZUnitTestGlobals::NonInteractive)
{
printf("\nPress ENTER to continue...\n");
fflush(stdout);
fgetc(stdin);
}
if (success)
exit(0);
else
exit(1);
}