/* See COPYING.txt for the full license governing this code. */
/**
 * \file variator_exhaustive.c
 *
 * Source file for the variator that tests the SUT with all the different
 * variations of input parameters that are valid.
 */

#include <time.h>
#include <SDL_test.h>
#include "SDL_visualtest_sut_configparser.h"
#include "SDL_visualtest_exhaustive_variator.h"

static int
NextVariation(SDLVisualTest_Variation* variation,
              SDLVisualTest_SUTConfig* config)
{
    int i, carry;
    if(!variation)
    {
        SDLTest_LogError("variation argument cannot be NULL");
        return -1;
    }
    if(!config)
    {
        SDLTest_LogError("config argument cannot be NULL");
        return -1;
    }

    carry = 1;
    for(i = 0; i < variation->num_vars; i++)
    {
        carry = SDLVisualTest_NextValue(&variation->vars[i], &config->options[i]);
        if(carry != 1)
            break;
    }

    if(carry == 1) /* we're done, we've tried all possible variations */
        return 0;
    if(carry == 0)
        return 1;
    SDLTest_LogError("NextVariation() failed");
    return -1;
}

int
SDLVisualTest_InitExhaustiveVariator(SDLVisualTest_ExhaustiveVariator* variator,
                                     SDLVisualTest_SUTConfig* config)
{
    if(!variator)
    {
        SDLTest_LogError("variator argument cannot be NULL");
        return 0;
    }
    if(!config)
    {
        SDLTest_LogError("config argument cannot be NULL");
        return 0;
    }

    SDLTest_FuzzerInit(time(NULL));

    variator->config = *config;
    variator->variation.num_vars = 0;
    variator->variation.vars = NULL;

    return 1;
}

/* TODO: Right now variations where an option is not specified at all are not
   tested for. This can be implemented by switching the on attribute for integer,
   enum and string options to true and false. */
char*
SDLVisualTest_GetNextExhaustiveVariation(SDLVisualTest_ExhaustiveVariator* variator)
{
    int success;
    if(!variator)
    {
        SDLTest_LogError("variator argument cannot be NULL");
        return NULL;
    }

    if(!variator->variation.vars) /* the first time this function is called */
    {
        success = SDLVisualTest_InitVariation(&variator->variation,
                                              &variator->config);
        if(!success)
        {
            SDLTest_LogError("SDLVisualTest_InitVariation() failed");
            return NULL;
        }
        success = SDLVisualTest_MakeStrFromVariation(&variator->variation,
                  &variator->config, variator->buffer, MAX_SUT_ARGS_LEN);
        if(!success)
        {
            SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
            return NULL;
        }
        return variator->buffer;
    }
    else
    {
        success = NextVariation(&variator->variation, &variator->config);
        if(success == 1)
        {
            success = SDLVisualTest_MakeStrFromVariation(&variator->variation,
                      &variator->config, variator->buffer, MAX_SUT_ARGS_LEN);
            if(!success)
            {
                SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
                return NULL;
            }
            return variator->buffer;
        }
        else if(success == -1)
            SDLTest_LogError("NextVariation() failed.");
        return NULL;
    }
    return NULL;
}

void
SDLVisualTest_FreeExhaustiveVariator(SDLVisualTest_ExhaustiveVariator* variator)
{
    if(!variator)
    {
        SDLTest_LogError("variator argument cannot be NULL");
        return;
    }
    SDL_free(variator->variation.vars);
    variator->variation.vars = NULL;
}