2024-02-12 03:10:54 +00:00
/**
* GUID test suite
*/
# include "SDL.h"
# include "SDL_test.h"
# ifdef HAVE_STDINT_H
# include <stdint.h>
# endif
/* ================= Test Case Implementation ================== */
/* Helper functions */
# define NUM_TEST_GUIDS 5
# ifndef UINT64_C
# ifdef _MSC_VER
# define UINT64_C(x) x##ui64
# elif defined(_LP64)
# define UINT64_C(x) x##UL
# else
# define UINT64_C(x) x##ULL
# endif
# endif
static struct
{
char * str ;
Uint64 upper , lower ;
} test_guids [ NUM_TEST_GUIDS ] = {
{ " 0000000000000000 "
" ffffffffffffffff " ,
UINT64_C ( 0x0000000000000000 ) , UINT64_C ( 0xffffffffffffffff ) } ,
{ " 0011223344556677 "
" 8091a2b3c4d5e6f0 " ,
UINT64_C ( 0x0011223344556677 ) , UINT64_C ( 0x8091a2b3c4d5e6f0 ) } ,
{ " a011223344556677 "
" 8091a2b3c4d5e6f0 " ,
UINT64_C ( 0xa011223344556677 ) , UINT64_C ( 0x8091a2b3c4d5e6f0 ) } ,
{ " a011223344556677 "
" 8091a2b3c4d5e6f1 " ,
UINT64_C ( 0xa011223344556677 ) , UINT64_C ( 0x8091a2b3c4d5e6f1 ) } ,
{ " a011223344556677 "
" 8191a2b3c4d5e6f0 " ,
UINT64_C ( 0xa011223344556677 ) , UINT64_C ( 0x8191a2b3c4d5e6f0 ) } ,
} ;
static void
upper_lower_to_bytestring ( Uint8 * out , Uint64 upper , Uint64 lower )
{
Uint64 values [ 2 ] ;
int i , k ;
values [ 0 ] = upper ;
values [ 1 ] = lower ;
for ( i = 0 ; i < 2 ; + + i ) {
Uint64 v = values [ i ] ;
for ( k = 0 ; k < 8 ; + + k ) {
* out + + = v > > 56 ;
v < < = 8 ;
}
}
}
/* Test case functions */
/**
* @ brief Check String - to - GUID conversion
*
* @ sa SDL_GUIDFromString
*/
static int
TestGuidFromString ( void * arg )
{
int i ;
SDLTest_AssertPass ( " Call to SDL_GUIDFromString " ) ;
for ( i = 0 ; i < NUM_TEST_GUIDS ; + + i ) {
Uint8 expected [ 16 ] ;
SDL_GUID guid ;
upper_lower_to_bytestring ( expected ,
test_guids [ i ] . upper , test_guids [ i ] . lower ) ;
guid = SDL_GUIDFromString ( test_guids [ i ] . str ) ;
SDLTest_AssertCheck ( SDL_memcmp ( expected , guid . data , 16 ) = = 0 , " GUID from string, GUID was: '%s' " , test_guids [ i ] . str ) ;
}
return TEST_COMPLETED ;
}
/**
* @ brief Check GUID - to - String conversion
*
* @ sa SDL_GUIDToString
*/
static int
TestGuidToString ( void * arg )
{
int i ;
SDLTest_AssertPass ( " Call to SDL_GUIDToString " ) ;
for ( i = 0 ; i < NUM_TEST_GUIDS ; + + i ) {
const int guid_str_offset = 4 ;
char guid_str_buf [ 64 ] ;
char * guid_str = guid_str_buf + guid_str_offset ;
SDL_GUID guid ;
int size ;
upper_lower_to_bytestring ( guid . data ,
test_guids [ i ] . upper , test_guids [ i ] . lower ) ;
/* Serialise to limited-length buffers */
for ( size = 0 ; size < = 36 ; + + size ) {
const Uint8 fill_char = size + 0xa0 ;
Uint32 expected_prefix ;
Uint32 actual_prefix ;
int written_size ;
SDL_memset ( guid_str_buf , fill_char , sizeof ( guid_str_buf ) ) ;
SDL_GUIDToString ( guid , guid_str , size ) ;
/* Check bytes before guid_str_buf */
2024-02-25 04:32:46 +00:00
expected_prefix = fill_char | ( fill_char < < 8 ) | ( fill_char < < 16 ) | ( fill_char < < 24 ) ;
2024-02-12 03:10:54 +00:00
SDL_memcpy ( & actual_prefix , guid_str_buf , 4 ) ;
SDLTest_AssertCheck ( expected_prefix = = actual_prefix , " String buffer memory before output untouched, expected: % " SDL_PRIu32 " , got: % " SDL_PRIu32 " , at size=%d " , expected_prefix , actual_prefix , size ) ;
/* Check that we did not overwrite too much */
written_size = 0 ;
while ( ( guid_str [ written_size ] & 0xff ) ! = fill_char & & written_size < 256 ) {
+ + written_size ;
}
SDLTest_AssertCheck ( written_size < = size , " Output length is within expected bounds, with length %d: wrote %d of %d permitted bytes " , size , written_size , size ) ;
if ( size > = 33 ) {
SDLTest_AssertCheck ( SDL_strcmp ( guid_str , test_guids [ i ] . str ) = = 0 , " GUID string equality, from string: %s " , test_guids [ i ] . str ) ;
}
}
}
return TEST_COMPLETED ;
}
/* ================= Test References ================== */
/* GUID routine test cases */
static const SDLTest_TestCaseReference guidTest1 = {
( SDLTest_TestCaseFp ) TestGuidFromString , " TestGuidFromString " , " Call to SDL_GUIDFromString " , TEST_ENABLED
} ;
static const SDLTest_TestCaseReference guidTest2 = {
( SDLTest_TestCaseFp ) TestGuidToString , " TestGuidToString " , " Call to SDL_GUIDToString " , TEST_ENABLED
} ;
/* Sequence of GUID routine test cases */
static const SDLTest_TestCaseReference * guidTests [ ] = {
& guidTest1 ,
& guidTest2 ,
NULL
} ;
/* GUID routine test suite (global) */
SDLTest_TestSuiteReference guidTestSuite = {
" GUID " ,
NULL ,
guidTests ,
NULL
} ;