Add some skeleton for unit testing. Start with template objects.

This commit is contained in:
Marcelo Roberto Jimenez 2010-10-21 00:43:33 -02:00
parent 45461f738d
commit 3ec269c872
12 changed files with 229 additions and 1 deletions

View File

@ -514,6 +514,7 @@ AC_CONFIG_FILES([
upnp/Makefile
upnp/doc/Makefile
upnp/sample/Makefile
upnp/unittest/Makefile
docs/dist/Makefile
libupnp.pc
])

View File

@ -4,7 +4,7 @@
# Copyright (C) 2005 Rémi Turboult <r3mi@users.sourceforge.net>
#
SUBDIRS = doc . sample
SUBDIRS = doc . sample unittest
AM_CPPFLAGS = \
-I$(srcdir)/inc \

33
upnp/unittest/Makefile.am Normal file
View File

@ -0,0 +1,33 @@
#
# "Makefile.am" for "libupnp/upnp/unittest"
#
# Copyright (C) 2010 Marcelo Roberto Jimenez <mroberto@users.sourceforge.net>
#
AM_CPPFLAGS = \
-I$(top_srcdir)/upnp/inc \
-I$(top_srcdir)/threadutil/inc \
-I$(top_srcdir)/ixml/inc \
-I$(top_srcdir)/upnp/src/inc
LDADD = \
$(top_builddir)/upnp/libupnp.la \
$(top_builddir)/threadutil/libthreadutil.la \
$(top_builddir)/ixml/libixml.la
#unittest
noinst_PROGRAMS = unittest
unittest_CPPFLAGS = \
$(AM_CPPFLAGS)
unittest_SOURCES = \
main.c \
templates/FirstObject.c \
templates/FirstObject.h \
templates/templates.c \
templates/templates.h \
templates/SecondObject.c \
templates/SecondObject.h \
templates/TheStruct.h

29
upnp/unittest/main.c Normal file
View File

@ -0,0 +1,29 @@
#include <stdio.h>
#include "templates/templates.h"
int (*tests[])(void) = {
templates,
};
int main(void)
{
int ret = 0;
int i;
int n = (sizeof tests) / (sizeof tests[0]);
int result;
for (i = 0; i < n; ++i) {
result = tests[i]();
printf("Test number %3d: %s.\n", i + 1, !result ? "PASS" : "FAIL");
ret += result;
}
printf("\n"
"Failed in %d tests.\n"
"Passed in %d tests.\n",
ret, n - ret);
return ret;
}

View File

@ -0,0 +1,6 @@
#include "config.h"
#define TEMPLATE_GENERATE_SOURCE
#include "FirstObject.h"

View File

@ -0,0 +1,44 @@
#ifndef FIRSTOBJECT_H
#define FIRSTOBJECT_H
/*!
* \file
*
* \brief Object used in unit testing of object templates.
*/
/******************************************************************************/
#ifdef TEMPLATE_GENERATE_SOURCE
#undef TEMPLATE_GENERATE_SOURCE
#include "SecondObject.h"
#define TEMPLATE_GENERATE_SOURCE
#else /* TEMPLATE_GENERATE_SOURCE */
#include "SecondObject.h"
#endif /* TEMPLATE_GENERATE_SOURCE */
/******************************************************************************/
#include "TheStruct.h"
#define CLASS UnitFirstObject
#define EXPAND_CLASS_MEMBERS(CLASS) \
EXPAND_CLASS_MEMBER_INT(CLASS, TheInteger, int) \
EXPAND_CLASS_MEMBER_INT(CLASS, TheUnsignedLong, unsigned long) \
EXPAND_CLASS_MEMBER_INT(CLASS, TheCharPointer, char *) \
EXPAND_CLASS_MEMBER_BUFFER(CLASS, TheBuffer, struct TheStruct) \
EXPAND_CLASS_MEMBER_LIST(CLASS, TheList) \
EXPAND_CLASS_MEMBER_OBJECT(CLASS, TheSecondObject, UnitSecondObject) \
EXPAND_CLASS_MEMBER_STRING(CLASS, TheString) \
EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, TheDomString)
#include "TemplateInclude.h"
#endif /* FIRSTOBJECT_H */

View File

@ -0,0 +1,6 @@
#include "config.h"
#define TEMPLATE_GENERATE_SOURCE
#include "SecondObject.h"

View File

@ -0,0 +1,44 @@
#ifndef SECONDOBJECT_H
#define SECONDOBJECT_H
/*!
* \file
*
* \brief Object used in unit testing of object templates.
*/
/******************************************************************************/
#ifdef TEMPLATE_GENERATE_SOURCE
#undef TEMPLATE_GENERATE_SOURCE
/*#include "ThirdObject.h"*/
#define TEMPLATE_GENERATE_SOURCE
#else /* TEMPLATE_GENERATE_SOURCE */
/*#include "ThirdObject.h"*/
#endif /* TEMPLATE_GENERATE_SOURCE */
/******************************************************************************/
#include "TheStruct.h"
#define CLASS UnitSecondObject
#define EXPAND_CLASS_MEMBERS(CLASS) \
EXPAND_CLASS_MEMBER_INT(CLASS, TheInteger, int) \
EXPAND_CLASS_MEMBER_INT(CLASS, TheUnsignedLong, unsigned long) \
EXPAND_CLASS_MEMBER_INT(CLASS, TheCharPointer, char *) \
EXPAND_CLASS_MEMBER_BUFFER(CLASS, TheBuffer, struct TheStruct) \
EXPAND_CLASS_MEMBER_LIST(CLASS, TheList) \
/* EXPAND_CLASS_MEMBER_OBJECT(CLASS, TheThirdObject, ThirdObject) */ \
EXPAND_CLASS_MEMBER_STRING(CLASS, TheString) \
EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, TheDomString)
#include "TemplateInclude.h"
#endif /* SECONDOBJECT_H */

View File

@ -0,0 +1,11 @@
#ifndef THESTRUCT_H
#define THESTRUCT_H
struct TheStruct {
int a;
long b;
};
#endif /* THESTRUCT_H */

View File

@ -0,0 +1,33 @@
#! /bin/bash
#
# The purpose of this file is to make it easier to find problems in
# Template Objects compilation.
#
# Because Template Objects are a result of preprocessing, the are normally
# invisible to the human eye. So, we paint him! Using the C pre-processor.
#
# The issue is that compilation error messages give all errors at the same
# lines. Using a combination of the pre-processor and indent, we are able
# to produce a good readable code, so that we can debug the templates.
#
if [[ "$1" == "" ]]; then
echo "Error: no file name given, please enter the C file name."
exit -1
fi
FILENAME=$(basename $1 .c)
top_srcdir=../../..
INCLUDES=
INCLUDES="${INCLUDES} -I${top_srcdir}"
INCLUDES="${INCLUDES} -I${top_srcdir}/ixml/inc"
INCLUDES="${INCLUDES} -I${top_srcdir}/threadutil/inc" \
INCLUDES="${INCLUDES} -I${top_srcdir}/upnp/inc" \
INCLUDES="${INCLUDES} -I${top_srcdir}/upnp/src/inc"
gcc ${INCLUDES} -E ${FILENAME}.c | grep -v ^# | indent -linux > ${FILENAME}_pp.c
gcc ${INCLUDES} -Wall -c ${FILENAME}_pp.c

View File

@ -0,0 +1,13 @@
#include "templates.h"
#include "FirstObject.h"
#include "SecondObject.h"
int templates(void)
{
int ret = 0;
return ret;
}

View File

@ -0,0 +1,8 @@
#ifndef TEMPLATES_H
#define TEMPLATES_H
int templates(void);
#endif /* TEMPLATES_H */