/* See COPYING.txt for the full license governing this code. */
/**
 * \file SDL_visualtest_variators.h
 *
 * Header for all the variators that vary input parameters to a SUT application.
 */

#include "SDL_visualtest_exhaustive_variator.h"
#include "SDL_visualtest_random_variator.h"

#ifndef _SDL_visualtest_variators_h
#define _SDL_visualtest_variators_h

/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif

/**
 * Struct that acts like a wrapper around the different types of variators
 * available.
 */
typedef struct SDLVisualTest_Variator
{
    /*! Type of the variator */
    SDLVisualTest_VariatorType type;
    /*! union object that stores the variator */
    union
    {
        SDLVisualTest_ExhaustiveVariator exhaustive;
        SDLVisualTest_RandomVariator random;
    } data;
} SDLVisualTest_Variator;

/**
 * Initializes the variator object pointed to by \c variator of type \c type
 * with information from the config object pointed to by \c config.
 *
 * \return 1 on success, 0 on failure
 */
int SDLVisualTest_InitVariator(SDLVisualTest_Variator* variator,
                               SDLVisualTest_SUTConfig* config,
                               SDLVisualTest_VariatorType type,
                               Uint64 seed);

/**
 * Gets the next variation using the variator.
 *
 * \return The arguments string representing the variation on success, and
 *         NULL on failure. The pointer returned should not be freed.
 */
char* SDLVisualTest_GetNextVariation(SDLVisualTest_Variator* variator);

/**
 * Frees any resources associated with the variator.
 */
void SDLVisualTest_FreeVariator(SDLVisualTest_Variator* variator);

/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif

#endif /* _SDL_visualtest_variators_h */