225 lines
6 KiB
C
225 lines
6 KiB
C
|
/* 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;
|
||
|
}
|