/*
* Copyright (c) 2012-2013 Vojtech Horky
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** @file
* Data types internally used by PCUT.
*/
#ifndef PCUT_DATADEF_H_GUARD
#define PCUT_DATADEF_H_GUARD
#include <pcut/prevs.h>
#include <stdlib.h>
#include <stddef.h>
/** @cond devel */
#if defined(__GNUC__) || defined(__clang__)
#define PCUT_CC_UNUSED_VARIABLE(name, initializer) \
name __attribute__((unused)) = initializer
#else
#define PCUT_CC_UNUSED_VARIABLE(name, initializer) \
name = initializer
#endif
enum {
PCUT_KIND_SKIP,
PCUT_KIND_NESTED,
PCUT_KIND_SETUP,
PCUT_KIND_TEARDOWN,
PCUT_KIND_TESTSUITE,
PCUT_KIND_TEST
};
enum {
PCUT_EXTRA_TIMEOUT,
PCUT_EXTRA_SKIP,
PCUT_EXTRA_LAST
};
enum {
PCUT_MAIN_EXTRA_PREINIT_HOOK,
PCUT_MAIN_EXTRA_INIT_HOOK,
PCUT_MAIN_EXTRA_REPORT_XML,
PCUT_MAIN_EXTRA_LAST
};
/** Generic wrapper for test cases, test suites etc. */
typedef struct pcut_item pcut_item_t;
/** Extra information about a test. */
typedef struct pcut_extra pcut_extra_t;
/** Extra information for the main() function. */
typedef struct pcut_main_extra pcut_main_extra_t;
/** Test method type. */
typedef void (*pcut_test_func_t)(void);
/** Set-up or tear-down method type. */
typedef void (*pcut_setup_func_t)(void);
/** @copydoc pcut_extra_t */
struct pcut_extra {
/** Discriminator for the union.
*
* Use PCUT_EXTRA_* to determine which field of the union is used.
*/
int type;
/** Test-specific time-out in seconds. */
int timeout;
};
/** @copydoc pcut_main_extra_t */
struct pcut_main_extra {
/** Discriminator for the union.
*
* Use PCUT_MAIN_EXTRA_* to determine which field of the union is used.
*/
int type;
/** Callback once PCUT initializes itself. */
void (*init_hook)(void);
/** Callback even before command-line arguments are processed. */
void (*preinit_hook)(int *, char ***);
};
/** @copydoc pcut_item_t */
struct pcut_item {
/** Link to previous item. */
pcut_item_t *previous;
/** Link to next item. */
pcut_item_t *next;
/** Unique id of this item. */
int id;
/** Discriminator for this item. */
int kind;
/** Name of this item. */
const char *name;
/** Test-case function. */
pcut_test_func_t test_func;
/** Set-up function of a suite. */
pcut_setup_func_t setup_func;
/** Tear-down function of a suite. */
pcut_setup_func_t teardown_func;
/** Extra attributes. */
pcut_extra_t *extras;
/** Extra attributes for main() function. */
pcut_main_extra_t *main_extras;
/** Nested lists. */
pcut_item_t *nested;
};
/** @endcond */
#endif