// 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.

#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_TEST_THUNKS_H_
#define FBL_TESTS_INTRUSIVE_CONTAINERS_TEST_THUNKS_H_

#include <zxtest/zxtest.h>

namespace fbl {
namespace tests {
namespace intrusive_containers {

#define MAKE_TEST_THUNK(_test_name)           \
  static void _test_name() {                  \
    TestEnvironmentClass env;                 \
    ASSERT_NO_FAILURES(env._test_name(), ""); \
    ASSERT_NO_FAILURES(env.Reset(), "");      \
  }

// 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(ThreeContainerHelper)
  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>>

#define RUN_ZXTEST(_group, _flavor, _test) \
  TEST(_group, _test##_##_flavor) {        \
    auto fn = _flavor ::_test;             \
    ASSERT_NO_FAILURES(fn());              \
  }

}  // namespace intrusive_containers
}  // namespace tests
}  // namespace fbl

#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_TEST_THUNKS_H_
