tuple.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <tuple>
  2. #include <utility>
  3. #include <gtest/gtest.h>
  4. #include <entt/core/tuple.hpp>
  5. TEST(Tuple, IsTuple) {
  6. ASSERT_FALSE(entt::is_tuple_v<int>);
  7. ASSERT_TRUE(entt::is_tuple_v<std::tuple<>>);
  8. ASSERT_TRUE(entt::is_tuple_v<std::tuple<int>>);
  9. ASSERT_TRUE((entt::is_tuple_v<std::tuple<int, char>>));
  10. }
  11. TEST(Tuple, UnwrapTuple) {
  12. auto single = std::make_tuple(2);
  13. auto multi = std::make_tuple(2, 'c');
  14. auto ref = std::forward_as_tuple(std::get<0>(single));
  15. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(single)), int &>();
  16. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(multi)), std::tuple<int, char> &>();
  17. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(ref)), int &>();
  18. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(std::move(single))), int &&>();
  19. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(std::move(multi))), std::tuple<int, char> &&>();
  20. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(std::move(ref))), int &>();
  21. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(std::as_const(single))), const int &>();
  22. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(std::as_const(multi))), const std::tuple<int, char> &>();
  23. testing::StaticAssertTypeEq<decltype(entt::unwrap_tuple(std::as_const(ref))), int &>();
  24. ASSERT_EQ(entt::unwrap_tuple(single), 2);
  25. ASSERT_EQ(entt::unwrap_tuple(multi), multi);
  26. ASSERT_EQ(entt::unwrap_tuple(std::move(ref)), 2);
  27. }
  28. TEST(Tuple, ForwardApply) {
  29. entt::forward_apply first{[](auto &&...args) { return sizeof...(args); }};
  30. entt::forward_apply second{[](int value) { return value; }};
  31. entt::forward_apply third{[](auto... args) { return (args + ...); }};
  32. ASSERT_EQ(first(std::make_tuple()), 0u);
  33. ASSERT_EQ(std::as_const(first)(std::make_tuple()), 0u);
  34. ASSERT_EQ(second(std::make_tuple(2)), 2);
  35. ASSERT_EQ(std::as_const(second)(std::make_tuple(2)), 2);
  36. ASSERT_EQ(third(std::make_tuple('a', 1)), 'b');
  37. ASSERT_EQ(std::as_const(third)(std::make_tuple('a', 1)), 'b');
  38. }