proxygen
EnumerateTest.cpp File Reference
#include <array>
#include <string>
#include <vector>
#include <folly/Range.h>
#include <folly/container/Enumerate.h>
#include <folly/portability/GTest.h>

Go to the source code of this file.

Classes

class  CStringRange
 
struct  CStringRange::Sentinel
 

Macros

#define ENUMERATE_TEST_BASIC(DECL, NAME)
 
#define ENUMERATE_TEST_BASIC_CONST(DECL, NAME)
 

Functions

 TEST (Enumerate, Basic)
 
 TEST (Enumerate, BasicRRef)
 
 TEST (Enumerate, BasicConst)
 
 TEST (Enumerate, BasicConstRef)
 
 TEST (Enumerate, BasicConstRRef)
 
 TEST (Enumerate, Temporary)
 
 TEST (Enumerate, BasicConstArg)
 
 TEST (Enumerate, TemporaryConstEnumerate)
 
 TEST (Enumerate, RangeSupport)
 
 TEST (Enumerate, EmptyRange)
 
bool operator== (const char *c, CStringRange::Sentinel)
 
 TEST (Enumerate, Cpp17Support)
 

Macro Definition Documentation

#define ENUMERATE_TEST_BASIC (   DECL,
  NAME 
)
Value:
TEST(Enumerate, NAME) { \
std::vector<std::string> v = {"abc", "a", "ab"}; \
size_t i = 0; \
for (DECL it : folly::enumerate(v)) { \
EXPECT_EQ(it.index, i); \
EXPECT_EQ(*it, v[i]); \
EXPECT_EQ(it->size(), v[i].size()); \
\
/* Test mutability. */ \
std::string newValue = "x"; \
*it = newValue; \
EXPECT_EQ(newValue, v[i]); \
\
++i; \
} \
EXPECT_EQ(i, v.size()); \
}
TEST(Enumerate, Basic)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
#define DECL(name,...)
const char * string
Definition: Conv.cpp:212
string NAME
Definition: tokenize.py:56

Definition at line 38 of file EnumerateTest.cpp.

#define ENUMERATE_TEST_BASIC_CONST (   DECL,
  NAME 
)
Value:
TEST(Enumerate, NAME) { \
std::vector<std::string> v = {"abc", "a", "ab"}; \
size_t i = 0; \
for (DECL it : folly::enumerate(v)) { \
static_assert( \
IsConstReference<decltype(*it)>::value, "Const enumeration"); \
EXPECT_EQ(it.index, i); \
EXPECT_EQ(*it, v[i]); \
EXPECT_EQ(it->size(), v[i].size()); \
++i; \
} \
EXPECT_EQ(i, v.size()); \
}
TEST(Enumerate, Basic)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
static const char *const value
Definition: Conv.cpp:50
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
#define DECL(name,...)
string NAME
Definition: tokenize.py:56

Definition at line 63 of file EnumerateTest.cpp.

Function Documentation

bool operator== ( const char *  c,
CStringRange::Sentinel   
)

Definition at line 164 of file EnumerateTest.cpp.

Referenced by folly::operator!=(), and TEST().

164  {
165  return *c == 0;
166 }
char c
TEST ( Enumerate  ,
Basic   
)

Definition at line 58 of file EnumerateTest.cpp.

64 { \
TEST ( Enumerate  ,
BasicRRef   
)

Definition at line 59 of file EnumerateTest.cpp.

64 { \
TEST ( Enumerate  ,
BasicConst   
)

Definition at line 79 of file EnumerateTest.cpp.

85 {
TEST ( Enumerate  ,
BasicConstRef   
)

Definition at line 80 of file EnumerateTest.cpp.

85 {
TEST ( Enumerate  ,
BasicConstRRef   
)

Definition at line 81 of file EnumerateTest.cpp.

85 {
TEST ( Enumerate  ,
Temporary   
)

Definition at line 85 of file EnumerateTest.cpp.

References folly::enumerate(), EXPECT_EQ, and i.

85  {
86  std::vector<std::string> v = {"abc", "a", "ab"};
87  size_t i = 0;
88  for (auto&& it : folly::enumerate(decltype(v)(v))) { // Copy v.
89  EXPECT_EQ(it.index, i);
90  EXPECT_EQ(*it, v[i]);
91  EXPECT_EQ(it->size(), v[i].size());
92  ++i;
93  }
94 
95  EXPECT_EQ(i, v.size());
96 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
TEST ( Enumerate  ,
BasicConstArg   
)

Definition at line 98 of file EnumerateTest.cpp.

References folly::enumerate(), EXPECT_EQ, i, and value.

98  {
99  const std::vector<std::string> v = {"abc", "a", "ab"};
100  size_t i = 0;
101  for (auto&& it : folly::enumerate(v)) {
102  static_assert(
103  IsConstReference<decltype(*it)>::value, "Enumerating a const vector");
104  EXPECT_EQ(it.index, i);
105  EXPECT_EQ(*it, v[i]);
106  EXPECT_EQ(it->size(), v[i].size());
107  ++i;
108  }
109 
110  EXPECT_EQ(i, v.size());
111 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
static const char *const value
Definition: Conv.cpp:50
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
TEST ( Enumerate  ,
TemporaryConstEnumerate   
)

Definition at line 113 of file EnumerateTest.cpp.

References folly::enumerate(), EXPECT_EQ, i, and value.

113  {
114  std::vector<std::string> v = {"abc", "a", "ab"};
115  size_t i = 0;
116  for (const auto&& it : folly::enumerate(decltype(v)(v))) { // Copy v.
117  static_assert(IsConstReference<decltype(*it)>::value, "Const enumeration");
118  EXPECT_EQ(it.index, i);
119  EXPECT_EQ(*it, v[i]);
120  EXPECT_EQ(it->size(), v[i].size());
121  ++i;
122  }
123 
124  EXPECT_EQ(i, v.size());
125 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
static const char *const value
Definition: Conv.cpp:50
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
TEST ( Enumerate  ,
RangeSupport   
)

Definition at line 127 of file EnumerateTest.cpp.

References folly::enumerate(), EXPECT_EQ, i, and folly::range().

127  {
128  std::vector<std::string> v = {"abc", "a", "ab"};
129  size_t i = 0;
130  for (const auto&& it : folly::enumerate(folly::range(v))) {
131  EXPECT_EQ(it.index, i);
132  EXPECT_EQ(*it, v[i]);
133  EXPECT_EQ(it->size(), v[i].size());
134  ++i;
135  }
136 
137  EXPECT_EQ(i, v.size());
138 }
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
constexpr Range< Iter > range(Iter first, Iter last)
Definition: Range.h:1114
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
TEST ( Enumerate  ,
EmptyRange   
)

Definition at line 140 of file EnumerateTest.cpp.

References ADD_FAILURE, folly::enumerate(), and v.

140  {
141  std::vector<std::string> v;
142  for (auto&& it : folly::enumerate(v)) {
143  (void)it; // Silence warnings.
144  ADD_FAILURE();
145  }
146 }
auto v
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
#define ADD_FAILURE()
Definition: gtest.h:1808
TEST ( Enumerate  ,
Cpp17Support   
)

Definition at line 168 of file EnumerateTest.cpp.

References ASSERT_LT, folly::test::begin(), folly::test::end(), folly::enumerate(), and EXPECT_EQ.

168  {
169  std::array<char, 5> test = {"test"};
170  // Can't use range based for loop until C++17, so test manually
171  // Equivalent to:
172  // for (const auto&& it : folly::enumerate(CStringRange{test.data()})) { ... }
173  {
174  auto&& enumerate = folly::enumerate(CStringRange{test.data()});
175  auto begin = enumerate.begin();
176  auto end = enumerate.end();
177  for (; begin != end; ++begin) {
178  const auto&& it = *begin;
179 
180  ASSERT_LT(it.index, test.size());
181  EXPECT_EQ(*it, test[it.index]);
182  }
183  }
184 }
#define ASSERT_LT(val1, val2)
Definition: gtest.h:1968
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
auto begin(TestAdlIterable &instance)
Definition: ForeachTest.cpp:56
auto end(TestAdlIterable &instance)
Definition: ForeachTest.cpp:62
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167