#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "idl/processor.h"
#include "CUnit/Test.h"
CU_Test(idl_enum, no_enumerator)
{
idl_retcode_t ret;
idl_pstate_t *pstate = NULL;
const char str[] = "enum foo { };";
ret = idl_create_pstate(0u, NULL, &pstate);
CU_ASSERT_EQ_FATAL (ret, IDL_RETCODE_OK);
CU_ASSERT_NEQ_FATAL (pstate, NULL);
ret = idl_parse_string(pstate, str);
CU_ASSERT_EQ (ret, IDL_RETCODE_SYNTAX_ERROR);
CU_ASSERT_EQ (pstate->root, NULL);
idl_delete_pstate(pstate);
}
CU_Test(idl_enum, duplicate_enumerators)
{
idl_retcode_t ret;
idl_pstate_t *pstate = NULL;
const char str[] = "enum foo { bar, bar };";
ret = idl_create_pstate(0u, NULL, &pstate);
CU_ASSERT_EQ_FATAL (ret, IDL_RETCODE_OK);
CU_ASSERT_NEQ_FATAL (pstate, NULL);
ret = idl_parse_string(pstate, str);
CU_ASSERT_EQ (ret, IDL_RETCODE_SEMANTIC_ERROR);
CU_ASSERT_EQ (pstate->root, NULL);
idl_delete_pstate(pstate);
}
CU_Test(idl_enum, enumerator_matches_enum)
{
idl_retcode_t ret;
idl_pstate_t *pstate = NULL;
const char str[] = "enum foo { foo };";
ret = idl_create_pstate(0u, NULL, &pstate);
CU_ASSERT_EQ_FATAL (ret, IDL_RETCODE_OK);
CU_ASSERT_NEQ_FATAL (pstate, NULL);
ret = idl_parse_string(pstate, str);
CU_ASSERT_EQ (ret, IDL_RETCODE_SEMANTIC_ERROR);
CU_ASSERT_EQ (pstate->root, NULL);
idl_delete_pstate(pstate);
}
#if 0#endif
CU_Test(idl_enum, single_enumerator)
{
idl_retcode_t ret;
idl_pstate_t *pstate = NULL;
idl_enum_t *e;
idl_enumerator_t *er;
const char str[] = "enum foo { bar };";
ret = idl_create_pstate(0u, NULL, &pstate);
CU_ASSERT_EQ_FATAL (ret, IDL_RETCODE_OK);
CU_ASSERT_NEQ_FATAL (pstate, NULL);
ret = idl_parse_string(pstate, str);
CU_ASSERT_EQ (ret, IDL_RETCODE_OK);
e = (idl_enum_t *)pstate->root;
CU_ASSERT_FATAL (idl_is_enum(e));
er = (idl_enumerator_t *)e->enumerators;
CU_ASSERT_FATAL (idl_is_enumerator(er));
CU_ASSERT_NEQ_FATAL (idl_identifier(er), NULL);
CU_ASSERT_STREQ (idl_identifier(er), "bar");
CU_ASSERT_EQ (idl_parent(er), e);
idl_delete_pstate(pstate);
}
CU_Test(idl_enum, multiple_enumerators)
{
idl_retcode_t ret;
idl_pstate_t *pstate = NULL;
idl_enum_t *e;
idl_enumerator_t *er;
const char str[] = "enum foo { bar, baz };";
ret = idl_create_pstate(0u, NULL, &pstate);
CU_ASSERT_EQ_FATAL (ret, IDL_RETCODE_OK);
CU_ASSERT_NEQ_FATAL (pstate, NULL);
ret = idl_parse_string(pstate, str);
CU_ASSERT_EQ (ret, IDL_RETCODE_OK);
e = (idl_enum_t *)pstate->root;
CU_ASSERT_FATAL (idl_is_enum(e));
er = (idl_enumerator_t *)e->enumerators;
CU_ASSERT_FATAL (idl_is_enumerator(er));
CU_ASSERT_NEQ_FATAL (idl_identifier(er), NULL);
CU_ASSERT_STREQ (idl_identifier(er), "bar");
CU_ASSERT_EQ (idl_parent(er), e);
er = idl_next(er);
CU_ASSERT_FATAL (idl_is_enumerator(er));
CU_ASSERT_NEQ_FATAL (idl_identifier(er), NULL);
CU_ASSERT_STREQ (idl_identifier(er), "baz");
CU_ASSERT_EQ (idl_parent(er), e);
idl_delete_pstate(pstate);
}