blob: 38fa73911d02159fdab2855ba0001d4022e850de [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
namespace fbl {
namespace tests {
namespace intrusive_containers {
#define MAKE_TEST_THUNK(_test_name) \
static bool _test_name ## Test() { \
TestEnvironmentClass env; \
BEGIN_TEST; \
EXPECT_TRUE(env._test_name(), ""); \
EXPECT_TRUE(env.Reset(), ""); \
END_TEST; \
}
// A utility class used to generate static test thunks for the various
// combinations of test environments and test object types.
template <typename TestEnvironmentClass>
struct TestThunks {
// Generic tests
MAKE_TEST_THUNK(Clear);
MAKE_TEST_THUNK(ClearUnsafe);
MAKE_TEST_THUNK(IsEmpty);
MAKE_TEST_THUNK(Iterate);
MAKE_TEST_THUNK(IterErase);
MAKE_TEST_THUNK(DirectErase);
MAKE_TEST_THUNK(MakeIterator);
MAKE_TEST_THUNK(ReverseIterate);
MAKE_TEST_THUNK(ReverseIterErase);
MAKE_TEST_THUNK(Swap);
MAKE_TEST_THUNK(RvalueOps);
MAKE_TEST_THUNK(Scope);
MAKE_TEST_THUNK(TwoContainer);
MAKE_TEST_THUNK(IterCopyPointer);
MAKE_TEST_THUNK(EraseIf);
MAKE_TEST_THUNK(FindIf);
// Sequence specific tests
MAKE_TEST_THUNK(PushFront);
MAKE_TEST_THUNK(PopFront);
MAKE_TEST_THUNK(PushBack);
MAKE_TEST_THUNK(PopBack);
MAKE_TEST_THUNK(SeqIterate);
MAKE_TEST_THUNK(SeqReverseIterate);
MAKE_TEST_THUNK(EraseNext);
MAKE_TEST_THUNK(InsertAfter);
MAKE_TEST_THUNK(Insert);
MAKE_TEST_THUNK(DirectInsert);
MAKE_TEST_THUNK(Splice);
MAKE_TEST_THUNK(ReplaceIfCopy);
MAKE_TEST_THUNK(ReplaceIfMove);
MAKE_TEST_THUNK(ReplaceCopy);
MAKE_TEST_THUNK(ReplaceMove);
// Associative container specific tests
MAKE_TEST_THUNK(InsertByKey);
MAKE_TEST_THUNK(FindByKey);
MAKE_TEST_THUNK(EraseByKey);
MAKE_TEST_THUNK(InsertOrFind);
MAKE_TEST_THUNK(InsertOrReplace);
// Ordered Associative container specific tests
MAKE_TEST_THUNK(OrderedIter)
MAKE_TEST_THUNK(OrderedReverseIter)
MAKE_TEST_THUNK(UpperBound);
MAKE_TEST_THUNK(LowerBound);
};
#undef MAKE_TEST_THUNK
// Macros used to define test object types, test environments, and test thunk
// structs used for exercising various containers and managed/unmanaged pointer
// types.
#define DEFINE_TEST_OBJECT(_container_type, _ptr_type, _base_type) \
class _ptr_type ## _container_type ## TestObj : \
public _base_type<_container_type ## Traits< \
typename ptr_type::_ptr_type<_ptr_type ## _container_type ## TestObj>::type>> { \
public: \
explicit _ptr_type ## _container_type ## TestObj(size_t val) \
: _base_type(val) { } \
}; \
using _ptr_type ## _container_type ## TestTraits = \
_ptr_type ## TestTraits<_ptr_type ## _container_type ## TestObj>
// Macro which declare static storage for things like custom deleters for each
// tested container type. If new static storage is needed for testing custom
// pointer type or custom deleters, it should be declared here.
#define DECLARE_TEST_STORAGE(_container_type) \
template <> std::atomic<size_t> TestCustomDeleter< \
StdUniquePtrCustomDeleter ## _container_type ## TestObj \
>::delete_count_{0}
#define DEFINE_TEST_OBJECTS(_container_type) \
DEFINE_TEST_OBJECT(_container_type, Unmanaged, TestObj); \
DEFINE_TEST_OBJECT(_container_type, UniquePtr, TestObj); \
DEFINE_TEST_OBJECT(_container_type, StdUniquePtrDefaultDeleter, TestObj); \
DEFINE_TEST_OBJECT(_container_type, StdUniquePtrCustomDeleter, TestObj); \
DEFINE_TEST_OBJECT(_container_type, RefPtr, RefedTestObj); \
DECLARE_TEST_STORAGE(_container_type)
#define DEFINE_TEST_THUNK(_env_type, _container_type, _ptr_type) \
TestThunks<_env_type ## ContainerTestEnvironment<_ptr_type ## _container_type ## TestTraits>>
} // namespace intrusive_containers
} // namespace tests
} // namespace fbl