|  | /* See COPYING.txt for the full license governing this code. */ | 
|  | /** | 
|  | * \file variator_common.c | 
|  | * | 
|  | * Source file for some common functionality used by variators. | 
|  | */ | 
|  |  | 
|  | #include <SDL_test.h> | 
|  | #include "SDL_visualtest_variator_common.h" | 
|  |  | 
|  | int | 
|  | SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue* var, | 
|  | SDLVisualTest_SUTOption* opt) | 
|  | { | 
|  | if(!var) | 
|  | { | 
|  | SDLTest_LogError("var argument cannot be NULL"); | 
|  | return -1; | 
|  | } | 
|  | if(!opt) | 
|  | { | 
|  | SDLTest_LogError("opt argument cannot be NULL"); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | switch(opt->type) | 
|  | { | 
|  | case SDL_SUT_OPTIONTYPE_BOOL: | 
|  | if(var->bool_value) | 
|  | { | 
|  | var->bool_value = SDL_FALSE; | 
|  | return 1; | 
|  | } | 
|  | else | 
|  | { | 
|  | var->bool_value = SDL_TRUE; | 
|  | return 0; | 
|  | } | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_ENUM: | 
|  | var->enumerated.index++; | 
|  | if(!opt->data.enum_values[var->enumerated.index]) | 
|  | { | 
|  | var->enumerated.index = 0; | 
|  | return 1; | 
|  | } | 
|  | return 0; | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_INT: | 
|  | { | 
|  | int increment = (opt->data.range.max - opt->data.range.min) / | 
|  | SDL_SUT_INTEGER_OPTION_TEST_STEPS; | 
|  | /* prevents infinite loop when rounding */ | 
|  | if(increment == 0) | 
|  | increment = 1; | 
|  | var->integer.value += increment; | 
|  | if(var->integer.value > opt->data.range.max) | 
|  | { | 
|  | var->integer.value = opt->data.range.min; | 
|  | return 1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_STRING: | 
|  | return 1; | 
|  | break; | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | int | 
|  | SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation* variation, | 
|  | SDLVisualTest_SUTConfig* config, | 
|  | char* buffer, int size) | 
|  | { | 
|  | int i, index; | 
|  | SDLVisualTest_SUTOptionValue* vars; | 
|  | SDLVisualTest_SUTOption* options; | 
|  | if(!variation) | 
|  | { | 
|  | SDLTest_LogError("variation argument cannot be NULL"); | 
|  | return 0; | 
|  | } | 
|  | if(!config) | 
|  | { | 
|  | SDLTest_LogError("config argument cannot be NULL"); | 
|  | return 0; | 
|  | } | 
|  | if(!buffer) | 
|  | { | 
|  | SDLTest_LogError("buffer argument cannot be NULL"); | 
|  | return 0; | 
|  | } | 
|  | if(size <= 0) | 
|  | { | 
|  | SDLTest_LogError("size argument should be positive"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | index = 0; | 
|  | buffer[0] = '\0'; | 
|  | options = config->options; | 
|  | vars = variation->vars; | 
|  | for(i = 0; i < variation->num_vars; i++) | 
|  | { | 
|  | int n, enum_index; | 
|  | if(index >= size - 1) | 
|  | { | 
|  | SDLTest_LogError("String did not fit in buffer size"); | 
|  | return 0; | 
|  | } | 
|  | switch(options[i].type) | 
|  | { | 
|  | case SDL_SUT_OPTIONTYPE_BOOL: | 
|  | if(vars[i].bool_value) | 
|  | { | 
|  | n = SDL_snprintf(buffer + index, size - index, "%s ", | 
|  | options[i].name); | 
|  | if(n <= 0) | 
|  | { | 
|  | SDLTest_LogError("SDL_snprintf() failed"); | 
|  | return 0; | 
|  | } | 
|  | index += n; | 
|  | } | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_ENUM: | 
|  | if(vars[i].enumerated.on) | 
|  | { | 
|  | enum_index = vars[i].enumerated.index; | 
|  | n = SDL_snprintf(buffer + index, size - index, "%s %s ", | 
|  | options[i].name, options[i].data.enum_values[enum_index]); | 
|  | index += n; | 
|  | } | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_INT: | 
|  | if(vars[i].integer.on) | 
|  | { | 
|  | n = SDL_snprintf(buffer + index, size - index, "%s %d ", | 
|  | options[i].name, vars[i].integer.value); | 
|  | index += n; | 
|  | } | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_STRING: | 
|  | if(vars[i].string.on) | 
|  | { | 
|  | n = SDL_snprintf(buffer + index, size - index, "%s %s ", | 
|  | options[i].name, vars[i].string.value); | 
|  | index += n; | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int | 
|  | SDLVisualTest_InitVariation(SDLVisualTest_Variation* variation, | 
|  | SDLVisualTest_SUTConfig* config) | 
|  | { | 
|  | int i; | 
|  | SDLVisualTest_SUTOptionValue* vars; | 
|  | SDLVisualTest_SUTOption* options; | 
|  | if(!variation) | 
|  | { | 
|  | SDLTest_LogError("variation argument cannot be NULL"); | 
|  | return 0; | 
|  | } | 
|  | if(!config) | 
|  | { | 
|  | SDLTest_LogError("config argument cannot be NULL"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /* initialize the first variation */ | 
|  | if(config->num_options <= 0) | 
|  | { | 
|  | SDLTest_LogError("config->num_options must be positive"); | 
|  | return 0; | 
|  | } | 
|  | variation->vars = (SDLVisualTest_SUTOptionValue*)SDL_malloc(config->num_options * | 
|  | sizeof(SDLVisualTest_SUTOptionValue)); | 
|  | if(!variation->vars) | 
|  | { | 
|  | SDLTest_LogError("malloc() failed"); | 
|  | return 0; | 
|  | } | 
|  | variation->num_vars = config->num_options; | 
|  | vars = variation->vars; | 
|  | options = config->options; | 
|  | for(i = 0; i < variation->num_vars; i++) | 
|  | { | 
|  | switch(options[i].type) | 
|  | { | 
|  | case SDL_SUT_OPTIONTYPE_BOOL: | 
|  | vars[i].bool_value = SDL_FALSE; | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_ENUM: | 
|  | vars[i].enumerated.on = SDL_TRUE; | 
|  | vars[i].enumerated.index = 0; | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_INT: | 
|  | { | 
|  | vars[i].integer.on = SDL_TRUE; | 
|  | vars[i].integer.value = options[i].data.range.min; | 
|  | } | 
|  | break; | 
|  |  | 
|  | case SDL_SUT_OPTIONTYPE_STRING: | 
|  | vars[i].string.on = SDL_TRUE; | 
|  | vars[i].string.value = options[i].name; | 
|  | break; | 
|  | } | 
|  | } | 
|  | return 1; | 
|  | } |