Skip to content

File test_generator_rational.c

File List > gen-rational > test > test_generator_rational.c

Go to the documentation of this file

#include "generator_rational.h"
#include "string.h"
#include "unity.h"
#include "storage_defs.h"

/******************************************************************************/
/*******************************Untested Frameworks****************************/
/******************************************************************************/

/******************************************************************************/
/******************************* Stubs ****************************************/
/******************************************************************************/

#define STR_TERMINAL_CHAR    (0x7Fu)

char   key_buff[UTIL_TANG_DEFS_MAX_CROSSINGNUM * 10u][UTIL_TANG_DEFS_MAX_CROSSINGNUM * 100u];
char   index_buff[UTIL_TANG_DEFS_MAX_CROSSINGNUM * 100u][UTIL_TANG_DEFS_MAX_CROSSINGNUM * 100u];
char   value_buff[UTIL_TANG_DEFS_MAX_CROSSINGNUM * 100u][UTIL_TANG_DEFS_MAX_CROSSINGNUM * 100u];
size_t key_idx   = 0;
size_t index_idx = 0;
size_t value_idx = 0;

STATIC_INLINE_UINT8 stub_write_dedup_success(const char *key,
                                             const char *index,
                                             const char *value)
{
    size_t i = 0;

    for (i = 0; i < key_idx; i++)
    {
        if (strcmp(key_buff[i], key) == 0)
        {
            return STORE_DEFS_WRITE_SUCCESS;
        }
    }
    strcpy(key_buff[key_idx], key);
    strcpy(index_buff[index_idx], index);
    strcpy(value_buff[value_idx], value);
    key_idx++;
    index_idx++;
    value_idx++;
    return STORE_DEFS_WRITE_SUCCESS;
}

STATIC_INLINE_UINT8 stub_write_success(const char *key,
                                       const char *index,
                                       const char *value)
{
    strcpy(key_buff[key_idx], key);
    strcpy(index_buff[index_idx], index);
    strcpy(value_buff[value_idx], value);
    key_idx++;
    index_idx++;
    value_idx++;
    return STORE_DEFS_WRITE_SUCCESS;
}

STATIC_INLINE_UINT8 stub_write_fail(const char *key,
                                    const char *index,
                                    const char *value)
{
    return STORE_DEFS_WRITE_FAIL;
}

STATIC_INLINE const char *stub_read(const char *key, const char *index)
{
    return value_buff[value_idx];
}

/******************************************************************************/
/*******************************Test Data**************************************/
/******************************************************************************/
note_tv_t tv;
char      tv_str[UTIL_TANG_DEFS_MAX_CROSSINGNUM * 2u];

/* clang-format off */

gen_rational_config_t tc_write_success = {5,
                                          &stub_write_dedup_success,
                                          &tv,
                                          tv_str,
                                          UTIL_TANG_DEFS_MAX_CROSSINGNUM * 2u,};
gen_rational_config_t tc_write_fail    = {5,
                                          &stub_write_fail,
                                          &tv,
                                          tv_str,
                                          UTIL_TANG_DEFS_MAX_CROSSINGNUM * 2u,};
gen_rational_config_t tc_null_buff     = {5,
                                          &stub_write_fail,
                                          NULL,
                                          tv_str,
                                          UTIL_TANG_DEFS_MAX_CROSSINGNUM * 2u,};
gen_rational_config_t tc_null_str_buff = {5,
                                          &stub_write_fail,
                                          &tv,
                                          NULL,
                                          UTIL_TANG_DEFS_MAX_CROSSINGNUM * 2u,};

char cross_num_five_rattang[UTIL_TANG_DEFS_MAX_CROSSINGNUM*5][UTIL_TANG_DEFS_MAX_CROSSINGNUM * 2u]={
/* 5 */
"[1 1 1 1 1]",
/* 4 */
"[2 1 1 1 0]",
"[1 2 1 1 0]",
"[1 1 2 1 0]",
"[1 1 1 2 0]",
/* 3 */
"[3 1 1]",
"[1 3 1]",
"[1 1 3]",
"[2 2 1]",
"[2 1 2]",
"[1 2 2]",
/* 2 */
"[3 2 0]",
"[2 3 0]",
"[4 1 0]",
"[1 4 0]",
/* 1 */
"[5]",
};

/* clang-format on */

/******************************************************************************/
/*******************************Test prep**************************************/
/******************************************************************************/

void setUp(void)
{
}

void tearDown(void)
{
}

/******************************************************************************/
/*******************************Test cases*************************************/
/******************************************************************************/

STATIC_INLINE void test_config(void)
{
    uint8_t ret_val = gen_rational_config(&tc_write_success);

    TEST_ASSERT_EQUAL_UINT8(ret_val, GEN_DEFS_CONFIG_SUCCESS);
    ret_val = gen_rational_config(NULL);
    TEST_ASSERT_EQUAL_UINT8(
        ret_val, GEN_RATIONAL_CONFIG_IS_NULL | GEN_DEFS_CONFIG_FAIL);
    ret_val = gen_rational_config(&tc_null_buff);
    TEST_ASSERT_EQUAL_UINT8(
        ret_val, GEN_RATIONAL_CONFIG_BUFFER | GEN_DEFS_CONFIG_FAIL);
    ret_val = gen_rational_config(&tc_null_str_buff);
    TEST_ASSERT_EQUAL_UINT8(
        ret_val, GEN_RATIONAL_CONFIG_STR_BUFFER | GEN_DEFS_CONFIG_FAIL);
}

STATIC_INLINE void test_generate_fail(void)
{
    uint8_t ret_val = gen_rational_config(&tc_write_fail);

    TEST_ASSERT_EQUAL_UINT8(ret_val, GEN_DEFS_CONFIG_SUCCESS);
    ret_val = gen_rational_generate();
    TEST_ASSERT_EQUAL_UINT8(ret_val, GEN_DEFS_GENERATION_FAIL);
}

STATIC_INLINE void test_generate(void)
{
    uint8_t ret_val = gen_rational_config(&tc_write_success);
    size_t  j, i;

    TEST_ASSERT_EQUAL_UINT8(ret_val, GEN_DEFS_CONFIG_SUCCESS);
    ret_val = gen_rational_generate();
    TEST_ASSERT_EQUAL_UINT8(ret_val, GEN_DEFS_GENERATION_SUCCESS);
    /*@@@TODO check the buffers */

    TEST_ASSERT_EQUAL_UINT8(16, key_idx);
    for (i = 0; i < 16; i++)
    {
        TEST_MESSAGE("Checking against:");
        TEST_MESSAGE(key_buff[i]);

        bool fail = true;
        for (j = 0; j < key_idx; j++)
        {
            TEST_MESSAGE("Looking for generated:");
            TEST_MESSAGE(cross_num_five_rattang[j]);
            if (strcmp(key_buff[j], cross_num_five_rattang[i]) == 0)
            {
                TEST_MESSAGE("Found!");
                fail = false;
                break;
            }
        }
        if (fail)
        {
            TEST_FAIL_MESSAGE("Couldn't find a tangle in the list.");
        }
    }
}

/******************************************************************************/
/*******************************Test main**************************************/
/******************************************************************************/
int main(void)
{
    UNITY_BEGIN();

    RUN_TEST(test_config);
    RUN_TEST(test_generate);
    RUN_TEST(test_generate_fail);

    return UNITY_END();
}