|
|
|
@ -1,21 +1,28 @@
|
|
|
|
|
#include "../misc/traits.h"
|
|
|
|
|
#include "../tests/testutils.h"
|
|
|
|
|
|
|
|
|
|
#include <cppunit/TestFixture.h>
|
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
|
|
|
|
|
|
#include <forward_list>
|
|
|
|
|
#include <list>
|
|
|
|
|
#include <map>
|
|
|
|
|
#include <memory>
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
using namespace Traits;
|
|
|
|
|
|
|
|
|
|
using namespace CPPUNIT_NS;
|
|
|
|
|
|
|
|
|
|
struct SomeStruct {
|
|
|
|
|
string foo;
|
|
|
|
|
int bar;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct CountableStruct {
|
|
|
|
|
int numberOfElements;
|
|
|
|
|
int numberOfElements = 42;
|
|
|
|
|
size_t size() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -49,6 +56,14 @@ static_assert(!IsNoneOf<int, string, int, bool>::value, "IsNoneOf: negative case
|
|
|
|
|
static_assert(!IsNoneOf<bool, string, int, bool>::value, "IsNoneOf: negative case");
|
|
|
|
|
static_assert(IsNoneOf<unsigned int, string, int, bool>::value, "IsNoneOf: positive case");
|
|
|
|
|
|
|
|
|
|
static_assert(!IsDereferencable<string>::value, "IsDereferencable: negative case");
|
|
|
|
|
static_assert(!IsDereferencable<int>::value, "IsDereferencable: negative case");
|
|
|
|
|
static_assert(IsDereferencable<string *>::value, "IsDereferencable: positive case");
|
|
|
|
|
static_assert(IsDereferencable<int *>::value, "IsDereferencable: positive case");
|
|
|
|
|
static_assert(IsDereferencable<unique_ptr<string>>::value, "IsDereferencable: positive case");
|
|
|
|
|
static_assert(IsDereferencable<shared_ptr<string>>::value, "IsDereferencable: positive case");
|
|
|
|
|
static_assert(!IsDereferencable<weak_ptr<string>>::value, "IsDereferencable: positive case");
|
|
|
|
|
|
|
|
|
|
static_assert(!IsIteratable<int>::value, "IsIterator: negative case");
|
|
|
|
|
static_assert(!IsIteratable<SomeStruct>::value, "IsIterator: negative case");
|
|
|
|
|
static_assert(IsIteratable<string>::value, "IsIterator: positive case");
|
|
|
|
@ -78,3 +93,42 @@ static_assert(IsString<u16string>::value, "IsCString: positive case");
|
|
|
|
|
|
|
|
|
|
static_assert(!IsComplete<TestIncomplete>::value, "IsComplete: negative case");
|
|
|
|
|
static_assert(IsComplete<CountableStruct>::value, "IsComplete: positive case");
|
|
|
|
|
|
|
|
|
|
constexpr int i = 5;
|
|
|
|
|
constexpr CountableStruct someStruct{};
|
|
|
|
|
static_assert(dereferenceMaybe(&i) == 5, "int* dereferenced");
|
|
|
|
|
static_assert(dereferenceMaybe(i) == 5, "int not dereferenced");
|
|
|
|
|
static_assert(dereferenceMaybe(&someStruct).numberOfElements == 42, "CountableStruct* dereferenced");
|
|
|
|
|
static_assert(dereferenceMaybe(someStruct).numberOfElements == 42, "CountableStruct not dereferenced");
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief The TraitsTest class tests parts of the Traits namespace which can not be evaluated at compile-time.
|
|
|
|
|
*/
|
|
|
|
|
class TraitsTest : public TestFixture {
|
|
|
|
|
CPPUNIT_TEST_SUITE(TraitsTest);
|
|
|
|
|
CPPUNIT_TEST(testDereferenceMaybe);
|
|
|
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
void setUp()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
void tearDown()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void testDereferenceMaybe();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(TraitsTest);
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief Tests whether a smart pointer to a string can be treated like a normal string through the use of dereferenceMaybe().
|
|
|
|
|
*/
|
|
|
|
|
void TraitsTest::testDereferenceMaybe()
|
|
|
|
|
{
|
|
|
|
|
const auto someString = "foo"s;
|
|
|
|
|
const auto someSmartPointer = make_unique<string>("foo");
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL("foo"s, dereferenceMaybe(someString));
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL("foo"s, dereferenceMaybe(someSmartPointer));
|
|
|
|
|
}
|
|
|
|
|