8#ifndef INCLUDED_BSLS_PROTOCOLTEST
9#define INCLUDED_BSLS_PROTOCOLTEST
303#include <bsls_compilerfeatures.h>
307#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
308#include <type_traits>
334struct ProtocolTest_IsAbstract;
336#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
339struct ProtocolTest_IsAbstract {
340 enum {
value = std::is_abstract<T>::value };
343#elif defined(BSLS_PLATFORM_CMP_GNU) && BSLS_PLATFORM_CMP_VERSION >= 110000
355struct ProtocolTest_VoidType {
367template <
class VOID_TYPE,
class T>
368struct ProtocolTest_IsClassTypeImp {
376 enum { value =
false };
380struct ProtocolTest_IsClassTypeImp<
381 typename ProtocolTest_VoidType<int T::*>::Type,
390 enum { value =
true };
394struct ProtocolTest_IsClassType {
402 value = ProtocolTest_IsClassTypeImp<void, T>::value
406template <
bool CONDITION,
class T =
void>
407struct ProtocolTest_EnableIf {
417struct ProtocolTest_EnableIf<true, T> {
428struct ProtocolTest_NoType {
438struct ProtocolTest_YesType {
448struct ProtocolTest_IsReturnableImpUtil {
458 static T returnThe();
468 static ProtocolTest_NoType test(...);
470 static ProtocolTest_YesType
471 test(
typename ProtocolTest_EnableIf<
static_cast<bool>(
472 sizeof(
static_cast<void>(returnThe<T>()), 0))>::Type *);
482struct ProtocolTest_IsReturnable {
492 value =
sizeof(ProtocolTest_YesType) ==
493 sizeof(ProtocolTest_IsReturnableImpUtil::test<T>(0))
499struct ProtocolTest_IsAbstract {
511 value = ProtocolTest_IsClassType<T>::value &&
512 !ProtocolTest_IsReturnable<T>::value
600template <
class BSLS_TESTIMP>
664#if defined (BSLS_LIBRARYFEATURES_HAS_CPP11_MISCELLANEOUS_UTILITIES)
666 std::max_align_t d_dummy[
sizeof(T) /
sizeof(std::max_align_t) + 1];
671 unsigned long long d_ull;
676 MaxAlignType d_dummy[
sizeof(T) /
sizeof(MaxAlignType) + 1];
695template <
class BSLS_PROTOCOL>
706 mutable bool d_entered;
712 mutable bool d_exited;
789template <
class BSLS_TESTIMP>
794 typedef typename BSLS_TESTIMP::ProtocolType ProtocolType;
808 void trace(
char const *message)
const;
823 BSLS_TESTIMP
method(
const char *methodDesc =
"");
866#define BSLS_PROTOCOLTEST_ASSERT(test, methodCall) \
868 (void) test.method( \
869 "inside BSLS_PROTOCOLTEST_ASSERT("#methodCall")")->methodCall;\
870 if (!test.lastStatus()) { \
871 ASSERT(0 && "Not a virtual method: "#methodCall); \
875#define BSLS_PROTOCOLTEST_RV_ASSERT(test, methodCall, returnValue) \
877 returnValue = test.method( \
878 "inside BSLS_PROTOCOLTEST_ASSERT("#methodCall")")->methodCall;\
879 if (!test.lastStatus()) { \
880 ASSERT(0 && "Not a virtual method: "#methodCall); \
897ProtocolTest_MethodReturnType::operator T()
const
909ProtocolTest_MethodReturnRefType::operator T&()
const
912 T *pObj =
reinterpret_cast<T *
>(&obj);
921template <
class BSLS_TESTIMP>
972template <
class BSLS_PROTOCOL>
981template <
class BSLS_PROTOCOL>
985 if (d_entered && !d_exited) {
991template <
class BSLS_PROTOCOL>
997 return static_cast<BSLS_PROTOCOL *
>(
this);
1001template <
class BSLS_PROTOCOL>
1007 return static_cast<const BSLS_PROTOCOL *
>(
this);
1010template <
class BSLS_PROTOCOL>
1019template <
class BSLS_PROTOCOL>
1028template <
class BSLS_PROTOCOL>
1037template <
class BSLS_PROTOCOL>
1044template <
class BSLS_PROTOCOL>
1049 d_status = testStatus;
1057template <
class BSLS_TESTIMP>
1061 d_status.resetLast();
1064template <
class BSLS_TESTIMP>
1066void ProtocolTest<BSLS_TESTIMP>::trace(
char const *message)
const
1069 std::printf(
"\t%s\n", message);
1074template <
class BSLS_TESTIMP>
1082template <
class BSLS_TESTIMP>
1090 impl.setTestStatus(&d_status);
1094template <
class BSLS_TESTIMP>
1098 trace(
"inside ProtocolTest::testAbstract()");
1105 return lastStatus();
1108template <
class BSLS_TESTIMP>
1112 trace(
"inside ProtocolTest::testNoDataMembers()");
1113 struct EmptyProtocol
1115 virtual ~EmptyProtocol() {}
1120 if (
sizeof(EmptyProtocol) !=
sizeof(ProtocolType)) {
1124 return lastStatus();
1127template <
class BSLS_TESTIMP>
1130 trace(
"inside ProtocolTest::testVirtualDestructor");
1141 BSLS_TESTIMP * base = obj;
1142 obj->setTestStatus(&d_status);
1153 return lastStatus();
1157template <
class BSLS_TESTIMP>
1161 return d_status.failures();
1164template <
class BSLS_TESTIMP>
1168 return d_status.last();
1173#ifndef BDE_OPENSOURCE_PUBLICATION
1178#ifdef bsls_ProtocolTest
1179#undef bsls_ProtocolTest
1182#define bsls_ProtocolTest bsls::ProtocolTest
1184#ifdef bsls_ProtocolTestImp
1185#undef bsls_ProtocolTestImp
1188#define bsls_ProtocolTestImp bsls::ProtocolTestImp
Definition bsls_protocoltest.h:696
ProtocolTest_MethodReturnRefType markDoneRef() const
Definition bsls_protocoltest.h:1022
BSLS_PROTOCOL ProtocolType
Definition bsls_protocoltest.h:720
~ProtocolTestImp()
Definition bsls_protocoltest.h:983
void setTestStatus(ProtocolTest_Status *testStatus) const
Definition bsls_protocoltest.h:1046
T markDoneVal(const T &value) const
Definition bsls_protocoltest.h:1031
BSLS_PROTOCOL * operator->()
Definition bsls_protocoltest.h:994
void markEnter() const
Definition bsls_protocoltest.h:1039
ProtocolTest_MethodReturnType markDone() const
Definition bsls_protocoltest.h:1013
ProtocolTestImp()
Create an object of the ProtocolTestImp class.
Definition bsls_protocoltest.h:974
Definition bsls_protocoltest.h:662
Definition bsls_protocoltest.h:618
ProtocolTest_Status()
Definition bsls_protocoltest.h:934
void fail()
Definition bsls_protocoltest.h:948
bool last() const
Definition bsls_protocoltest.h:962
int failures() const
Definition bsls_protocoltest.h:956
void resetLast()
Reset the status of the last test to true.
Definition bsls_protocoltest.h:942
Definition bsls_protocoltest.h:790
BSLS_TESTIMP method(const char *methodDesc="")
Definition bsls_protocoltest.h:1084
bool lastStatus() const
Definition bsls_protocoltest.h:1166
bool testAbstract()
Definition bsls_protocoltest.h:1096
ProtocolTest(bool verbose=false)
Construct a ProtocolTest object.
Definition bsls_protocoltest.h:1076
bool testNoDataMembers()
Definition bsls_protocoltest.h:1110
bool testVirtualDestructor()
Definition bsls_protocoltest.h:1128
int failures() const
Definition bsls_protocoltest.h:1159
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlt_iso8601util.h:707
Definition bsls_protocoltest.h:601
~ProtocolTest_Dtor()
Definition bsls_protocoltest.h:923
Definition bsls_protocoltest.h:530
Definition bsls_protocoltest.h:527
static NoType test(U(*)[1])
@ value
Definition bsls_protocoltest.h:538
char YesType
Definition bsls_protocoltest.h:529
Definition bsls_protocoltest.h:579
Definition bsls_protocoltest.h:556