You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							3867 lines
						
					
					
						
							145 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							3867 lines
						
					
					
						
							145 KiB
						
					
					
				
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * File:        xtests/xtests.h (formerly part of Synesis' internal test codebase)
							 | 
						|
								 *
							 | 
						|
								 * Purpose:     Main header file for xTests, a simple unit/component-testing
							 | 
						|
								 *              library.
							 | 
						|
								 *
							 | 
						|
								 * Created:     20th June 1999
							 | 
						|
								 * Updated:     6th July 2012
							 | 
						|
								 *
							 | 
						|
								 * Home:        http://stlsoft.org/
							 | 
						|
								 *
							 | 
						|
								 * Copyright (c) 1999-2012, Matthew Wilson and Synesis Software
							 | 
						|
								 * 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.
							 | 
						|
								 * - Neither the name(s) of Matthew Wilson and Synesis Software nor the
							 | 
						|
								 *   names of any contributors may be used to endorse or promote products
							 | 
						|
								 *   derived from this software without specific prior written permission.
							 | 
						|
								 *
							 | 
						|
								 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR
							 | 
						|
								 * CONTRIBUTORS 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 xtests/xtests.h
							 | 
						|
								 *
							 | 
						|
								 * [C, C++] Simple unit/component-testing library.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_INCL_XTESTS_H_XTESTS
							 | 
						|
								#define XTESTS_INCL_XTESTS_H_XTESTS
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								# define XTESTS_VER_XTESTS_H_XTESTS_MAJOR       3
							 | 
						|
								# define XTESTS_VER_XTESTS_H_XTESTS_MINOR       31
							 | 
						|
								# define XTESTS_VER_XTESTS_H_XTESTS_REVISION    5
							 | 
						|
								# define XTESTS_VER_XTESTS_H_XTESTS_EDIT        308
							 | 
						|
								#endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Version information
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * \def _XTESTS_VER_MAJOR
							 | 
						|
								 * The Major version number of the xTests library
							 | 
						|
								 *
							 | 
						|
								 * \def _XTESTS_VER_MINOR
							 | 
						|
								 * Minor version number of the xTests library
							 | 
						|
								 *
							 | 
						|
								 * \def _XTESTS_VER_REVISION
							 | 
						|
								 * The revision number of the xTests library
							 | 
						|
								 *
							 | 
						|
								 * \def _XTESTS_VER
							 | 
						|
								 * The composite version of the xTests library
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#define _XTESTS_VER_MAJOR       0
							 | 
						|
								#define _XTESTS_VER_MINOR       16
							 | 
						|
								#define _XTESTS_VER_REVISION    6
							 | 
						|
								
							 | 
						|
								#define _XTESTS_VER             0x001006ff
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Includes - 1
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
							 | 
						|
								# include <stlsoft/stlsoft.h>
							 | 
						|
								#endif /* !STLSOFT_INCL_STLSOFT_H_STLSOFT */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Compatibility
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#if _STLSOFT_VER < 0x010973ff
							 | 
						|
								# error xTests requires version 1.9.115 (or later) of STLSoft; download from www.stlsoft.org
							 | 
						|
								#endif /* _STLSOFT_VER */
							 | 
						|
								
							 | 
						|
								#if defined(STLSOFT_COMPILER_IS_WATCOM)
							 | 
						|
								# define _XTESTS_NO_CPP_API
							 | 
						|
								#endif /* compiler */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Includes - 2
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifdef __cplusplus
							 | 
						|
								# include <platformstl/platformstl.h>
							 | 
						|
								# if defined(PLATFORMSTL_OS_IS_UNIX)
							 | 
						|
								 /* We include threading.h to prevent the definition of _REENTRANT standard
							 | 
						|
								  * headers on some UNIX operating systems from confusing the feature
							 | 
						|
								  * discrimination in UNIXSTL and having it think that we're multithreading
							 | 
						|
								  * when we're not.
							 | 
						|
								  */
							 | 
						|
								#  include <unixstl/synch/util/features.h>
							 | 
						|
								# elif defined(PLATFORMSTL_OS_IS_WINDOWS)
							 | 
						|
								# endif /* PLATFORMSTL_OS_IS_???? */
							 | 
						|
								# if !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								#  ifndef STLSOFT_INCL_STLSOFT_META_HPP_IS_INTEGRAL_TYPE
							 | 
						|
								#   include <stlsoft/meta/is_integral_type.hpp>
							 | 
						|
								#  endif /* !STLSOFT_INCL_STLSOFT_META_HPP_IS_INTEGRAL_TYPE */
							 | 
						|
								#  ifndef STLSOFT_INCL_STLSOFT_META_HPP_IS_SAME_TYPE
							 | 
						|
								#   include <stlsoft/meta/is_same_type.hpp>
							 | 
						|
								#  endif /* !STLSOFT_INCL_STLSOFT_META_HPP_IS_SAME_TYPE */
							 | 
						|
								#  ifndef STLSOFT_INCL_STLSOFT_META_HPP_SELECT_FIRST_TYPE_IF
							 | 
						|
								#   include <stlsoft/meta/select_first_type_if.hpp>
							 | 
						|
								#  endif /* !STLSOFT_INCL_STLSOFT_META_HPP_SELECT_FIRST_TYPE_IF */
							 | 
						|
								#  ifdef STLSOFT_MINIMUM_SAS_INCLUDES
							 | 
						|
								#   ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_STRING_STD_H_C_STRING
							 | 
						|
								#    include <stlsoft/shims/access/string/std/c_string.h>
							 | 
						|
								#   endif /* !STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_STRING_STD_H_C_STRING */
							 | 
						|
								#  else /* ? STLSOFT_MINIMUM_SAS_INCLUDES */
							 | 
						|
								#   ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING
							 | 
						|
								#    include <stlsoft/shims/access/string.hpp>
							 | 
						|
								#   endif /* !STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING */
							 | 
						|
								#  endif /* STLSOFT_MINIMUM_SAS_INCLUDES */
							 | 
						|
								# endif /* !_XTESTS_NO_CPP_API */
							 | 
						|
								# if defined(STLSOFT_CF_EXCEPTION_SUPPORT)
							 | 
						|
								#  include <new>
							 | 
						|
								#  include <stdexcept>
							 | 
						|
								# endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								# if defined(STLSOFT_CF_RTTI_SUPPORT)
							 | 
						|
								#  include <typeinfo>
							 | 
						|
								# endif /* STLSOFT_CF_RTTI_SUPPORT */
							 | 
						|
								
							 | 
						|
								# include <algorithm>
							 | 
						|
								#endif /* __cplusplus */
							 | 
						|
								
							 | 
						|
								#include <stdio.h>
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Namespace
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#if defined(_STLSOFT_NO_NAMESPACE)
							 | 
						|
								# define _XTESTS_NO_NAMESPACE
							 | 
						|
								#endif /* _STLSOFT_NO_NAMESPACE */
							 | 
						|
								
							 | 
						|
								#ifndef _XTESTS_NO_NAMESPACE
							 | 
						|
								namespace xtests
							 | 
						|
								{
							 | 
						|
								namespace c
							 | 
						|
								{
							 | 
						|
								#endif /* !_XTESTS_NO_NAMESPACE */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Features
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								
							 | 
						|
								# ifndef XTESTS_CALL
							 | 
						|
								#  ifdef __cplusplus
							 | 
						|
								#   define XTESTS_CALL(x)                   extern "C" x
							 | 
						|
								#  else /* ? __cplusplus */
							 | 
						|
								#   define XTESTS_CALL(x)                   extern x
							 | 
						|
								#  endif /* __cplusplus */
							 | 
						|
								# endif /* !XTESTS_CALL */
							 | 
						|
								
							 | 
						|
								# ifdef STLSOFT_CF_FUNCTION_SYMBOL_SUPPORT
							 | 
						|
								#  define XTESTS_GET_FUNCTION_()            __FUNCTION__
							 | 
						|
								# else /* ? STLSOFT_CF_FUNCTION_SYMBOL_SUPPORT */
							 | 
						|
								#  define XTESTS_GET_FUNCTION_()            stlsoft_static_cast(char const*, 0)
							 | 
						|
								# endif /* STLSOFT_CF_FUNCTION_SYMBOL_SUPPORT */
							 | 
						|
								
							 | 
						|
								# ifndef _XTESTS_NO_NAMESPACE
							 | 
						|
								#  define XTESTS_NS_QUAL(ns, sym)           ns::sym
							 | 
						|
								# else /* ? _XTESTS_NO_NAMESPACE */
							 | 
						|
								#  define XTESTS_NS_QUAL(ns, sym)           sym
							 | 
						|
								# endif /* _XTESTS_NO_NAMESPACE */
							 | 
						|
								
							 | 
						|
								# define XTESTS_NS_C_QUAL(sym)              XTESTS_NS_QUAL(xtests::c, sym)
							 | 
						|
								# define XTESTS_NS_CPP_QUAL(sym)            XTESTS_NS_QUAL(xtests::c::cpp, sym)
							 | 
						|
								
							 | 
						|
								# if defined(STLSOFT_CF_RTTI_SUPPORT) && \
							 | 
						|
								     (  !defined(STLSOFT_COMPILER_IS_MSVC) || \
							 | 
						|
								        _MSC_VER >= 1310)
							 | 
						|
								#  define XTESTS_REPORT_EXCEPTION_(x)       XTESTS_NS_C_QUAL(xtests_caseExcepted)(typeid(x).name(), x.what())
							 | 
						|
								# else /* ? STLSOFT_CF_RTTI_SUPPORT */
							 | 
						|
								#  define XTESTS_REPORT_EXCEPTION_(x)       XTESTS_NS_C_QUAL(xtests_caseExcepted)("<exception-type unknown: rtti not available>", x.what())
							 | 
						|
								# endif /* STLSOFT_CF_RTTI_SUPPORT */
							 | 
						|
								
							 | 
						|
								# if defined(STLSOFT_CF_EXCEPTION_SUPPORT)
							 | 
						|
								
							 | 
						|
								#  if defined(STLSOFT_COMPILER_IS_GCC)
							 | 
						|
								    /* GCC 4.2 on Mac has a strange defect whereby the thrown exception
							 | 
						|
								     * doesn't get caught. When placed in a try-catch-throw, it works.
							 | 
						|
								     * Smells like a code generation defect - particularly likely when
							 | 
						|
								     * only some of the FF build configuration variants experience it -
							 | 
						|
								     * and this workaround seems effective.
							 | 
						|
								     */
							 | 
						|
								#   define XTESTS_INVOKE_TEST_CASE_FN_INNER_(fn)    do { try { (*fn)(); } catch(...) { throw; } } while(0)
							 | 
						|
								#  else /* ? compiler */
							 | 
						|
								#   define XTESTS_INVOKE_TEST_CASE_FN_INNER_(fn)    (*fn)()
							 | 
						|
								#  endif /* compiler */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#  define XTESTS_INVOKE_TEST_CASE_FN_(fn, name)                                         \
							 | 
						|
								                                                                                        \
							 | 
						|
								    do                                                                                  \
							 | 
						|
								    {                                                                                   \
							 | 
						|
								        try                                                                             \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_INVOKE_TEST_CASE_FN_INNER_(fn);                                      \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(std::bad_alloc& x)                                                        \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_REPORT_EXCEPTION_(x);                                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								            throw;                                                                      \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(XTESTS_NS_CPP_QUAL(requirement_failed_exception)& /* x */)                \
							 | 
						|
								        {                                                                               \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(std::exception& x)                                                        \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_REPORT_EXCEPTION_(x);                                                \
							 | 
						|
								        }                                                                               \
							 | 
						|
								    } while(0)
							 | 
						|
								
							 | 
						|
								#  define XTESTS_INVOKE_TEST_CASE_FN_THROWS_(fn, name, type)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    do                                                                                  \
							 | 
						|
								    {                                                                                   \
							 | 
						|
								        try                                                                             \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_INVOKE_TEST_CASE_FN_INNER_(fn);                                      \
							 | 
						|
								                                                                                        \
							 | 
						|
								            XTESTS_NS_C_QUAL(xtests_caseExceptionExpected)(#type);                      \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(XTESTS_NS_CPP_QUAL(requirement_failed_exception)& /* x */)                \
							 | 
						|
								        {                                                                               \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(type& /* x */)                                                            \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_TEST_PASSED();                                                       \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(std::bad_alloc& x)                                                        \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_REPORT_EXCEPTION_(x);                                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								            throw;                                                                      \
							 | 
						|
								        }                                                                               \
							 | 
						|
								        catch(std::exception& x)                                                        \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_REPORT_EXCEPTION_(x);                                                \
							 | 
						|
								        }                                                                               \
							 | 
						|
								    } while(0)
							 | 
						|
								
							 | 
						|
								# else /* ? STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								
							 | 
						|
								#  define XTESTS_INVOKE_TEST_CASE_FN_(fn, name)  (*fn)()
							 | 
						|
								
							 | 
						|
								# endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								# if defined(STLSOFT_COMPILER_IS_DMC)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_data_a_(x)        stlsoft_ns_qual(c_str_data_a)(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_data_w_(x)        stlsoft_ns_qual(c_str_data_w)(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_len_a_(x)         stlsoft_ns_qual(c_str_len_a)(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_len_w_(x)         stlsoft_ns_qual(c_str_len_w)(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_ptr_a_(x)         stlsoft_ns_qual(c_str_ptr_a)(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_ptr_w_(x)         stlsoft_ns_qual(c_str_ptr_w)(x)
							 | 
						|
								# elif defined(STLSOFT_COMPILER_IS_GCC)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_data_a_(x)        c_str_data_a(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_data_w_(x)        c_str_data_w(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_len_a_(x)         c_str_len_a(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_len_w_(x)         c_str_len_w(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_ptr_a_(x)         c_str_ptr_a(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_ptr_w_(x)         c_str_ptr_w(x)
							 | 
						|
								# else /* ? compiler */
							 | 
						|
								#  define XTESTS_INVOKE_c_str_data_a_(x)        c_str_data_a(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_data_w_(x)        c_str_data_w(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_len_a_(x)         c_str_len_a(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_len_w_(x)         c_str_len_w(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_ptr_a_(x)         c_str_ptr_a(x)
							 | 
						|
								#  define XTESTS_INVOKE_c_str_ptr_w_(x)         c_str_ptr_w(x)
							 | 
						|
								# endif /* compiler */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								# if defined(STLSOFT_COMPILER_IS_MSVC) && \
							 | 
						|
								    (   _MSC_VER >= 1500 || \
							 | 
						|
								        (   _MSC_VER >= 1400 && \
							 | 
						|
								            defined(_MSC_FULL_VER) && \
							 | 
						|
								            _MSC_FULL_VER >= 140050320))
							 | 
						|
								#  define XTESTS_DECLARE_DEPRECATION(symtype, oldfn, newfn)  __declspec(deprecated("The " symtype " " STLSOFT_STRINGIZE(oldfn) " is deprecated and will be removed from a future version of xTests; use " STLSOFT_STRINGIZE(newfn) " instead"))
							 | 
						|
								#  define XTESTS_CALL_DEPRECATED(rt, oldfn, newfn)           XTESTS_DECLARE_DEPRECATION("function", oldfn, newfn) XTESTS_CALL(rt)
							 | 
						|
								# else /* ? compiler */
							 | 
						|
								#  define XTESTS_DECLARE_DEPRECATION(symtype, oldfn, newfn)
							 | 
						|
								#  define XTESTS_CALL_DEPRECATED(rt, oldfn, newfn)           XTESTS_CALL(rt)
							 | 
						|
								# endif /* compiler */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								 /* function pointer casts */
							 | 
						|
								# define XTESTS_VOID_FUNCTION_CAST_(f)          stlsoft_c_cast(  void(*)(void),    f  )
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Constants & definitions
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** Flags to be passed to xtests_startRunner
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_FLAGS()
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM()
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_REPORTER_AND_FLAGS()
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS()
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_SETUP_FNS()
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS_AND_SETUP_FNS()
							 | 
						|
								 */
							 | 
						|
								enum xtests_runner_flags_t
							 | 
						|
								{
							 | 
						|
								        xtestsRunnerFlagsNoWindowsDebugString   =   0x0001
							 | 
						|
								    ,   xtestsReportOnlyNonEmptyCases           =   0x0002
							 | 
						|
								};
							 | 
						|
								#ifndef __cplusplus
							 | 
						|
								typedef enum xtests_runner_flags_t xtests_runner_flags_t;
							 | 
						|
								#endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_FP_APPROXIMATE_FACTOR
							 | 
						|
								 * The factor within which floating point numbers are deemed to be
							 | 
						|
								 * approximately equal.
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_FP_APPROXIMATE_FACTOR                    (1.000001)
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Macros
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \defgroup group__xtests__test_runner_functions Test Runner Functions
							 | 
						|
								 *
							 | 
						|
								 * Functions that are used to define, start, report on, and complete test
							 | 
						|
								 * runners.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \defgroup group__xtests__test_case_functions Test Case Functions
							 | 
						|
								 *
							 | 
						|
								 * Functions that are used to define, start, and complete test cases.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \defgroup group__xtests__test_functions Test Functions
							 | 
						|
								 *
							 | 
						|
								 * Functions that are used to exercise tests.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \defgroup group__xtests__utiliy_functions Utility Functions
							 | 
						|
								 *
							 | 
						|
								 * Utility functions that supplement use of the library.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER(name, verbosity)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner that will report to stdout
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER(name, verbosity)                                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), NULL, NULL, NULL, 0, NULL, NULL, NULL))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_SETUP_FNS(name, verbosity, setup, teardown, setupParam)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner that will report to stdout
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param setup The function to be called before each test
							 | 
						|
								 * \param teardown The function to be called after each test
							 | 
						|
								 * \param setupParam A caller-supplied parameter that is passed with
							 | 
						|
								 *   each invocation of the setup and teardown functions
							 | 
						|
								 *
							 | 
						|
								 * \see xTests_Setup_t
							 | 
						|
								 * \see xTests_Teardown_t
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_SETUP_FNS(name, verbosity, setup, teardown, setupParam)    \
							 | 
						|
								                                                                                            \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), NULL, NULL, NULL, 0, (setup), (teardown), (setupParam)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_STREAM(name, verbosity, stm)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param stm The stream to which output will be written
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_STREAM(name, verbosity, stm)                           \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), NULL, NULL, stm, 0, NULL, NULL, NULL))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_REPORTER(name, verbosity, reporter, reporterParam)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner with the given callback reporter
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param reporter The reporter instance
							 | 
						|
								 * \param reporterParam A caller-supplied parameter that is passed with
							 | 
						|
								 *   every callback
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_REPORTER(name, verbosity, reporter, reporterParam)     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), (reporter), (reporterParam), NULL, 0, NULL, NULL, NULL))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM(name, verbosity, reporter, reporterParam, stm)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner with the given callback reporter
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param reporter The reporter instance
							 | 
						|
								 * \param reporterParam A caller-supplied parameter that is passed with
							 | 
						|
								 *   every callback
							 | 
						|
								 * \param stm The stream to which output will be written
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM(name, verbosity, reporter, reporterParam, stm) \
							 | 
						|
								                                                                                                    \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), (reporter), (reporterParam), stm, 0, NULL, NULL, NULL))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS(name, verbosity, reporter, reporterParam, stm, flags)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner with the given callback reporter
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param reporter The reporter instance
							 | 
						|
								 * \param reporterParam A caller-supplied parameter that is passed with
							 | 
						|
								 *   every callback
							 | 
						|
								 * \param stm The stream to which output will be written
							 | 
						|
								 * \param flags The \link xtests::c::xtests_runner_flags_t flags\endlink
							 | 
						|
								 *   that moderate the runner behaviour
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS(name, verbosity, reporter, reporterParam, stm, flags) \
							 | 
						|
								                                                                                                    \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), (reporter), (reporterParam), (stm), (flags), NULL, NULL, NULL))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS_AND_SETUP_FNS(name, verbosity, reporter, reporterParam, stm, flags, setup, teardown, setupParam)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner with the given callback reporter
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param reporter The reporter instance
							 | 
						|
								 * \param reporterParam A caller-supplied parameter that is passed with
							 | 
						|
								 *   every invocation of the reporter
							 | 
						|
								 * \param stm The stream to which output will be written
							 | 
						|
								 * \param flags The \link xtests::c::xtests_runner_flags_t flags\endlink
							 | 
						|
								 *   that moderate the runner behaviour
							 | 
						|
								 * \param setup The function to be called before each test
							 | 
						|
								 * \param teardown The function to be called after each test
							 | 
						|
								 * \param setupParam A caller-supplied parameter that is passed with
							 | 
						|
								 *   each invocation of the setup and teardown functions
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS_AND_SETUP_FNS(name, verbosity, reporter, reporterParam, stm, flags, setup, teardown, setupParam) \
							 | 
						|
								                                                                                                                                                                \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), (reporter), (reporterParam), (stm), (flags), (setup), (teardown), (setupParam)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_START_RUNNER_WITH_FLAGS(name, verbosity, flags)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Starts a test runner that will report to stdout
							 | 
						|
								 *
							 | 
						|
								 * A test runner is a logically-related group of test cases.
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test-runner
							 | 
						|
								 * \param verbosity The verbosity (see xtests_verbosity_t) at which the
							 | 
						|
								 *   runner will be executed
							 | 
						|
								 * \param flags The \link xtests::c::xtests_runner_flags_t flags\endlink
							 | 
						|
								 *   that moderate the runner behaviour
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_START_RUNNER_WITH_FLAGS(name, verbosity, flags)                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_startRunner)((name), (verbosity), NULL, NULL, NULL, (flags), NULL, NULL, NULL))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_PRINT_RESULTS()
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Prints the test results of the currently executing test.
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_START_RUNNER() or XTESTS_START_RUNNER_WITH_REPORTER(), and
							 | 
						|
								 *   before invocation of XTESTS_END_RUNNER() or
							 | 
						|
								 *   XTESTS_END_RUNNER_UPDATE_EXITCODE().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_PRINT_RESULTS()                                                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_printRunnerResults)()
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_END_RUNNER()
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Ends a test runner
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_END_RUNNER()                                                             \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_endRunner)(NULL)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_ABEND(terminationMessage)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Abnormal end of tests, and process termination
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_ABEND(terminationMessage)                                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_abend)(terminationMessage)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_END_RUNNER_UPDATE_EXITCODE()
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Ends a test runner, and modifies a caller-supplied exit code parameter
							 | 
						|
								 *
							 | 
						|
								 * \param retCode A pointer to a variable of type <code>int</code> that will
							 | 
						|
								 *   receive an exit code.
							 | 
						|
								 *
							 | 
						|
								 * \remarks The variable should have been initialised to
							 | 
						|
								 *   <code>EXIT_SUCCESS</code>, and each invocation of
							 | 
						|
								 *   XTESTS_END_RUNNER_UPDATE_EXITCODE() (for each separate test-runner
							 | 
						|
								 *   in a given application) will only set it to <code>EXIT_FAILURE</code>
							 | 
						|
								 *   in the case where that runner has failed one or more tests.
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_END_RUNNER_UPDATE_EXITCODE(retCode)                                      \
							 | 
						|
								                                                                                        \
							 | 
						|
								    stlsoft_static_cast(void, XTESTS_NS_C_QUAL(xtests_endRunner)(retCode))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_CASE_BEGIN(name, desc)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Begins a test case, of the given name and description
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test case
							 | 
						|
								 * \param desc The description of the test case. May be <code>NULL</code>
							 | 
						|
								 *   or the empty string (<code>""</code>).
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_CASE_BEGIN(name, desc)                                                   \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (0 == XTESTS_NS_C_QUAL(xtests_beginTestCase)((name), (desc)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_CASE_END(name, desc)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Ends the current test case
							 | 
						|
								 *
							 | 
						|
								 * \param name The name of the test case
							 | 
						|
								 *
							 | 
						|
								 * \note The <code>name</code> parameter is ignored in the current
							 | 
						|
								 *   implementation, which can only run one test case at a time.
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_CASE_END(name)                                                           \
							 | 
						|
								                                                                                        \
							 | 
						|
								    stlsoft_static_cast(void, XTESTS_NS_C_QUAL(xtests_endTestCase)((name)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_RUN_CASE_WITH_NAME_AND_DESC(name, desc, fn)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Runs the given test case function, specifying a name and description
							 | 
						|
								 *
							 | 
						|
								 * \param name Name of the test case
							 | 
						|
								 * \param desc Description of the test case
							 | 
						|
								 * \param fn A function, taking no parameters and returning
							 | 
						|
								 *   <code>void</code>, that executes a number of tests representing a test
							 | 
						|
								 *   case.
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_RUN_CASE_WITH_NAME_AND_DESC(name, desc, fn)                              \
							 | 
						|
								                                                                                        \
							 | 
						|
								    do                                                                                  \
							 | 
						|
								    {                                                                                   \
							 | 
						|
								        if(XTESTS_CASE_BEGIN(name, desc))                                               \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_INVOKE_TEST_CASE_FN_(fn, name);                                      \
							 | 
						|
								                                                                                        \
							 | 
						|
								            XTESTS_CASE_END(name);                                                      \
							 | 
						|
								        }                                                                               \
							 | 
						|
								                                                                                        \
							 | 
						|
								    } while(0)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_RUN_CASE_WITH_DESC(fn, desc)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Runs the given test case function, specifying a description
							 | 
						|
								 *
							 | 
						|
								 * \param fn A function, taking no parameters and returning
							 | 
						|
								 *   <code>void</code>, that executes a number of tests representing a test
							 | 
						|
								 *   case.
							 | 
						|
								 * \param desc Description of the test case
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_RUN_CASE_WITH_DESC(fn, desc)                                             \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_RUN_CASE_WITH_NAME_AND_DESC(#fn, desc, fn)
							 | 
						|
								                                                                                        \
							 | 
						|
								/** \def XTESTS_RUN_CASE(fn)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Runs the given test case function
							 | 
						|
								 *
							 | 
						|
								 * \param fn A function, taking no parameters and returning
							 | 
						|
								 *   <code>void</code>, that executes a number of tests representing a test
							 | 
						|
								 *   case.
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_RUN_CASE(fn)                                                             \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_RUN_CASE_WITH_DESC(fn, "")
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#ifdef STLSOFT_CF_EXCEPTION_SUPPORT
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_RUN_CASE_THAT_THROWS_WITH_NAME_AND_DESC(name, desc, fn, type)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Runs the given test case function, specifying a name and description, and
							 | 
						|
								 * the type of an exception that is expected
							 | 
						|
								 *
							 | 
						|
								 * \param name Name of the test case
							 | 
						|
								 * \param desc Description of the test case
							 | 
						|
								 * \param fn A function, taking no parameters and returning
							 | 
						|
								 *   <code>void</code>, that executes a number of tests representing a test
							 | 
						|
								 *   case.
							 | 
						|
								 * \param type The type of the exception that is expected to be thrown
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_RUN_CASE_THAT_THROWS_WITH_NAME_AND_DESC(name, desc, fn, type)           \
							 | 
						|
								                                                                                        \
							 | 
						|
								    do                                                                                  \
							 | 
						|
								    {                                                                                   \
							 | 
						|
								        if(XTESTS_CASE_BEGIN(name, desc))                                               \
							 | 
						|
								        {                                                                               \
							 | 
						|
								            XTESTS_INVOKE_TEST_CASE_FN_THROWS_(fn, name, type);                         \
							 | 
						|
								                                                                                        \
							 | 
						|
								            XTESTS_CASE_END(name);                                                      \
							 | 
						|
								        }                                                                               \
							 | 
						|
								                                                                                        \
							 | 
						|
								    } while(0)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_RUN_CASE_THAT_THROWS_WITH_DESC(fn, desc, type)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Runs the given test case function, specifying a description, and
							 | 
						|
								 * the type of an exception that is expected
							 | 
						|
								 *
							 | 
						|
								 * \param fn A function, taking no parameters and returning
							 | 
						|
								 *   <code>void</code>, that executes a number of tests representing a test
							 | 
						|
								 *   case.
							 | 
						|
								 * \param desc Description of the test case
							 | 
						|
								 * \param type The type of the exception that is expected to be thrown
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_RUN_CASE_THAT_THROWS_WITH_DESC(fn, desc, type)                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_RUN_CASE_THAT_THROWS_WITH_NAME_AND_DESC(#fn, desc, fn, type)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_RUN_CASE_THAT_THROWS(fn, type)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_case_functions
							 | 
						|
								 *
							 | 
						|
								 * Runs the given test case function, specifying the type of an exception
							 | 
						|
								 * that is expected
							 | 
						|
								 *
							 | 
						|
								 * \param fn A function, taking no parameters and returning
							 | 
						|
								 *   <code>void</code>, that executes a number of tests representing a test
							 | 
						|
								 *   case.
							 | 
						|
								 * \param type The type of the exception that is expected to be thrown
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_RUN_CASE_THAT_THROWS(fn, type)                                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_RUN_CASE_THAT_THROWS_WITH_NAME_AND_DESC(#fn, "", fn, type)
							 | 
						|
								
							 | 
						|
								#endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FAIL_WITH_QUALIFIER(msg, qualifier)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Causes a test failure to be expressed, passing an explanatory message and
							 | 
						|
								 * a message qualifier.
							 | 
						|
								 *
							 | 
						|
								 * \param msg The message explaining the failure condition
							 | 
						|
								 * \param qualifier The message qualifier.
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_FAIL_WITH_QUALIFIER(msg, qualifier)                                 \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_writeFailMessage)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), msg, qualifier)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FAIL(msg)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Causes a test failure to be expressed, passing an explanatory message.
							 | 
						|
								 *
							 | 
						|
								 * \param msg The message explaining the failure condition
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_FAIL(msg)                                                           \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_TEST_FAIL_WITH_QUALIFIER(msg, stlsoft_static_cast(char const*, NULL))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_PASSED()
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Causes a test success to be expressed.
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_PASSED()                                                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPassed)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "")
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WITH_MESSAGE(expr, msg)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Causes a test to be exercised, passing an explanatory message to be used
							 | 
						|
								 * in the case of failure.
							 | 
						|
								 *
							 | 
						|
								 * \param expr The expression whose truth is to be evaluated
							 | 
						|
								 * \param msg The message explaining the failure condition
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WITH_MESSAGE(expr, msg)                                             \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    ((expr)                                                                             \
							 | 
						|
								        ? XTESTS_NS_C_QUAL(xtests_testPassed)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), msg)   \
							 | 
						|
								        : XTESTS_NS_C_QUAL(xtests_testFailed)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), msg)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST(expr)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Causes a test to be exercised.
							 | 
						|
								 *
							 | 
						|
								 * \param expr The expression whose truth is to be evaluated
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST(expr)                                                               \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_TEST_WITH_MESSAGE(expr, #expr)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test enumerations
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_ENUM_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two enumerator values are exactly equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected enumerator value
							 | 
						|
								 * \param actual The actual enumerator value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The enumerators should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_ENUM_EQUAL(expected, actual)                    XTESTS_TEST_INTEGER_EQUAL_EXACT(stlsoft_static_cast(int, (expected)), stlsoft_static_cast(int, (actual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_ENUM_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two enumerator values are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected enumerator value
							 | 
						|
								 * \param actual The actual enumerator value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The enumerators should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_ENUM_NOT_EQUAL(expected, actual)                XTESTS_TEST_INTEGER_NOT_EQUAL(stlsoft_static_cast(int, (expected)), stlsoft_static_cast(int, (actual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test integers
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_EQUAL_EXACT(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two integer values are exactly equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The integers should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_EXACT(expected, actual)                              \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two integer values are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The integers should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_NOT_EQUAL(expected, actual)                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_GREATER(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual integer value is greater than the expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_GREATER(expected, actual)                                  \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonGreaterThan))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_LESS(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual integer value is less than the expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_LESS(expected, actual)                                     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonLessThan))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_GREATER_OR_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual integer value is greater than or equal to the
							 | 
						|
								 * expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_GREATER_OR_EQUAL(expected, actual)                         \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonGreaterThanOrEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_LESS_OR_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual integer value is less than or equal to the expected
							 | 
						|
								 * value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_LESS_OR_EQUAL(expected, actual)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonLessThanOrEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_EQUAL_ANY_IN_RANGE(begin, end, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that a given integer value matches any of the elements in a
							 | 
						|
								 * given range.
							 | 
						|
								 *
							 | 
						|
								 * \param begin Start iterator of the match range
							 | 
						|
								 * \param end End iterator of the match range
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The value type of the iterators should be the same as the
							 | 
						|
								 *   type of the tested value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_ANY_IN_RANGE(begin, end, actual)                     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer_any_in_range(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "XTESTS_TEST_INTEGER_EQUAL_ANY_IN_RANGE(" ## #begin ## ", " ## #end ## ", " ## #actual ## ")", (begin), (end), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_EQUAL_ANY_NOT_IN_RANGE(begin, end, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that a given integer value matches none of the elements in a
							 | 
						|
								 * given range.
							 | 
						|
								 *
							 | 
						|
								 * \param begin Start iterator of the match range
							 | 
						|
								 * \param end End iterator of the match range
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The value type of the iterators should be the same as the
							 | 
						|
								 *   type of the tested value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_ANY_NOT_IN_RANGE(begin, end, actual)                 \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer_any_in_range(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "XTESTS_TEST_INTEGER_EQUAL_ANY_IN_RANGE(" ## #begin ## ", " ## #end ## ", " ## #actual ## ")", (begin), (end), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual))))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#if 0
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_EQUAL_ANY_OF(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that a given integer value matches any of the given expected values.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value(s)
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_ANY_OF(expected, actual)                             \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer_one_of(                                      \
							 | 
						|
								        __FILE__                                                                        \
							 | 
						|
								    ,   __LINE__                                                                        \
							 | 
						|
								    ,   XTESTS_GET_FUNCTION_()                                                          \
							 | 
						|
								    ,   "XTESTS_TEST_INTEGER_EQUAL_ANY_OF(" ## #expected ## ", " ## #actual ## ")"      \
							 | 
						|
								    ,   (expected)                                                                      \
							 | 
						|
								    ,   (actual)                                                                        \
							 | 
						|
								    , XTESTS_NS_C_QUAL(xtestsComparisonEqual)))                                         \
							 | 
						|
								    )
							 | 
						|
								#endif /* 0 */
							 | 
						|
								
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_ANY_OF2(expected0, expected1, actual)                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer_one_of(                                      \
							 | 
						|
								        __FILE__                                                                        \
							 | 
						|
								    ,   __LINE__                                                                        \
							 | 
						|
								    ,   XTESTS_GET_FUNCTION_()                                                          \
							 | 
						|
								    ,   "XTESTS_TEST_INTEGER_EQUAL_ANY_OF(" ## #expected0 ## ", " ## #expected1 ## ", " ## #actual ## ")"      \
							 | 
						|
								    ,   (actual)                                                                        \
							 | 
						|
								    ,   (expected0)                                                                     \
							 | 
						|
								    ,   (expected1)                                                                     \
							 | 
						|
								    , XTESTS_NS_C_QUAL(xtestsComparisonEqual)))                                         \
							 | 
						|
								    )
							 | 
						|
								
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_ANY_OF3(expected0, expected1, expected2, actual)     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer_one_of(                                      \
							 | 
						|
								        __FILE__                                                                        \
							 | 
						|
								    ,   __LINE__                                                                        \
							 | 
						|
								    ,   XTESTS_GET_FUNCTION_()                                                          \
							 | 
						|
								    ,   "XTESTS_TEST_INTEGER_EQUAL_ANY_OF(" ## #expected0 ## ", " ## #expected1 ## ", " ## #expected2 ## ", " ## #actual ## ")"      \
							 | 
						|
								    ,   (actual)                                                                        \
							 | 
						|
								    ,   (expected0)                                                                     \
							 | 
						|
								    ,   (expected1)                                                                     \
							 | 
						|
								    ,   (expected2)                                                                     \
							 | 
						|
								    , XTESTS_NS_C_QUAL(xtestsComparisonEqual)))                                         \
							 | 
						|
								    )
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test Booleans
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_BOOLEAN_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two boolean values are exactly equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected boolean value
							 | 
						|
								 * \param actual The actual boolean value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_EQUAL(expected, actual)                                    \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_BOOLEAN_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two boolean values are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected boolean value
							 | 
						|
								 * \param actual The actual boolean value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_NOT_EQUAL(expected, actual)                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_BOOLEAN_TRUE(actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that an expression is true
							 | 
						|
								 *
							 | 
						|
								 * \param actual The boolean expression that is expected to be true
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_TRUE(actual)                                               \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", true, (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_BOOLEAN_FALSE(actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that an expression is false
							 | 
						|
								 *
							 | 
						|
								 * \param actual The boolean expression that is expected to be false
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_FALSE(actual)                                              \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_integer(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", false, (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test characters
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_EQUAL_EXACT(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two character values are exactly equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The characters should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_CHARACTER_EQUAL_EXACT(expected, actual)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_character(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two character values are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The characters should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_CHARACTER_NOT_EQUAL(expected, actual)                              \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_character(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_GREATER(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual character value is greater than the expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_CHARACTER_GREATER(expected, actual)                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_character(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonGreaterThan))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_LESS(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual character value is less than the expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_CHARACTER_LESS(expected, actual)                                   \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_character(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonLessThan))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_GREATER_OR_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual character value is greater than or equal to the
							 | 
						|
								 * expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_CHARACTER_GREATER_OR_EQUAL(expected, actual)                       \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_character(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonGreaterThanOrEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_LESS_OR_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual character value is less than or equal to the expected
							 | 
						|
								 * value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_CHARACTER_LESS_OR_EQUAL(expected, actual)                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_character(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonLessThanOrEqual))))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test floating-points
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FLOATINGPOINT_EQUAL_EXACT(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two floating point values are exactly equal
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected floating point value
							 | 
						|
								 * \param actual The actual floating point value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_FLOATINGPOINT_EQUAL_EXACT(expected, actual)                        \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_floating_point(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL_EXACT(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two floating point values are not exactly equal
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected floating point value
							 | 
						|
								 * \param actual The actual floating point value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL_EXACT(expected, actual)                    \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_floating_point(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FLOATINGPOINT_EQUAL_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two floating point values are approximately
							 | 
						|
								 * equal (as defined by xtests_setFloatingPointCloseFactor()).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected floating point value
							 | 
						|
								 * \param actual The actual floating point value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_FLOATINGPOINT_EQUAL_APPROX(expected, actual)                       \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_floating_point(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual))))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two floating point values are not approximately
							 | 
						|
								 * equal (as defined by xtests_setFloatingPointCloseFactor()).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected floating point value
							 | 
						|
								 * \param actual The actual floating point value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL_APPROX(expected, actual)                   \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_CPP_QUAL(xtests_test_floating_point(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual))))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* Requiring tests
							 | 
						|
								 *
							 | 
						|
								 * These cause an exception of type XXXXX to be thrown if the condition
							 | 
						|
								 * fails, thereby preventing the execution of any further tests that
							 | 
						|
								 * rely on previously established assertions, which may result in undefined
							 | 
						|
								 * behaviour (and possible program failure).
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_REQUIRE(test)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Causes the current test case to exit immediately if the given test
							 | 
						|
								 * fails, without considering any other tests
							 | 
						|
								 *
							 | 
						|
								 * \param test The test that must succeed
							 | 
						|
								 *
							 | 
						|
								 * \note This is only available in C++ compilation units
							 | 
						|
								 */
							 | 
						|
								# if defined(STLSOFT_CF_EXCEPTION_SUPPORT)
							 | 
						|
								#  define XTESTS_REQUIRE(test)                                          XTESTS_NS_CPP_QUAL(xtests_require)(!(!(test)))
							 | 
						|
								# else /* STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								#  define XTESTS_REQUIRE(test)                                          XTESTS_NS_C_QUAL(xtests_require_C)(!(!(test)))
							 | 
						|
								# endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								
							 | 
						|
								#else /* ? __cplusplus) && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								# define XTESTS_TEST_INTEGER_EQUAL_EXACT(expected, actual)              XTESTS_TEST((expected) == (actual))
							 | 
						|
								# define XTESTS_TEST_INTEGER_NOT_EQUAL(expected, actual)                XTESTS_TEST((expected) != (actual))
							 | 
						|
								# define XTESTS_TEST_INTEGER_GREATER(expected, actual)                  XTESTS_TEST((expected) < (actual))
							 | 
						|
								# define XTESTS_TEST_INTEGER_LESS(expected, actual)                     XTESTS_TEST((expected) > (actual))
							 | 
						|
								# define XTESTS_TEST_INTEGER_GREATER_OR_EQUAL(expected, actual)         XTESTS_TEST((expected) <= (actual))
							 | 
						|
								# define XTESTS_TEST_INTEGER_LESS_OR_EQUAL(expected, actual)            XTESTS_TEST((expected) >= (actual))
							 | 
						|
								
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_EQUAL(expected, actual)                    XTESTS_TEST((expected) == (actual))
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_NOT_EQUAL(expected, actual)                XTESTS_TEST((expected) != (actual))
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_TRUE(actual)                               XTESTS_TEST((actual))
							 | 
						|
								# define XTESTS_TEST_BOOLEAN_FALSE(actual)                              XTESTS_TEST(!(actual))
							 | 
						|
								
							 | 
						|
								# define XTESTS_TEST_CHARACTER_EQUAL_EXACT(expected, actual)            XTESTS_TEST((expected) == (actual))
							 | 
						|
								# define XTESTS_TEST_CHARACTER_NOT_EQUAL(expected, actual)              XTESTS_TEST((expected) != (actual))
							 | 
						|
								# define XTESTS_TEST_CHARACTER_GREATER(expected, actual)                XTESTS_TEST((expected) < (actual))
							 | 
						|
								# define XTESTS_TEST_CHARACTER_LESS(expected, actual)                   XTESTS_TEST((expected) > (actual))
							 | 
						|
								# define XTESTS_TEST_CHARACTER_GREATER_OR_EQUAL(expected, actual)       XTESTS_TEST((expected) <= (actual))
							 | 
						|
								# define XTESTS_TEST_CHARACTER_LESS_OR_EQUAL(expected, actual)          XTESTS_TEST((expected) >= (actual))
							 | 
						|
								
							 | 
						|
								# define XTESTS_TEST_FLOATINGPOINT_EQUAL_APPROX(expected, actual)       XTESTS_TEST(xtests_floatingPointClose((expected), (actual)))
							 | 
						|
								# define XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL_APPROX(expected, actual)   XTESTS_TEST(!xtests_floatingPointClose((expected), (actual)))
							 | 
						|
								
							 | 
						|
								#endif /* __cplusplus) && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_ARRAY_END_POST(ar)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__utiliy_functions
							 | 
						|
								 *
							 | 
						|
								 * Evaluates the end-point of an array, based on its static array size.
							 | 
						|
								 */
							 | 
						|
								#ifdef __DMC__
							 | 
						|
								# define XTESTS_ARRAY_END_POST(ar)                                      (&(ar)[0] + STLSOFT_NUM_ELEMENTS(ar))
							 | 
						|
								#else /* ? compiler */
							 | 
						|
								# define XTESTS_ARRAY_END_POST(ar)                                      (&0[(ar)] + STLSOFT_NUM_ELEMENTS(ar))
							 | 
						|
								#endif /* compiler */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test integers
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_INTEGER_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two integer values (of the same type) are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected integer value
							 | 
						|
								 * \param actual The actual integer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_INTEGER_EQUAL(expected, actual)                 XTESTS_TEST_INTEGER_EQUAL_EXACT(expected, actual)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FLOATINGPOINT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two floating point values (of the same type) are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected floating point value
							 | 
						|
								 * \param actual The actual floating point value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_FLOATINGPOINT_EQUAL(expected, actual)           XTESTS_TEST_FLOATINGPOINT_EQUAL_APPROX(expected, actual)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two floating point values (of the same type) are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected floating point value
							 | 
						|
								 * \param actual The actual floating point value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL(expected, actual)       XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL_APPROX(expected, actual)
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_CHARACTER_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two character values (of the same type) are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected character value
							 | 
						|
								 * \param actual The actual character value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_CHARACTER_EQUAL(expected, actual)               XTESTS_TEST_CHARACTER_EQUAL_EXACT(expected, actual)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test multibyte strings
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_EQUAL(expected, actual)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_EQUAL_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are approximately equal (by ignoring
							 | 
						|
								 * case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_EQUAL_APPROX(expected, actual)                     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL(expected, actual)                        \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are not equal (when ignoring
							 | 
						|
								 * case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL_APPROX(expected, actual)                 \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_EQUAL_N(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are equal up to a given limit.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_EQUAL_N(expected, actual, n)                       \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_EQUAL_N_APPROX(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are approximately equal (by ignoring
							 | 
						|
								 * case), up to a given limit.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_EQUAL_N_APPROX(expected, actual, n)                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL_N(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL_N(expected, actual, n)                   \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL_N_APPROX(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (multibyte) strings are not equal (when ignoring
							 | 
						|
								 * case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_NOT_EQUAL_N_APPROX(expected, actual, n)            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test wide strings
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_EQUAL(expected, actual)                                 \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_EQUAL_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are approximately equal (by ignoring case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_EQUAL_APPROX(expected, actual)                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_NOT_EQUAL(expected, actual)                             \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_NOT_EQUAL_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are not equal (when ignoring
							 | 
						|
								 * case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_NOT_EQUAL_APPROX(expected, actual)                        \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStrings)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_EQUAL_N(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are equal up to a given limit.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_EQUAL_N(expected, actual, n)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_EQUAL_N_APPROX(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are approximately equal (by ignoring
							 | 
						|
								 * case), up to a given limit.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_EQUAL_N_APPROX(expected, actual, n)                     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_NOT_EQUAL_N(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_NOT_EQUAL_N(expected, actual, n)                        \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_NOT_EQUAL_N_APPROX(expected, actual, n)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two (wide) strings are not equal (when ignoring case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 * \param n The maximum number of characters to compare
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_NOT_EQUAL_N_APPROX(expected, actual, n)                 \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringsN)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), n, XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_CONTAIN(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string contains the expected sub-sequence.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_CONTAIN(expected, actual)                          \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_CONTAIN_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string contains the expected sub-sequence (disregarding
							 | 
						|
								 * case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_CONTAIN_APPROX(expected, actual)                   \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_NOT_CONTAIN(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string does not contain the expected sub-sequence.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_NOT_CONTAIN(expected, actual)                      \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_MULTIBYTE_STRING_NOT_CONTAIN_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string does not contain the expected sub-sequence
							 | 
						|
								 * (disregarding case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_MULTIBYTE_STRING_NOT_CONTAIN_APPROX(expected, actual)               \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testMultibyteStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_CONTAIN(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string contains the expected sub-sequence.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_CONTAIN(expected, actual)                               \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_CONTAIN_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string contains the expected sub-sequence (disregarding
							 | 
						|
								 * case).
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_CONTAIN_APPROX(expected, actual)                        \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_NOT_CONTAIN(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string does not contain the expected sub-sequence.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_NOT_CONTAIN(expected, actual)                           \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_WIDE_STRING_NOT_CONTAIN_APPROX(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the string does not contain the expected sub-sequence.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The substring to find with the actual string
							 | 
						|
								 * \param actual The actual value of the string
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_WIDE_STRING_NOT_CONTAIN_APPROX(expected, actual)                    \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testWideStringContains)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonApproxNotEqual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test pointers
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_POINTER_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two pointers are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the pointer
							 | 
						|
								 * \param actual The actual value of the pointer
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_POINTER_EQUAL(expected, actual)                                     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_POINTER_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two pointer values are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected pointer value
							 | 
						|
								 * \param actual The actual pointer value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The pointers should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_POINTER_NOT_EQUAL(expected, actual)                                \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_POINTER_GREATER(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual pointer value is greater than the expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected pointer value
							 | 
						|
								 * \param actual The actual pointer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_POINTER_GREATER(expected, actual)                                  \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonGreaterThan)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_POINTER_LESS(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual pointer value is less than the expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected pointer value
							 | 
						|
								 * \param actual The actual pointer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_POINTER_LESS(expected, actual)                                     \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonLessThan)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_POINTER_GREATER_OR_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual pointer value is greater than or equal to the
							 | 
						|
								 * expected value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected pointer value
							 | 
						|
								 * \param actual The actual pointer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_POINTER_GREATER_OR_EQUAL(expected, actual)                         \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonGreaterThanOrEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_POINTER_LESS_OR_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that the actual pointer value is less than or equal to the expected
							 | 
						|
								 * value.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected pointer value
							 | 
						|
								 * \param actual The actual pointer value
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_POINTER_LESS_OR_EQUAL(expected, actual)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", (expected), (actual), XTESTS_NS_C_QUAL(xtestsComparisonLessThanOrEqual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////
							 | 
						|
								 * Test function pointers
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FUNCTION_POINTER_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two pointers are equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected value of the pointer
							 | 
						|
								 * \param actual The actual value of the pointer
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_TEST_FUNCTION_POINTER_EQUAL(expected, actual)                            \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testFunctionPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", XTESTS_VOID_FUNCTION_CAST_(expected), XTESTS_VOID_FUNCTION_CAST_(actual), XTESTS_NS_C_QUAL(xtestsComparisonEqual)))
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_TEST_FUNCTION_POINTER_NOT_EQUAL(expected, actual)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_functions
							 | 
						|
								 *
							 | 
						|
								 * Tests that two pointer values are not equal.
							 | 
						|
								 *
							 | 
						|
								 * \param expected The expected pointer value
							 | 
						|
								 * \param actual The actual pointer value
							 | 
						|
								 *
							 | 
						|
								 * \remarks The pointers should be of the same type
							 | 
						|
								 *
							 | 
						|
								 * \note This can only be invoked after a successful invocation of
							 | 
						|
								 *   XTESTS_CASE_BEGIN() and before invocation of XTESTS_CASE_END().
							 | 
						|
								 */
							 | 
						|
								# define XTESTS_TEST_FUNCTION_POINTER_NOT_EQUAL(expected, actual)                       \
							 | 
						|
								                                                                                        \
							 | 
						|
								    (!XTESTS_NS_C_QUAL(xTests_hasRequiredConditionFailed()) &&                          \
							 | 
						|
								    XTESTS_NS_C_QUAL(xtests_testFunctionPointers)(__FILE__, __LINE__, XTESTS_GET_FUNCTION_(), "", XTESTS_VOID_FUNCTION_CAST_(expected), XTESTS_VOID_FUNCTION_CAST_(actual), XTESTS_NS_C_QUAL(xtestsComparisonNotEqual)))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Helper functions
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifdef __cplusplus
							 | 
						|
								# if !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								#  ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								
							 | 
						|
								/* c_str_len_n_X(s, n)
							 | 
						|
								 *
							 | 
						|
								 * prevents len-limited strlen() from overstepping
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								inline size_t c_str_len_n_a(char const* s, size_t n)
							 | 
						|
								{
							 | 
						|
								    size_t len = 0;
							 | 
						|
								
							 | 
						|
								    for(; '\0' != *s && len != n; ++s, ++len)
							 | 
						|
								    {}
							 | 
						|
								
							 | 
						|
								    return len;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								inline size_t c_str_len_n_w(wchar_t const* s, size_t n)
							 | 
						|
								{
							 | 
						|
								    size_t len = 0;
							 | 
						|
								
							 | 
						|
								    for(; '\0' != *s && len != n; ++s, ++len)
							 | 
						|
								    {}
							 | 
						|
								
							 | 
						|
								    return len;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template <typename S>
							 | 
						|
								inline size_t c_str_len_n_a(S const& s, size_t n)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_len_a);
							 | 
						|
								
							 | 
						|
								    size_t len = XTESTS_INVOKE_c_str_len_a_(s);
							 | 
						|
								
							 | 
						|
								    return (len < n) ? len : n;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template <typename S>
							 | 
						|
								inline size_t c_str_len_n_w(S const& s, size_t n)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_len_w);
							 | 
						|
								
							 | 
						|
								    size_t len = XTESTS_INVOKE_c_str_len_w_(s);
							 | 
						|
								
							 | 
						|
								    return (len < n) ? len : n;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#  endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								# endif /* !_XTESTS_NO_CPP_API */
							 | 
						|
								#endif /* __cplusplus */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * API functions
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/** The verbosity level to be applied when executing a test runner
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__test_runner_functions
							 | 
						|
								 *
							 | 
						|
								 * Verbosity affects the output from an xTests test program. Output comes
							 | 
						|
								 * in the following forms:
							 | 
						|
								 *
							 | 
						|
								 * - a test failure (highly granular)
							 | 
						|
								 * - a test case summary
							 | 
						|
								 * - a test runner summary
							 | 
						|
								 *
							 | 
						|
								 *
							 | 
						|
								 *
							 | 
						|
								 * \see XTESTS_START_RUNNER()
							 | 
						|
								 * \see XTESTS_START_RUNNER_WITH_REPORTER()
							 | 
						|
								 */
							 | 
						|
								enum xtests_verbosity_t
							 | 
						|
								{
							 | 
						|
								        XTESTS_VERBOSITY_SILENT                       =   -1  /*!< There is no output of any kind; status must be indicated by program return code */
							 | 
						|
								    ,   XTESTS_VERBOSITY_RUNNER_SUMMARY_ON_ERROR      =   0   /*!< Outputs only a runner summary only on error */
							 | 
						|
								    ,   XTESTS_VERBOSITY_RUNNER_SUMMARY               =   1   /*!< Outputs only a runner summary */
							 | 
						|
								    ,   XTESTS_VERBOSITY_FIRST_CASE_SUMMARY_ON_ERROR  =   2   /*!< Outputs a runner summary and the first case summary only on error */
							 | 
						|
								    ,   XTESTS_VERBOSITY_CASE_SUMMARY_ON_ERROR        =   3   /*!< Outputs a runner summary and a summary for each test case in error */
							 | 
						|
								    ,   XTESTS_VERBOSITY_CASE_SUMMARY                 =   4   /*!< Outputs a runner summary and a summary for each test case */
							 | 
						|
								
							 | 
						|
								    ,   XTESTS_VERBOSITY_VERBOSE                      =   9   /*!< Maximum amount of output */
							 | 
						|
								};
							 | 
						|
								#ifndef __cplusplus
							 | 
						|
								typedef enum xtests_verbosity_t xtests_verbosity_t;
							 | 
						|
								#endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								
							 | 
						|
								enum xtests_comparison_t
							 | 
						|
								{
							 | 
						|
								    /* NOTE: NEVER CHANGE THE ORDER OF THESE ENUMERATORS !!!!!!!!!!! */
							 | 
						|
								
							 | 
						|
								        xtestsComparisonEqual               =   0
							 | 
						|
								    ,   xtestsComparisonNotEqual
							 | 
						|
								    ,   xtestsComparisonGreaterThan
							 | 
						|
								    ,   xtestsComparisonLessThan
							 | 
						|
								    ,   xtestsComparisonGreaterThanOrEqual
							 | 
						|
								    ,   xtestsComparisonLessThanOrEqual
							 | 
						|
								    ,   xtestsComparisonApproxEqual
							 | 
						|
								    ,   xtestsComparisonApproxNotEqual
							 | 
						|
								
							 | 
						|
								    /* NOTE: NEVER CHANGE THE ORDER OF THESE ENUMERATORS !!!!!!!!!!! */
							 | 
						|
								
							 | 
						|
								    ,   xtestsComparison_max_enumerator
							 | 
						|
								
							 | 
						|
								};
							 | 
						|
								# ifndef __cplusplus
							 | 
						|
								typedef enum xtests_comparison_t xtests_comparison_t;
							 | 
						|
								# endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								# ifdef __cplusplus
							 | 
						|
								
							 | 
						|
								enum xtests_variable_type_t
							 | 
						|
								{
							 | 
						|
								        xtestsVariableNone                  =   0
							 | 
						|
								    ,   xtestsVariableBoolean               =   1
							 | 
						|
								    ,   xtestsVariableOpaquePointer         =   3
							 | 
						|
								    ,   xtestsVariableMultibyteCharacter    =   5
							 | 
						|
								    ,   xtestsVariableWideCharacter         =   6
							 | 
						|
								    ,   xtestsVariableMultibyteString       =   7
							 | 
						|
								    ,   xtestsVariableWideString            =   8
							 | 
						|
								    ,   xtestsVariableSignedChar            =   11
							 | 
						|
								    ,   xtestsVariableUnsignedChar          =   12
							 | 
						|
								    ,   xtestsVariableShort                 =   13
							 | 
						|
								    ,   xtestsVariableUnsignedShort         =   14
							 | 
						|
								    ,   xtestsVariableInt                   =   15
							 | 
						|
								    ,   xtestsVariableUnsignedInt           =   16
							 | 
						|
								    ,   xtestsVariableLong                  =   17
							 | 
						|
								    ,   xtestsVariableUnsignedLong          =   18
							 | 
						|
								#ifdef STLSOFT_CF_64BIT_INT_SUPPORT
							 | 
						|
								    ,   xtestsVariableLongLong              =   19
							 | 
						|
								    ,   xtestsVariableUnsignedLongLong      =   20
							 | 
						|
								#endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
							 | 
						|
								    ,   xtestsVariableDouble                =   31
							 | 
						|
								};
							 | 
						|
								#ifndef __cplusplus
							 | 
						|
								typedef enum xtests_variable_type_t xtests_variable_type_t;
							 | 
						|
								#endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								enum xtests_test_type_t
							 | 
						|
								{
							 | 
						|
								        xtestsTestFullComparison            =   0
							 | 
						|
								    ,   xtestsTestPartialComparison         =   1
							 | 
						|
								    ,   xtestsTestContainment               =   2
							 | 
						|
								};
							 | 
						|
								#ifndef __cplusplus
							 | 
						|
								typedef enum xtests_test_type_t xtests_test_type_t;
							 | 
						|
								#endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								union xtests_variable_value_t
							 | 
						|
								{
							 | 
						|
								    int                             booleanValue;
							 | 
						|
								    int                             intValue;
							 | 
						|
								    unsigned int                    uintValue;
							 | 
						|
								    long                            longValue;
							 | 
						|
								    unsigned long                   ulongValue;
							 | 
						|
								#ifdef STLSOFT_CF_64BIT_INT_SUPPORT
							 | 
						|
								    stlsoft_ns_qual(ss_sint64_t)    longlongValue;
							 | 
						|
								    stlsoft_ns_qual(ss_uint64_t)    ulonglongValue;
							 | 
						|
								#endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
							 | 
						|
								    char                            multibyteCharacterValue;
							 | 
						|
								    wchar_t                         wideCharacterValue;
							 | 
						|
								    char const*                     multibyteStringValue;
							 | 
						|
								    wchar_t const*                  wideStringValue;
							 | 
						|
								    double                          doubleValue;
							 | 
						|
								    void const volatile*            opaquePointerValue;
							 | 
						|
								
							 | 
						|
								    explicit xtests_variable_value_t(bool b);
							 | 
						|
								    explicit xtests_variable_value_t(char ch);
							 | 
						|
								    explicit xtests_variable_value_t(wchar_t ch, xtests_variable_type_t type /* = xtestsVariableMultibyteCharacter */);
							 | 
						|
								    explicit xtests_variable_value_t(signed   int i);
							 | 
						|
								    explicit xtests_variable_value_t(unsigned int i);
							 | 
						|
								    explicit xtests_variable_value_t(signed   long i);
							 | 
						|
								    explicit xtests_variable_value_t(unsigned long i);
							 | 
						|
								#ifdef STLSOFT_CF_64BIT_INT_SUPPORT
							 | 
						|
								    explicit xtests_variable_value_t(stlsoft_ns_qual(ss_sint64_t) const& i);
							 | 
						|
								    explicit xtests_variable_value_t(stlsoft_ns_qual(ss_uint64_t) const& i);
							 | 
						|
								#endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
							 | 
						|
								    explicit xtests_variable_value_t(char const* s);
							 | 
						|
								    explicit xtests_variable_value_t(wchar_t const* s);
							 | 
						|
								    explicit xtests_variable_value_t(char const* s, size_t n);
							 | 
						|
								    explicit xtests_variable_value_t(wchar_t const* s, size_t n);
							 | 
						|
								    explicit xtests_variable_value_t(double const& d);
							 | 
						|
								    explicit xtests_variable_value_t(void const volatile* pv);
							 | 
						|
								};
							 | 
						|
								#ifndef __cplusplus
							 | 
						|
								typedef union xtests_variable_value_t xtests_variable_value_t;
							 | 
						|
								#endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								struct xtests_variable_t
							 | 
						|
								{
							 | 
						|
								    xtests_variable_type_t  variableType;
							 | 
						|
								    xtests_test_type_t      testType;
							 | 
						|
								    xtests_variable_value_t value;
							 | 
						|
								    size_t                  valueLen;
							 | 
						|
								
							 | 
						|
								public:
							 | 
						|
								    explicit xtests_variable_t(char ch);
							 | 
						|
								    explicit xtests_variable_t(wchar_t ch, xtests_variable_type_t type /* = xtestsVariableMultibyteCharacter */);
							 | 
						|
								    explicit xtests_variable_t(bool b);
							 | 
						|
								    explicit xtests_variable_t(int b, xtests_variable_type_t type /* = xtestsVariableBoolean */);
							 | 
						|
								    explicit xtests_variable_t(signed   char i);
							 | 
						|
								    explicit xtests_variable_t(unsigned char i);
							 | 
						|
								    explicit xtests_variable_t(signed   short i);
							 | 
						|
								    explicit xtests_variable_t(unsigned short i);
							 | 
						|
								    explicit xtests_variable_t(signed   int i);
							 | 
						|
								    explicit xtests_variable_t(unsigned int i);
							 | 
						|
								    explicit xtests_variable_t(signed   long i);
							 | 
						|
								    explicit xtests_variable_t(unsigned long i);
							 | 
						|
								#ifdef STLSOFT_CF_64BIT_INT_SUPPORT
							 | 
						|
								    explicit xtests_variable_t(stlsoft_ns_qual(ss_sint64_t) const& i);
							 | 
						|
								    explicit xtests_variable_t(stlsoft_ns_qual(ss_uint64_t) const& i);
							 | 
						|
								#endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
							 | 
						|
								    explicit xtests_variable_t(char const* s, size_t n, xtests_test_type_t testType = xtestsTestFullComparison);
							 | 
						|
								    explicit xtests_variable_t(wchar_t const* s, size_t n, xtests_test_type_t testType = xtestsTestFullComparison);
							 | 
						|
								    explicit xtests_variable_t(char const* s, xtests_test_type_t testType = xtestsTestFullComparison);
							 | 
						|
								    explicit xtests_variable_t(wchar_t const* s, xtests_test_type_t testType = xtestsTestFullComparison);
							 | 
						|
								    explicit xtests_variable_t(double const& d);
							 | 
						|
								    explicit xtests_variable_t(void const volatile* pv);
							 | 
						|
								};
							 | 
						|
								#ifndef __cplusplus
							 | 
						|
								typedef union xtests_variable_t xtests_variable_t;
							 | 
						|
								#endif /* !__cplusplus */
							 | 
						|
								
							 | 
						|
								/** Summary of results for a single test case, or for all test cases
							 | 
						|
								 * in a test runner
							 | 
						|
								 */
							 | 
						|
								struct xTests_runner_results_t
							 | 
						|
								{
							 | 
						|
								    typedef stlsoft_ns_qual(uint32_t)   uint32_t;
							 | 
						|
								
							 | 
						|
								    char const*     name;
							 | 
						|
								    uint32_t        numCases;
							 | 
						|
								    uint32_t        numTests;
							 | 
						|
								    uint32_t        numFailedCases;
							 | 
						|
								    uint32_t        numFailedTests;
							 | 
						|
								    uint32_t        numMissingExpectedExceptions;
							 | 
						|
								    uint32_t        numUnexpectedExceptions;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								/** Interface to a type whose instances may be used to report results
							 | 
						|
								 */
							 | 
						|
								struct xTests_Reporter_t
							 | 
						|
								{
							 | 
						|
								protected:
							 | 
						|
								#  if defined(STLSOFT_COMPILER_IS_GCC)
							 | 
						|
								    virtual ~xTests_Reporter_t()
							 | 
						|
								    {}
							 | 
						|
								#  else /* ? compiler */
							 | 
						|
								    ~xTests_Reporter_t()
							 | 
						|
								    {}
							 | 
						|
								private:
							 | 
						|
								    virtual void dummy_dtor()
							 | 
						|
								    {}
							 | 
						|
								#  endif /* compiler */
							 | 
						|
								
							 | 
						|
								public: /* Overrides */
							 | 
						|
								    virtual void onStartRunner(void* reporterParam, char const* name, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								      virtual void onBeginTestCase(void* reporterParam, char const* name, char const* desc, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								        virtual void onTestPassed(void* reporterParam, char const* file, int line, char const* function, char const* expr, xtests_comparison_t comparison, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								        virtual void onTestFailed(void* reporterParam, char const* file, int line, char const* function, char const* expr, xtests_variable_t const* expectedValue, xtests_variable_t const* actualValue, ptrdiff_t length, xtests_comparison_t comparison, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								        virtual void onWriteFailMessage(void* reporterParam, char const* file, int line, char const* function, char const* message, char const* qualifyingInformation, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								        virtual void onCaseExcepted(void* reporterParam, char const* caseName, char const* exceptionType, char const* exceptionMessage, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								        virtual void onCaseExceptionExpected(void* reporterParam, char const* caseName, char const* exceptionType, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								      virtual void onEndTestCase(void* reporterParam, char const* name, xTests_runner_results_t const* results, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								      virtual void onPrintRunnerResults(void* reporterParam, xTests_runner_results_t const* results, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								      virtual void onAbend(void* reporterParam, char const* message, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								      virtual void onDefect(void* reporterParam, char const* message, char const* qualifier, int verbosity) = 0;
							 | 
						|
								
							 | 
						|
								    virtual void onEndRunner(void* reporterParam, char const* name, int verbosity) = 0;
							 | 
						|
								};
							 | 
						|
								# else /* ? __cplusplus */
							 | 
						|
								struct xTests_Reporter_t;
							 | 
						|
								typedef struct xTests_Reporter_t xTests_Reporter_t;
							 | 
						|
								# endif /* __cplusplus */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								/** Function that is used to setup the test environment for each test case
							 | 
						|
								 *
							 | 
						|
								 * \param param The caller-supplied parameter passed to xtests_startRunner()
							 | 
						|
								 *   (via XTESTS_START_RUNNER_WITH_SETUP_FNS() or 
							 | 
						|
								 *   XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS_AND_SETUP_FNS())
							 | 
						|
								 *
							 | 
						|
								 * \return A value that indicates whether setup was successful
							 | 
						|
								 * \retval 0 Setup was successful
							 | 
						|
								 * \retval !0 Setup failed. In this case, the test case will not be executed. 
							 | 
						|
								 */
							 | 
						|
								typedef int (*xTests_Setup_t)(void* param);
							 | 
						|
								
							 | 
						|
								/** Function that is used to teardown the test environment for each test
							 | 
						|
								 *   case
							 | 
						|
								 *
							 | 
						|
								 * \param param The caller-supplied parameter passed to xtests_startRunner()
							 | 
						|
								 *   (via XTESTS_START_RUNNER_WITH_SETUP_FNS() or 
							 | 
						|
								 *   XTESTS_START_RUNNER_WITH_REPORTER_AND_STREAM_AND_FLAGS_AND_SETUP_FNS())
							 | 
						|
								 *
							 | 
						|
								 * \return Ignored in the current version.
							 | 
						|
								 */
							 | 
						|
								typedef int (*xTests_Teardown_t)(void* param);
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_startRunner(
							 | 
						|
								    char const*         name
							 | 
						|
								,   int                 verbosity
							 | 
						|
								,   xTests_Reporter_t*  reporter        /* = NULL => reports to console (fprintf); also reports via OutputDebugString() on windows */
							 | 
						|
								,   void*               reporterParam   /* = NULL */
							 | 
						|
								,   FILE*               stm             /* = NULL => stdout */
							 | 
						|
								,   int                 flags           /* = 0 */
							 | 
						|
								,   xTests_Setup_t      setup
							 | 
						|
								,   xTests_Teardown_t   teardown
							 | 
						|
								,   void*               setupParam
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_endRunner(int *retCode);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(void)
							 | 
						|
								xtests_printRunnerResults(void);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(void)
							 | 
						|
								xtests_abend(char const* message);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_beginTestCase(
							 | 
						|
								    char const* name
							 | 
						|
								,   char const* desc
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_endTestCase(char const* name);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testPassed(
							 | 
						|
								    char const* file
							 | 
						|
								,   int         line
							 | 
						|
								,   char const* function
							 | 
						|
								,   char const* expr
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed(
							 | 
						|
								    char const* file
							 | 
						|
								,   int         line
							 | 
						|
								,   char const* function
							 | 
						|
								,   char const* expr
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_int(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   int                 expected
							 | 
						|
								,   int                 actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_long(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   long                expected
							 | 
						|
								,   long                actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_ulong(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   unsigned long       expected
							 | 
						|
								,   unsigned long       actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								# ifdef STLSOFT_CF_64BIT_INT_SUPPORT
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_longlong(
							 | 
						|
								    char const*                     file
							 | 
						|
								,   int                             line
							 | 
						|
								,   char const*                     function
							 | 
						|
								,   char const*                     expr
							 | 
						|
								,   stlsoft_ns_qual(ss_sint64_t)    expected
							 | 
						|
								,   stlsoft_ns_qual(ss_sint64_t)    actual
							 | 
						|
								,   xtests_comparison_t             comp
							 | 
						|
								);
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_ulonglong(
							 | 
						|
								    char const*                     file
							 | 
						|
								,   int                             line
							 | 
						|
								,   char const*                     function
							 | 
						|
								,   char const*                     expr
							 | 
						|
								,   stlsoft_ns_qual(ss_uint64_t)    expected
							 | 
						|
								,   stlsoft_ns_qual(ss_uint64_t)    actual
							 | 
						|
								,   xtests_comparison_t             comp
							 | 
						|
								);
							 | 
						|
								# endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_boolean(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   int                 expected
							 | 
						|
								,   int                 actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFailed_double(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   double              expected
							 | 
						|
								,   double              actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testMultibyteStrings(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   char const*         expected
							 | 
						|
								,   char const*         actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testMultibyteStringsN(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   char const*         expected
							 | 
						|
								,   char const*         actual
							 | 
						|
								,   ptrdiff_t           n /* exact if +ve; limit if -ve */
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testMultibyteStringsN_(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   char const*         expected
							 | 
						|
								,   char const*         actual
							 | 
						|
								,   ptrdiff_t           n /* exact if +ve; limit if -ve */
							 | 
						|
								,   size_t              cchExpected
							 | 
						|
								,   size_t              cchActual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_testMultibyteStrings(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   S0 const&           expected
							 | 
						|
								,   S1 const&           actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_ptr_a);
							 | 
						|
								
							 | 
						|
								    return xtests_testMultibyteStrings(file, line, function, expr, XTESTS_INVOKE_c_str_ptr_a_(XTESTS_INVOKE_c_str_ptr_a_(expected)), XTESTS_INVOKE_c_str_ptr_a_(XTESTS_INVOKE_c_str_ptr_a_(actual)), comp);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_testMultibyteStringsN(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   S0 const&           expected
							 | 
						|
								,   S1 const&           actual
							 | 
						|
								,   int                 n /* exact if +ve; limit if -ve */
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_data_a);
							 | 
						|
								
							 | 
						|
								    return xtests_testMultibyteStringsN_(
							 | 
						|
								        file
							 | 
						|
								    ,   line
							 | 
						|
								    ,   function
							 | 
						|
								    ,   expr
							 | 
						|
								    ,   XTESTS_INVOKE_c_str_data_a_(XTESTS_INVOKE_c_str_data_a_(expected))
							 | 
						|
								    ,   XTESTS_INVOKE_c_str_data_a_(XTESTS_INVOKE_c_str_data_a_(actual))
							 | 
						|
								    ,   n
							 | 
						|
								    ,   c_str_len_n_a(expected, stlsoft_static_cast(size_t, (n < 0) ? -n : n))
							 | 
						|
								    ,   c_str_len_n_a(actual, stlsoft_static_cast(size_t, (n < 0) ? -n : n))
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								#endif /* C++ && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testWideStrings(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   wchar_t const*      expected
							 | 
						|
								,   wchar_t const*      actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testWideStringsN_(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   wchar_t const*      expected
							 | 
						|
								,   wchar_t const*      actual
							 | 
						|
								,   int                 n /* exact if +ve; limit if -ve */
							 | 
						|
								,   size_t              cchExpected
							 | 
						|
								,   size_t              cchActual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testWideStringsN(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   wchar_t const*      expected
							 | 
						|
								,   wchar_t const*      actual
							 | 
						|
								,   int                 n /* exact if +ve; limit if -ve */
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_testWideStrings(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   S0 const&           expected
							 | 
						|
								,   S1 const&           actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_ptr_w);
							 | 
						|
								
							 | 
						|
								    return xtests_testWideStrings(file, line, function, expr, XTESTS_INVOKE_c_str_ptr_w_(XTESTS_INVOKE_c_str_ptr_w_(expected)), XTESTS_INVOKE_c_str_ptr_w_(XTESTS_INVOKE_c_str_ptr_w_(actual)), comp);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_testWideStringsN(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   S0 const&           expected
							 | 
						|
								,   S1 const&           actual
							 | 
						|
								,   int                 n /* exact if +ve; limit if -ve */
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_data_w);
							 | 
						|
								
							 | 
						|
								    return xtests_testWideStringsN_(
							 | 
						|
								        file
							 | 
						|
								    ,   line
							 | 
						|
								    ,   function
							 | 
						|
								    ,   expr
							 | 
						|
								    ,   XTESTS_INVOKE_c_str_data_w_(XTESTS_INVOKE_c_str_data_w_(expected))
							 | 
						|
								    ,   XTESTS_INVOKE_c_str_data_w_(XTESTS_INVOKE_c_str_data_w_(actual))
							 | 
						|
								    ,   n
							 | 
						|
								    ,   c_str_len_n_w(expected, stlsoft_static_cast(size_t, (n < 0) ? -n : n))
							 | 
						|
								    ,   c_str_len_n_w(actual, stlsoft_static_cast(size_t, (n < 0) ? -n : n))
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								#endif /* C++ && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testMultibyteStringContains(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   char const*         expected
							 | 
						|
								,   char const*         actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_testMultibyteStringContains(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   S0 const&           expected
							 | 
						|
								,   S1 const&           actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_ptr_a);
							 | 
						|
								
							 | 
						|
								    return xtests_testMultibyteStringContains(file, line, function, expr, XTESTS_INVOKE_c_str_ptr_a_(XTESTS_INVOKE_c_str_ptr_a_(expected)), XTESTS_INVOKE_c_str_ptr_a_(XTESTS_INVOKE_c_str_ptr_a_(actual)), comp);
							 | 
						|
								}
							 | 
						|
								#endif /* C++ && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testWideStringContains(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   wchar_t const*      expected
							 | 
						|
								,   wchar_t const*      actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_testWideStringContains(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   S0 const&           expected
							 | 
						|
								,   S1 const&           actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_ptr_w);
							 | 
						|
								
							 | 
						|
								    return xtests_testWideStringContains(file, line, function, expr, XTESTS_INVOKE_c_str_ptr_w_(XTESTS_INVOKE_c_str_ptr_w_(expected)), XTESTS_INVOKE_c_str_ptr_w_(XTESTS_INVOKE_c_str_ptr_w_(actual)), comp);
							 | 
						|
								}
							 | 
						|
								#endif /* C++ && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testPointers(
							 | 
						|
								    char const*             file
							 | 
						|
								,   int                     line
							 | 
						|
								,   char const*             function
							 | 
						|
								,   char const*             expr
							 | 
						|
								,   void volatile const*    expected
							 | 
						|
								,   void volatile const*    actual
							 | 
						|
								,   xtests_comparison_t     comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testFunctionPointers(
							 | 
						|
								    char const*             file
							 | 
						|
								,   int                     line
							 | 
						|
								,   char const*             function
							 | 
						|
								,   char const*             expr
							 | 
						|
								,   void                    (*expected)(void)
							 | 
						|
								,   void                    (*actual)(void)
							 | 
						|
								,   xtests_comparison_t     comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testCharactersA(
							 | 
						|
								    char const*             file
							 | 
						|
								,   int                     line
							 | 
						|
								,   char const*             function
							 | 
						|
								,   char const*             expr
							 | 
						|
								,   char                    expected
							 | 
						|
								,   char                    actual
							 | 
						|
								,   xtests_comparison_t     comp
							 | 
						|
								);
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_testCharactersW(
							 | 
						|
								    char const*             file
							 | 
						|
								,   int                     line
							 | 
						|
								,   char const*             function
							 | 
						|
								,   char const*             expr
							 | 
						|
								,   wchar_t                 expected
							 | 
						|
								,   wchar_t                 actual
							 | 
						|
								,   xtests_comparison_t     comp
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_writeFailMessage(
							 | 
						|
								    char const* file
							 | 
						|
								,   int         line
							 | 
						|
								,   char const* function
							 | 
						|
								,   char const* message
							 | 
						|
								,   char const* qualifyingInformation
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								template<
							 | 
						|
								    typename S0
							 | 
						|
								,   typename S1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_writeFailMessage(
							 | 
						|
								    char const* file
							 | 
						|
								,   int         line
							 | 
						|
								,   char const* function
							 | 
						|
								,   S0 const&   message
							 | 
						|
								,   S1 const&   qualifyingInformation
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_ns_using(c_str_ptr_a);
							 | 
						|
								
							 | 
						|
								    return xtests_writeFailMessage(
							 | 
						|
								        file
							 | 
						|
								    ,   line
							 | 
						|
								    ,   function
							 | 
						|
								    ,   XTESTS_INVOKE_c_str_ptr_a_(XTESTS_INVOKE_c_str_ptr_a_(message))
							 | 
						|
								    ,   XTESTS_INVOKE_c_str_ptr_a_(XTESTS_INVOKE_c_str_ptr_a_(qualifyingInformation)));
							 | 
						|
								}
							 | 
						|
								#endif /* C++ && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(void)
							 | 
						|
								xtests_caseExcepted(
							 | 
						|
								    char const* exceptionType
							 | 
						|
								,   char const* exceptionMessage
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(void)
							 | 
						|
								xtests_caseExceptionExpected(
							 | 
						|
								    char const* exceptionType
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_floatingPointClose(
							 | 
						|
								    double expected
							 | 
						|
								,   double actual
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								/** Sets the floating-point number closesness factor, used in
							 | 
						|
								 *   XTESTS_TEST_FLOATINGPOINT_EQUAL_APPROX()
							 | 
						|
								 *
							 | 
						|
								 * \param factor The factor. Must be >= 1.0 and < 2.0
							 | 
						|
								 * \param old Optional pointer to receive the previous value. May be NULL
							 | 
						|
								 *
							 | 
						|
								 * \see XTESTS_FLOATINGPOINT_FACTOR_SCOPE
							 | 
						|
								 */
							 | 
						|
								XTESTS_CALL(double)
							 | 
						|
								xtests_setFloatingPointCloseFactor(
							 | 
						|
								    double  factor
							 | 
						|
								,   double* old /* = NULL */
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								#endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * C++-only functionality
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#if defined(__cplusplus) && \
							 | 
						|
								    !defined(_XTESTS_NO_CPP_API)
							 | 
						|
								
							 | 
						|
								# ifndef _XTESTS_NO_NAMESPACE
							 | 
						|
								namespace cpp
							 | 
						|
								{
							 | 
						|
								# endif /* !_XTESTS_NO_NAMESPACE */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								# if defined(STLSOFT_CF_EXCEPTION_SUPPORT)
							 | 
						|
								
							 | 
						|
								#  ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								class requirement_failed_exception
							 | 
						|
								    : public std::runtime_error
							 | 
						|
								{
							 | 
						|
								public:
							 | 
						|
								    typedef std::runtime_error              parent_class_type;
							 | 
						|
								    typedef requirement_failed_exception    class_type;
							 | 
						|
								
							 | 
						|
								public:
							 | 
						|
								    explicit requirement_failed_exception(char const* message)
							 | 
						|
								        : parent_class_type(message)
							 | 
						|
								    {}
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								inline
							 | 
						|
								void
							 | 
						|
								xtests_require(int success)
							 | 
						|
								{
							 | 
						|
								    if(!success)
							 | 
						|
								    {
							 | 
						|
								        throw requirement_failed_exception("XTESTS_REQUIRE()'d test failed");
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#  endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								# endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
							 | 
						|
								
							 | 
						|
								/** Scoping class that sets the floating-point close factor for a 
							 | 
						|
								 *   controlled period
							 | 
						|
								 */
							 | 
						|
								class xtest_floatingpoint_factor_scope
							 | 
						|
								{
							 | 
						|
								public:
							 | 
						|
								    /** Sets the floating point close factor to the given value */
							 | 
						|
								    xtest_floatingpoint_factor_scope(double const& factor)
							 | 
						|
								        : m_original(xtests_setFloatingPointCloseFactor(factor, NULL))
							 | 
						|
								    {}
							 | 
						|
								    /** Resets the floating point close factor to the original value */
							 | 
						|
								    ~xtest_floatingpoint_factor_scope() stlsoft_throw_0()
							 | 
						|
								    {
							 | 
						|
								        xtests_setFloatingPointCloseFactor(m_original, NULL);
							 | 
						|
								    }
							 | 
						|
								private:
							 | 
						|
								    xtest_floatingpoint_factor_scope(xtest_floatingpoint_factor_scope const&);
							 | 
						|
								    xtest_floatingpoint_factor_scope &operator =(xtest_floatingpoint_factor_scope const&);
							 | 
						|
								
							 | 
						|
								private:
							 | 
						|
								    const double m_original;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_FLOATINGPOINT_FACTOR_SCOPE
							 | 
						|
								 *
							 | 
						|
								 * [C++ only] Macro used to declare an instance of the
							 | 
						|
								 * class xtests::c::cpp::xtest_floatingpoint_factor_scope, which causes the
							 | 
						|
								 * floating point factor to be set to a new value for the lifetime of the
							 | 
						|
								 * object, and then returned to its prior value
							 | 
						|
								<pre>
							 | 
						|
								  XTESTS_TEST_FLOATINGPOINT_NOT_EQUAL(5.05, 5.06);
							 | 
						|
								
							 | 
						|
								  XTESTS_FLOATINGPOINT_FACTOR_SCOPE factor_scoper(1.1); // highly permissive factor
							 | 
						|
								
							 | 
						|
								  XTESTS_TEST_FLOATINGPOINT_EQUAL(5.05, 5.06);
							 | 
						|
								</pre>
							 | 
						|
								 */
							 | 
						|
								#  define XTESTS_FLOATINGPOINT_FACTOR_SCOPE XTESTS_NS_CPP_QUAL(xtest_floatingpoint_factor_scope)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#  ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								template <typename T>
							 | 
						|
								struct xtests_failure_reporter;
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<int>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, int expected, int actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_int(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<unsigned int>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, unsigned int expected, unsigned int actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_ulong(file, line, function, expr, static_cast<unsigned long>(expected), static_cast<unsigned long>(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<signed char>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, signed char expected, signed char actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_failure_reporter<int>::xtests_report_failure_equal(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<unsigned char>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, unsigned char expected, unsigned char actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_failure_reporter<int>::xtests_report_failure_equal(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<short>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, int expected, int actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_failure_reporter<int>::xtests_report_failure_equal(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<unsigned short>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, int expected, int actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_failure_reporter<int>::xtests_report_failure_equal(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								#ifdef STLSOFT_CF_SHORT_DISTINCT_INT_TYPE
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<stlsoft::sint16_t>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, stlsoft::sint16_t expected, stlsoft::sint16_t actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_int(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<stlsoft::uint16_t>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, stlsoft::uint16_t expected, stlsoft::uint16_t actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_int(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								#endif /* STLSOFT_CF_SHORT_DISTINCT_INT_TYPE */
							 | 
						|
								
							 | 
						|
								#ifdef STLSOFT_CF_INT_DISTINCT_INT_TYPE
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<stlsoft::sint32_t>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, stlsoft::sint32_t expected, stlsoft::sint32_t actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_int(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<stlsoft::uint32_t>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, stlsoft::uint32_t expected, stlsoft::uint32_t actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_int(file, line, function, expr, int(expected), int(actual), comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								#endif /* STLSOFT_CF_INT_DISTINCT_INT_TYPE */
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<long>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, long expected, long actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_long(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<unsigned long>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, unsigned long expected, unsigned long actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_ulong(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								#  ifdef STLSOFT_CF_64BIT_INT_SUPPORT
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter< stlsoft_ns_qual(ss_sint64_t)>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, stlsoft::sint64_t expected, stlsoft::sint64_t actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_longlong(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter< stlsoft_ns_qual(ss_uint64_t)>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, stlsoft::uint64_t expected, stlsoft::uint64_t actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_ulonglong(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								#  endif /* STLSOFT_CF_64BIT_INT_SUPPORT */
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct xtests_failure_reporter<bool>
							 | 
						|
								{
							 | 
						|
								    static void xtests_report_failure_equal(char const* file, int line, char const* function, char const* expr, int expected, int actual, xtests_comparison_t comp)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testFailed_boolean(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename T1
							 | 
						|
								,   typename T2
							 | 
						|
								>
							 | 
						|
								struct xtests_integer_failure_reporter_selector
							 | 
						|
								{
							 | 
						|
								private:
							 | 
						|
								    enum { are_types_same       =   (0 != stlsoft::is_same_type<T1, T2>::value) };
							 | 
						|
								    enum { T1_is_larger_than_T2 =   sizeof(T1) > sizeof(T2)                     };
							 | 
						|
								
							 | 
						|
								    typedef typename stlsoft::select_first_type_if< T1
							 | 
						|
								                                                ,   T2
							 | 
						|
								                                                ,   T1_is_larger_than_T2
							 | 
						|
								                                                >::type         larger_type_;
							 | 
						|
								
							 | 
						|
								public:
							 | 
						|
								    typedef xtests_failure_reporter<larger_type_>               type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I1
							 | 
						|
								,   typename I2
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								void
							 | 
						|
								xtests_reportFailedIntegerComparison(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           expected
							 | 
						|
								,   I2 const&           actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    STLSOFT_STATIC_ASSERT(0 != stlsoft::is_integral_type<I1>::value);
							 | 
						|
								    STLSOFT_STATIC_ASSERT(0 != stlsoft::is_integral_type<I2>::value);
							 | 
						|
								
							 | 
						|
								#  if defined(STLSOFT_COMPILER_IS_BORLAND)
							 | 
						|
								
							 | 
						|
								    xtests_integer_failure_reporter_selector<I1, I2>::type::xtests_report_failure_equal(file, line, function, expr, expected, actual, comp);
							 | 
						|
								
							 | 
						|
								#  else /* ? compiler */
							 | 
						|
								
							 | 
						|
								    typedef typename xtests_integer_failure_reporter_selector<I1, I2>::type    failure_reporter_t;
							 | 
						|
								
							 | 
						|
								    failure_reporter_t::xtests_report_failure_equal(file, line, function, expr, expected, actual, comp);
							 | 
						|
								
							 | 
						|
								#  endif /* compiler */
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#if defined(STLSOFT_COMPILER_IS_MSVC) && \
							 | 
						|
								    _MSC_VER >= 1310 && \
							 | 
						|
								    !defined(_WIN64) && \
							 | 
						|
								    defined(_Wp64)
							 | 
						|
								/* This special overload is to allow for cases such as:
							 | 
						|
								 *
							 | 
						|
								 *     XTESTS_TEST_INTEGER_EQUAL(4u, sink.size());
							 | 
						|
								 */
							 | 
						|
								inline
							 | 
						|
								void
							 | 
						|
								xtests_reportFailedIntegerComparison(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   unsigned int        expected
							 | 
						|
								,   size_t              actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_static_cast(void, xtests_testFailed_ulong(file, line, function, expr, static_cast<unsigned long>(expected), static_cast<unsigned long>(actual), comp));
							 | 
						|
								}
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								inline
							 | 
						|
								void
							 | 
						|
								xtests_reportFailedIntegerComparison(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   bool                expected
							 | 
						|
								,   bool                actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								#  if defined(STLSOFT_COMPILER_IS_BORLAND)
							 | 
						|
								
							 | 
						|
								    xtests_integer_failure_reporter_selector<bool, bool>::type::xtests_report_failure_equal(file, line, function, expr, expected, actual, comp);
							 | 
						|
								
							 | 
						|
								#  else /* ? compiler */
							 | 
						|
								
							 | 
						|
								    typedef xtests_integer_failure_reporter_selector<bool, bool>::type    failure_reporter_t;
							 | 
						|
								
							 | 
						|
								    failure_reporter_t::xtests_report_failure_equal(file, line, function, expr, expected, actual, comp);
							 | 
						|
								
							 | 
						|
								#  endif /* compiler */
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#if 0
							 | 
						|
								inline
							 | 
						|
								void
							 | 
						|
								xtests_reportFailedIntegerComparison(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   int                 expected
							 | 
						|
								,   bool                actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    xtests_reportFailedIntegerComparison(file, line, function, expr, 0 != expected, actual, comp);
							 | 
						|
								}
							 | 
						|
								#endif /* 0 */
							 | 
						|
								
							 | 
						|
								inline
							 | 
						|
								void
							 | 
						|
								xtests_reportFailedFloatingPointComparison(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   double const&       expected
							 | 
						|
								,   double const&       actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    stlsoft_static_cast(void, xtests_testFailed_double(file, line, function, expr, expected, actual, comp));
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I
							 | 
						|
								,   typename II
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_compare_to_range_(
							 | 
						|
								    char const*         /* file */
							 | 
						|
								,   int                 /* line */
							 | 
						|
								,   char const*         /* function */
							 | 
						|
								,   char const*         /* expr */
							 | 
						|
								,   II                  begin
							 | 
						|
								,   II                  end
							 | 
						|
								,   I const&            actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    for(; begin != end; ++begin)
							 | 
						|
								    {
							 | 
						|
								        I const& expected = *begin;
							 | 
						|
								
							 | 
						|
								        switch(comp)
							 | 
						|
								        {
							 | 
						|
								            case    xtestsComparisonEqual:
							 | 
						|
								            case    xtestsComparisonApproxEqual:
							 | 
						|
								                if(expected == actual)
							 | 
						|
								                {
							 | 
						|
								                    return true;
							 | 
						|
								                }
							 | 
						|
								                break;
							 | 
						|
								            case    xtestsComparisonNotEqual:
							 | 
						|
								            case    xtestsComparisonApproxNotEqual:
							 | 
						|
								                if(expected != actual)
							 | 
						|
								                {
							 | 
						|
								                    return true;
							 | 
						|
								                }
							 | 
						|
								                break;
							 | 
						|
								            case    xtestsComparisonGreaterThan:
							 | 
						|
								                if(actual > expected)
							 | 
						|
								                {
							 | 
						|
								                    return true;
							 | 
						|
								                }
							 | 
						|
								                break;
							 | 
						|
								            case    xtestsComparisonLessThan:
							 | 
						|
								                if(actual < expected)
							 | 
						|
								                {
							 | 
						|
								                    return true;
							 | 
						|
								                }
							 | 
						|
								                break;
							 | 
						|
								            case    xtestsComparisonGreaterThanOrEqual:
							 | 
						|
								                if(actual >= expected)
							 | 
						|
								                {
							 | 
						|
								                    return true;
							 | 
						|
								                }
							 | 
						|
								                break;
							 | 
						|
								            case    xtestsComparisonLessThanOrEqual:
							 | 
						|
								                if(actual <= expected)
							 | 
						|
								                {
							 | 
						|
								                    return true;
							 | 
						|
								                }
							 | 
						|
								                break;
							 | 
						|
								            default:
							 | 
						|
								                STLSOFT_MESSAGE_ASSERT("unrecognised enumerator", false);
							 | 
						|
								            case    xtestsComparison_max_enumerator:
							 | 
						|
								                xtests_abend("invalid test comparison type: test framework may be out of date!");
							 | 
						|
								                break;
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return false;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I
							 | 
						|
								,   typename II
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_any_in_range(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   II                  begin
							 | 
						|
								,   II                  end
							 | 
						|
								,   I const&            actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    int comparisonSucceeded = xtests_test_integer_compare_to_range_(file, line, function, expr, begin, end, actual, comp);
							 | 
						|
								
							 | 
						|
								    if(comparisonSucceeded)
							 | 
						|
								    {
							 | 
						|
								        xtests_testPassed(file, line, function, expr);
							 | 
						|
								    }
							 | 
						|
								    else
							 | 
						|
								    {
							 | 
						|
								#if 0
							 | 
						|
								        xtests_reportFailedIntegerComparison(file, line, function, expr, expected, actual, comp);
							 | 
						|
								#else /* ? 0 */
							 | 
						|
								        xtests_testFailed(file, line, function, expr);
							 | 
						|
								#endif /* 0 */
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return comparisonSucceeded;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I1
							 | 
						|
								,   typename I2
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           expected
							 | 
						|
								,   I2 const&           actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    int comparisonSucceeded = false;
							 | 
						|
								
							 | 
						|
								    switch(comp)
							 | 
						|
								    {
							 | 
						|
								        case    xtestsComparisonEqual:
							 | 
						|
								        case    xtestsComparisonApproxEqual:
							 | 
						|
								            if(expected == actual)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonNotEqual:
							 | 
						|
								        case    xtestsComparisonApproxNotEqual:
							 | 
						|
								            if(expected != actual)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonGreaterThan:
							 | 
						|
								            if(actual > expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonLessThan:
							 | 
						|
								            if(actual < expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonGreaterThanOrEqual:
							 | 
						|
								            if(actual >= expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonLessThanOrEqual:
							 | 
						|
								            if(actual <= expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        default:
							 | 
						|
								            STLSOFT_MESSAGE_ASSERT("unrecognised enumerator", false);
							 | 
						|
								        case    xtestsComparison_max_enumerator:
							 | 
						|
								            xtests_abend("invalid test comparison type: test framework may be out of date!");
							 | 
						|
								            break;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    if(comparisonSucceeded)
							 | 
						|
								    {
							 | 
						|
								        xtests_testPassed(file, line, function, expr);
							 | 
						|
								    }
							 | 
						|
								    else
							 | 
						|
								    {
							 | 
						|
								        xtests_reportFailedIntegerComparison(file, line, function, expr, expected, actual, comp);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return comparisonSucceeded;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   I0 const&           expected2
							 | 
						|
								,   I0 const&           expected3
							 | 
						|
								,   I0 const&           expected4
							 | 
						|
								,   I0 const&           expected5
							 | 
						|
								,   I0 const&           expected6
							 | 
						|
								,   I0 const&           expected7
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    I0 const range[] = { 
							 | 
						|
								        expected0
							 | 
						|
								    ,   expected1
							 | 
						|
								    ,   expected2
							 | 
						|
								    ,   expected3
							 | 
						|
								    ,   expected4
							 | 
						|
								    ,   expected5
							 | 
						|
								    ,   expected6
							 | 
						|
								    ,   expected7
							 | 
						|
								    };
							 | 
						|
								
							 | 
						|
								    return xtests_test_integer_any_in_range(file, line, function, expr, &range[0], &range[0] + STLSOFT_NUM_ELEMENTS(range), actual, comp);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   I0 const&           expected2
							 | 
						|
								,   I0 const&           expected3
							 | 
						|
								,   I0 const&           expected4
							 | 
						|
								,   I0 const&           expected5
							 | 
						|
								,   I0 const&           expected6
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_test_integer_one_of(
							 | 
						|
								        file, line, function, expr
							 | 
						|
								    ,   actual
							 | 
						|
								    ,   expected0, expected1, expected2, expected3, expected4, expected5, expected6, expected0
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   I0 const&           expected2
							 | 
						|
								,   I0 const&           expected3
							 | 
						|
								,   I0 const&           expected4
							 | 
						|
								,   I0 const&           expected5
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_test_integer_one_of(
							 | 
						|
								        file, line, function, expr
							 | 
						|
								    ,   actual
							 | 
						|
								    ,   expected0, expected1, expected2, expected3, expected4, expected5, expected0, expected0
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   I0 const&           expected2
							 | 
						|
								,   I0 const&           expected3
							 | 
						|
								,   I0 const&           expected4
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_test_integer_one_of(
							 | 
						|
								        file, line, function, expr
							 | 
						|
								    ,   actual
							 | 
						|
								    ,   expected0, expected1, expected2, expected3, expected4, expected0, expected0, expected0
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   I0 const&           expected2
							 | 
						|
								,   I0 const&           expected3
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_test_integer_one_of(
							 | 
						|
								        file, line, function, expr
							 | 
						|
								    ,   actual
							 | 
						|
								    ,   expected0, expected1, expected2, expected3, expected0, expected0, expected0, expected0
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   I0 const&           expected2
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_test_integer_one_of(
							 | 
						|
								        file, line, function, expr
							 | 
						|
								    ,   actual
							 | 
						|
								    ,   expected0, expected1, expected2, expected0, expected0, expected0, expected0, expected0
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								template<
							 | 
						|
								    typename I0
							 | 
						|
								,   typename I1
							 | 
						|
								>
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_integer_one_of(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   I1 const&           actual
							 | 
						|
								,   I0 const&           expected0
							 | 
						|
								,   I0 const&           expected1
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_test_integer_one_of(
							 | 
						|
								        file, line, function, expr
							 | 
						|
								    ,   actual
							 | 
						|
								    ,   expected0, expected1, expected0, expected0, expected0, expected0, expected0, expected0
							 | 
						|
								    ,   comp
							 | 
						|
								    );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_character(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   char                expected
							 | 
						|
								,   char                actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_testCharactersA(file, line, function, expr, expected, actual, comp);
							 | 
						|
								}
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_character(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   wchar_t             expected
							 | 
						|
								,   wchar_t             actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    return xtests_testCharactersW(file, line, function, expr, expected, actual, comp);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								inline
							 | 
						|
								int
							 | 
						|
								xtests_test_floating_point(
							 | 
						|
								    char const*         file
							 | 
						|
								,   int                 line
							 | 
						|
								,   char const*         function
							 | 
						|
								,   char const*         expr
							 | 
						|
								,   double const&       expected
							 | 
						|
								,   double const&       actual
							 | 
						|
								,   xtests_comparison_t comp
							 | 
						|
								)
							 | 
						|
								{
							 | 
						|
								    int comparisonSucceeded = false;
							 | 
						|
								
							 | 
						|
								    switch(comp)
							 | 
						|
								    {
							 | 
						|
								        case    xtestsComparisonEqual:
							 | 
						|
								            if(expected == actual)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonApproxEqual:
							 | 
						|
								            if(xtests_floatingPointClose(expected, actual))
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonNotEqual:
							 | 
						|
								            if(expected != actual)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonApproxNotEqual:
							 | 
						|
								            if(!xtests_floatingPointClose(expected, actual))
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonGreaterThan:
							 | 
						|
								            if(actual > expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonLessThan:
							 | 
						|
								            if(actual < expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonGreaterThanOrEqual:
							 | 
						|
								            if(actual >= expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        case    xtestsComparisonLessThanOrEqual:
							 | 
						|
								            if(actual <= expected)
							 | 
						|
								            {
							 | 
						|
								                comparisonSucceeded = true;
							 | 
						|
								            }
							 | 
						|
								            break;
							 | 
						|
								        default:
							 | 
						|
								            STLSOFT_MESSAGE_ASSERT("unrecognised enumerator", false);
							 | 
						|
								        case    xtestsComparison_max_enumerator:
							 | 
						|
								            xtests_abend("invalid test comparison type: test framework may be out of date!");
							 | 
						|
								            break;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    if(comparisonSucceeded)
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_testPassed(file, line, function, expr));
							 | 
						|
								    }
							 | 
						|
								    else
							 | 
						|
								    {
							 | 
						|
								        stlsoft_static_cast(void, xtests_reportFailedFloatingPointComparison(file, line, function, expr, expected, actual, comp));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return comparisonSucceeded;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#  endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								# ifndef _XTESTS_NO_NAMESPACE
							 | 
						|
								} /* namespace cpp */
							 | 
						|
								# endif /* !_XTESTS_NO_NAMESPACE */
							 | 
						|
								
							 | 
						|
								#else /* __cplusplus && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								# define XTESTS_REQUIRE(test)           XTESTS_NS_C_QUAL(xtests_require_C)(!(!(test)))
							 | 
						|
								
							 | 
						|
								#endif /* __cplusplus) && !_XTESTS_NO_CPP_API */
							 | 
						|
								
							 | 
						|
								/** [INTERNAL] Worker function for XTESTS_REQUIRE() (in C compilation units)
							 | 
						|
								 */
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_require_C(
							 | 
						|
								    int success
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								/** [INTERNAL] Worker function
							 | 
						|
								 */
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xTests_hasRequiredConditionFailed(void);
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Helper functions
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								XTESTS_CALL(int)
							 | 
						|
								xtests_commandLine_parseVerbosity(
							 | 
						|
								    int     argc
							 | 
						|
								,   char**  argv
							 | 
						|
								,   int*    verbosity
							 | 
						|
								);
							 | 
						|
								#endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								/** \def XTESTS_COMMANDLINE_PARSEVERBOSITY(argc, argv, pverbosity)
							 | 
						|
								 *
							 | 
						|
								 * \ingroup group__xtests__utiliy_functions
							 | 
						|
								 *
							 | 
						|
								 * Parses a verbosity from the command-line
							 | 
						|
								 *
							 | 
						|
								 * Parse the verbosity from the command-line arguments, looking for an
							 | 
						|
								 * argument of the form "--verbosity=<N>", where N is a non-negative
							 | 
						|
								 * integer.
							 | 
						|
								 *
							 | 
						|
								 * \param argc The <code>argc</code> parameter passed into
							 | 
						|
								 *   <code>main()</code>
							 | 
						|
								 * \param argv The <code>argv</code> parameter passed into
							 | 
						|
								 *   <code>main()</code>
							 | 
						|
								 * \param pverbosity A pointer to an integer to receive the verbosity. Will
							 | 
						|
								 *   be set to xtestsVerbositySummaryOnSuccess even if no verbosity argument
							 | 
						|
								 *   is found. May not be NULL.
							 | 
						|
								 *
							 | 
						|
								 * \return The index of argument containing the verbosity, or 0 to indicate
							 | 
						|
								 *   failure
							 | 
						|
								 */
							 | 
						|
								#define XTESTS_COMMANDLINE_PARSEVERBOSITY(argc, argv, pverbosity)                       \
							 | 
						|
								                                                                                        \
							 | 
						|
								    stlsoft_static_cast(void, XTESTS_NS_C_QUAL(xtests_commandLine_parseVerbosity)((argc), (argv), (pverbosity)))
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Obsolete names
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef XTESTS_DOCUMENTATION_SKIP_SECTION
							 | 
						|
								# define XTESTS_FAIL_WITH_QUALIFIER(msg, qualifier)     XTESTS_TEST_FAIL_WITH_QUALIFIER(msg, qualifier)
							 | 
						|
								# define XTESTS_FAIL(msg)                               XTESTS_TEST_FAIL(msg)
							 | 
						|
								# define XTESTS_PASSED()                                XTESTS_TEST_PASSED()
							 | 
						|
								# define XTESTS_TEST_MULTIBYTE_STRINGS_EQUAL            XTESTS_TEST_MULTIBYTE_STRING_EQUAL
							 | 
						|
								#endif /* !XTESTS_DOCUMENTATION_SKIP_SECTION */
							 | 
						|
								
							 | 
						|
								/* /////////////////////////////////////////////////////////////////////////
							 | 
						|
								 * Namespace
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#ifndef _XTESTS_NO_NAMESPACE
							 | 
						|
								} /* namespace c */
							 | 
						|
								} /* namespace xtests */
							 | 
						|
								#endif /* !_XTESTS_NO_NAMESPACE */
							 | 
						|
								
							 | 
						|
								/* ////////////////////////////////////////////////////////////////////// */
							 | 
						|
								
							 | 
						|
								#endif /* !XTESTS_INCL_XTESTS_H_XTESTS */
							 | 
						|
								
							 | 
						|
								/* ///////////////////////////// end of file //////////////////////////// */
							 |