visualtest/src/variator_random.c
author Ryan C. Gordon <icculus@icculus.org>
Sun, 21 Oct 2018 22:40:17 -0400
changeset 12345 50e1cca28b39
parent 7924 fcb86d323770
permissions -rw-r--r--
wasapi/win32: Sort initial device lists by device GUID.

This makes an unchanged set of hardware always report devices in the same
order on each run.
     1 /* See COPYING.txt for the full license governing this code. */
     2 /**
     3  * \file variator_random.c
     4  *
     5  * Source file for the variator that tests the SUT with random variations to the
     6  * input parameters.
     7  */
     8 
     9 #include <time.h>
    10 #include <SDL_test.h>
    11 #include "SDL_visualtest_random_variator.h"
    12 
    13 int
    14 SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator* variator,
    15                                  SDLVisualTest_SUTConfig* config, Uint64 seed)
    16 {
    17     if(!variator)
    18     {
    19         SDLTest_LogError("variator argument cannot be NULL");
    20         return 0;
    21     }
    22     if(!config)
    23     {
    24         SDLTest_LogError("config argument cannot be NULL");
    25         return 0;
    26     }
    27 
    28     if(seed)
    29         SDLTest_FuzzerInit(seed);
    30     else
    31         SDLTest_FuzzerInit(time(NULL));
    32 
    33     variator->config = *config;
    34 
    35     if(!SDLVisualTest_InitVariation(&variator->variation, &variator->config))
    36     {
    37         SDLTest_LogError("SDLVisualTest_InitVariation() failed");
    38         return 0;
    39     }
    40 
    41     return 1;
    42 }
    43 
    44 char*
    45 SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator* variator)
    46 {
    47     SDLVisualTest_SUTOptionValue* vars;
    48     SDLVisualTest_SUTOption* options;
    49     int i;
    50     if(!variator)
    51     {
    52         SDLTest_LogError("variator argument cannot be NULL");
    53         return NULL;
    54     }
    55  
    56     /* to save typing */
    57     vars = variator->variation.vars;
    58     options = variator->config.options;
    59 
    60     /* generate a random variation */
    61     for(i = 0; i < variator->variation.num_vars; i++)
    62     {
    63         switch(options[i].type)
    64         {
    65             case SDL_SUT_OPTIONTYPE_BOOL:
    66                 vars[i].bool_value = SDLTest_RandomIntegerInRange(0, 1) ? SDL_FALSE :
    67                                                                           SDL_TRUE;
    68             break;
    69 
    70             case SDL_SUT_OPTIONTYPE_ENUM:
    71             {
    72                 int emx = 0;
    73                 while(options[i].data.enum_values[emx])
    74                     emx++;
    75                 vars[i].enumerated.index = SDLTest_RandomIntegerInRange(0, emx - 1);
    76             }
    77             break;
    78             
    79             case SDL_SUT_OPTIONTYPE_INT:
    80                 vars[i].integer.value = SDLTest_RandomIntegerInRange(
    81                                         options[i].data.range.min,
    82                                         options[i].data.range.max);
    83             break;
    84 
    85             case SDL_SUT_OPTIONTYPE_STRING:
    86                 // String values are left unchanged
    87             break;
    88         }
    89     }
    90 
    91     /* convert variation to an arguments string */
    92     if(!SDLVisualTest_MakeStrFromVariation(&variator->variation, &variator->config,
    93                                            variator->buffer, MAX_SUT_ARGS_LEN))
    94     {
    95         SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
    96         return NULL;
    97     }
    98 
    99     return variator->buffer;
   100 }
   101 
   102 void SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator* variator)
   103 {
   104     if(!variator)
   105     {
   106         SDLTest_LogError("variator argument cannot be NULL");
   107         return;
   108     }
   109     SDL_free(variator->variation.vars);
   110     variator->variation.vars = NULL;
   111 }