2015-06-21 17:33:46 +02:00
/**
* Hints test suite
*/
2022-11-26 20:43:38 -08:00
# include <SDL3/SDL.h>
# include <SDL3/SDL_test.h>
2023-03-08 16:12:45 +01:00
# include "testautomation_suites.h"
2015-06-21 17:33:46 +02:00
2023-03-08 16:12:45 +01:00
static const char * HintsEnum [ ] = {
2015-06-21 17:33:46 +02:00
SDL_HINT_FRAMEBUFFER_ACCELERATION ,
SDL_HINT_GAMECONTROLLERCONFIG ,
SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS ,
SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK ,
SDL_HINT_ORIENTATIONS ,
SDL_HINT_RENDER_DIRECT3D_THREADSAFE ,
SDL_HINT_RENDER_VSYNC ,
SDL_HINT_TIMER_RESOLUTION ,
SDL_HINT_VIDEO_ALLOW_SCREENSAVER ,
SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES ,
SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS ,
SDL_HINT_VIDEO_WIN_D3DCOMPILER ,
SDL_HINT_VIDEO_X11_XRANDR ,
SDL_HINT_XINPUT_ENABLED ,
2022-11-30 12:51:59 -08:00
} ;
2023-03-08 16:12:45 +01:00
static const char * HintsVerbose [ ] = {
2021-09-22 09:49:41 -07:00
" SDL_FRAMEBUFFER_ACCELERATION " ,
" SDL_GAMECONTROLLERCONFIG " ,
" SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS " ,
" SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK " ,
" SDL_ORIENTATIONS " ,
" SDL_RENDER_DIRECT3D_THREADSAFE " ,
" SDL_RENDER_VSYNC " ,
" SDL_TIMER_RESOLUTION " ,
" SDL_VIDEO_ALLOW_SCREENSAVER " ,
" SDL_VIDEO_MAC_FULLSCREEN_SPACES " ,
" SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS " ,
" SDL_VIDEO_WIN_D3DCOMPILER " ,
" SDL_VIDEO_X11_XRANDR " ,
" SDL_XINPUT_ENABLED "
2022-11-30 12:51:59 -08:00
} ;
2015-06-21 17:33:46 +02:00
2022-12-29 22:58:16 +01:00
SDL_COMPILE_TIME_ASSERT ( HintsEnum , SDL_arraysize ( HintsEnum ) = = SDL_arraysize ( HintsVerbose ) ) ;
2022-04-28 20:57:20 +02:00
2023-03-08 16:12:45 +01:00
static const int numHintsEnum = SDL_arraysize ( HintsEnum ) ;
2015-06-21 17:33:46 +02:00
/* Test case functions */
/**
2023-11-06 10:26:06 -05:00
* Call to SDL_GetHint
2015-06-21 17:33:46 +02:00
*/
2024-09-06 03:21:13 +02:00
static int SDLCALL hints_getHint ( void * arg )
2015-06-21 17:33:46 +02:00
{
2022-11-30 12:51:59 -08:00
const char * result1 ;
const char * result2 ;
int i ;
2022-12-29 22:58:16 +01:00
for ( i = 0 ; i < numHintsEnum ; i + + ) {
result1 = SDL_GetHint ( HintsEnum [ i ] ) ;
SDLTest_AssertPass ( " Call to SDL_GetHint(%s) - using define definition " , ( char * ) HintsEnum [ i ] ) ;
result2 = SDL_GetHint ( HintsVerbose [ i ] ) ;
SDLTest_AssertPass ( " Call to SDL_GetHint(%s) - using string definition " , ( char * ) HintsVerbose [ i ] ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
( result1 = = NULL & & result2 = = NULL ) | | ( SDL_strcmp ( result1 , result2 ) = = 0 ) ,
" Verify returned values are equal; got: result1='%s' result2='%s " ,
( result1 = = NULL ) ? " null " : result1 ,
( result2 = = NULL ) ? " null " : result2 ) ;
}
2021-11-20 01:02:02 +03:00
2022-11-30 12:51:59 -08:00
return TEST_COMPLETED ;
2015-06-21 17:33:46 +02:00
}
2025-03-14 00:43:32 +01:00
typedef struct {
char * name ;
char * value ;
char * oldValue ;
} HintCallbackContext ;
2022-10-02 17:17:31 -07:00
static void SDLCALL hints_testHintChanged ( void * userdata , const char * name , const char * oldValue , const char * hint )
{
2025-03-14 00:43:32 +01:00
HintCallbackContext * context = userdata ;
context - > name = name ? SDL_strdup ( name ) : NULL ;
context - > value = hint ? SDL_strdup ( hint ) : NULL ;
context - > oldValue = oldValue ? SDL_strdup ( oldValue ) : NULL ;
2022-10-02 17:17:31 -07:00
}
2015-06-21 17:33:46 +02:00
/**
2023-11-06 10:26:06 -05:00
* Call to SDL_SetHint
2015-06-21 17:33:46 +02:00
*/
2024-09-06 03:21:13 +02:00
static int SDLCALL hints_setHint ( void * arg )
2015-06-21 17:33:46 +02:00
{
2022-11-30 12:51:59 -08:00
const char * testHint = " SDL_AUTOMATED_TEST_HINT " ;
const char * originalValue ;
char * value ;
const char * testValue ;
2025-03-14 00:43:32 +01:00
HintCallbackContext callback_data ;
2024-09-18 07:52:28 -07:00
bool result ;
2022-11-30 12:51:59 -08:00
int i , j ;
/* Create random values to set */
value = SDLTest_RandomAsciiStringOfSize ( 10 ) ;
2022-12-29 22:58:16 +01:00
for ( i = 0 ; i < numHintsEnum ; i + + ) {
2022-11-30 12:51:59 -08:00
/* Capture current value */
2022-12-29 22:58:16 +01:00
originalValue = SDL_GetHint ( HintsEnum [ i ] ) ;
SDLTest_AssertPass ( " Call to SDL_GetHint(%s) " , HintsEnum [ i ] ) ;
2022-11-30 12:51:59 -08:00
/* Copy the original value, since it will be freed when we set it again */
originalValue = originalValue ? SDL_strdup ( originalValue ) : NULL ;
/* Set value (twice) */
for ( j = 1 ; j < = 2 ; j + + ) {
2022-12-29 22:58:16 +01:00
result = SDL_SetHint ( HintsEnum [ i ] , value ) ;
SDLTest_AssertPass ( " Call to SDL_SetHint(%s, %s) (iteration %i) " , HintsEnum [ i ] , value , j ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
2024-09-18 07:52:28 -07:00
result = = true | | result = = false ,
2022-11-30 12:51:59 -08:00
" Verify valid result was returned, got: %i " ,
( int ) result ) ;
2022-12-29 22:58:16 +01:00
testValue = SDL_GetHint ( HintsEnum [ i ] ) ;
SDLTest_AssertPass ( " Call to SDL_GetHint(%s) - using string definition " , HintsVerbose [ i ] ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
( SDL_strcmp ( value , testValue ) = = 0 ) ,
" Verify returned value equals set value; got: testValue='%s' value='%s " ,
( testValue = = NULL ) ? " null " : testValue ,
value ) ;
}
/* Reset original value */
2022-12-29 22:58:16 +01:00
result = SDL_SetHint ( HintsEnum [ i ] , originalValue ) ;
SDLTest_AssertPass ( " Call to SDL_SetHint(%s, originalValue) " , HintsEnum [ i ] ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
2024-09-18 07:52:28 -07:00
result = = true | | result = = false ,
2022-11-30 12:51:59 -08:00
" Verify valid result was returned, got: %i " ,
( int ) result ) ;
SDL_free ( ( void * ) originalValue ) ;
2015-06-21 17:33:46 +02:00
}
2021-11-20 01:02:02 +03:00
2022-11-30 12:51:59 -08:00
SDL_free ( value ) ;
/* Set default value in environment */
2024-09-13 17:00:15 -07:00
SDL_SetEnvironmentVariable ( SDL_GetEnvironment ( ) , testHint , " original " , 1 ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertPass ( " Call to SDL_GetHint() after saving and restoring hint " ) ;
originalValue = SDL_GetHint ( testHint ) ;
value = ( originalValue = = NULL ) ? NULL : SDL_strdup ( originalValue ) ;
2025-03-14 00:43:32 +01:00
result = SDL_SetHint ( testHint , " temp " ) ;
SDLTest_AssertCheck ( ! result , " SDL_SetHint( \" %s \" , \" temp \" ) should return false " , testHint ) ;
result = SDL_SetHint ( testHint , value ) ;
SDLTest_AssertCheck ( ! result , " SDL_SetHint( \" %s \" , \" %s \" should return false " , testHint , value ) ;
2022-11-30 12:51:59 -08:00
SDL_free ( value ) ;
testValue = SDL_GetHint ( testHint ) ;
SDLTest_AssertCheck (
testValue & & SDL_strcmp ( testValue , " original " ) = = 0 ,
" testValue = %s, expected \" original \" " ,
testValue ) ;
SDLTest_AssertPass ( " Call to SDL_SetHintWithPriority(NULL, SDL_HINT_DEFAULT) " ) ;
2025-03-14 00:43:32 +01:00
result = SDL_SetHintWithPriority ( testHint , NULL , SDL_HINT_DEFAULT ) ;
SDLTest_AssertCheck ( ! result , " SDL_SetHintWithPriority( \" %s \" , NULL, SDL_HINT_DEFAULT) should return false " , testHint ) ;
2022-11-30 12:51:59 -08:00
testValue = SDL_GetHint ( testHint ) ;
SDLTest_AssertCheck (
testValue & & SDL_strcmp ( testValue , " original " ) = = 0 ,
" testValue = %s, expected \" original \" " ,
testValue ) ;
SDLTest_AssertPass ( " Call to SDL_SetHintWithPriority( \" temp \" , SDL_HINT_OVERRIDE) " ) ;
2025-03-14 00:43:32 +01:00
result = SDL_SetHintWithPriority ( testHint , " temp " , SDL_HINT_OVERRIDE ) ;
SDLTest_AssertCheck ( result , " SDL_SetHintWithPriority( \" %s \" , \" temp \" , SDL_HINT_OVERRIDE) should return true " , testHint ) ;
2022-11-30 12:51:59 -08:00
testValue = SDL_GetHint ( testHint ) ;
SDLTest_AssertCheck (
testValue & & SDL_strcmp ( testValue , " temp " ) = = 0 ,
" testValue = %s, expected \" temp \" " ,
testValue ) ;
SDLTest_AssertPass ( " Call to SDL_SetHintWithPriority(NULL, SDL_HINT_OVERRIDE) " ) ;
2025-03-14 00:43:32 +01:00
result = SDL_SetHintWithPriority ( testHint , NULL , SDL_HINT_OVERRIDE ) ;
SDLTest_AssertCheck ( result , " SDL_SetHintWithPriority( \" %s \" , NULL, SDL_HINT_OVERRIDE) should return true " , testHint ) ;
2022-11-30 12:51:59 -08:00
testValue = SDL_GetHint ( testHint ) ;
SDLTest_AssertCheck (
testValue = = NULL ,
" testValue = %s, expected NULL " ,
testValue ) ;
SDLTest_AssertPass ( " Call to SDL_ResetHint() " ) ;
SDL_ResetHint ( testHint ) ;
testValue = SDL_GetHint ( testHint ) ;
SDLTest_AssertCheck (
testValue & & SDL_strcmp ( testValue , " original " ) = = 0 ,
" testValue = %s, expected \" original \" " ,
testValue ) ;
/* Make sure callback functionality works past a reset */
2025-03-14 00:43:32 +01:00
SDL_zero ( callback_data ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertPass ( " Call to SDL_AddHintCallback() " ) ;
2025-03-14 00:43:32 +01:00
SDL_AddHintCallback ( testHint , hints_testHintChanged , & callback_data ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
2025-03-14 00:43:32 +01:00
callback_data . name & & SDL_strcmp ( callback_data . name , testHint ) = = 0 ,
" callback_data.name = \" %s \" , expected \" %s \" " ,
callback_data . name , testHint ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
2025-03-14 00:43:32 +01:00
callback_data . value & & SDL_strcmp ( callback_data . value , " original " ) = = 0 ,
" callback_data.value = \" %s \" , expected \" %s \" " ,
callback_data . value , " original " ) ;
SDL_free ( callback_data . name ) ;
SDL_free ( callback_data . value ) ;
SDL_free ( callback_data . oldValue ) ;
SDL_zero ( callback_data ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertPass ( " Call to SDL_ResetHint(), using callback " ) ;
SDL_ResetHint ( testHint ) ;
SDLTest_AssertCheck (
2025-03-14 00:43:32 +01:00
callback_data . value & & SDL_strcmp ( callback_data . value , " original " ) = = 0 ,
2022-11-30 12:51:59 -08:00
" callbackValue = %s, expected \" original \" " ,
2025-03-14 00:43:32 +01:00
callback_data . value ) ;
SDL_free ( callback_data . name ) ;
SDL_free ( callback_data . value ) ;
SDL_free ( callback_data . oldValue ) ;
SDL_zero ( callback_data ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertPass ( " Call to SDL_SetHintWithPriority( \" temp \" , SDL_HINT_OVERRIDE), using callback after reset " ) ;
2025-03-14 00:43:32 +01:00
result = SDL_SetHintWithPriority ( testHint , " temp " , SDL_HINT_OVERRIDE ) ;
SDLTest_AssertCheck ( result , " SDL_SetHintWithPriority( \" %s \" , \" temp \" , SDL_HINT_OVERRIDE) should return true " , testHint ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertCheck (
2025-03-14 00:43:32 +01:00
callback_data . value & & SDL_strcmp ( callback_data . value , " temp " ) = = 0 ,
2022-11-30 12:51:59 -08:00
" callbackValue = %s, expected \" temp \" " ,
2025-03-14 00:43:32 +01:00
callback_data . value ) ;
SDL_free ( callback_data . name ) ;
SDL_free ( callback_data . value ) ;
SDL_free ( callback_data . oldValue ) ;
SDL_zero ( callback_data ) ;
2022-11-30 12:51:59 -08:00
SDLTest_AssertPass ( " Call to SDL_ResetHint(), after clearing callback " ) ;
2025-03-14 00:43:32 +01:00
SDL_RemoveHintCallback ( testHint , hints_testHintChanged , & callback_data ) ;
2022-11-30 12:51:59 -08:00
SDL_ResetHint ( testHint ) ;
2015-06-21 17:33:46 +02:00
SDLTest_AssertCheck (
2025-03-14 00:43:32 +01:00
! callback_data . value ,
2022-11-30 12:51:59 -08:00
" callbackValue = %s, expected \" (null) \" " ,
2025-03-14 00:43:32 +01:00
callback_data . value ) ;
SDL_free ( callback_data . name ) ;
SDL_free ( callback_data . value ) ;
SDL_free ( callback_data . oldValue ) ;
SDL_zero ( callback_data ) ;
/* Make sure callback functionality work with hint renamed in sdl3 */
SDLTest_AssertPass ( " Call to SDL_AddHintCallback() " ) ;
SDL_AddHintCallback ( SDL_HINT_WINDOW_ALLOW_TOPMOST , hints_testHintChanged , & callback_data ) ;
SDLTest_AssertPass ( " Call to SDL_SetHintWithPriority( \" temp \" , SDL_HINT_OVERRIDE), using callback " ) ;
SDLTest_AssertCheck ( callback_data . name & & SDL_strcmp ( callback_data . name , SDL_HINT_WINDOW_ALLOW_TOPMOST ) = = 0 , " callback was called with name \" %s \" (expected \" %s \" ) " , callback_data . name , SDL_HINT_WINDOW_ALLOW_TOPMOST ) ;
SDLTest_AssertCheck ( ! callback_data . value , " callback was called with null value, was %s " , callback_data . value ) ;
SDLTest_AssertCheck ( ! callback_data . oldValue , " callback was called with null oldvalue, was %s " , callback_data . oldValue ) ;
SDL_free ( callback_data . name ) ;
SDL_free ( callback_data . value ) ;
SDL_free ( callback_data . oldValue ) ;
SDL_zero ( callback_data ) ;
result = SDL_SetHintWithPriority ( SDL_HINT_WINDOW_ALLOW_TOPMOST , " temp " , SDL_HINT_OVERRIDE ) ;
SDLTest_AssertCheck ( result , " SDL_SetHintWithPriority( \" %s \" , \" temp \" , SDL_HINT_OVERRIDE) should return true " , testHint ) ;
SDLTest_AssertCheck (
callback_data . name & & SDL_strcmp ( callback_data . name , SDL_HINT_WINDOW_ALLOW_TOPMOST ) = = 0 ,
" callback_data.name = \" %s \" , expected \" %s \" " ,
callback_data . name , SDL_HINT_WINDOW_ALLOW_TOPMOST ) ;
SDLTest_AssertCheck (
callback_data . value & & SDL_strcmp ( callback_data . value , " temp " ) = = 0 ,
" callback_data.value = \" %s \" , expected \" %s \" " ,
callback_data . value , " temp " ) ;
SDL_free ( callback_data . name ) ;
SDL_free ( callback_data . value ) ;
SDL_free ( callback_data . oldValue ) ;
SDL_zero ( callback_data ) ;
SDL_ResetHint ( testHint ) ;
2022-11-30 12:51:59 -08:00
return TEST_COMPLETED ;
2015-06-21 17:33:46 +02:00
}
/* ================= Test References ================== */
/* Hints test cases */
2025-03-14 00:43:32 +01:00
static const SDLTest_TestCaseReference hintsGetHint = {
2024-09-04 23:54:56 +02:00
hints_getHint , " hints_getHint " , " Call to SDL_GetHint " , TEST_ENABLED
2022-11-30 12:51:59 -08:00
} ;
2015-06-21 17:33:46 +02:00
2025-03-14 00:43:32 +01:00
static const SDLTest_TestCaseReference hintsSetHint = {
2024-09-04 23:54:56 +02:00
hints_setHint , " hints_setHint " , " Call to SDL_SetHint " , TEST_ENABLED
2022-11-30 12:51:59 -08:00
} ;
2015-06-21 17:33:46 +02:00
/* Sequence of Hints test cases */
2022-11-30 12:51:59 -08:00
static const SDLTest_TestCaseReference * hintsTests [ ] = {
2025-03-14 00:43:32 +01:00
& hintsGetHint ,
& hintsSetHint ,
NULL
2015-06-21 17:33:46 +02:00
} ;
/* Hints test suite (global) */
SDLTest_TestSuiteReference hintsTestSuite = {
" Hints " ,
NULL ,
hintsTests ,
NULL
} ;