• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* See COPYING.txt for the full license governing this code. */
2 /**
3  * \file variator_common.c
4  *
5  * Source file for some common functionality used by variators.
6  */
7 
8 #include <SDL_test.h>
9 #include "SDL_visualtest_variator_common.h"
10 
11 int
SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue * var,SDLVisualTest_SUTOption * opt)12 SDLVisualTest_NextValue(SDLVisualTest_SUTOptionValue* var,
13                         SDLVisualTest_SUTOption* opt)
14 {
15     if(!var)
16     {
17         SDLTest_LogError("var argument cannot be NULL");
18         return -1;
19     }
20     if(!opt)
21     {
22         SDLTest_LogError("opt argument cannot be NULL");
23         return -1;
24     }
25 
26     switch(opt->type)
27     {
28         case SDL_SUT_OPTIONTYPE_BOOL:
29             if(var->bool_value)
30             {
31                 var->bool_value = SDL_FALSE;
32                 return 1;
33             }
34             else
35             {
36                 var->bool_value = SDL_TRUE;
37                 return 0;
38             }
39         break;
40 
41         case SDL_SUT_OPTIONTYPE_ENUM:
42             var->enumerated.index++;
43             if(!opt->data.enum_values[var->enumerated.index])
44             {
45                 var->enumerated.index = 0;
46                 return 1;
47             }
48             return 0;
49         break;
50 
51         case SDL_SUT_OPTIONTYPE_INT:
52         {
53             int increment = (opt->data.range.max - opt->data.range.min) /
54                             SDL_SUT_INTEGER_OPTION_TEST_STEPS;
55             /* prevents infinite loop when rounding */
56             if(increment == 0)
57                 increment = 1;
58             var->integer.value += increment;
59             if(var->integer.value > opt->data.range.max)
60             {
61                 var->integer.value = opt->data.range.min;
62                 return 1;
63             }
64             return 0;
65         }
66         break;
67 
68         case SDL_SUT_OPTIONTYPE_STRING:
69             return 1;
70         break;
71     }
72     return -1;
73 }
74 
75 int
SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation * variation,SDLVisualTest_SUTConfig * config,char * buffer,int size)76 SDLVisualTest_MakeStrFromVariation(SDLVisualTest_Variation* variation,
77                                    SDLVisualTest_SUTConfig* config,
78                                    char* buffer, int size)
79 {
80     int i, index;
81     SDLVisualTest_SUTOptionValue* vars;
82     SDLVisualTest_SUTOption* options;
83     if(!variation)
84     {
85         SDLTest_LogError("variation argument cannot be NULL");
86         return 0;
87     }
88     if(!config)
89     {
90         SDLTest_LogError("config argument cannot be NULL");
91         return 0;
92     }
93     if(!buffer)
94     {
95         SDLTest_LogError("buffer argument cannot be NULL");
96         return 0;
97     }
98     if(size <= 0)
99     {
100         SDLTest_LogError("size argument should be positive");
101         return 0;
102     }
103 
104     index = 0;
105     buffer[0] = '\0';
106     options = config->options;
107     vars = variation->vars;
108     for(i = 0; i < variation->num_vars; i++)
109     {
110         int n, enum_index;
111         if(index >= size - 1)
112         {
113             SDLTest_LogError("String did not fit in buffer size");
114             return 0;
115         }
116         switch(options[i].type)
117         {
118             case SDL_SUT_OPTIONTYPE_BOOL:
119                 if(vars[i].bool_value)
120                 {
121                     n = SDL_snprintf(buffer + index, size - index, "%s ",
122                                      options[i].name);
123                     if(n <= 0)
124                     {
125                         SDLTest_LogError("SDL_snprintf() failed");
126                         return 0;
127                     }
128                     index += n;
129                 }
130             break;
131 
132             case SDL_SUT_OPTIONTYPE_ENUM:
133                 if(vars[i].enumerated.on)
134                 {
135                     enum_index = vars[i].enumerated.index;
136                     n = SDL_snprintf(buffer + index, size - index, "%s %s ",
137                         options[i].name, options[i].data.enum_values[enum_index]);
138                     index += n;
139                 }
140             break;
141 
142             case SDL_SUT_OPTIONTYPE_INT:
143                 if(vars[i].integer.on)
144                 {
145                     n = SDL_snprintf(buffer + index, size - index, "%s %d ",
146                                      options[i].name, vars[i].integer.value);
147                     index += n;
148                 }
149             break;
150 
151             case SDL_SUT_OPTIONTYPE_STRING:
152                 if(vars[i].string.on)
153                 {
154                     n = SDL_snprintf(buffer + index, size - index, "%s %s ",
155                                      options[i].name, vars[i].string.value);
156                     index += n;
157                 }
158             break;
159         }
160     }
161     return 1;
162 }
163 
164 int
SDLVisualTest_InitVariation(SDLVisualTest_Variation * variation,SDLVisualTest_SUTConfig * config)165 SDLVisualTest_InitVariation(SDLVisualTest_Variation* variation,
166                             SDLVisualTest_SUTConfig* config)
167 {
168     int i;
169     SDLVisualTest_SUTOptionValue* vars;
170     SDLVisualTest_SUTOption* options;
171     if(!variation)
172     {
173         SDLTest_LogError("variation argument cannot be NULL");
174         return 0;
175     }
176     if(!config)
177     {
178         SDLTest_LogError("config argument cannot be NULL");
179         return 0;
180     }
181 
182     /* initialize the first variation */
183     if(config->num_options <= 0)
184     {
185         SDLTest_LogError("config->num_options must be positive");
186         return 0;
187     }
188     variation->vars = (SDLVisualTest_SUTOptionValue*)SDL_malloc(config->num_options *
189                      sizeof(SDLVisualTest_SUTOptionValue));
190     if(!variation->vars)
191     {
192         SDLTest_LogError("malloc() failed");
193         return 0;
194     }
195     variation->num_vars = config->num_options;
196     vars = variation->vars;
197     options = config->options;
198     for(i = 0; i < variation->num_vars; i++)
199     {
200         switch(options[i].type)
201         {
202             case SDL_SUT_OPTIONTYPE_BOOL:
203                 vars[i].bool_value = SDL_FALSE;
204             break;
205 
206             case SDL_SUT_OPTIONTYPE_ENUM:
207                 vars[i].enumerated.on = SDL_TRUE;
208                 vars[i].enumerated.index = 0;
209             break;
210 
211             case SDL_SUT_OPTIONTYPE_INT:
212             {
213                 vars[i].integer.on = SDL_TRUE;
214                 vars[i].integer.value = options[i].data.range.min;
215             }
216             break;
217 
218             case SDL_SUT_OPTIONTYPE_STRING:
219                 vars[i].string.on = SDL_TRUE;
220                 vars[i].string.value = options[i].name;
221             break;
222         }
223     }
224     return 1;
225 }